Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
1 line
49 KiB
JSON
1 line
49 KiB
JSON
{"repo": "312527814/java-practice", "files": {"llm/spring-ai-alibaba/src/main/java/org/example/apptest/TestInterceptor.java": {"30bb0f3406775108e5df79eadda3cf777a0f0f49": {"t": 1785745665.978871, "n": 2214, "h": "d3ca168a135a7071", "c": "package org.example.apptest;\n\nimport com.alibaba.cloud.ai.graph.RunnableConfig;\nimport com.alibaba.cloud.ai.graph.agent.ReactAgent;\nimport com.alibaba.cloud.ai.graph.agent.hook.ModelHook;\nimport com.alibaba.cloud.ai.graph.agent.hook.modelcalllimit.ModelCallLimitHook;\nimport com.alibaba.cloud.ai.graph.agent.interceptor.contextediting.ContextEditingInterceptor;\nimport com.alibaba.cloud.ai.graph.exception.GraphRunnerException;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatOptions;\nimport org.springframework.ai.deepseek.api.DeepSeekApi;\nimport org.springframework.ai.tool.ToolCallback;\nimport org.springframework.ai.tool.function.FunctionToolCallback;\n\npublic class TestInterceptor {\n public static void main(String[] args) throws GraphRunnerException {\n // 初始化 ChatModel\n DeepSeekApi deepSeekApi = DeepSeekApi.builder()\n .apiKey(System.getenv(\"DEEPSEEK_API_KEY\"))\n .build();\n\n ChatModel chatModel = DeepSeekChatModel.builder()\n .deepSeekApi(deepSeekApi)\n .defaultOptions(DeepSeekChatOptions.builder()\n .model(\"deepseek-v4-pro\")\n .temperature(0.7)\n .build())\n .build();\n\n // 定义天气查询工具\n ToolCallback weatherTool = FunctionToolCallback.builder(\"get_weather\", new WeatherTool())\n .description(\"Get weather for a given city\")\n .inputType(WeatherRequest.class)\n .build();\n ModelHook loggingHook = new LoggingModelHook();\n // 使用\n ReactAgent agent = ReactAgent.builder()\n .name(\"resilient_agent\")\n .model(chatModel)\n .tools(weatherTool)\n .hooks(loggingHook,new LoggingModelHook2())\n// .interceptors(new MyModelInterceptor(),new MyToolInterceptor())\n .build();\n\n AssistantMessage response = agent.call(\"what is the weather in San Francisco\");\n System.out.println(response.getText());\n }\n}\n"}, "7c896eb7a4f9495726061d690d27124e647beca3": {"t": 1785755544.7406855, "n": 2214, "h": "d3ca168a135a7071", "c": "package org.example.apptest;\n\nimport com.alibaba.cloud.ai.graph.RunnableConfig;\nimport com.alibaba.cloud.ai.graph.agent.ReactAgent;\nimport com.alibaba.cloud.ai.graph.agent.hook.ModelHook;\nimport com.alibaba.cloud.ai.graph.agent.hook.modelcalllimit.ModelCallLimitHook;\nimport com.alibaba.cloud.ai.graph.agent.interceptor.contextediting.ContextEditingInterceptor;\nimport com.alibaba.cloud.ai.graph.exception.GraphRunnerException;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatOptions;\nimport org.springframework.ai.deepseek.api.DeepSeekApi;\nimport org.springframework.ai.tool.ToolCallback;\nimport org.springframework.ai.tool.function.FunctionToolCallback;\n\npublic class TestInterceptor {\n public static void main(String[] args) throws GraphRunnerException {\n // 初始化 ChatModel\n DeepSeekApi deepSeekApi = DeepSeekApi.builder()\n .apiKey(System.getenv(\"DEEPSEEK_API_KEY\"))\n .build();\n\n ChatModel chatModel = DeepSeekChatModel.builder()\n .deepSeekApi(deepSeekApi)\n .defaultOptions(DeepSeekChatOptions.builder()\n .model(\"deepseek-v4-pro\")\n .temperature(0.7)\n .build())\n .build();\n\n // 定义天气查询工具\n ToolCallback weatherTool = FunctionToolCallback.builder(\"get_weather\", new WeatherTool())\n .description(\"Get weather for a given city\")\n .inputType(WeatherRequest.class)\n .build();\n ModelHook loggingHook = new LoggingModelHook();\n // 使用\n ReactAgent agent = ReactAgent.builder()\n .name(\"resilient_agent\")\n .model(chatModel)\n .tools(weatherTool)\n .hooks(loggingHook,new LoggingModelHook2())\n// .interceptors(new MyModelInterceptor(),new MyToolInterceptor())\n .build();\n\n AssistantMessage response = agent.call(\"what is the weather in San Francisco\");\n System.out.println(response.getText());\n }\n}\n"}, "82101e97e125e52e409a738fb8e891fe167e64e9": {"t": 1785755546.1534293, "n": 2212, "h": "1bfbec85a50dacac", "c": "package org.example.apptest;\n\nimport com.alibaba.cloud.ai.graph.RunnableConfig;\nimport com.alibaba.cloud.ai.graph.agent.ReactAgent;\nimport com.alibaba.cloud.ai.graph.agent.hook.ModelHook;\nimport com.alibaba.cloud.ai.graph.agent.hook.modelcalllimit.ModelCallLimitHook;\nimport com.alibaba.cloud.ai.graph.agent.interceptor.contextediting.ContextEditingInterceptor;\nimport com.alibaba.cloud.ai.graph.exception.GraphRunnerException;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatOptions;\nimport org.springframework.ai.deepseek.api.DeepSeekApi;\nimport org.springframework.ai.tool.ToolCallback;\nimport org.springframework.ai.tool.function.FunctionToolCallback;\n\npublic class TestInterceptor {\n public static void main(String[] args) throws GraphRunnerException {\n // 初始化 ChatModel\n DeepSeekApi deepSeekApi = DeepSeekApi.builder()\n .apiKey(System.getenv(\"DEEPSEEK_API_KEY\"))\n .build();\n\n ChatModel chatModel = DeepSeekChatModel.builder()\n .deepSeekApi(deepSeekApi)\n .defaultOptions(DeepSeekChatOptions.builder()\n .model(\"deepseek-v4-pro\")\n .temperature(0.7)\n .build())\n .build();\n\n // 定义天气查询工具\n ToolCallback weatherTool = FunctionToolCallback.builder(\"get_weather\", new WeatherTool())\n .description(\"Get weather for a given city\")\n .inputType(WeatherRequest.class)\n .build();\n ModelHook loggingHook = new LoggingModelHook();\n // 使用\n ReactAgent agent = ReactAgent.builder()\n .name(\"resilient_agent\")\n .model(chatModel)\n .tools(weatherTool)\n .hooks(loggingHook,new LoggingModelHook2())\n .interceptors(new MyModelInterceptor(),new MyToolInterceptor())\n .build();\n\n AssistantMessage response = agent.call(\"what is the weather in San Francisco\");\n System.out.println(response.getText());\n }\n}\n"}}, "llm/spring-ai-alibaba/src/main/java/org/example/apptest/TestHumanInTheLoop.java": {"30bb0f3406775108e5df79eadda3cf777a0f0f49": {"t": 1785745666.1656413, "n": 5537, "h": "5de63f27fc28b446", "c": "package org.example.apptest;\n\nimport com.alibaba.cloud.ai.graph.NodeOutput;\nimport com.alibaba.cloud.ai.graph.RunnableConfig;\nimport com.alibaba.cloud.ai.graph.action.InterruptionMetadata;\nimport com.alibaba.cloud.ai.graph.agent.ReactAgent;\nimport com.alibaba.cloud.ai.graph.agent.hook.hip.HumanInTheLoopHook;\nimport com.alibaba.cloud.ai.graph.agent.hook.hip.ToolConfig;\nimport com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;\nimport com.alibaba.cloud.ai.graph.exception.GraphRunnerException;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatOptions;\nimport org.springframework.ai.deepseek.api.DeepSeekApi;\nimport org.springframework.ai.tool.ToolCallback;\nimport org.springframework.ai.tool.function.FunctionToolCallback;\n\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.Scanner;\n\npublic class TestHumanInTheLoop {\n public static void main(String[] args) throws GraphRunnerException {\n // 初始化 ChatModel\n DeepSeekApi deepSeekApi = DeepSeekApi.builder()\n .apiKey(System.getenv(\"DEEPSEEK_API_KEY\"))\n .build();\n\n ChatModel chatModel = DeepSeekChatModel.builder()\n .deepSeekApi(deepSeekApi)\n .defaultOptions(DeepSeekChatOptions.builder()\n .model(\"deepseek-v4-pro\")\n .temperature(0.7)\n .build())\n .build();\n\n ToolCallback weatherTool = FunctionToolCallback.builder(\"get_weather\", new WeatherTool())\n .description(\"Get weather for a given city\")\n .inputType(WeatherRequest.class)\n .build();\n\n MemorySaver memorySaver = new MemorySaver();\n\n HumanInTheLoopHook humanInTheLoopHook = HumanInTheLoopHook.builder()\n .approvalOn(\"get_weather\", ToolConfig.builder()\n .description(\"查询天气需要审批\")\n .build())\n .build();\n\n ReactAgent agent = ReactAgent.builder()\n .name(\"approval_agent\")\n .model(chatModel)\n .tools(weatherTool)\n .hooks(List.of(humanInTheLoopHook))\n .interceptors(new MyModelInterceptor())\n .saver(memorySaver)\n .enableLogging(true)\n .build();\n\n // HITL 必须指定 threadId,用于 checkpoint 恢复\n String threadId = \"hitl-test-thread\";\n RunnableConfig config = RunnableConfig.builder()\n .threadId(threadId)\n .build();\n\n // 第一次调用:触发工具审批中断(不能用 call(),要用 invokeAndGetOutput 检测中断)\n System.out.println(\"=== 第一次调用:期望触发人工审批中断 ===\");\n Optional<NodeOutput> result = agent.invokeAndGetOutput(\n \"what is the weather in San Francisco\",\n config);\n\n if (result.isEmpty()) {\n System.out.println(\"第一次调用无返回,请检查 DEEPSEEK_API_KEY 或模型是否调用了 get_weather\");\n return;\n }\n\n if (result.get() instanceof InterruptionMetadata interruption) {\n System.out.println(\"检测到人工审批中断,待审批工具:\");\n interruption.toolFeedbacks().forEach(feedback -> {\n System.out.println(\" 工具: \" + feedback.getName());\n System.out.println(\" 参数: \" + feedback.getArguments());\n System.out.println(\" 说明: \" + feedback.getDescription());\n });\n // 构建批准反馈\n InterruptionMetadata.Builder feedbackBuilder = InterruptionMetadata.builder()\n .nodeId(interruption.node())\n .state(interruption.state());\n System.out.print(\"是否调用该工具?(yes/no): \");\n System.out.flush();\n Scanner scanner = new Scanner(System.in);\n String name = scanner.nextLine().trim();\n\n if(name.equals(\"yes\")){\n interruption.toolFeedbacks().forEach(toolFeedback ->\n feedbackBuilder.addToolFeedback(\n InterruptionMetadata.ToolFeedback.builder(toolFeedback)\n .result(InterruptionMetadata.ToolFeedback.FeedbackResult.APPROVED)\n .build()));\n // 第二次调用:resumeConfig + 空消息恢复执行\n System.out.println(\"\\n=== 第二次调用:批准并恢复执行 ===\");\n }else {\n interruption.toolFeedbacks().forEach(toolFeedback ->\n feedbackBuilder.addToolFeedback(\n InterruptionMetadata.ToolFeedback.builder(toolFeedback)\n .result(InterruptionMetadata.ToolFeedback.FeedbackResult.REJECTED)\n .build()));\n // 第二次调用:resumeConfig + 空消息恢复执行\n System.out.println(\"\\n=== 第二次调用:拒绝执行 ===\");\n }\n\n\n InterruptionMetadata approvalMetadata = feedbackBuilder.build();\n RunnableConfig resumeConfig = RunnableConfig.builder()\n .threadId(threadId)\n .addMetadata(RunnableConfig.HUMAN_FEEDBACK_METADATA_KEY, approvalMetadata)\n .build();\n\n\n\n AssistantMessage response = agent.call(\"\", resumeConfig);\n System.out.println(\"最终结果: \" + response.getText());\n return;\n }\n System.out.println(\"未触发人工审批,首次返回类型: \" + result.get().getClass().getSimpleName());\n }\n}\n"}, "82101e97e125e52e409a738fb8e891fe167e64e9": {"t": 1785755544.6424208, "n": 5537, "h": "5de63f27fc28b446", "c": "package org.example.apptest;\n\nimport com.alibaba.cloud.ai.graph.NodeOutput;\nimport com.alibaba.cloud.ai.graph.RunnableConfig;\nimport com.alibaba.cloud.ai.graph.action.InterruptionMetadata;\nimport com.alibaba.cloud.ai.graph.agent.ReactAgent;\nimport com.alibaba.cloud.ai.graph.agent.hook.hip.HumanInTheLoopHook;\nimport com.alibaba.cloud.ai.graph.agent.hook.hip.ToolConfig;\nimport com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;\nimport com.alibaba.cloud.ai.graph.exception.GraphRunnerException;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatOptions;\nimport org.springframework.ai.deepseek.api.DeepSeekApi;\nimport org.springframework.ai.tool.ToolCallback;\nimport org.springframework.ai.tool.function.FunctionToolCallback;\n\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.Scanner;\n\npublic class TestHumanInTheLoop {\n public static void main(String[] args) throws GraphRunnerException {\n // 初始化 ChatModel\n DeepSeekApi deepSeekApi = DeepSeekApi.builder()\n .apiKey(System.getenv(\"DEEPSEEK_API_KEY\"))\n .build();\n\n ChatModel chatModel = DeepSeekChatModel.builder()\n .deepSeekApi(deepSeekApi)\n .defaultOptions(DeepSeekChatOptions.builder()\n .model(\"deepseek-v4-pro\")\n .temperature(0.7)\n .build())\n .build();\n\n ToolCallback weatherTool = FunctionToolCallback.builder(\"get_weather\", new WeatherTool())\n .description(\"Get weather for a given city\")\n .inputType(WeatherRequest.class)\n .build();\n\n MemorySaver memorySaver = new MemorySaver();\n\n HumanInTheLoopHook humanInTheLoopHook = HumanInTheLoopHook.builder()\n .approvalOn(\"get_weather\", ToolConfig.builder()\n .description(\"查询天气需要审批\")\n .build())\n .build();\n\n ReactAgent agent = ReactAgent.builder()\n .name(\"approval_agent\")\n .model(chatModel)\n .tools(weatherTool)\n .hooks(List.of(humanInTheLoopHook))\n .interceptors(new MyModelInterceptor())\n .saver(memorySaver)\n .enableLogging(true)\n .build();\n\n // HITL 必须指定 threadId,用于 checkpoint 恢复\n String threadId = \"hitl-test-thread\";\n RunnableConfig config = RunnableConfig.builder()\n .threadId(threadId)\n .build();\n\n // 第一次调用:触发工具审批中断(不能用 call(),要用 invokeAndGetOutput 检测中断)\n System.out.println(\"=== 第一次调用:期望触发人工审批中断 ===\");\n Optional<NodeOutput> result = agent.invokeAndGetOutput(\n \"what is the weather in San Francisco\",\n config);\n\n if (result.isEmpty()) {\n System.out.println(\"第一次调用无返回,请检查 DEEPSEEK_API_KEY 或模型是否调用了 get_weather\");\n return;\n }\n\n if (result.get() instanceof InterruptionMetadata interruption) {\n System.out.println(\"检测到人工审批中断,待审批工具:\");\n interruption.toolFeedbacks().forEach(feedback -> {\n System.out.println(\" 工具: \" + feedback.getName());\n System.out.println(\" 参数: \" + feedback.getArguments());\n System.out.println(\" 说明: \" + feedback.getDescription());\n });\n // 构建批准反馈\n InterruptionMetadata.Builder feedbackBuilder = InterruptionMetadata.builder()\n .nodeId(interruption.node())\n .state(interruption.state());\n System.out.print(\"是否调用该工具?(yes/no): \");\n System.out.flush();\n Scanner scanner = new Scanner(System.in);\n String name = scanner.nextLine().trim();\n\n if(name.equals(\"yes\")){\n interruption.toolFeedbacks().forEach(toolFeedback ->\n feedbackBuilder.addToolFeedback(\n InterruptionMetadata.ToolFeedback.builder(toolFeedback)\n .result(InterruptionMetadata.ToolFeedback.FeedbackResult.APPROVED)\n .build()));\n // 第二次调用:resumeConfig + 空消息恢复执行\n System.out.println(\"\\n=== 第二次调用:批准并恢复执行 ===\");\n }else {\n interruption.toolFeedbacks().forEach(toolFeedback ->\n feedbackBuilder.addToolFeedback(\n InterruptionMetadata.ToolFeedback.builder(toolFeedback)\n .result(InterruptionMetadata.ToolFeedback.FeedbackResult.REJECTED)\n .build()));\n // 第二次调用:resumeConfig + 空消息恢复执行\n System.out.println(\"\\n=== 第二次调用:拒绝执行 ===\");\n }\n\n\n InterruptionMetadata approvalMetadata = feedbackBuilder.build();\n RunnableConfig resumeConfig = RunnableConfig.builder()\n .threadId(threadId)\n .addMetadata(RunnableConfig.HUMAN_FEEDBACK_METADATA_KEY, approvalMetadata)\n .build();\n\n\n\n AssistantMessage response = agent.call(\"\", resumeConfig);\n System.out.println(\"最终结果: \" + response.getText());\n return;\n }\n System.out.println(\"未触发人工审批,首次返回类型: \" + result.get().getClass().getSimpleName());\n }\n}\n"}}, "llm/spring-ai-alibaba/src/main/java/org/example/apptest/TestHook.java": {"30bb0f3406775108e5df79eadda3cf777a0f0f49": {"t": 1785745700.6606915, "n": 3396, "h": "e94216387c8f6c91", "c": "package org.example.apptest;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;\nimport com.alibaba.cloud.ai.graph.RunnableConfig;\nimport com.alibaba.cloud.ai.graph.agent.ReactAgent;\nimport com.alibaba.cloud.ai.graph.agent.hook.ModelHook;\nimport com.alibaba.cloud.ai.graph.agent.hook.modelcalllimit.ModelCallLimitHook;\nimport com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;\nimport com.alibaba.cloud.ai.graph.exception.GraphRunnerException;\nimport org.example.hooks.RAGMessagesHook;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.content.Media;\nimport org.springframework.ai.deepseek.DeepSeekChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatOptions;\nimport org.springframework.ai.deepseek.api.DeepSeekApi;\nimport org.springframework.ai.tool.ToolCallback;\nimport org.springframework.ai.tool.function.FunctionToolCallback;\nimport org.springframework.core.io.FileSystemResource;\nimport org.springframework.util.MimeTypeUtils;\n\npublic class TestHook {\n public static void main(String[] args) throws GraphRunnerException {\n// 初始化 ChatModel\n DeepSeekApi deepSeekApi = DeepSeekApi.builder()\n .apiKey(System.getenv(\"DEEPSEEK_API_KEY\"))\n .build();\n\n ChatModel chatModel = DeepSeekChatModel.builder()\n .deepSeekApi(deepSeekApi)\n .defaultOptions(DeepSeekChatOptions.builder()\n .model(\"deepseek-v4-pro\")\n .temperature(0.7)\n .build())\n .build();\n\n // 定义天气查询工具\n ToolCallback weatherTool = FunctionToolCallback.builder(\"get_weather\", new WeatherTool())\n .description(\"Get weather for a given city\")\n .inputType(WeatherRequest.class)\n .build();\n String customSchema = \"请按照以下JSON格式输出:\\n\"\n + \"{\\n\"\n + \" \\\"title\\\": \\\"标题\\\",\\n\"\n + \" \\\"content\\\": \\\"内容\\\",\\n\"\n + \" \\\"style\\\": \\\"风格\\\"\\n\"\n + \"}\";\n\n ModelHook loggingHook = new LoggingModelHook();\n\n ModelCallLimitHook hook = ModelCallLimitHook.builder()\n .runLimit(5) // 限制最多调用 5 次\n .exitBehavior(ModelCallLimitHook.ExitBehavior.ERROR) // 超出限制时抛出异常\n .build();\n\n // threadId 是给定对话的唯一标识符\n RunnableConfig runnableConfig = RunnableConfig.builder().threadId(\"threadId\").addMetadata(\"user_id\", \"1\").build();\n runnableConfig.context().put(\"1\",\"222\");\n // 创建 agent\n ReactAgent agent = ReactAgent.builder()\n .name(\"weather_agent\")\n .model(chatModel)\n .tools(weatherTool)\n .hooks(loggingHook)\n .systemPrompt(\"You are a helpful assistant\")\n .saver(new MemorySaver())\n .outputSchema(customSchema)\n .build();\n AssistantMessage response=null;\n// response = agent.call(\"你是什么模型?\",runnableConfig);\n response = agent.call(\"what is the weather in San Francisco?\", runnableConfig);\n System.out.println(response.getText());\n }\n}\n"}, "7c896eb7a4f9495726061d690d27124e647beca3": {"t": 1785755543.5079172, "n": 3396, "h": "e94216387c8f6c91", "c": "package org.example.apptest;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;\nimport com.alibaba.cloud.ai.graph.RunnableConfig;\nimport com.alibaba.cloud.ai.graph.agent.ReactAgent;\nimport com.alibaba.cloud.ai.graph.agent.hook.ModelHook;\nimport com.alibaba.cloud.ai.graph.agent.hook.modelcalllimit.ModelCallLimitHook;\nimport com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;\nimport com.alibaba.cloud.ai.graph.exception.GraphRunnerException;\nimport org.example.hooks.RAGMessagesHook;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.content.Media;\nimport org.springframework.ai.deepseek.DeepSeekChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatOptions;\nimport org.springframework.ai.deepseek.api.DeepSeekApi;\nimport org.springframework.ai.tool.ToolCallback;\nimport org.springframework.ai.tool.function.FunctionToolCallback;\nimport org.springframework.core.io.FileSystemResource;\nimport org.springframework.util.MimeTypeUtils;\n\npublic class TestHook {\n public static void main(String[] args) throws GraphRunnerException {\n// 初始化 ChatModel\n DeepSeekApi deepSeekApi = DeepSeekApi.builder()\n .apiKey(System.getenv(\"DEEPSEEK_API_KEY\"))\n .build();\n\n ChatModel chatModel = DeepSeekChatModel.builder()\n .deepSeekApi(deepSeekApi)\n .defaultOptions(DeepSeekChatOptions.builder()\n .model(\"deepseek-v4-pro\")\n .temperature(0.7)\n .build())\n .build();\n\n // 定义天气查询工具\n ToolCallback weatherTool = FunctionToolCallback.builder(\"get_weather\", new WeatherTool())\n .description(\"Get weather for a given city\")\n .inputType(WeatherRequest.class)\n .build();\n String customSchema = \"请按照以下JSON格式输出:\\n\"\n + \"{\\n\"\n + \" \\\"title\\\": \\\"标题\\\",\\n\"\n + \" \\\"content\\\": \\\"内容\\\",\\n\"\n + \" \\\"style\\\": \\\"风格\\\"\\n\"\n + \"}\";\n\n ModelHook loggingHook = new LoggingModelHook();\n\n ModelCallLimitHook hook = ModelCallLimitHook.builder()\n .runLimit(5) // 限制最多调用 5 次\n .exitBehavior(ModelCallLimitHook.ExitBehavior.ERROR) // 超出限制时抛出异常\n .build();\n\n // threadId 是给定对话的唯一标识符\n RunnableConfig runnableConfig = RunnableConfig.builder().threadId(\"threadId\").addMetadata(\"user_id\", \"1\").build();\n runnableConfig.context().put(\"1\",\"222\");\n // 创建 agent\n ReactAgent agent = ReactAgent.builder()\n .name(\"weather_agent\")\n .model(chatModel)\n .tools(weatherTool)\n .hooks(loggingHook)\n .systemPrompt(\"You are a helpful assistant\")\n .saver(new MemorySaver())\n .outputSchema(customSchema)\n .build();\n AssistantMessage response=null;\n// response = agent.call(\"你是什么模型?\",runnableConfig);\n response = agent.call(\"what is the weather in San Francisco?\", runnableConfig);\n System.out.println(response.getText());\n }\n}\n"}, "82101e97e125e52e409a738fb8e891fe167e64e9": {"t": 1785755545.091831, "n": 3337, "h": "e688ae5ec078cede", "c": "package org.example.apptest;\n\nimport com.alibaba.cloud.ai.dashscope.api.DashScopeApi;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;\nimport com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;\nimport com.alibaba.cloud.ai.graph.RunnableConfig;\nimport com.alibaba.cloud.ai.graph.agent.ReactAgent;\nimport com.alibaba.cloud.ai.graph.agent.hook.ModelHook;\nimport com.alibaba.cloud.ai.graph.agent.hook.modelcalllimit.ModelCallLimitHook;\nimport com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;\nimport com.alibaba.cloud.ai.graph.exception.GraphRunnerException;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.content.Media;\nimport org.springframework.ai.deepseek.DeepSeekChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatOptions;\nimport org.springframework.ai.deepseek.api.DeepSeekApi;\nimport org.springframework.ai.tool.ToolCallback;\nimport org.springframework.ai.tool.function.FunctionToolCallback;\nimport org.springframework.core.io.FileSystemResource;\nimport org.springframework.util.MimeTypeUtils;\n\npublic class TestHook {\n public static void main(String[] args) throws GraphRunnerException {\n// 初始化 ChatModel\n DeepSeekApi deepSeekApi = DeepSeekApi.builder()\n .apiKey(System.getenv(\"DEEPSEEK_API_KEY\"))\n .build();\n\n ChatModel chatModel = DeepSeekChatModel.builder()\n .deepSeekApi(deepSeekApi)\n .defaultOptions(DeepSeekChatOptions.builder()\n .model(\"deepseek-v4-pro\")\n .temperature(0.7)\n .build())\n .build();\n\n // 定义天气查询工具\n ToolCallback weatherTool = FunctionToolCallback.builder(\"get_weather\", new WeatherTool())\n .description(\"Get weather for a given city\")\n .inputType(WeatherRequest.class)\n .build();\n String customSchema = \"请按照以下JSON格式输出:\\n\"\n + \"{\\n\"\n + \" \\\"title\\\": \\\"标题\\\",\\n\"\n + \" \\\"content\\\": \\\"内容\\\",\\n\"\n + \" \\\"style\\\": \\\"风格\\\"\\n\"\n + \"}\";\n\n ModelHook loggingHook = new LoggingModelHook();\n\n ModelCallLimitHook hook = ModelCallLimitHook.builder()\n .runLimit(5) // 限制最多调用 5 次\n .exitBehavior(ModelCallLimitHook.ExitBehavior.ERROR) // 超出限制时抛出异常\n .build();\n\n // threadId 是给定对话的唯一标识符\n RunnableConfig runnableConfig = RunnableConfig.builder().threadId(\"threadId\").addMetadata(\"user_id\", \"1\").build();\n runnableConfig.context().put(\"1\",\"222\");\n // 创建 agent\n ReactAgent agent = ReactAgent.builder()\n .name(\"weather_agent\")\n .model(chatModel)\n .tools(weatherTool)\n .hooks(loggingHook,hook)\n .systemPrompt(\"You are a helpful assistant\")\n .saver(new MemorySaver())\n .outputSchema(customSchema)\n .build();\n\n AssistantMessage response = agent.call(\"你是什么模型?\",runnableConfig);\n response = agent.call(\"what is the weather in San Francisco?\", runnableConfig);\n System.out.println(response.getText());\n }\n}\n"}}, "llm/spring-ai-alibaba/src/main/java/org/example/apptest/TestSkills.java": {"30bb0f3406775108e5df79eadda3cf777a0f0f49": {"t": 1785745706.2894678, "n": 3703, "h": "9512b0fa8367c0eb", "c": "package org.example.apptest;\n\nimport com.alibaba.cloud.ai.graph.agent.ReactAgent;\nimport com.alibaba.cloud.ai.graph.agent.hook.shelltool.ShellToolAgentHook;\nimport com.alibaba.cloud.ai.graph.agent.hook.skills.SkillsAgentHook;\nimport com.alibaba.cloud.ai.graph.agent.interceptor.contextediting.ContextEditingInterceptor;\nimport com.alibaba.cloud.ai.graph.agent.tools.ShellTool2;\nimport com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;\nimport com.alibaba.cloud.ai.graph.skills.registry.SkillRegistry;\nimport com.alibaba.cloud.ai.graph.skills.registry.filesystem.FileSystemSkillRegistry;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatOptions;\nimport org.springframework.ai.deepseek.api.DeepSeekApi;\nimport org.springframework.core.io.ClassPathResource;\nimport org.springframework.core.io.Resource;\n\nimport java.net.URL;\nimport java.nio.file.Path;\nimport java.util.List;\n\npublic class TestSkills {\n public static void main(String[] args) throws Exception {\n // 初始化 ChatModel\n DeepSeekApi deepSeekApi = DeepSeekApi.builder()\n .apiKey(System.getenv(\"DEEPSEEK_API_KEY\"))\n .build();\n\n ChatModel chatModel = DeepSeekChatModel.builder()\n .deepSeekApi(deepSeekApi)\n .defaultOptions(DeepSeekChatOptions.builder()\n .model(\"deepseek-v4-pro\")\n .temperature(0.7)\n .build())\n .build();\n\n String skillsDirectory = getTestSkillsDirectory();\n\n // 1. 技能注册表:从 src/test/resources/skills 加载\n SkillRegistry registry = FileSystemSkillRegistry.builder()\n .projectSkillsDirectory(skillsDirectory)\n .build();\n\n // 2. Skills Hook:注册 read_skill 工具并注入技能列表到系统提示\n SkillsAgentHook skillsHook = SkillsAgentHook.builder()\n .skillRegistry(registry)\n .build();\n\n // 3. Shell Hook:工作目录设为技能根目录,便于执行 scripts/extract_pdf.py\n ShellToolAgentHook shellHook = ShellToolAgentHook.builder()\n .shellTool2(ShellTool2.builder(skillsDirectory + \"/skills/pdf-extractor\").build())\n .build();\n\n ContextEditingInterceptor build1 = ContextEditingInterceptor.builder().trigger(120000).clearAtLeast(60000).build();\n\n // 4. 构建 Agent\n ReactAgent agent = ReactAgent.builder()\n .name(\"skills-integration-agent\")\n .model(chatModel)\n .saver(new MemorySaver())\n .interceptors(build1)\n .hooks(List.of(skillsHook, shellHook))\n .enableLogging(true)\n .build();\n\n // 5. 使用真实 PDF 路径(与官方 AgentSkillsTest 一致)\n String pdfPath = skillsDirectory + \"/skills/pdf-extractor/saa-roadmap.pdf\";\n AssistantMessage response = agent.call(\"请从 \" + pdfPath + \" 文件中提取关键信息。\");\n\n System.out.println(\"回复内容:\");\n System.out.println(response.getText());\n }\n\n private static String getTestSkillsDirectory() throws Exception {\n Resource resource = new ClassPathResource(\"skills\");\n if (resource.exists() && resource.getFile().isDirectory()) {\n return resource.getFile().getAbsolutePath();\n }\n URL url = TestSkills.class.getClassLoader().getResource(\"skills\");\n if (url != null && \"file\".equals(url.getProtocol())) {\n return Path.of(url.toURI()).toString();\n }\n throw new IllegalStateException(\"Cannot find test skills directory under src/test/resources/skills\");\n }\n}\n"}, "82101e97e125e52e409a738fb8e891fe167e64e9": {"t": 1785755543.3313437, "n": 3703, "h": "9512b0fa8367c0eb", "c": "package org.example.apptest;\n\nimport com.alibaba.cloud.ai.graph.agent.ReactAgent;\nimport com.alibaba.cloud.ai.graph.agent.hook.shelltool.ShellToolAgentHook;\nimport com.alibaba.cloud.ai.graph.agent.hook.skills.SkillsAgentHook;\nimport com.alibaba.cloud.ai.graph.agent.interceptor.contextediting.ContextEditingInterceptor;\nimport com.alibaba.cloud.ai.graph.agent.tools.ShellTool2;\nimport com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;\nimport com.alibaba.cloud.ai.graph.skills.registry.SkillRegistry;\nimport com.alibaba.cloud.ai.graph.skills.registry.filesystem.FileSystemSkillRegistry;\nimport org.springframework.ai.chat.messages.AssistantMessage;\nimport org.springframework.ai.chat.model.ChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatModel;\nimport org.springframework.ai.deepseek.DeepSeekChatOptions;\nimport org.springframework.ai.deepseek.api.DeepSeekApi;\nimport org.springframework.core.io.ClassPathResource;\nimport org.springframework.core.io.Resource;\n\nimport java.net.URL;\nimport java.nio.file.Path;\nimport java.util.List;\n\npublic class TestSkills {\n public static void main(String[] args) throws Exception {\n // 初始化 ChatModel\n DeepSeekApi deepSeekApi = DeepSeekApi.builder()\n .apiKey(System.getenv(\"DEEPSEEK_API_KEY\"))\n .build();\n\n ChatModel chatModel = DeepSeekChatModel.builder()\n .deepSeekApi(deepSeekApi)\n .defaultOptions(DeepSeekChatOptions.builder()\n .model(\"deepseek-v4-pro\")\n .temperature(0.7)\n .build())\n .build();\n\n String skillsDirectory = getTestSkillsDirectory();\n\n // 1. 技能注册表:从 src/test/resources/skills 加载\n SkillRegistry registry = FileSystemSkillRegistry.builder()\n .projectSkillsDirectory(skillsDirectory)\n .build();\n\n // 2. Skills Hook:注册 read_skill 工具并注入技能列表到系统提示\n SkillsAgentHook skillsHook = SkillsAgentHook.builder()\n .skillRegistry(registry)\n .build();\n\n // 3. Shell Hook:工作目录设为技能根目录,便于执行 scripts/extract_pdf.py\n ShellToolAgentHook shellHook = ShellToolAgentHook.builder()\n .shellTool2(ShellTool2.builder(skillsDirectory + \"/skills/pdf-extractor\").build())\n .build();\n\n ContextEditingInterceptor build1 = ContextEditingInterceptor.builder().trigger(120000).clearAtLeast(60000).build();\n\n // 4. 构建 Agent\n ReactAgent agent = ReactAgent.builder()\n .name(\"skills-integration-agent\")\n .model(chatModel)\n .saver(new MemorySaver())\n .interceptors(build1)\n .hooks(List.of(skillsHook, shellHook))\n .enableLogging(true)\n .build();\n\n // 5. 使用真实 PDF 路径(与官方 AgentSkillsTest 一致)\n String pdfPath = skillsDirectory + \"/skills/pdf-extractor/saa-roadmap.pdf\";\n AssistantMessage response = agent.call(\"请从 \" + pdfPath + \" 文件中提取关键信息。\");\n\n System.out.println(\"回复内容:\");\n System.out.println(response.getText());\n }\n\n private static String getTestSkillsDirectory() throws Exception {\n Resource resource = new ClassPathResource(\"skills\");\n if (resource.exists() && resource.getFile().isDirectory()) {\n return resource.getFile().getAbsolutePath();\n }\n URL url = TestSkills.class.getClassLoader().getResource(\"skills\");\n if (url != null && \"file\".equals(url.getProtocol())) {\n return Path.of(url.toURI()).toString();\n }\n throw new IllegalStateException(\"Cannot find test skills directory under src/test/resources/skills\");\n }\n}\n"}}, "llm/langchain4j-app/src/main/java/org/example/Langchain4jApp.java": {"30bb0f3406775108e5df79eadda3cf777a0f0f49": {"t": 1785746124.3267722, "n": 4713, "h": "b91815a48f5a3a06", "c": "package org.example;\n\nimport dev.langchain4j.community.model.dashscope.QwenChatModel;\nimport dev.langchain4j.community.model.dashscope.WanxImageModel;\nimport dev.langchain4j.data.image.Image;\nimport dev.langchain4j.data.message.AiMessage;\nimport dev.langchain4j.data.message.ChatMessage;\nimport dev.langchain4j.data.message.UserMessage;\nimport dev.langchain4j.model.chat.ChatModel;\nimport dev.langchain4j.model.chat.response.ChatResponse;\nimport dev.langchain4j.model.ollama.OllamaChatModel;\nimport dev.langchain4j.model.openai.OpenAiChatModel;\nimport dev.langchain4j.model.output.Response;\nimport dev.langchain4j.service.AiServices;\nimport dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;\nimport org.example.tool.Calculator;\nimport org.junit.Test;\n\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * Hello world!\n */\npublic class Langchain4jApp {\n public static void main(String[] args) {\n deepseek();\n }\n\n\n public static void deepseek() {\n\n ChatModel model = OpenAiChatModel.builder()\n .baseUrl(\"https://api.deepseek.com/v1\")\n .apiKey(System.getenv(\"deepseek.api.key\"))\n .modelName(\"deepseek-reasoner\")\n .returnThinking(false)\n .build();\n InMemoryChatMemoryStore store = new InMemoryChatMemoryStore();\n String memoryId=\"foo\";\n List<ChatMessage> messages = store.getMessages(memoryId);\n messages.add(new UserMessage(\"请记住我叫刘德华,回答不要超过10个字\"));\n store.updateMessages(memoryId,messages);\n\n ChatResponse chat = model.chat(store.getMessages(memoryId));\n messages.add(chat.aiMessage());\n\n store.updateMessages(memoryId,messages);\n\n messages.add(new UserMessage(\"我叫什么名字?回答不要超过10个字\"));\n store.updateMessages(memoryId,store.getMessages(memoryId));\n System.out.println(store.getMessages(memoryId));\n\n System.out.println(\"....................\");\n ChatResponse chat2 = model.chat(store.getMessages(memoryId));\n System.out.println(chat2);\n\n\n\n }\n\n @Test\n public void ollama() {\n\n ChatModel model = OllamaChatModel.builder()\n .baseUrl(\"https://api.deepseek.com/v1\")\n .temperature(0.0)\n .logRequests(true)\n .logResponses(true)\n .modelName(\"TINY_DOLPHIN_MODEL\")\n .build();\n String result = model.chat(\"介绍一下你自己,不要超过10个字\");\n System.out.println(result);\n }\n @Test\n public void MemoryStore() {\n InMemoryChatMemoryStore store = new InMemoryChatMemoryStore();\n store.updateMessages(\"foo\", Arrays.asList(new UserMessage(\"abc def\"), new AiMessage(\"ghi jkl\")));\n\n List<ChatMessage> foo = store.getMessages(\"foo\");\n System.out.println(foo);\n store.deleteMessages(\"foo\");\n System.out.println(foo);\n\n }\n\n @Test\n public void wanxImageModel() {\n String getenv = System.getenv(\"ALI_AI_KEY\");\n WanxImageModel wanxImageModel = WanxImageModel.builder()\n .baseUrl(\"https://dashscope.aliyuncs.com/api/v1\")\n .modelName(\"wanx2.1-t2i-plus\")\n .apiKey(getenv)\n .build();\n\n Response<Image> response = wanxImageModel.generate(\"美女\");\n System.out.println(response.content().url());\n }\n @Test\n public void QwenChatModel() {\n String getenv = System.getenv(\"ALI_AI_KEY\");\n QwenChatModel qwenChatModel = QwenChatModel.builder()\n .baseUrl(\"https://dashscope.aliyuncs.com/api/v1\")\n .modelName(\"qwen3-vl-plus\")\n .apiKey(getenv)\n .build();\n\n// String result = qwenChatModel.chat(\"请介绍一下你自己,不要超过10个字\");\n String result = qwenChatModel.chat(\"langchain4j是由谁开发出来的?\");\n System.out.println(result);\n }\n interface Assistant {\n\n String chat(String userMessage);\n }\n\n @Test\n public void Tool() {\n String getenv = System.getenv(\"ALI_AI_KEY\");\n QwenChatModel model = QwenChatModel.builder()\n .baseUrl(\"https://dashscope.aliyuncs.com/api/v1\")\n .modelName(\"qwen-max\")\n .apiKey(getenv)\n .build();\n\n Assistant assistant = AiServices.builder(Assistant.class)\n .chatModel(model)\n .tools(new Calculator())\n .build();\n\n// String question = \"What is the square root of the sum of the numbers of letters in the words \\\"hello\\\" and \\\"world\\\"?\";\n// String question = \"请计算3和4的和是多少?\";\n String question = \"请将'redis'和‘mysql’拼接一下,直接返回结果,不要有多余的补充。\";\n\n String answer = assistant.chat(question);\n\n System.out.println(answer);\n }\n}\n"}, "ecd12b8290930b71a5925019b43f91a534521f86": {"t": 1785755544.67521, "n": 4713, "h": "b91815a48f5a3a06", "c": "package org.example;\n\nimport dev.langchain4j.community.model.dashscope.QwenChatModel;\nimport dev.langchain4j.community.model.dashscope.WanxImageModel;\nimport dev.langchain4j.data.image.Image;\nimport dev.langchain4j.data.message.AiMessage;\nimport dev.langchain4j.data.message.ChatMessage;\nimport dev.langchain4j.data.message.UserMessage;\nimport dev.langchain4j.model.chat.ChatModel;\nimport dev.langchain4j.model.chat.response.ChatResponse;\nimport dev.langchain4j.model.ollama.OllamaChatModel;\nimport dev.langchain4j.model.openai.OpenAiChatModel;\nimport dev.langchain4j.model.output.Response;\nimport dev.langchain4j.service.AiServices;\nimport dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;\nimport org.example.tool.Calculator;\nimport org.junit.Test;\n\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * Hello world!\n */\npublic class Langchain4jApp {\n public static void main(String[] args) {\n deepseek();\n }\n\n\n public static void deepseek() {\n\n ChatModel model = OpenAiChatModel.builder()\n .baseUrl(\"https://api.deepseek.com/v1\")\n .apiKey(System.getenv(\"deepseek.api.key\"))\n .modelName(\"deepseek-reasoner\")\n .returnThinking(false)\n .build();\n InMemoryChatMemoryStore store = new InMemoryChatMemoryStore();\n String memoryId=\"foo\";\n List<ChatMessage> messages = store.getMessages(memoryId);\n messages.add(new UserMessage(\"请记住我叫刘德华,回答不要超过10个字\"));\n store.updateMessages(memoryId,messages);\n\n ChatResponse chat = model.chat(store.getMessages(memoryId));\n messages.add(chat.aiMessage());\n\n store.updateMessages(memoryId,messages);\n\n messages.add(new UserMessage(\"我叫什么名字?回答不要超过10个字\"));\n store.updateMessages(memoryId,store.getMessages(memoryId));\n System.out.println(store.getMessages(memoryId));\n\n System.out.println(\"....................\");\n ChatResponse chat2 = model.chat(store.getMessages(memoryId));\n System.out.println(chat2);\n\n\n\n }\n\n @Test\n public void ollama() {\n\n ChatModel model = OllamaChatModel.builder()\n .baseUrl(\"https://api.deepseek.com/v1\")\n .temperature(0.0)\n .logRequests(true)\n .logResponses(true)\n .modelName(\"TINY_DOLPHIN_MODEL\")\n .build();\n String result = model.chat(\"介绍一下你自己,不要超过10个字\");\n System.out.println(result);\n }\n @Test\n public void MemoryStore() {\n InMemoryChatMemoryStore store = new InMemoryChatMemoryStore();\n store.updateMessages(\"foo\", Arrays.asList(new UserMessage(\"abc def\"), new AiMessage(\"ghi jkl\")));\n\n List<ChatMessage> foo = store.getMessages(\"foo\");\n System.out.println(foo);\n store.deleteMessages(\"foo\");\n System.out.println(foo);\n\n }\n\n @Test\n public void wanxImageModel() {\n String getenv = System.getenv(\"ALI_AI_KEY\");\n WanxImageModel wanxImageModel = WanxImageModel.builder()\n .baseUrl(\"https://dashscope.aliyuncs.com/api/v1\")\n .modelName(\"wanx2.1-t2i-plus\")\n .apiKey(getenv)\n .build();\n\n Response<Image> response = wanxImageModel.generate(\"美女\");\n System.out.println(response.content().url());\n }\n @Test\n public void QwenChatModel() {\n String getenv = System.getenv(\"ALI_AI_KEY\");\n QwenChatModel qwenChatModel = QwenChatModel.builder()\n .baseUrl(\"https://dashscope.aliyuncs.com/api/v1\")\n .modelName(\"qwen3-vl-plus\")\n .apiKey(getenv)\n .build();\n\n// String result = qwenChatModel.chat(\"请介绍一下你自己,不要超过10个字\");\n String result = qwenChatModel.chat(\"langchain4j是由谁开发出来的?\");\n System.out.println(result);\n }\n interface Assistant {\n\n String chat(String userMessage);\n }\n\n @Test\n public void Tool() {\n String getenv = System.getenv(\"ALI_AI_KEY\");\n QwenChatModel model = QwenChatModel.builder()\n .baseUrl(\"https://dashscope.aliyuncs.com/api/v1\")\n .modelName(\"qwen-max\")\n .apiKey(getenv)\n .build();\n\n Assistant assistant = AiServices.builder(Assistant.class)\n .chatModel(model)\n .tools(new Calculator())\n .build();\n\n// String question = \"What is the square root of the sum of the numbers of letters in the words \\\"hello\\\" and \\\"world\\\"?\";\n// String question = \"请计算3和4的和是多少?\";\n String question = \"请将'redis'和‘mysql’拼接一下,直接返回结果,不要有多余的补充。\";\n\n String answer = assistant.chat(question);\n\n System.out.println(answer);\n }\n}\n"}}, "llm/mcp-client/src/main/resources/application.properties": {"30bb0f3406775108e5df79eadda3cf777a0f0f49": {"t": 1786068461.7759323, "n": 411, "h": "0e93db404a3cb2d8", "c": "server.port=8088\n\nspring.ai.openai.api-key=${OPENAI_API_KEY}\nspring.ai.openai.base-url=https://api.deepseek.com\nspring.ai.openai.chat.options.model=deepseek-reasoner\n\nspring.ai.dashscope.api-key=${ALI_AI_KEY}\nspring.ai.dashscope.chat.options.model=qwen-max\n#spring.ai.mcp.client.sse.name=LocationNameService\n#spring.ai.mcp.client.type=ASYNC\nspring.ai.mcp.client.sse.connections.server.url=http://localhost:8080\n"}}}} |