Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/agents-flex_agents-flex.json
T

1 line
241 KiB
JSON

{"repo": "agents-flex/agents-flex", "files": {"demos/skills-demo/src/main/java/com/agentsflex/skills/SkillsConsoleDemoMain.java": {"8d98490336909545c2816b2f86e1eefab77f095f": {"t": 1785745655.8205125, "n": 8658, "h": "8230a0a7dce71642", "c": "package com.agentsflex.skills;\n\nimport com.agentsflex.core.message.AiMessage;\nimport com.agentsflex.core.message.ToolCall;\nimport com.agentsflex.core.message.ToolMessage;\nimport com.agentsflex.core.model.chat.StreamResponseListener;\nimport com.agentsflex.core.model.chat.response.AiMessageResponse;\nimport com.agentsflex.core.model.client.StreamContext;\nimport com.agentsflex.core.prompt.MemoryPrompt;\nimport com.agentsflex.core.util.StringUtil;\nimport com.agentsflex.model.chat.openai.OpenAIChatConfig;\nimport com.agentsflex.model.chat.openai.OpenAIChatModel;\nimport com.agentsflex.skill.SkillsTool;\nimport com.agentsflex.skill.runtime.SkillRuntime;\nimport com.alibaba.fastjson2.JSON;\nimport com.alibaba.fastjson2.JSONWriter;\n\nimport java.io.BufferedReader;\nimport java.io.InputStreamReader;\nimport java.nio.charset.StandardCharsets;\nimport java.util.List;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.concurrent.atomic.AtomicReference;\n\n/**\n * 可在控制台中持续输入问题的 Skills 多轮对话示例。\n */\npublic class SkillsConsoleDemoMain {\n\n public static void main(String[] args) throws Exception {\n SkillsDemoMain.disableObservabilityByDefault();\n\n String skillsDirectory = SkillsDemoMain.resolveSkillsDirectory();\n long turnTimeoutSeconds = SkillsDemoMain.environmentLong(\"SKILLS_DEMO_TIMEOUT_SECONDS\", 900L);\n OpenAIChatModel chatModel = createChatModel();\n\n try (SkillRuntime runtime = SkillsDemoMain.createRuntime();\n BufferedReader reader = new BufferedReader(\n new InputStreamReader(System.in, StandardCharsets.UTF_8))) {\n MemoryPrompt prompt = createPrompt(skillsDirectory, runtime);\n\n System.out.println(\"Skills directory: \" + skillsDirectory);\n System.out.println(\"Skill runtime: \" + runtime.getName());\n System.out.println(\"持续对话已启动。输入 /clear 清空对话历史,输入 /exit 或 /quit 退出。\\n\");\n\n while (true) {\n System.out.print(\"You> \");\n System.out.flush();\n String input = reader.readLine();\n if (input == null || isExitCommand(input)) {\n System.out.println(\"Bye.\");\n break;\n }\n if (\"/clear\".equalsIgnoreCase(input.trim())) {\n prompt.clear();\n System.out.println(\"对话历史已清空。\\n\");\n continue;\n }\n if (!StringUtil.hasText(input)) {\n continue;\n }\n\n prompt.addUserMessage(input.trim());\n System.out.print(\"Assistant> \");\n runTurn(chatModel, prompt, turnTimeoutSeconds);\n System.out.println();\n }\n }\n }\n\n private static OpenAIChatModel createChatModel() {\n return OpenAIChatConfig.builder()\n .provider(SkillsDemoMain.environment(\"DEEPSEEK_PROVIDER\", \"DeepSeek\"))\n .endpoint(SkillsDemoMain.environment(\"DEEPSEEK_ENDPOINT\", \"https://api.deepseek.com\"))\n .requestPath(SkillsDemoMain.environment(\"DEEPSEEK_REQUEST_PATH\", \"/chat/completions\"))\n .apiKey(SkillsDemoMain.requireEnvironment(\"DEEPSEEK_API_KEY\"))\n .model(SkillsDemoMain.environment(\"DEEPSEEK_MODEL\", \"deepseek-v4-pro\"))\n .logEnabled(Boolean.parseBoolean(\n SkillsDemoMain.environment(\"CHAT_LOG_ENABLED\", \"true\")))\n .buildModel();\n }\n\n private static MemoryPrompt createPrompt(String skillsDirectory, SkillRuntime runtime) {\n MemoryPrompt prompt = new MemoryPrompt();\n prompt.setSystemMessage(\"Always use the available skills when they match the request. \"\n + \"Run every shell command with the provided Bash tool in the configured skill runtime.\");\n prompt.addTools(SkillsTool.builder()\n .addSkillsDirectory(skillsDirectory)\n .runtime(runtime)\n .buildTools());\n return prompt;\n }\n\n private static void runTurn(OpenAIChatModel chatModel, MemoryPrompt prompt,\n long timeoutSeconds) throws InterruptedException {\n CountDownLatch completed = new CountDownLatch(1);\n AtomicReference<Throwable> failure = new AtomicReference<>();\n chatModel.chatStream(prompt, new ConsoleConversationListener(\n chatModel, prompt, completed, failure));\n\n if (!completed.await(timeoutSeconds, TimeUnit.SECONDS)) {\n throw new IllegalStateException(\"Conversation turn timed out after \"\n + timeoutSeconds + \" seconds\");\n }\n if (failure.get() != null) {\n throw new IllegalStateException(\"Conversation turn failed\", failure.get());\n }\n }\n\n private static boolean isExitCommand(String input) {\n String command = input.trim();\n return \"/exit\".equalsIgnoreCase(command) || \"/quit\".equalsIgnoreCase(command);\n }\n\n private static class ConsoleConversationListener implements StreamResponseListener {\n\n private final OpenAIChatModel chatModel;\n private final MemoryPrompt prompt;\n private final CountDownLatch completed;\n private final AtomicReference<Throwable> failure;\n private final AtomicBoolean streamActive = new AtomicBoolean(false);\n private final AtomicBoolean followUpStarted = new AtomicBoolean(false);\n\n private ConsoleConversationListener(OpenAIChatModel chatModel, MemoryPrompt prompt,\n CountDownLatch completed,\n AtomicReference<Throwable> failure) {\n this.chatModel = chatModel;\n this.prompt = prompt;\n this.completed = completed;\n this.failure = failure;\n }\n\n @Override\n public void onOpen(StreamContext context) {\n streamActive.set(true);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n try {\n if (response.isError()) {\n recordFailure(new IllegalStateException(response.getErrorMessage()));\n return;\n }\n\n AiMessage message = response.getMessage();\n if (message == null) {\n return;\n }\n String content = StringUtil.hasText(message.getContent())\n ? message.getContent() : message.getReasoningContent();\n if (content != null) {\n System.out.print(content);\n System.out.flush();\n }\n\n if (!message.isFinalDelta()) {\n return;\n }\n\n prompt.addMessage(message);\n if (!message.hasToolCalls()) {\n return;\n }\n\n System.out.println(\"\\n\\n---------- tools ----------\");\n for (ToolCall toolCall : message.getToolCalls()) {\n System.out.println(toolCall.getName() + \": \"\n + JSON.toJSONString(toolCall.getArgsMap(), JSONWriter.Feature.PrettyFormat));\n }\n List<ToolMessage> toolMessages = response.executeToolCallsAndGetToolMessages();\n for (ToolMessage toolMessage : toolMessages) {\n System.out.println(\"result: \" + toolMessage.getContent());\n }\n System.out.println(\"---------------------------\\n\");\n prompt.addMessages(toolMessages);\n followUpStarted.set(true);\n try {\n chatModel.chatStream(prompt, new ConsoleConversationListener(\n chatModel, prompt, completed, failure));\n } catch (RuntimeException e) {\n followUpStarted.set(false);\n throw e;\n }\n } catch (RuntimeException e) {\n recordFailure(e);\n }\n }\n\n @Override\n public void onError(StreamContext context, Throwable throwable) {\n recordFailure(throwable == null\n ? new IllegalStateException(\"Unknown model failure\") : throwable);\n }\n\n @Override\n public void onClose(StreamContext context) {\n if (streamActive.compareAndSet(true, false) && !followUpStarted.get()) {\n completed.countDown();\n }\n }\n\n private void recordFailure(Throwable throwable) {\n failure.compareAndSet(null, throwable);\n }\n }\n}\n"}, "5ca99d8c1fe87679751890b200c1b109725319d4": {"t": 1785755430.174862, "n": 8658, "h": "8230a0a7dce71642", "c": "package com.agentsflex.skills;\n\nimport com.agentsflex.core.message.AiMessage;\nimport com.agentsflex.core.message.ToolCall;\nimport com.agentsflex.core.message.ToolMessage;\nimport com.agentsflex.core.model.chat.StreamResponseListener;\nimport com.agentsflex.core.model.chat.response.AiMessageResponse;\nimport com.agentsflex.core.model.client.StreamContext;\nimport com.agentsflex.core.prompt.MemoryPrompt;\nimport com.agentsflex.core.util.StringUtil;\nimport com.agentsflex.model.chat.openai.OpenAIChatConfig;\nimport com.agentsflex.model.chat.openai.OpenAIChatModel;\nimport com.agentsflex.skill.SkillsTool;\nimport com.agentsflex.skill.runtime.SkillRuntime;\nimport com.alibaba.fastjson2.JSON;\nimport com.alibaba.fastjson2.JSONWriter;\n\nimport java.io.BufferedReader;\nimport java.io.InputStreamReader;\nimport java.nio.charset.StandardCharsets;\nimport java.util.List;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.concurrent.atomic.AtomicReference;\n\n/**\n * 可在控制台中持续输入问题的 Skills 多轮对话示例。\n */\npublic class SkillsConsoleDemoMain {\n\n public static void main(String[] args) throws Exception {\n SkillsDemoMain.disableObservabilityByDefault();\n\n String skillsDirectory = SkillsDemoMain.resolveSkillsDirectory();\n long turnTimeoutSeconds = SkillsDemoMain.environmentLong(\"SKILLS_DEMO_TIMEOUT_SECONDS\", 900L);\n OpenAIChatModel chatModel = createChatModel();\n\n try (SkillRuntime runtime = SkillsDemoMain.createRuntime();\n BufferedReader reader = new BufferedReader(\n new InputStreamReader(System.in, StandardCharsets.UTF_8))) {\n MemoryPrompt prompt = createPrompt(skillsDirectory, runtime);\n\n System.out.println(\"Skills directory: \" + skillsDirectory);\n System.out.println(\"Skill runtime: \" + runtime.getName());\n System.out.println(\"持续对话已启动。输入 /clear 清空对话历史,输入 /exit 或 /quit 退出。\\n\");\n\n while (true) {\n System.out.print(\"You> \");\n System.out.flush();\n String input = reader.readLine();\n if (input == null || isExitCommand(input)) {\n System.out.println(\"Bye.\");\n break;\n }\n if (\"/clear\".equalsIgnoreCase(input.trim())) {\n prompt.clear();\n System.out.println(\"对话历史已清空。\\n\");\n continue;\n }\n if (!StringUtil.hasText(input)) {\n continue;\n }\n\n prompt.addUserMessage(input.trim());\n System.out.print(\"Assistant> \");\n runTurn(chatModel, prompt, turnTimeoutSeconds);\n System.out.println();\n }\n }\n }\n\n private static OpenAIChatModel createChatModel() {\n return OpenAIChatConfig.builder()\n .provider(SkillsDemoMain.environment(\"DEEPSEEK_PROVIDER\", \"DeepSeek\"))\n .endpoint(SkillsDemoMain.environment(\"DEEPSEEK_ENDPOINT\", \"https://api.deepseek.com\"))\n .requestPath(SkillsDemoMain.environment(\"DEEPSEEK_REQUEST_PATH\", \"/chat/completions\"))\n .apiKey(SkillsDemoMain.requireEnvironment(\"DEEPSEEK_API_KEY\"))\n .model(SkillsDemoMain.environment(\"DEEPSEEK_MODEL\", \"deepseek-v4-pro\"))\n .logEnabled(Boolean.parseBoolean(\n SkillsDemoMain.environment(\"CHAT_LOG_ENABLED\", \"true\")))\n .buildModel();\n }\n\n private static MemoryPrompt createPrompt(String skillsDirectory, SkillRuntime runtime) {\n MemoryPrompt prompt = new MemoryPrompt();\n prompt.setSystemMessage(\"Always use the available skills when they match the request. \"\n + \"Run every shell command with the provided Bash tool in the configured skill runtime.\");\n prompt.addTools(SkillsTool.builder()\n .addSkillsDirectory(skillsDirectory)\n .runtime(runtime)\n .buildTools());\n return prompt;\n }\n\n private static void runTurn(OpenAIChatModel chatModel, MemoryPrompt prompt,\n long timeoutSeconds) throws InterruptedException {\n CountDownLatch completed = new CountDownLatch(1);\n AtomicReference<Throwable> failure = new AtomicReference<>();\n chatModel.chatStream(prompt, new ConsoleConversationListener(\n chatModel, prompt, completed, failure));\n\n if (!completed.await(timeoutSeconds, TimeUnit.SECONDS)) {\n throw new IllegalStateException(\"Conversation turn timed out after \"\n + timeoutSeconds + \" seconds\");\n }\n if (failure.get() != null) {\n throw new IllegalStateException(\"Conversation turn failed\", failure.get());\n }\n }\n\n private static boolean isExitCommand(String input) {\n String command = input.trim();\n return \"/exit\".equalsIgnoreCase(command) || \"/quit\".equalsIgnoreCase(command);\n }\n\n private static class ConsoleConversationListener implements StreamResponseListener {\n\n private final OpenAIChatModel chatModel;\n private final MemoryPrompt prompt;\n private final CountDownLatch completed;\n private final AtomicReference<Throwable> failure;\n private final AtomicBoolean streamActive = new AtomicBoolean(false);\n private final AtomicBoolean followUpStarted = new AtomicBoolean(false);\n\n private ConsoleConversationListener(OpenAIChatModel chatModel, MemoryPrompt prompt,\n CountDownLatch completed,\n AtomicReference<Throwable> failure) {\n this.chatModel = chatModel;\n this.prompt = prompt;\n this.completed = completed;\n this.failure = failure;\n }\n\n @Override\n public void onOpen(StreamContext context) {\n streamActive.set(true);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n try {\n if (response.isError()) {\n recordFailure(new IllegalStateException(response.getErrorMessage()));\n return;\n }\n\n AiMessage message = response.getMessage();\n if (message == null) {\n return;\n }\n String content = StringUtil.hasText(message.getContent())\n ? message.getContent() : message.getReasoningContent();\n if (content != null) {\n System.out.print(content);\n System.out.flush();\n }\n\n if (!message.isFinalDelta()) {\n return;\n }\n\n prompt.addMessage(message);\n if (!message.hasToolCalls()) {\n return;\n }\n\n System.out.println(\"\\n\\n---------- tools ----------\");\n for (ToolCall toolCall : message.getToolCalls()) {\n System.out.println(toolCall.getName() + \": \"\n + JSON.toJSONString(toolCall.getArgsMap(), JSONWriter.Feature.PrettyFormat));\n }\n List<ToolMessage> toolMessages = response.executeToolCallsAndGetToolMessages();\n for (ToolMessage toolMessage : toolMessages) {\n System.out.println(\"result: \" + toolMessage.getContent());\n }\n System.out.println(\"---------------------------\\n\");\n prompt.addMessages(toolMessages);\n followUpStarted.set(true);\n try {\n chatModel.chatStream(prompt, new ConsoleConversationListener(\n chatModel, prompt, completed, failure));\n } catch (RuntimeException e) {\n followUpStarted.set(false);\n throw e;\n }\n } catch (RuntimeException e) {\n recordFailure(e);\n }\n }\n\n @Override\n public void onError(StreamContext context, Throwable throwable) {\n recordFailure(throwable == null\n ? new IllegalStateException(\"Unknown model failure\") : throwable);\n }\n\n @Override\n public void onClose(StreamContext context) {\n if (streamActive.compareAndSet(true, false) && !followUpStarted.get()) {\n completed.countDown();\n }\n }\n\n private void recordFailure(Throwable throwable) {\n failure.compareAndSet(null, throwable);\n }\n }\n}\n"}, "ec28e62e6c63c998b15f7209d1d47e34c2f1ad20": {"t": 1785755431.7820513, "n": 8660, "h": "e1a7e0f8c909c1c8", "c": "package com.agentsflex.skills;\n\nimport com.agentsflex.core.message.AiMessage;\nimport com.agentsflex.core.message.ToolCall;\nimport com.agentsflex.core.message.ToolMessage;\nimport com.agentsflex.core.model.chat.StreamResponseListener;\nimport com.agentsflex.core.model.chat.response.AiMessageResponse;\nimport com.agentsflex.core.model.client.StreamContext;\nimport com.agentsflex.core.prompt.MemoryPrompt;\nimport com.agentsflex.core.util.StringUtil;\nimport com.agentsflex.model.chat.openai.OpenAIChatConfig;\nimport com.agentsflex.model.chat.openai.OpenAIChatModel;\nimport com.agentsflex.skill.SkillsTool;\nimport com.agentsflex.skill.runtime.SkillRuntime;\nimport com.alibaba.fastjson2.JSON;\nimport com.alibaba.fastjson2.JSONWriter;\n\nimport java.io.BufferedReader;\nimport java.io.InputStreamReader;\nimport java.nio.charset.StandardCharsets;\nimport java.util.List;\nimport java.util.concurrent.CountDownLatch;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.concurrent.atomic.AtomicReference;\n\n/**\n * 可在控制台中持续输入问题的 Skills 多轮对话示例。\n */\npublic class SkillsConsoleDemoMain {\n\n public static void main(String[] args) throws Exception {\n SkillsDemoMain.disableObservabilityByDefault();\n\n String skillsDirectory = SkillsDemoMain.resolveSkillsDirectory();\n long turnTimeoutSeconds = SkillsDemoMain.environmentLong(\"SKILLS_DEMO_TIMEOUT_SECONDS\", 900L);\n OpenAIChatModel chatModel = createChatModel();\n\n try (SkillRuntime runtime = SkillsDemoMain.createRuntime();\n BufferedReader reader = new BufferedReader(\n new InputStreamReader(System.in, StandardCharsets.UTF_8))) {\n MemoryPrompt prompt = createPrompt(skillsDirectory, runtime);\n\n System.out.println(\"Skills directory: \" + skillsDirectory);\n System.out.println(\"Skill runtime: \" + runtime.getName());\n System.out.println(\"持续对话已启动。输入 /clear 清空对话历史,输入 /exit 或 /quit 退出。\\n\");\n\n while (true) {\n System.out.print(\"You> \");\n System.out.flush();\n String input = reader.readLine();\n if (input == null || isExitCommand(input)) {\n System.out.println(\"Bye.\");\n break;\n }\n if (\"/clear\".equalsIgnoreCase(input.trim())) {\n prompt.clear();\n System.out.println(\"对话历史已清空。\\n\");\n continue;\n }\n if (!StringUtil.hasText(input)) {\n continue;\n }\n\n prompt.addUserMessage(input.trim());\n System.out.print(\"Assistant> \");\n runTurn(chatModel, prompt, turnTimeoutSeconds);\n System.out.println();\n }\n }\n }\n\n private static OpenAIChatModel createChatModel() {\n return OpenAIChatConfig.builder()\n .provider(SkillsDemoMain.environment(\"DEEPSEEK_PROVIDER\", \"DeepSeek\"))\n .endpoint(SkillsDemoMain.environment(\"DEEPSEEK_ENDPOINT\", \"https://api.deepseek.com\"))\n .requestPath(SkillsDemoMain.environment(\"DEEPSEEK_REQUEST_PATH\", \"/chat/completions\"))\n .apiKey(SkillsDemoMain.requireEnvironment(\"DEEPSEEK_API_KEY\"))\n .model(SkillsDemoMain.environment(\"DEEPSEEK_MODEL\", \"deepseek-v4-pro\"))\n .logEnabled(Boolean.parseBoolean(\n SkillsDemoMain.environment(\"CHAT_LOG_ENABLED\", \"true\")))\n .buildModel();\n }\n\n private static MemoryPrompt createPrompt(String skillsDirectory, SkillRuntime runtime) {\n MemoryPrompt prompt = new MemoryPrompt();\n prompt.setSystemMessage(\"Always use the available skills when they match the request. \"\n + \"Run every shell command with the provided Bash tool in the configured skill runtime.\");\n prompt.addTools(SkillsTool.builder()\n .addSkillsDirectory(skillsDirectory)\n .runtime(runtime)\n .buildTools());\n return prompt;\n }\n\n private static void runTurn(OpenAIChatModel chatModel, MemoryPrompt prompt,\n long timeoutSeconds) throws InterruptedException {\n CountDownLatch completed = new CountDownLatch(1);\n AtomicReference<Throwable> failure = new AtomicReference<>();\n chatModel.chatStream(prompt, new ConsoleConversationListener(\n chatModel, prompt, completed, failure));\n\n if (!completed.await(timeoutSeconds, TimeUnit.SECONDS)) {\n throw new IllegalStateException(\"Conversation turn timed out after \"\n + timeoutSeconds + \" seconds\");\n }\n if (failure.get() != null) {\n throw new IllegalStateException(\"Conversation turn failed\", failure.get());\n }\n }\n\n private static boolean isExitCommand(String input) {\n String command = input.trim();\n return \"/exit\".equalsIgnoreCase(command) || \"/quit\".equalsIgnoreCase(command);\n }\n\n private static class ConsoleConversationListener implements StreamResponseListener {\n\n private final OpenAIChatModel chatModel;\n private final MemoryPrompt prompt;\n private final CountDownLatch completed;\n private final AtomicReference<Throwable> failure;\n private final AtomicBoolean streamActive = new AtomicBoolean(false);\n private final AtomicBoolean followUpStarted = new AtomicBoolean(false);\n\n private ConsoleConversationListener(OpenAIChatModel chatModel, MemoryPrompt prompt,\n CountDownLatch completed,\n AtomicReference<Throwable> failure) {\n this.chatModel = chatModel;\n this.prompt = prompt;\n this.completed = completed;\n this.failure = failure;\n }\n\n @Override\n public void onStart(StreamContext context) {\n streamActive.set(true);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n try {\n if (response.isError()) {\n recordFailure(new IllegalStateException(response.getErrorMessage()));\n return;\n }\n\n AiMessage message = response.getMessage();\n if (message == null) {\n return;\n }\n String content = StringUtil.hasText(message.getContent())\n ? message.getContent() : message.getReasoningContent();\n if (content != null) {\n System.out.print(content);\n System.out.flush();\n }\n\n if (!message.isFinalDelta()) {\n return;\n }\n\n prompt.addMessage(message);\n if (!message.hasToolCalls()) {\n return;\n }\n\n System.out.println(\"\\n\\n---------- tools ----------\");\n for (ToolCall toolCall : message.getToolCalls()) {\n System.out.println(toolCall.getName() + \": \"\n + JSON.toJSONString(toolCall.getArgsMap(), JSONWriter.Feature.PrettyFormat));\n }\n List<ToolMessage> toolMessages = response.executeToolCallsAndGetToolMessages();\n for (ToolMessage toolMessage : toolMessages) {\n System.out.println(\"result: \" + toolMessage.getContent());\n }\n System.out.println(\"---------------------------\\n\");\n prompt.addMessages(toolMessages);\n followUpStarted.set(true);\n try {\n chatModel.chatStream(prompt, new ConsoleConversationListener(\n chatModel, prompt, completed, failure));\n } catch (RuntimeException e) {\n followUpStarted.set(false);\n throw e;\n }\n } catch (RuntimeException e) {\n recordFailure(e);\n }\n }\n\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n recordFailure(throwable == null\n ? new IllegalStateException(\"Unknown model failure\") : throwable);\n }\n\n @Override\n public void onStop(StreamContext context) {\n if (streamActive.compareAndSet(true, false) && !followUpStarted.get()) {\n completed.countDown();\n }\n }\n\n private void recordFailure(Throwable throwable) {\n failure.compareAndSet(null, throwable);\n }\n }\n}\n"}}, "agents-flex-chat/agents-flex-chat-openai/src/test/java/com/agentsflex/model/chat/openai/OpenAIChatModelTest.java": {"8d98490336909545c2816b2f86e1eefab77f095f": {"t": 1785746127.1569421, "n": 28332, "h": "6dd2424f3fe0e46b", "c": "package com.agentsflex.model.chat.openai;\n\nimport com.agentsflex.core.agent.react.ReActAgent;\nimport com.agentsflex.core.agent.react.ReActAgentListener;\nimport com.agentsflex.core.agent.react.ReActAgentState;\nimport com.agentsflex.core.agent.react.ReActStep;\nimport com.agentsflex.core.memory.ChatMemory;\nimport com.agentsflex.core.message.ToolCall;\nimport com.agentsflex.core.message.ToolMessage;\nimport com.agentsflex.core.message.UserMessage;\nimport com.agentsflex.core.model.chat.*;\nimport com.agentsflex.core.model.chat.response.AiMessageResponse;\nimport com.agentsflex.core.model.chat.tool.ProviderTool;\nimport com.agentsflex.core.model.chat.tool.Tool;\nimport com.agentsflex.core.model.chat.tool.ToolScanner;\nimport com.agentsflex.core.model.client.StreamContext;\nimport com.agentsflex.core.model.exception.ModelException;\nimport com.agentsflex.core.prompt.SimplePrompt;\nimport com.agentsflex.core.util.Maps;\nimport org.junit.Test;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\npublic class OpenAIChatModelTest {\n\n @Test(expected = ModelException.class)\n public void testChat() {\n\n String output = OpenAIChatConfig.builder()\n .endpoint(\"https://ai.gitee.com\")\n .provider(\"GiteeAI\")\n .model(\"Qwen3-32B\")\n .apiKey(\"PXW1****D12\")\n .buildModel()\n .chat(\"你叫什么名字\");\n\n System.out.println(output);\n }\n\n @Test()\n public void testChatStream() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"PXW1GXE***\");\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setLogEnabled(true);\n\n ChatOptions options = ChatOptions.builder().thinkingEnabled(false).build();\n options.setContextAttributes(Maps.of(\"name\", \"张三\"));\n\n ChatModel chatModel = new OpenAIChatModel(config);\n\n\n ChatModelTestUtils.waitForStream(chatModel, \"你叫什么名字\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n ChatContext x = ChatContextHolder.currentContext();\n System.out.println(x);\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onError(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onClose(StreamContext context) {\n ChatContext x = ChatContextHolder.currentContext();\n System.out.println(x);\n System.out.println(\"stop!!!!\");\n }\n }, options);\n\n }\n\n\n @Test()\n public void testChatStreamBailian() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32ab******57502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京的天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onError(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onClose(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test()\n public void testChatStreamBailianSearch() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32a*****502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max-2026-01-23\");\n config.addSupportProviderTools(\"web_search\", \"web_extractor\", \"code_interpreter\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"杭州明天天气如何\");\n// prompt.addToolsFromClass(WeatherFunctions.class);\n prompt.addTools(ProviderTool.ofList(\"web_search\", \"web_extractor\", \"code_interpreter\"));\n\n ChatOptions options = new ChatOptions();\n options.addExtraBody(\"enable_search\", true);\n// options.addExtraBody(\"search_options\", Maps.of(\"forced_search\",true));\n\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onError(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n// System.out.println(\"onMessage >>>>>\" + response.getMessage().getReasoningContent());\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onClose(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test\n public void testChatOllama() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setEndpoint(\"http://localhost:11434\");\n config.setModel(\"llama3\");\n config.setLogEnabled(true);\n\n ChatModel chatModel = new OpenAIChatModel(config);\n chatModel.chatStream(\"who are you\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onClose(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n// try {\n// Thread.sleep(2000);\n// } catch (InterruptedException e) {\n// throw new RuntimeException(e);\n// }\n }\n\n\n @Test()\n public void testChatWithImage() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-5gqOcl*****\");\n config.setModel(\"gpt-4-turbo\");\n config.setRetryEnabled(false);\n\n\n ChatModel chatModel = new OpenAIChatModel(config);\n SimplePrompt prompt = new SimplePrompt(\"What's in this image?\");\n prompt.addImageUrl(\"https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg\");\n\n\n AiMessageResponse response = chatModel.chat(prompt);\n System.out.println(response);\n }\n\n\n @Test()\n public void testFunctionCalling1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n System.out.println(response.executeToolCallsAndGetResults());\n // 阴转多云\n }\n\n @Test()\n public void testFunctionCalling2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling3() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57a\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling4() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57aa75\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling44() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d5\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling444() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n// config.setRequestPath(\"/api/v3/chat/completions\");\n// config.setModel(\"Qwen3-32B\");\n config.setModel(\"DeepSeek-V3.2\");\n config.setApiKey(\"PXW1G***L7D12\");\n config.setRetryEnabled(false);\n// config.setLogEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n// System.out.println(\"onMessage11 >>>>>\" + response);\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n List<ToolMessage> toolMessages = response.executeToolCallsAndGetToolMessages();\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(toolMessages);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::22\" + msg);\n }\n\n @Override\n public void onClose(StreamContext context) {\n System.out.println(\"onStop >>>>>\");\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n\n }\n\n\n @Test()\n public void testFunctionCalling5() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1G*********D12\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n// System.out.println(\"onMessage >>>>>\" + response);\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling55() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setApiKey(\"PXW1\");\n config.setRetryEnabled(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling56() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n config.setApiKey(\"PXW1\");\n config.setRetryEnabled(false);\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling6() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n\n System.out.println(llm.chat(prompt));\n\n }\n\n\n @Test()\n public void testReAct1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"****\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n// ReActAgent reActAgent = new ReActAgent(llm, functions, \"北京和上海的天气怎么样?\");\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"介绍一下北京\");\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n }\n\n @Override\n public void onNonActionResponse(AiMessageResponse response) {\n System.out.println(\"onNonActionResponse >>>>>\" + response.getMessage().getContent());\n }\n });\n\n reActAgent.execute();\n }\n\n\n @Test()\n public void testReAct2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen2-72B-Instruct\");\n config.setApiKey(\"*****\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"今天的天气怎么样?\");\n// reActAgent.setStreamable(true);\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onChatResponseStream(StreamContext context, AiMessageResponse response) {\n// System.out.print(response.getMessage().getContent());\n }\n\n @Override\n public void onRequestUserInput(String question) {\n System.out.println(\"onRequestUserInput>>>\" + question);\n\n ReActAgentState state = reActAgent.getState();\n state.addMessage(new UserMessage(\"我在北京市\"));\n ReActAgent newAgent = new ReActAgent(llm, tools, state);\n newAgent.addListener(this);\n newAgent.execute();\n }\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n ChatMemory memory = reActAgent.getMemoryPrompt().getMemory();\n System.out.println(memory);\n }\n\n @Override\n public void onNonActionResponseStream(StreamContext context) {\n System.out.println(\"onNonActionResponseStream >>>>>\" + context);\n }\n });\n\n reActAgent.execute();\n\n TimeUnit.SECONDS.sleep(20);\n }\n\n\n @Test()\n public void testBailian() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3.5-plus\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setLogEnabled(false);\n config.setApiKey(\"sk-\");\n config.setRetryEnabled(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n String content = response.getMessage().getContent();\n String msg = content != null ? content : response.getMessage().getReasoningContent();\n\n if (content != null)\n System.out.println(content);\n\n// if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n// System.out.println(\":::::::: start....\");\n// prompt.setAiMessage(response.getMessage());\n// prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n// llm.chatStream(prompt, new StreamResponseListener() {\n// @Override\n// public void onMessage(StreamContext context, AiMessageResponse response) {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\":::\" + msg);\n// }\n// });\n// } else {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\">>>\" + msg);\n// }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n\n @Test()\n public void testDeepseek() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://api.deepseek.com\");\n config.setRequestPath(\"/chat/completions\");\n config.setModel(\"deepseek-v4-pro\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setLogEnabled(false);\n config.setApiKey(\"sk-***691\");\n config.setRetryEnabled(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n String content = response.getMessage().getContent();\n String msg = content != null ? content : \"[null]\";\n\n System.out.println(\">>>>>> raw: \" + response.getRawText());\n System.out.println(\">>>>>> msg: \" + msg +\" lastMsg: \" + response.getMessage().isFinalDelta());\n\n// if (content != null)\n// System.out.println(content);\n\n// if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n// System.out.println(\":::::::: start....\");\n// prompt.setAiMessage(response.getMessage());\n// prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n// llm.chatStream(prompt, new StreamResponseListener() {\n// @Override\n// public void onMessage(StreamContext context, AiMessageResponse response) {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\":::\" + msg);\n// }\n// });\n// } else {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\">>>\" + msg);\n// }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n}\n"}, "5ca99d8c1fe87679751890b200c1b109725319d4": {"t": 1785755429.2551503, "n": 28332, "h": "6dd2424f3fe0e46b", "c": "package com.agentsflex.model.chat.openai;\n\nimport com.agentsflex.core.agent.react.ReActAgent;\nimport com.agentsflex.core.agent.react.ReActAgentListener;\nimport com.agentsflex.core.agent.react.ReActAgentState;\nimport com.agentsflex.core.agent.react.ReActStep;\nimport com.agentsflex.core.memory.ChatMemory;\nimport com.agentsflex.core.message.ToolCall;\nimport com.agentsflex.core.message.ToolMessage;\nimport com.agentsflex.core.message.UserMessage;\nimport com.agentsflex.core.model.chat.*;\nimport com.agentsflex.core.model.chat.response.AiMessageResponse;\nimport com.agentsflex.core.model.chat.tool.ProviderTool;\nimport com.agentsflex.core.model.chat.tool.Tool;\nimport com.agentsflex.core.model.chat.tool.ToolScanner;\nimport com.agentsflex.core.model.client.StreamContext;\nimport com.agentsflex.core.model.exception.ModelException;\nimport com.agentsflex.core.prompt.SimplePrompt;\nimport com.agentsflex.core.util.Maps;\nimport org.junit.Test;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\npublic class OpenAIChatModelTest {\n\n @Test(expected = ModelException.class)\n public void testChat() {\n\n String output = OpenAIChatConfig.builder()\n .endpoint(\"https://ai.gitee.com\")\n .provider(\"GiteeAI\")\n .model(\"Qwen3-32B\")\n .apiKey(\"PXW1****D12\")\n .buildModel()\n .chat(\"你叫什么名字\");\n\n System.out.println(output);\n }\n\n @Test()\n public void testChatStream() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"PXW1GXE***\");\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setLogEnabled(true);\n\n ChatOptions options = ChatOptions.builder().thinkingEnabled(false).build();\n options.setContextAttributes(Maps.of(\"name\", \"张三\"));\n\n ChatModel chatModel = new OpenAIChatModel(config);\n\n\n ChatModelTestUtils.waitForStream(chatModel, \"你叫什么名字\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n ChatContext x = ChatContextHolder.currentContext();\n System.out.println(x);\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onError(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onClose(StreamContext context) {\n ChatContext x = ChatContextHolder.currentContext();\n System.out.println(x);\n System.out.println(\"stop!!!!\");\n }\n }, options);\n\n }\n\n\n @Test()\n public void testChatStreamBailian() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32ab******57502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京的天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onError(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onClose(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test()\n public void testChatStreamBailianSearch() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32a*****502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max-2026-01-23\");\n config.addSupportProviderTools(\"web_search\", \"web_extractor\", \"code_interpreter\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"杭州明天天气如何\");\n// prompt.addToolsFromClass(WeatherFunctions.class);\n prompt.addTools(ProviderTool.ofList(\"web_search\", \"web_extractor\", \"code_interpreter\"));\n\n ChatOptions options = new ChatOptions();\n options.addExtraBody(\"enable_search\", true);\n// options.addExtraBody(\"search_options\", Maps.of(\"forced_search\",true));\n\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onError(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n// System.out.println(\"onMessage >>>>>\" + response.getMessage().getReasoningContent());\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onClose(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test\n public void testChatOllama() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setEndpoint(\"http://localhost:11434\");\n config.setModel(\"llama3\");\n config.setLogEnabled(true);\n\n ChatModel chatModel = new OpenAIChatModel(config);\n chatModel.chatStream(\"who are you\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onClose(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n// try {\n// Thread.sleep(2000);\n// } catch (InterruptedException e) {\n// throw new RuntimeException(e);\n// }\n }\n\n\n @Test()\n public void testChatWithImage() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-5gqOcl*****\");\n config.setModel(\"gpt-4-turbo\");\n config.setRetryEnabled(false);\n\n\n ChatModel chatModel = new OpenAIChatModel(config);\n SimplePrompt prompt = new SimplePrompt(\"What's in this image?\");\n prompt.addImageUrl(\"https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg\");\n\n\n AiMessageResponse response = chatModel.chat(prompt);\n System.out.println(response);\n }\n\n\n @Test()\n public void testFunctionCalling1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n System.out.println(response.executeToolCallsAndGetResults());\n // 阴转多云\n }\n\n @Test()\n public void testFunctionCalling2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling3() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57a\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling4() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57aa75\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling44() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d5\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling444() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n// config.setRequestPath(\"/api/v3/chat/completions\");\n// config.setModel(\"Qwen3-32B\");\n config.setModel(\"DeepSeek-V3.2\");\n config.setApiKey(\"PXW1G***L7D12\");\n config.setRetryEnabled(false);\n// config.setLogEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n// System.out.println(\"onMessage11 >>>>>\" + response);\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n List<ToolMessage> toolMessages = response.executeToolCallsAndGetToolMessages();\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(toolMessages);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::22\" + msg);\n }\n\n @Override\n public void onClose(StreamContext context) {\n System.out.println(\"onStop >>>>>\");\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n\n }\n\n\n @Test()\n public void testFunctionCalling5() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1G*********D12\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n// System.out.println(\"onMessage >>>>>\" + response);\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling55() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setApiKey(\"PXW1\");\n config.setRetryEnabled(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling56() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n config.setApiKey(\"PXW1\");\n config.setRetryEnabled(false);\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling6() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n\n System.out.println(llm.chat(prompt));\n\n }\n\n\n @Test()\n public void testReAct1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"****\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n// ReActAgent reActAgent = new ReActAgent(llm, functions, \"北京和上海的天气怎么样?\");\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"介绍一下北京\");\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n }\n\n @Override\n public void onNonActionResponse(AiMessageResponse response) {\n System.out.println(\"onNonActionResponse >>>>>\" + response.getMessage().getContent());\n }\n });\n\n reActAgent.execute();\n }\n\n\n @Test()\n public void testReAct2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen2-72B-Instruct\");\n config.setApiKey(\"*****\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"今天的天气怎么样?\");\n// reActAgent.setStreamable(true);\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onChatResponseStream(StreamContext context, AiMessageResponse response) {\n// System.out.print(response.getMessage().getContent());\n }\n\n @Override\n public void onRequestUserInput(String question) {\n System.out.println(\"onRequestUserInput>>>\" + question);\n\n ReActAgentState state = reActAgent.getState();\n state.addMessage(new UserMessage(\"我在北京市\"));\n ReActAgent newAgent = new ReActAgent(llm, tools, state);\n newAgent.addListener(this);\n newAgent.execute();\n }\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n ChatMemory memory = reActAgent.getMemoryPrompt().getMemory();\n System.out.println(memory);\n }\n\n @Override\n public void onNonActionResponseStream(StreamContext context) {\n System.out.println(\"onNonActionResponseStream >>>>>\" + context);\n }\n });\n\n reActAgent.execute();\n\n TimeUnit.SECONDS.sleep(20);\n }\n\n\n @Test()\n public void testBailian() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3.5-plus\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setLogEnabled(false);\n config.setApiKey(\"sk-\");\n config.setRetryEnabled(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n String content = response.getMessage().getContent();\n String msg = content != null ? content : response.getMessage().getReasoningContent();\n\n if (content != null)\n System.out.println(content);\n\n// if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n// System.out.println(\":::::::: start....\");\n// prompt.setAiMessage(response.getMessage());\n// prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n// llm.chatStream(prompt, new StreamResponseListener() {\n// @Override\n// public void onMessage(StreamContext context, AiMessageResponse response) {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\":::\" + msg);\n// }\n// });\n// } else {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\">>>\" + msg);\n// }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n\n @Test()\n public void testDeepseek() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://api.deepseek.com\");\n config.setRequestPath(\"/chat/completions\");\n config.setModel(\"deepseek-v4-pro\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setLogEnabled(false);\n config.setApiKey(\"sk-***691\");\n config.setRetryEnabled(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n String content = response.getMessage().getContent();\n String msg = content != null ? content : \"[null]\";\n\n System.out.println(\">>>>>> raw: \" + response.getRawText());\n System.out.println(\">>>>>> msg: \" + msg +\" lastMsg: \" + response.getMessage().isFinalDelta());\n\n// if (content != null)\n// System.out.println(content);\n\n// if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n// System.out.println(\":::::::: start....\");\n// prompt.setAiMessage(response.getMessage());\n// prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n// llm.chatStream(prompt, new StreamResponseListener() {\n// @Override\n// public void onMessage(StreamContext context, AiMessageResponse response) {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\":::\" + msg);\n// }\n// });\n// } else {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\">>>\" + msg);\n// }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n}\n"}, "2c9423d263b6ca283e32b435fe618f173ce61fd8": {"t": 1785755431.0909922, "n": 28333, "h": "0301ebcc55f5a173", "c": "package com.agentsflex.model.chat.openai;\n\nimport com.agentsflex.core.agent.react.ReActAgent;\nimport com.agentsflex.core.agent.react.ReActAgentListener;\nimport com.agentsflex.core.agent.react.ReActAgentState;\nimport com.agentsflex.core.agent.react.ReActStep;\nimport com.agentsflex.core.memory.ChatMemory;\nimport com.agentsflex.core.message.ToolCall;\nimport com.agentsflex.core.message.ToolMessage;\nimport com.agentsflex.core.message.UserMessage;\nimport com.agentsflex.core.model.chat.*;\nimport com.agentsflex.core.model.chat.response.AiMessageResponse;\nimport com.agentsflex.core.model.chat.tool.ProviderTool;\nimport com.agentsflex.core.model.chat.tool.Tool;\nimport com.agentsflex.core.model.chat.tool.ToolScanner;\nimport com.agentsflex.core.model.client.StreamContext;\nimport com.agentsflex.core.model.exception.ModelException;\nimport com.agentsflex.core.prompt.SimplePrompt;\nimport com.agentsflex.core.util.Maps;\nimport org.junit.Test;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\npublic class OpenAIChatModelTest {\n\n @Test(expected = ModelException.class)\n public void testChat() {\n\n String output = OpenAIChatConfig.builder()\n .endpoint(\"https://ai.gitee.com\")\n .provider(\"GiteeAI\")\n .model(\"Qwen3-32B\")\n .apiKey(\"PXW1****D12\")\n .buildModel()\n .chat(\"你叫什么名字\");\n\n System.out.println(output);\n }\n\n @Test()\n public void testChatStream() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"PXW1GXE***\");\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setLogEnabled(true);\n\n ChatOptions options = ChatOptions.builder().thinkingEnabled(false).build();\n options.setContextAttributes(Maps.of(\"name\", \"张三\"));\n\n ChatModel chatModel = new OpenAIChatModel(config);\n\n\n ChatModelTestUtils.waitForStream(chatModel, \"你叫什么名字\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n ChatContext x = ChatContextHolder.currentContext();\n System.out.println(x);\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onStop(StreamContext context) {\n ChatContext x = ChatContextHolder.currentContext();\n System.out.println(x);\n System.out.println(\"stop!!!!\");\n }\n }, options);\n\n }\n\n\n @Test()\n public void testChatStreamBailian() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32ab******57502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京的天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test()\n public void testChatStreamBailianSearch() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32a*****502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max-2026-01-23\");\n config.addSupportProviderTools(\"web_search\", \"web_extractor\", \"code_interpreter\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"杭州明天天气如何\");\n// prompt.addToolsFromClass(WeatherFunctions.class);\n prompt.addTools(ProviderTool.ofList(\"web_search\", \"web_extractor\", \"code_interpreter\"));\n\n ChatOptions options = new ChatOptions();\n options.addExtraBody(\"enable_search\", true);\n// options.addExtraBody(\"search_options\", Maps.of(\"forced_search\",true));\n\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n// System.out.println(\"onMessage >>>>>\" + response.getMessage().getReasoningContent());\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test\n public void testChatOllama() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setEndpoint(\"http://localhost:11434\");\n config.setModel(\"llama3\");\n config.setLogEnabled(true);\n\n ChatModel chatModel = new OpenAIChatModel(config);\n chatModel.chatStream(\"who are you\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n// try {\n// Thread.sleep(2000);\n// } catch (InterruptedException e) {\n// throw new RuntimeException(e);\n// }\n }\n\n\n @Test()\n public void testChatWithImage() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-5gqOcl*****\");\n config.setModel(\"gpt-4-turbo\");\n config.setRetryEnabled(false);\n\n\n ChatModel chatModel = new OpenAIChatModel(config);\n SimplePrompt prompt = new SimplePrompt(\"What's in this image?\");\n prompt.addImageUrl(\"https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg\");\n\n\n AiMessageResponse response = chatModel.chat(prompt);\n System.out.println(response);\n }\n\n\n @Test()\n public void testFunctionCalling1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n System.out.println(response.executeToolCallsAndGetResults());\n // 阴转多云\n }\n\n @Test()\n public void testFunctionCalling2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling3() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57a\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling4() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57aa75\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling44() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d5\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling444() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n// config.setRequestPath(\"/api/v3/chat/completions\");\n// config.setModel(\"Qwen3-32B\");\n config.setModel(\"DeepSeek-V3.2\");\n config.setApiKey(\"PXW1G***L7D12\");\n config.setRetryEnabled(false);\n// config.setLogEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n// System.out.println(\"onMessage11 >>>>>\" + response);\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n List<ToolMessage> toolMessages = response.executeToolCallsAndGetToolMessages();\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(toolMessages);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::22\" + msg);\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"onStop >>>>>\");\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n\n }\n\n\n @Test()\n public void testFunctionCalling5() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1G*********D12\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n// System.out.println(\"onMessage >>>>>\" + response);\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling55() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setApiKey(\"PXW1\");\n config.setRetryEnabled(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling56() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n config.setApiKey(\"PXW1\");\n config.setRetryEnabled(false);\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling6() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n\n System.out.println(llm.chat(prompt));\n\n }\n\n\n @Test()\n public void testReAct1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"****\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n// ReActAgent reActAgent = new ReActAgent(llm, functions, \"北京和上海的天气怎么样?\");\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"介绍一下北京\");\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n }\n\n @Override\n public void onNonActionResponse(AiMessageResponse response) {\n System.out.println(\"onNonActionResponse >>>>>\" + response.getMessage().getContent());\n }\n });\n\n reActAgent.execute();\n }\n\n\n @Test()\n public void testReAct2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen2-72B-Instruct\");\n config.setApiKey(\"*****\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"今天的天气怎么样?\");\n// reActAgent.setStreamable(true);\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onChatResponseStream(StreamContext context, AiMessageResponse response) {\n// System.out.print(response.getMessage().getContent());\n }\n\n @Override\n public void onRequestUserInput(String question) {\n System.out.println(\"onRequestUserInput>>>\" + question);\n\n ReActAgentState state = reActAgent.getState();\n state.addMessage(new UserMessage(\"我在北京市\"));\n ReActAgent newAgent = new ReActAgent(llm, tools, state);\n newAgent.addListener(this);\n newAgent.execute();\n }\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n ChatMemory memory = reActAgent.getMemoryPrompt().getMemory();\n System.out.println(memory);\n }\n\n @Override\n public void onNonActionResponseStream(StreamContext context) {\n System.out.println(\"onNonActionResponseStream >>>>>\" + context);\n }\n });\n\n reActAgent.execute();\n\n TimeUnit.SECONDS.sleep(20);\n }\n\n\n @Test()\n public void testBailian() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3.5-plus\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setLogEnabled(false);\n config.setApiKey(\"sk-\");\n config.setRetryEnabled(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n String content = response.getMessage().getContent();\n String msg = content != null ? content : response.getMessage().getReasoningContent();\n\n if (content != null)\n System.out.println(content);\n\n// if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n// System.out.println(\":::::::: start....\");\n// prompt.setAiMessage(response.getMessage());\n// prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n// llm.chatStream(prompt, new StreamResponseListener() {\n// @Override\n// public void onMessage(StreamContext context, AiMessageResponse response) {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\":::\" + msg);\n// }\n// });\n// } else {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\">>>\" + msg);\n// }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n\n @Test()\n public void testDeepseek() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://api.deepseek.com\");\n config.setRequestPath(\"/chat/completions\");\n config.setModel(\"deepseek-v4-pro\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setLogEnabled(false);\n config.setApiKey(\"sk-***691\");\n config.setRetryEnabled(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n String content = response.getMessage().getContent();\n String msg = content != null ? content : \"[null]\";\n\n System.out.println(\">>>>>> raw: \" + response.getRawText());\n System.out.println(\">>>>>> msg: \" + msg +\" lastMsg: \" + response.getMessage().isFinalDelta());\n\n// if (content != null)\n// System.out.println(content);\n\n// if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n// System.out.println(\":::::::: start....\");\n// prompt.setAiMessage(response.getMessage());\n// prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n// llm.chatStream(prompt, new StreamResponseListener() {\n// @Override\n// public void onMessage(StreamContext context, AiMessageResponse response) {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\":::\" + msg);\n// }\n// });\n// } else {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\">>>\" + msg);\n// }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n}\n"}, "17a0f04ccfe6cecb83391cb3ad819e6af4060dc5": {"t": 1785755434.12444, "n": 25891, "h": "342250ccf8967edf", "c": "package com.agentsflex.model.chat.openai;\n\nimport com.agentsflex.core.agent.react.ReActAgent;\nimport com.agentsflex.core.agent.react.ReActAgentListener;\nimport com.agentsflex.core.agent.react.ReActAgentState;\nimport com.agentsflex.core.agent.react.ReActStep;\nimport com.agentsflex.core.memory.ChatMemory;\nimport com.agentsflex.core.message.ToolCall;\nimport com.agentsflex.core.message.ToolMessage;\nimport com.agentsflex.core.message.UserMessage;\nimport com.agentsflex.core.model.chat.*;\nimport com.agentsflex.core.model.chat.response.AiMessageResponse;\nimport com.agentsflex.core.model.chat.tool.ProviderTool;\nimport com.agentsflex.core.model.chat.tool.Tool;\nimport com.agentsflex.core.model.chat.tool.ToolScanner;\nimport com.agentsflex.core.model.client.StreamContext;\nimport com.agentsflex.core.model.exception.ModelException;\nimport com.agentsflex.core.prompt.SimplePrompt;\nimport com.agentsflex.core.util.Maps;\nimport org.junit.Test;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\npublic class OpenAIChatModelTest {\n\n @Test(expected = ModelException.class)\n public void testChat() {\n\n String output = OpenAIChatConfig.builder()\n .endpoint(\"https://ai.gitee.com\")\n .provider(\"GiteeAI\")\n .model(\"Qwen3-32B\")\n .apiKey(\"PXW1****D12\")\n .buildModel()\n .chat(\"你叫什么名字\");\n\n System.out.println(output);\n }\n\n @Test()\n public void testChatStream() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"PXW1GXE***\");\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setLogEnabled(true);\n\n ChatOptions options = ChatOptions.builder().thinkingEnabled(false).build();\n options.setContextAttributes(Maps.of(\"name\", \"张三\"));\n\n ChatModel chatModel = new OpenAIChatModel(config);\n\n\n ChatModelTestUtils.waitForStream(chatModel, \"你叫什么名字\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n ChatContext x = ChatContextHolder.currentContext();\n System.out.println(x);\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onStop(StreamContext context) {\n ChatContext x = ChatContextHolder.currentContext();\n System.out.println(x);\n System.out.println(\"stop!!!!\");\n }\n }, options);\n\n }\n\n\n @Test()\n public void testChatStreamBailian() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32ab******57502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京的天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test()\n public void testChatStreamBailianSearch() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32a*****502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max-2026-01-23\");\n config.addSupportProviderTools(\"web_search\", \"web_extractor\", \"code_interpreter\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"杭州明天天气如何\");\n// prompt.addToolsFromClass(WeatherFunctions.class);\n prompt.addTools(ProviderTool.ofList(\"web_search\", \"web_extractor\", \"code_interpreter\"));\n\n ChatOptions options = new ChatOptions();\n options.addExtraBody(\"enable_search\", true);\n// options.addExtraBody(\"search_options\", Maps.of(\"forced_search\",true));\n\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n// System.out.println(\"onMessage >>>>>\" + response.getMessage().getReasoningContent());\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test\n public void testChatOllama() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setEndpoint(\"http://localhost:11434\");\n config.setModel(\"llama3\");\n config.setLogEnabled(true);\n\n ChatModel chatModel = new OpenAIChatModel(config);\n chatModel.chatStream(\"who are you\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n// try {\n// Thread.sleep(2000);\n// } catch (InterruptedException e) {\n// throw new RuntimeException(e);\n// }\n }\n\n\n @Test()\n public void testChatWithImage() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-5gqOcl*****\");\n config.setModel(\"gpt-4-turbo\");\n config.setRetryEnabled(false);\n\n\n ChatModel chatModel = new OpenAIChatModel(config);\n SimplePrompt prompt = new SimplePrompt(\"What's in this image?\");\n prompt.addImageUrl(\"https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg\");\n\n\n AiMessageResponse response = chatModel.chat(prompt);\n System.out.println(response);\n }\n\n\n @Test()\n public void testFunctionCalling1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n System.out.println(response.executeToolCallsAndGetResults());\n // 阴转多云\n }\n\n @Test()\n public void testFunctionCalling2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling3() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57a\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling4() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57aa75\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling44() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d5\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling444() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n// config.setRequestPath(\"/api/v3/chat/completions\");\n// config.setModel(\"Qwen3-32B\");\n config.setModel(\"DeepSeek-V3.2\");\n config.setApiKey(\"PXW1G***L7D12\");\n config.setRetryEnabled(false);\n// config.setLogEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n// System.out.println(\"onMessage11 >>>>>\" + response);\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n List<ToolMessage> toolMessages = response.executeToolCallsAndGetToolMessages();\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(toolMessages);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::22\" + msg);\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"onStop >>>>>\");\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n\n }\n\n\n @Test()\n public void testFunctionCalling5() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1G*********D12\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n// System.out.println(\"onMessage >>>>>\" + response);\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling55() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setApiKey(\"PXW1\");\n config.setRetryEnabled(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling56() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n config.setApiKey(\"PXW1\");\n config.setRetryEnabled(false);\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling6() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n\n System.out.println(llm.chat(prompt));\n\n }\n\n\n @Test()\n public void testReAct1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"****\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n// ReActAgent reActAgent = new ReActAgent(llm, functions, \"北京和上海的天气怎么样?\");\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"介绍一下北京\");\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n }\n\n @Override\n public void onNonActionResponse(AiMessageResponse response) {\n System.out.println(\"onNonActionResponse >>>>>\" + response.getMessage().getContent());\n }\n });\n\n reActAgent.execute();\n }\n\n\n @Test()\n public void testReAct2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen2-72B-Instruct\");\n config.setApiKey(\"*****\");\n config.setRetryEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"今天的天气怎么样?\");\n// reActAgent.setStreamable(true);\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onChatResponseStream(StreamContext context, AiMessageResponse response) {\n// System.out.print(response.getMessage().getContent());\n }\n\n @Override\n public void onRequestUserInput(String question) {\n System.out.println(\"onRequestUserInput>>>\" + question);\n\n ReActAgentState state = reActAgent.getState();\n state.addMessage(new UserMessage(\"我在北京市\"));\n ReActAgent newAgent = new ReActAgent(llm, tools, state);\n newAgent.addListener(this);\n newAgent.execute();\n }\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n ChatMemory memory = reActAgent.getMemoryPrompt().getMemory();\n System.out.println(memory);\n }\n\n @Override\n public void onNonActionResponseStream(StreamContext context) {\n System.out.println(\"onNonActionResponseStream >>>>>\" + context);\n }\n });\n\n reActAgent.execute();\n\n TimeUnit.SECONDS.sleep(20);\n }\n\n\n @Test()\n public void testBailian() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3.5-plus\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setLogEnabled(false);\n config.setApiKey(\"sk-\");\n config.setRetryEnabled(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n String content = response.getMessage().getContent();\n String msg = content != null ? content : response.getMessage().getReasoningContent();\n\n if (content != null)\n System.out.println(content);\n\n// if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n// System.out.println(\":::::::: start....\");\n// prompt.setAiMessage(response.getMessage());\n// prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n// llm.chatStream(prompt, new StreamResponseListener() {\n// @Override\n// public void onMessage(StreamContext context, AiMessageResponse response) {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\":::\" + msg);\n// }\n// });\n// } else {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\">>>\" + msg);\n// }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n}\n"}, "418447e4bbdefec2ec87d490a4a6982f94185e36": {"t": 1785755435.842826, "n": 25384, "h": "ea4af9797abab6b6", "c": "package com.agentsflex.model.chat.openai;\n\nimport com.agentsflex.core.agent.react.ReActAgent;\nimport com.agentsflex.core.agent.react.ReActAgentListener;\nimport com.agentsflex.core.agent.react.ReActAgentState;\nimport com.agentsflex.core.agent.react.ReActStep;\nimport com.agentsflex.core.memory.ChatMemory;\nimport com.agentsflex.core.message.ToolCall;\nimport com.agentsflex.core.message.ToolMessage;\nimport com.agentsflex.core.message.UserMessage;\nimport com.agentsflex.core.model.chat.*;\nimport com.agentsflex.core.model.chat.response.AiMessageResponse;\nimport com.agentsflex.core.model.chat.tool.ProviderTool;\nimport com.agentsflex.core.model.chat.tool.Tool;\nimport com.agentsflex.core.model.chat.tool.ToolScanner;\nimport com.agentsflex.core.model.client.StreamContext;\nimport com.agentsflex.core.model.exception.ModelException;\nimport com.agentsflex.core.prompt.SimplePrompt;\nimport com.agentsflex.core.util.Maps;\nimport org.junit.Test;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\npublic class OpenAIChatModelTest {\n\n @Test(expected = ModelException.class)\n public void testChat() {\n\n String output = OpenAIChatConfig.builder()\n .endpoint(\"https://ai.gitee.com\")\n .provider(\"GiteeAI\")\n .model(\"Qwen3-32B\")\n .apiKey(\"PXW1****D12\")\n .buildModel()\n .chat(\"你叫什么名字\");\n\n System.out.println(output);\n }\n\n @Test()\n public void testChatStream() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"PXW1GXE***\");\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setLogEnabled(true);\n\n ChatOptions options = ChatOptions.builder().thinkingEnabled(false).build();\n options.setContextAttributes(Maps.of(\"name\", \"张三\"));\n\n ChatModel chatModel = new OpenAIChatModel(config);\n\n\n ChatModelTestUtils.waitForStream(chatModel, \"你叫什么名字\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n ChatContext x = ChatContextHolder.currentContext();\n System.out.println(x);\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onStop(StreamContext context) {\n ChatContext x = ChatContextHolder.currentContext();\n System.out.println(x);\n System.out.println(\"stop!!!!\");\n }\n }, options);\n\n }\n\n\n @Test()\n public void testChatStreamBailian() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32ab******57502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京的天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test()\n public void testChatStreamBailianSearch() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32a*****502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max-2026-01-23\");\n config.addSupportProviderTools(\"web_search\", \"web_extractor\", \"code_interpreter\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"杭州明天天气如何\");\n// prompt.addToolsFromClass(WeatherFunctions.class);\n prompt.addTools(ProviderTool.ofList(\"web_search\", \"web_extractor\", \"code_interpreter\"));\n\n ChatOptions options = new ChatOptions();\n options.addExtraBody(\"enable_search\", true);\n// options.addExtraBody(\"search_options\", Maps.of(\"forced_search\",true));\n\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n// System.out.println(\"onMessage >>>>>\" + response.getMessage().getReasoningContent());\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test\n public void testChatOllama() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setEndpoint(\"http://localhost:11434\");\n config.setModel(\"llama3\");\n config.setLogEnabled(true);\n\n ChatModel chatModel = new OpenAIChatModel(config);\n chatModel.chatStream(\"who are you\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n// try {\n// Thread.sleep(2000);\n// } catch (InterruptedException e) {\n// throw new RuntimeException(e);\n// }\n }\n\n\n @Test()\n public void testChatWithImage() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-5gqOcl*****\");\n config.setModel(\"gpt-4-turbo\");\n\n\n ChatModel chatModel = new OpenAIChatModel(config);\n SimplePrompt prompt = new SimplePrompt(\"What's in this image?\");\n prompt.addImageUrl(\"https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg\");\n\n\n AiMessageResponse response = chatModel.chat(prompt);\n System.out.println(response);\n }\n\n\n @Test()\n public void testFunctionCalling1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n System.out.println(response.executeToolCallsAndGetResults());\n // 阴转多云\n }\n\n @Test()\n public void testFunctionCalling2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling3() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57a\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling4() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57aa75\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling44() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d5\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling444() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n// config.setRequestPath(\"/api/v3/chat/completions\");\n// config.setModel(\"Qwen3-32B\");\n config.setModel(\"DeepSeek-V3.2\");\n config.setApiKey(\"PXW1G***L7D12\");\n// config.setLogEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n// System.out.println(\"onMessage11 >>>>>\" + response);\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n List<ToolMessage> toolMessages = response.executeToolCallsAndGetToolMessages();\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(toolMessages);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::22\" + msg);\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"onStop >>>>>\");\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n\n }\n\n\n @Test()\n public void testFunctionCalling5() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1G*********D12\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n// System.out.println(\"onMessage >>>>>\" + response);\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling55() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setApiKey(\"PXW1\");\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling56() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n config.setApiKey(\"PXW1\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling6() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n\n System.out.println(llm.chat(prompt));\n\n }\n\n\n @Test()\n public void testReAct1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"****\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n// ReActAgent reActAgent = new ReActAgent(llm, functions, \"北京和上海的天气怎么样?\");\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"介绍一下北京\");\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n }\n\n @Override\n public void onNonActionResponse(AiMessageResponse response) {\n System.out.println(\"onNonActionResponse >>>>>\" + response.getMessage().getContent());\n }\n });\n\n reActAgent.execute();\n }\n\n\n @Test()\n public void testReAct2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen2-72B-Instruct\");\n config.setApiKey(\"*****\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"今天的天气怎么样?\");\n// reActAgent.setStreamable(true);\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onChatResponseStream(StreamContext context, AiMessageResponse response) {\n// System.out.print(response.getMessage().getContent());\n }\n\n @Override\n public void onRequestUserInput(String question) {\n System.out.println(\"onRequestUserInput>>>\" + question);\n\n ReActAgentState state = reActAgent.getState();\n state.addMessage(new UserMessage(\"我在北京市\"));\n ReActAgent newAgent = new ReActAgent(llm, tools, state);\n newAgent.addListener(this);\n newAgent.execute();\n }\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n ChatMemory memory = reActAgent.getMemoryPrompt().getMemory();\n System.out.println(memory);\n }\n\n @Override\n public void onNonActionResponseStream(StreamContext context) {\n System.out.println(\"onNonActionResponseStream >>>>>\" + context);\n }\n });\n\n reActAgent.execute();\n\n TimeUnit.SECONDS.sleep(20);\n }\n\n\n @Test()\n public void testBailian() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3.5-plus\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setLogEnabled(false);\n config.setApiKey(\"sk-\");\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n String content = response.getMessage().getContent();\n String msg = content != null ? content : response.getMessage().getReasoningContent();\n\n if (content != null)\n System.out.println(content);\n\n// if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n// System.out.println(\":::::::: start....\");\n// prompt.setAiMessage(response.getMessage());\n// prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n// llm.chatStream(prompt, new StreamResponseListener() {\n// @Override\n// public void onMessage(StreamContext context, AiMessageResponse response) {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\":::\" + msg);\n// }\n// });\n// } else {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\">>>\" + msg);\n// }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n}\n"}, "c7dacad3f01023b644c45d18fed65bda316e9cfd": {"t": 1785755438.0681622, "n": 25229, "h": "71e84377dc5ef14c", "c": "package com.agentsflex.model.chat.openai;\n\nimport com.agentsflex.core.agent.react.ReActAgent;\nimport com.agentsflex.core.agent.react.ReActAgentListener;\nimport com.agentsflex.core.agent.react.ReActAgentState;\nimport com.agentsflex.core.agent.react.ReActStep;\nimport com.agentsflex.core.memory.ChatMemory;\nimport com.agentsflex.core.message.ToolCall;\nimport com.agentsflex.core.message.ToolMessage;\nimport com.agentsflex.core.message.UserMessage;\nimport com.agentsflex.core.model.chat.ChatModel;\nimport com.agentsflex.core.model.chat.ChatOptions;\nimport com.agentsflex.core.model.chat.StreamResponseListener;\nimport com.agentsflex.core.model.chat.response.AiMessageResponse;\nimport com.agentsflex.core.model.chat.tool.ProviderTool;\nimport com.agentsflex.core.model.chat.tool.Tool;\nimport com.agentsflex.core.model.chat.tool.ToolScanner;\nimport com.agentsflex.core.model.client.StreamContext;\nimport com.agentsflex.core.model.exception.ModelException;\nimport com.agentsflex.core.prompt.SimplePrompt;\nimport com.agentsflex.core.util.Maps;\nimport org.junit.Test;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\npublic class OpenAIChatModelTest {\n\n @Test(expected = ModelException.class)\n public void testChat() {\n\n String output = OpenAIChatConfig.builder()\n .endpoint(\"https://ai.gitee.com\")\n .provider(\"GiteeAI\")\n .model(\"Qwen3-32B\")\n .apiKey(\"PXW1****D12\")\n .buildModel()\n .chat(\"你叫什么名字\");\n\n System.out.println(output);\n }\n\n @Test()\n public void testChatStream() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"PXW1GXE***\");\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setLogEnabled(true);\n\n ChatOptions options = ChatOptions.builder().thinkingEnabled(false).build();\n\n ChatModel chatModel = new OpenAIChatModel(config);\n\n ChatModelTestUtils.waitForStream(chatModel, \"你叫什么名字\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n }, options);\n\n }\n\n\n @Test()\n public void testChatStreamBailian() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32ab******57502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京的天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test()\n public void testChatStreamBailianSearch() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32a*****502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max-2026-01-23\");\n config.addSupportProviderTools(\"web_search\", \"web_extractor\", \"code_interpreter\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"杭州明天天气如何\");\n// prompt.addToolsFromClass(WeatherFunctions.class);\n prompt.addTools(ProviderTool.ofList(\"web_search\", \"web_extractor\", \"code_interpreter\"));\n\n ChatOptions options = new ChatOptions();\n options.addExtraBody(\"enable_search\", true);\n// options.addExtraBody(\"search_options\", Maps.of(\"forced_search\",true));\n\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n// System.out.println(\"onMessage >>>>>\" + response.getMessage().getReasoningContent());\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test\n public void testChatOllama() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setEndpoint(\"http://localhost:11434\");\n config.setModel(\"llama3\");\n config.setLogEnabled(true);\n\n ChatModel chatModel = new OpenAIChatModel(config);\n chatModel.chatStream(\"who are you\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n// try {\n// Thread.sleep(2000);\n// } catch (InterruptedException e) {\n// throw new RuntimeException(e);\n// }\n }\n\n\n @Test()\n public void testChatWithImage() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-5gqOcl*****\");\n config.setModel(\"gpt-4-turbo\");\n\n\n ChatModel chatModel = new OpenAIChatModel(config);\n SimplePrompt prompt = new SimplePrompt(\"What's in this image?\");\n prompt.addImageUrl(\"https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg\");\n\n\n AiMessageResponse response = chatModel.chat(prompt);\n System.out.println(response);\n }\n\n\n @Test()\n public void testFunctionCalling1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n System.out.println(response.executeToolCallsAndGetResults());\n // 阴转多云\n }\n\n @Test()\n public void testFunctionCalling2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling3() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57a\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling4() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57aa75\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling44() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d5\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling444() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n// config.setRequestPath(\"/api/v3/chat/completions\");\n// config.setModel(\"Qwen3-32B\");\n config.setModel(\"DeepSeek-V3.2\");\n config.setApiKey(\"PXW1G***L7D12\");\n// config.setLogEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n// System.out.println(\"onMessage11 >>>>>\" + response);\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n List<ToolMessage> toolMessages = response.executeToolCallsAndGetToolMessages();\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(toolMessages);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::22\" + msg);\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"onStop >>>>>\");\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n\n }\n\n\n @Test()\n public void testFunctionCalling5() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1G*********D12\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n// System.out.println(\"onMessage >>>>>\" + response);\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling55() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setApiKey(\"PXW1\");\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling56() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n config.setApiKey(\"PXW1\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling6() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n\n System.out.println(llm.chat(prompt));\n\n }\n\n\n @Test()\n public void testReAct1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"****\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n// ReActAgent reActAgent = new ReActAgent(llm, functions, \"北京和上海的天气怎么样?\");\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"介绍一下北京\");\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n }\n\n @Override\n public void onNonActionResponse(AiMessageResponse response) {\n System.out.println(\"onNonActionResponse >>>>>\" + response.getMessage().getContent());\n }\n });\n\n reActAgent.execute();\n }\n\n\n @Test()\n public void testReAct2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen2-72B-Instruct\");\n config.setApiKey(\"*****\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"今天的天气怎么样?\");\n// reActAgent.setStreamable(true);\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onChatResponseStream(StreamContext context, AiMessageResponse response) {\n// System.out.print(response.getMessage().getContent());\n }\n\n @Override\n public void onRequestUserInput(String question) {\n System.out.println(\"onRequestUserInput>>>\" + question);\n\n ReActAgentState state = reActAgent.getState();\n state.addMessage(new UserMessage(\"我在北京市\"));\n ReActAgent newAgent = new ReActAgent(llm, tools, state);\n newAgent.addListener(this);\n newAgent.execute();\n }\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n ChatMemory memory = reActAgent.getMemoryPrompt().getMemory();\n System.out.println(memory);\n }\n\n @Override\n public void onNonActionResponseStream(StreamContext context) {\n System.out.println(\"onNonActionResponseStream >>>>>\" + context);\n }\n });\n\n reActAgent.execute();\n\n TimeUnit.SECONDS.sleep(20);\n }\n\n\n @Test()\n public void testBailian() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3.5-plus\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setLogEnabled(false);\n config.setApiKey(\"sk-\");\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n String content = response.getMessage().getContent();\n String msg = content != null ? content : response.getMessage().getReasoningContent();\n\n if (content != null)\n System.out.println(content);\n\n// if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n// System.out.println(\":::::::: start....\");\n// prompt.setAiMessage(response.getMessage());\n// prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n// llm.chatStream(prompt, new StreamResponseListener() {\n// @Override\n// public void onMessage(StreamContext context, AiMessageResponse response) {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\":::\" + msg);\n// }\n// });\n// } else {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\">>>\" + msg);\n// }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n}\n"}, "af05784bc48b00fbfffe5910130818c6b306231b": {"t": 1785755440.6010883, "n": 23119, "h": "0d982b2594683bd8", "c": "package com.agentsflex.model.chat.openai;\n\nimport com.agentsflex.core.agent.react.ReActAgent;\nimport com.agentsflex.core.agent.react.ReActAgentListener;\nimport com.agentsflex.core.agent.react.ReActAgentState;\nimport com.agentsflex.core.agent.react.ReActStep;\nimport com.agentsflex.core.memory.ChatMemory;\nimport com.agentsflex.core.message.ToolCall;\nimport com.agentsflex.core.message.ToolMessage;\nimport com.agentsflex.core.message.UserMessage;\nimport com.agentsflex.core.model.chat.ChatModel;\nimport com.agentsflex.core.model.chat.ChatOptions;\nimport com.agentsflex.core.model.chat.StreamResponseListener;\nimport com.agentsflex.core.model.chat.response.AiMessageResponse;\nimport com.agentsflex.core.model.chat.tool.Tool;\nimport com.agentsflex.core.model.chat.tool.ToolScanner;\nimport com.agentsflex.core.model.client.StreamContext;\nimport com.agentsflex.core.model.exception.ModelException;\nimport com.agentsflex.core.prompt.SimplePrompt;\nimport org.junit.Test;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\npublic class OpenAIChatModelTest {\n\n @Test(expected = ModelException.class)\n public void testChat() {\n\n String output = OpenAIChatConfig.builder()\n .endpoint(\"https://ai.gitee.com\")\n .provider(\"GiteeAI\")\n .model(\"Qwen3-32B\")\n .apiKey(\"PXW1****D12\")\n .buildModel()\n .chat(\"你叫什么名字\");\n\n System.out.println(output);\n }\n\n @Test()\n public void testChatStream() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"PXW1GXE***\");\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setLogEnabled(true);\n\n ChatOptions options = ChatOptions.builder().thinkingEnabled(false).build();\n\n ChatModel chatModel = new OpenAIChatModel(config);\n\n ChatModelTestUtils.waitForStream(chatModel, \"你叫什么名字\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n }, options);\n\n }\n\n\n @Test()\n public void testChatStreamBailian() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32ab******57502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京的天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test\n public void testChatOllama() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setEndpoint(\"http://localhost:11434\");\n config.setModel(\"llama3\");\n config.setLogEnabled(true);\n\n ChatModel chatModel = new OpenAIChatModel(config);\n chatModel.chatStream(\"who are you\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n// try {\n// Thread.sleep(2000);\n// } catch (InterruptedException e) {\n// throw new RuntimeException(e);\n// }\n }\n\n\n @Test()\n public void testChatWithImage() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-5gqOcl*****\");\n config.setModel(\"gpt-4-turbo\");\n\n\n ChatModel chatModel = new OpenAIChatModel(config);\n SimplePrompt prompt = new SimplePrompt(\"What's in this image?\");\n prompt.addImageUrl(\"https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg\");\n\n\n AiMessageResponse response = chatModel.chat(prompt);\n System.out.println(response);\n }\n\n\n @Test()\n public void testFunctionCalling1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n System.out.println(response.executeToolCallsAndGetResults());\n // 阴转多云\n }\n\n @Test()\n public void testFunctionCalling2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling3() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57a\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling4() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57aa75\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling44() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d5\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling444() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n// config.setRequestPath(\"/api/v3/chat/completions\");\n// config.setModel(\"Qwen3-32B\");\n config.setModel(\"DeepSeek-V3.2\");\n config.setApiKey(\"PXW1G***L7D12\");\n// config.setLogEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n// System.out.println(\"onMessage11 >>>>>\" + response);\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n List<ToolMessage> toolMessages = response.executeToolCallsAndGetToolMessages();\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(toolMessages);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::22\" + msg);\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"onStop >>>>>\");\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n\n }\n\n\n @Test()\n public void testFunctionCalling5() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1G*********D12\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n// System.out.println(\"onMessage >>>>>\" + response);\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling55() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setApiKey(\"PXW1\");\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling56() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n config.setApiKey(\"PXW1\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n\n @Test()\n public void testFunctionCalling6() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n\n System.out.println(llm.chat(prompt));\n\n }\n\n\n @Test()\n public void testReAct1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"****\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n// ReActAgent reActAgent = new ReActAgent(llm, functions, \"北京和上海的天气怎么样?\");\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"介绍一下北京\");\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n }\n\n @Override\n public void onNonActionResponse(AiMessageResponse response) {\n System.out.println(\"onNonActionResponse >>>>>\" + response.getMessage().getContent());\n }\n });\n\n reActAgent.execute();\n }\n\n\n @Test()\n public void testReAct2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen2-72B-Instruct\");\n config.setApiKey(\"*****\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"今天的天气怎么样?\");\n// reActAgent.setStreamable(true);\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onChatResponseStream(StreamContext context, AiMessageResponse response) {\n// System.out.print(response.getMessage().getContent());\n }\n\n @Override\n public void onRequestUserInput(String question) {\n System.out.println(\"onRequestUserInput>>>\" + question);\n\n ReActAgentState state = reActAgent.getState();\n state.addMessage(new UserMessage(\"我在北京市\"));\n ReActAgent newAgent = new ReActAgent(llm, tools, state);\n newAgent.addListener(this);\n newAgent.execute();\n }\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n ChatMemory memory = reActAgent.getMemoryPrompt().getMemory();\n System.out.println(memory);\n }\n\n @Override\n public void onNonActionResponseStream(StreamContext context) {\n System.out.println(\"onNonActionResponseStream >>>>>\" + context);\n }\n });\n\n reActAgent.execute();\n\n TimeUnit.SECONDS.sleep(20);\n }\n\n\n\n @Test()\n public void testBailian() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3.5-plus\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setLogEnabled(false);\n config.setApiKey(\"sk-\");\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n String content = response.getMessage().getContent();\n String msg = content != null ? content : response.getMessage().getReasoningContent();\n\n if (content != null)\n System.out.println(content);\n\n// if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n// System.out.println(\":::::::: start....\");\n// prompt.setAiMessage(response.getMessage());\n// prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n// llm.chatStream(prompt, new StreamResponseListener() {\n// @Override\n// public void onMessage(StreamContext context, AiMessageResponse response) {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\":::\" + msg);\n// }\n// });\n// } else {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\">>>\" + msg);\n// }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n}\n"}, "06a04fec97a8fc6faa4590580c38d2c7a1edf7ca": {"t": 1785755444.2578332, "n": 23064, "h": "01be9927c9adb1a3", "c": "package com.agentsflex.model.chat.openai;\n\nimport com.agentsflex.core.agent.react.ReActAgent;\nimport com.agentsflex.core.agent.react.ReActAgentListener;\nimport com.agentsflex.core.agent.react.ReActAgentState;\nimport com.agentsflex.core.agent.react.ReActStep;\nimport com.agentsflex.core.memory.ChatMemory;\nimport com.agentsflex.core.message.ToolCall;\nimport com.agentsflex.core.message.ToolMessage;\nimport com.agentsflex.core.message.UserMessage;\nimport com.agentsflex.core.model.chat.ChatModel;\nimport com.agentsflex.core.model.chat.ChatOptions;\nimport com.agentsflex.core.model.chat.StreamResponseListener;\nimport com.agentsflex.core.model.chat.response.AiMessageResponse;\nimport com.agentsflex.core.model.chat.tool.Tool;\nimport com.agentsflex.core.model.chat.tool.ToolScanner;\nimport com.agentsflex.core.model.client.StreamContext;\nimport com.agentsflex.core.model.exception.ModelException;\nimport com.agentsflex.core.prompt.SimplePrompt;\nimport org.junit.Test;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\npublic class OpenAIChatModelTest {\n\n @Test(expected = ModelException.class)\n public void testChat() {\n\n String output = OpenAIChatConfig.builder()\n .endpoint(\"https://ai.gitee.com\")\n .provider(\"GiteeAI\")\n .model(\"Qwen3-32B\")\n .apiKey(\"PXW1****D12\")\n .buildModel()\n .chat(\"你叫什么名字\");\n\n System.out.println(output);\n }\n\n @Test()\n public void testChatStream() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"PXW1GXE***\");\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setLogEnabled(true);\n\n ChatOptions options = ChatOptions.builder().thinkingEnabled(false).build();\n\n ChatModel chatModel = new OpenAIChatModel(config);\n\n ChatModelTestUtils.waitForStream(chatModel, \"你叫什么名字\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n }, options);\n\n }\n\n\n @Test()\n public void testChatStreamBailian() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-32ab******57502\");\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3-max\");\n ChatModel chatModel = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京的天气如何?\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n ChatModelTestUtils.waitForStream(chatModel, prompt, new StreamResponseListener() {\n @Override\n public void onFailure(StreamContext context, Throwable throwable) {\n System.out.println(\"onFailure>>>>\" + throwable);\n }\n\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().getContent() == null) {\n System.out.println(response.getMessage());\n }\n\n if (response.getMessage().isFinalDelta()) {\n List<ToolCall> toolCalls = response.getMessage().getToolCalls();\n System.out.println(toolCalls);\n }\n\n System.out.println(\"onMessage >>>>>\" + response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n }\n\n @Test\n public void testChatOllama() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setEndpoint(\"http://localhost:11434\");\n config.setModel(\"llama3\");\n config.setLogEnabled(true);\n\n ChatModel chatModel = new OpenAIChatModel(config);\n chatModel.chatStream(\"who are you\", new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(response.getMessage().getContent());\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"stop!!!!\");\n }\n });\n\n// try {\n// Thread.sleep(2000);\n// } catch (InterruptedException e) {\n// throw new RuntimeException(e);\n// }\n }\n\n\n @Test()\n public void testChatWithImage() {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-5gqOcl*****\");\n config.setModel(\"gpt-4-turbo\");\n\n\n ChatModel chatModel = new OpenAIChatModel(config);\n SimplePrompt prompt = new SimplePrompt(\"What's in this image?\");\n prompt.addImageUrl(\"https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg\");\n\n\n AiMessageResponse response = chatModel.chat(prompt);\n System.out.println(response);\n }\n\n\n @Test()\n public void testFunctionCalling1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n System.out.println(response.executeToolCallsAndGetResults());\n // 阴转多云\n }\n\n @Test()\n public void testFunctionCalling2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setApiKey(\"sk-rts5NF6n*******\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling3() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57a\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n if (response.hasToolCalls()) {\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n AiMessageResponse response1 = llm.chat(prompt);\n System.out.println(response1.getMessage().getContent());\n } else {\n System.out.println(response);\n }\n }\n\n @Test()\n public void testFunctionCalling4() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d57aa75\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling44() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ark.cn-beijing.volces.com\");\n config.setRequestPath(\"/api/v3/chat/completions\");\n config.setModel(\"deepseek-v3-250324\");\n config.setApiKey(\"2d5\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"今天北京的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n System.out.println(\" onMessage >>>>>\" + response.hasToolCalls());\n }\n });\n\n TimeUnit.SECONDS.sleep(5);\n }\n\n @Test()\n public void testFunctionCalling444() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n// config.setRequestPath(\"/api/v3/chat/completions\");\n// config.setModel(\"Qwen3-32B\");\n config.setModel(\"DeepSeek-V3.2\");\n config.setApiKey(\"PXW1G***L7D12\");\n// config.setLogEnabled(false);\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n// System.out.println(\"onMessage11 >>>>>\" + response);\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n List<ToolMessage> toolMessages = response.executeToolCallsAndGetToolMessages();\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(toolMessages);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::22\" + msg);\n }\n\n @Override\n public void onStop(StreamContext context) {\n System.out.println(\"onStop >>>>>\");\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n\n }\n\n\n @Test()\n public void testFunctionCalling5() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1G*********D12\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n// System.out.println(\"onMessage >>>>>\" + response);\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling55() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setApiKey(\"PXW1\");\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n @Test()\n public void testFunctionCalling56() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3.5-35B-A3B\");\n config.setApiKey(\"PXW1\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions1.class);\n\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n System.out.println(\":::::::: start....\");\n prompt.setAiMessage(response.getMessage());\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\":::\" + msg);\n }\n });\n } else {\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(\">>>\" + msg);\n }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n\n @Test()\n public void testFunctionCalling6() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"PXW1\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"/no_think 北京和上海的天气怎么样\");\n prompt.addToolsFromClass(WeatherFunctions.class);\n AiMessageResponse response = llm.chat(prompt);\n\n prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n\n System.out.println(llm.chat(prompt));\n\n }\n\n\n @Test()\n public void testReAct1() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen3-32B\");\n config.setApiKey(\"****\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n// ReActAgent reActAgent = new ReActAgent(llm, functions, \"北京和上海的天气怎么样?\");\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"介绍一下北京\");\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n }\n\n @Override\n public void onNonActionResponse(AiMessageResponse response) {\n System.out.println(\"onNonActionResponse >>>>>\" + response.getMessage().getContent());\n }\n });\n\n reActAgent.execute();\n }\n\n\n @Test()\n public void testReAct2() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n// config.setDebug(true);\n config.setEndpoint(\"https://ai.gitee.com\");\n config.setModel(\"Qwen2-72B-Instruct\");\n config.setApiKey(\"*****\");\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n List<Tool> tools = ToolScanner.scan(WeatherFunctions.class);\n ReActAgent reActAgent = new ReActAgent(llm, tools, \"今天的天气怎么样?\");\n// reActAgent.setStreamable(true);\n reActAgent.addListener(new ReActAgentListener() {\n\n @Override\n public void onChatResponseStream(StreamContext context, AiMessageResponse response) {\n// System.out.print(response.getMessage().getContent());\n }\n\n @Override\n public void onRequestUserInput(String question) {\n System.out.println(\"onRequestUserInput>>>\" + question);\n\n ReActAgentState state = reActAgent.getState();\n state.addMessage(new UserMessage(\"我在北京市\"));\n ReActAgent newAgent = new ReActAgent(llm, tools, state);\n newAgent.addListener(this);\n newAgent.execute();\n }\n\n @Override\n public void onActionStart(ReActStep step) {\n System.out.println(\">>>>>>\" + step.getThought());\n System.out.println(\"正在调用工具 >>>>> \" + step.getAction() + \":\" + step.getActionInput());\n }\n\n @Override\n public void onActionEnd(ReActStep step, Object result) {\n System.out.println(\"工具调用结束 >>>>> \" + step.getAction() + \":\" + step.getActionInput() + \">>>>结果:\" + result);\n }\n\n @Override\n public void onFinalAnswer(String finalAnswer) {\n System.out.println(\"onFinalAnswer >>>>>\" + finalAnswer);\n ChatMemory memory = reActAgent.getMemoryPrompt().getMemory();\n System.out.println(memory);\n }\n\n @Override\n public void onNonActionResponseStream(StreamContext context) {\n System.out.println(\"onNonActionResponseStream >>>>>\" + context);\n }\n });\n\n reActAgent.execute();\n\n TimeUnit.SECONDS.sleep(20);\n }\n\n\n\n @Test()\n public void testBailian() throws InterruptedException {\n OpenAIChatConfig config = new OpenAIChatConfig();\n config.setLogEnabled(true);\n config.setEndpoint(\"https://dashscope.aliyuncs.com\");\n config.setRequestPath(\"/compatible-mode/v1/chat/completions\");\n config.setModel(\"qwen3.5-plus\");\n// config.setModel(\"DeepSeek-V3\");\n// config.setSupportToolMessage(false);\n config.setLogEnabled(false);\n config.setApiKey(\"sk-\");\n\n\n OpenAIChatModel llm = new OpenAIChatModel(config);\n\n SimplePrompt prompt = new SimplePrompt(\"这个学生默写的化学公式,你帮忙最大程度识别出来,然后判断他写的是对是错,如果错的,你给出正确答案。 输出时,请按 Latex 进行输出。\");\n\n llm.chatStream(prompt, new StreamResponseListener() {\n @Override\n public void onMessage(StreamContext context, AiMessageResponse response) {\n\n String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n System.out.println(msg);\n\n// if (response.getMessage().isFinalDelta() && response.hasToolCalls()) {\n// System.out.println(\":::::::: start....\");\n// prompt.setAiMessage(response.getMessage());\n// prompt.setToolMessages(response.executeToolCallsAndGetToolMessages());\n// llm.chatStream(prompt, new StreamResponseListener() {\n// @Override\n// public void onMessage(StreamContext context, AiMessageResponse response) {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\":::\" + msg);\n// }\n// });\n// } else {\n// String msg = response.getMessage().getContent() != null ? response.getMessage().getContent() : response.getMessage().getReasoningContent();\n// System.out.println(\">>>\" + msg);\n// }\n }\n });\n\n TimeUnit.SECONDS.sleep(25);\n }\n\n\n}\n"}}}}