diff --git a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/AnthropicChatModelTest.java b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/AnthropicChatModelTest.java index 9bb98cf6ef..454fad47b6 100644 --- a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/AnthropicChatModelTest.java +++ b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/AnthropicChatModelTest.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.ai.framework.ai.core.model.chat; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.ai.anthropic.AnthropicChatModel; +import org.springframework.ai.anthropic.AnthropicChatOptions; import org.springframework.ai.anthropic.api.AnthropicApi; import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.SystemMessage; @@ -26,6 +27,11 @@ public class AnthropicChatModelTest { .apiKey("sk-muubv7cXeLw0Etgs743f365cD5Ea44429946Fa7e672d8942") .baseUrl("https://aihubmix.com") .build()) + .defaultOptions(AnthropicChatOptions.builder() + .model(AnthropicApi.ChatModel.CLAUDE_SONNET_4) + .temperature(0.7) + .maxTokens(4096) + .build()) .build(); @Test @@ -56,4 +62,26 @@ public class AnthropicChatModelTest { flux.doOnNext(System.out::println).then().block(); } + // TODO @芋艿:需要等 spring ai 升级:https://github.com/spring-projects/spring-ai/pull/2800 + @Test + @Disabled + public void testStream_thinking() { + // 准备参数 + List messages = new ArrayList<>(); + messages.add(new UserMessage("thkinking 下,1+1 为什么等于 2 ")); + AnthropicChatOptions options = AnthropicChatOptions.builder() + .model(AnthropicApi.ChatModel.CLAUDE_SONNET_4) + .thinking(AnthropicApi.ThinkingType.ENABLED, 3096) + .temperature(1D) + .build(); + + // 调用 + Flux flux = chatModel.stream(new Prompt(messages, options)); + // 打印结果 + flux.doOnNext(response -> { +// System.out.println(response); + System.out.println(response.getResult()); + }).then().block(); + } + } diff --git a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/DeepSeekChatModelTests.java b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/DeepSeekChatModelTests.java index 7b51df1662..2fbe0ee5de 100644 --- a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/DeepSeekChatModelTests.java +++ b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/DeepSeekChatModelTests.java @@ -60,4 +60,23 @@ public class DeepSeekChatModelTests { flux.doOnNext(System.out::println).then().block(); } + @Test + @Disabled + public void testStream_thinking() { + // 准备参数 + List messages = new ArrayList<>(); + messages.add(new UserMessage("详细分析下,如何设计一个电商系统?")); + DeepSeekChatOptions options = DeepSeekChatOptions.builder() + .model("deepseek-reasoner") + .build(); + + // 调用 + Flux flux = chatModel.stream(new Prompt(messages, options)); + // 打印结果 + flux.doOnNext(response -> { +// System.out.println(response); + System.out.println(response.getResult().getOutput()); + }).then().block(); + } + } diff --git a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/LlamaChatModelTests.java b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/LlamaChatModelTests.java index 69e2c1daaa..14f32e06ec 100644 --- a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/LlamaChatModelTests.java +++ b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/LlamaChatModelTests.java @@ -1,6 +1,20 @@ package cn.iocoder.yudao.module.ai.framework.ai.core.model.chat; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.ai.chat.messages.Message; +import org.springframework.ai.chat.messages.SystemMessage; +import org.springframework.ai.chat.messages.UserMessage; +import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.ollama.OllamaChatModel; +import org.springframework.ai.ollama.api.OllamaApi; +import org.springframework.ai.ollama.api.OllamaModel; +import org.springframework.ai.ollama.api.OllamaOptions; +import reactor.core.publisher.Flux; + +import java.util.ArrayList; +import java.util.List; /** * {@link OllamaChatModel} 集成测试 @@ -9,43 +23,65 @@ import org.springframework.ai.ollama.OllamaChatModel; */ public class LlamaChatModelTests { -// private final OllamaChatModel chatModel = OllamaChatModel.builder() -// .ollamaApi(new OllamaApi("http://127.0.0.1:11434")) // Ollama 服务地址 -// .defaultOptions(OllamaOptions.builder() -// .model(OllamaModel.LLAMA3.getName()) // 模型 -// .build()) -// .build(); -// -// @Test -// @Disabled -// public void testCall() { -// // 准备参数 -// List messages = new ArrayList<>(); -// messages.add(new SystemMessage("你是一个优质的文言文作者,用文言文描述着各城市的人文风景。")); -// messages.add(new UserMessage("1 + 1 = ?")); -// -// // 调用 -// ChatResponse response = chatModel.call(new Prompt(messages)); -// // 打印结果 -// System.out.println(response); -// System.out.println(response.getResult().getOutput()); -// } -// -// @Test -// @Disabled -// public void testStream() { -// // 准备参数 -// List messages = new ArrayList<>(); -// messages.add(new SystemMessage("你是一个优质的文言文作者,用文言文描述着各城市的人文风景。")); -// messages.add(new UserMessage("1 + 1 = ?")); -// -// // 调用 -// Flux flux = chatModel.stream(new Prompt(messages)); -// // 打印结果 -// flux.doOnNext(response -> { -//// System.out.println(response); -// System.out.println(response.getResult().getOutput()); -// }).then().block(); -// } + private final OllamaChatModel chatModel = OllamaChatModel.builder() + .ollamaApi(OllamaApi.builder() + .baseUrl("http://127.0.0.1:11434") // Ollama 服务地址 + .build()) + .defaultOptions(OllamaOptions.builder() + .model(OllamaModel.LLAMA3.getName()) // 模型 + .build()) + .build(); + + @Test + @Disabled + public void testCall() { + // 准备参数 + List messages = new ArrayList<>(); + messages.add(new SystemMessage("你是一个优质的文言文作者,用文言文描述着各城市的人文风景。")); + messages.add(new UserMessage("1 + 1 = ?")); + + // 调用 + ChatResponse response = chatModel.call(new Prompt(messages)); + // 打印结果 + System.out.println(response); + System.out.println(response.getResult().getOutput()); + } + + @Test + @Disabled + public void testStream() { + // 准备参数 + List messages = new ArrayList<>(); + messages.add(new SystemMessage("你是一个优质的文言文作者,用文言文描述着各城市的人文风景。")); + messages.add(new UserMessage("1 + 1 = ?")); + + // 调用 + Flux flux = chatModel.stream(new Prompt(messages)); + // 打印结果 + flux.doOnNext(response -> { +// System.out.println(response); + System.out.println(response.getResult().getOutput()); + }).then().block(); + } + + @Test + @Disabled + public void testStream_thinking() { + // 准备参数 + List messages = new ArrayList<>(); + messages.add(new UserMessage("详细分析下,如何设计一个电商系统?")); + OllamaOptions options = OllamaOptions.builder() + .model("qwen3") + .build(); + + // 调用 + Flux flux = chatModel.stream(new Prompt(messages, options)); + // 打印结果 + flux.doOnNext(response -> { +// System.out.println(response); + System.out.println(response.getResult().getOutput()); + }).then().block(); + } + } diff --git a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/MiniMaxChatModelTests.java b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/MiniMaxChatModelTests.java index ce350ddd25..8fb133dbb1 100644 --- a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/MiniMaxChatModelTests.java +++ b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/MiniMaxChatModelTests.java @@ -59,4 +59,24 @@ public class MiniMaxChatModelTests { }).then().block(); } + // TODO @芋艿:暂时没解析 reasoning_content 结果,需要等官方修复 + @Test + @Disabled + public void testStream_thinking() { + // 准备参数 + List messages = new ArrayList<>(); + messages.add(new UserMessage("详细分析下,如何设计一个电商系统?")); + MiniMaxChatOptions options = MiniMaxChatOptions.builder() + .model("MiniMax-M1") + .build(); + + // 调用 + Flux flux = chatModel.stream(new Prompt(messages, options)); + // 打印结果 + flux.doOnNext(response -> { +// System.out.println(response); + System.out.println(response.getResult().getOutput()); + }).then().block(); + } + } diff --git a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/MoonshotChatModelTests.java b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/MoonshotChatModelTests.java index 992334b4d9..b50ab80f4f 100644 --- a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/MoonshotChatModelTests.java +++ b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/MoonshotChatModelTests.java @@ -63,4 +63,25 @@ public class MoonshotChatModelTests { }).then().block(); } + // TODO @芋艿:暂时没解析 reasoning_content 结果,需要等官方修复 + @Test + @Disabled + public void testStream_thinking() { + // 准备参数 + List messages = new ArrayList<>(); + messages.add(new UserMessage("详细分析下,如何设计一个电商系统?")); + MoonshotChatOptions options = MoonshotChatOptions.builder() +// .model("kimi-k2-0711-preview") + .model("kimi-thinking-preview") + .build(); + + // 调用 + Flux flux = chatModel.stream(new Prompt(messages, options)); + // 打印结果 + flux.doOnNext(response -> { +// System.out.println(response); + System.out.println(response.getResult().getOutput()); + }).then().block(); + } + } diff --git a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/OpenAIChatModelTests.java b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/OpenAIChatModelTests.java index c650fd0420..5bae6c6941 100644 --- a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/OpenAIChatModelTests.java +++ b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/OpenAIChatModelTests.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.ai.framework.ai.core.model.chat; +import com.azure.ai.openai.models.ReasoningEffortValue; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.ai.chat.messages.Message; @@ -25,10 +26,11 @@ public class OpenAIChatModelTests { private final OpenAiChatModel chatModel = OpenAiChatModel.builder() .openAiApi(OpenAiApi.builder() .baseUrl("https://api.holdai.top") - .apiKey("sk-PytRecQlmjEteoa2RRN6cGnwslo72UUPLQVNEMS6K9yjbmpD") // apiKey + .apiKey("sk-z5joyRoV1iFEnh2SAi8QPNrIZTXyQSyxTmD5CoNDQbFixK2l") // apiKey .build()) .defaultOptions(OpenAiChatOptions.builder() - .model(OpenAiApi.ChatModel.GPT_4_1_NANO) // 模型 + .model("gpt-5-nano-2025-08-07") // 模型 +// .model(OpenAiApi.ChatModel.O1) // 模型 .temperature(0.7) .build()) .build(); @@ -54,7 +56,7 @@ public class OpenAIChatModelTests { // 准备参数 List messages = new ArrayList<>(); messages.add(new SystemMessage("你是一个优质的文言文作者,用文言文描述着各城市的人文风景。")); - messages.add(new UserMessage("1 + 1 = ?")); + messages.add(new UserMessage("帮我推理下,怎么实现一个用户中心!")); // 调用 Flux flux = chatModel.stream(new Prompt(messages)); @@ -65,4 +67,29 @@ public class OpenAIChatModelTests { }).then().block(); } + // TODO @芋艿:无法触发思考的字段返回,需要 response api:https://github.com/spring-projects/spring-ai/issues/2962 + @Test + @Disabled + public void testStream_thinking() { + // 准备参数 + List messages = new ArrayList<>(); + messages.add(new UserMessage("详细分析下,如何设计一个电商系统?")); + OpenAiChatOptions options = OpenAiChatOptions.builder() + .model("gpt-5") +// .model(OpenAiApi.ChatModel.O4_MINI) +// .model("o3-pro") + .reasoningEffort(ReasoningEffortValue.LOW.getValue()) + .build(); + + // 调用 + Flux flux = chatModel.stream(new Prompt(messages, options)); + // 打印结果 + flux.doOnNext(response -> { +// System.out.println(response); + System.out.println(response.getResult().getOutput()); + }).then().block(); + } + + + } diff --git a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/TongYiChatModelTests.java b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/TongYiChatModelTests.java index 4f2e27edd2..da7baaebcf 100644 --- a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/TongYiChatModelTests.java +++ b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/TongYiChatModelTests.java @@ -26,11 +26,13 @@ public class TongYiChatModelTests { .dashScopeApi(DashScopeApi.builder() .apiKey("sk-47aa124781be4bfb95244cc62f63f7d0") .build()) - .defaultOptions( DashScopeChatOptions.builder() - .withModel("qwen1.5-72b-chat") // 模型 + .defaultOptions(DashScopeChatOptions.builder() +// .withModel("qwen1.5-72b-chat") // 模型 + .withModel("qwen3-235b-a22b-thinking-2507") // 模型 // .withModel("deepseek-r1") // 模型(deepseek-r1) // .withModel("deepseek-v3") // 模型(deepseek-v3) // .withModel("deepseek-r1-distill-qwen-1.5b") // 模型(deepseek-r1-distill-qwen-1.5b) +// .withEnableThinking(true) .build()) .build(); @@ -54,8 +56,8 @@ public class TongYiChatModelTests { public void testStream() { // 准备参数 List messages = new ArrayList<>(); - messages.add(new SystemMessage("你是一个优质的文言文作者,用文言文描述着各城市的人文风景。")); - messages.add(new UserMessage("1 + 1 = ?")); +// messages.add(new SystemMessage("你是一个优质的文言文作者,用文言文描述着各城市的人文风景。")); + messages.add(new UserMessage("帮我推理下,怎么实现一个用户中心!")); // 调用 Flux flux = chatModel.stream(new Prompt(messages)); @@ -66,4 +68,24 @@ public class TongYiChatModelTests { }).then().block(); } + @Test + @Disabled + public void testStream_thinking() { + // 准备参数 + List messages = new ArrayList<>(); + messages.add(new UserMessage("详细分析下,如何设计一个电商系统?")); + DashScopeChatOptions options = DashScopeChatOptions.builder() + .withModel("qwen3-235b-a22b-thinking-2507") + .withEnableThinking(true) // 必须设置,否则会报错 + .build(); + + // 调用 + Flux flux = chatModel.stream(new Prompt(messages, options)); + // 打印结果 + flux.doOnNext(response -> { +// System.out.println(response); + System.out.println(response.getResult().getOutput()); + }).then().block(); + } + } diff --git a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/ZhiPuAiChatModelTests.java b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/ZhiPuAiChatModelTests.java index ffdb518925..0b0b006935 100644 --- a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/ZhiPuAiChatModelTests.java +++ b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/ZhiPuAiChatModelTests.java @@ -23,7 +23,7 @@ import java.util.List; public class ZhiPuAiChatModelTests { private final ZhiPuAiChatModel chatModel = new ZhiPuAiChatModel( - new ZhiPuAiApi("32f84543e54eee31f8d56b2bd6020573.3vh9idLJZ2ZhxDEs"), // 密钥 + new ZhiPuAiApi("2f35fb6ca4ea41fab898729b7fac086c.6ESSfPcCkxaKEUlR"), // 密钥 ZhiPuAiChatOptions.builder() .model(ZhiPuAiApi.ChatModel.GLM_4.getName()) // 模型 .build() @@ -61,4 +61,24 @@ public class ZhiPuAiChatModelTests { }).then().block(); } + // TODO @芋艿:暂时没解析 reasoning_content 结果,需要等官方修复 + @Test + @Disabled + public void testStream_thinking() { + // 准备参数 + List messages = new ArrayList<>(); + messages.add(new UserMessage("详细分析下,如何设计一个电商系统?")); + ZhiPuAiChatOptions options = ZhiPuAiChatOptions.builder() + .model("GLM-4.5") + .build(); + + // 调用 + Flux flux = chatModel.stream(new Prompt(messages, options)); + // 打印结果 + flux.doOnNext(response -> { +// System.out.println(response); + System.out.println(response.getResult().getOutput()); + }).then().block(); + } + }