From dfc3c6227c6180206305996b12bd3e12d416f3ea Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 23 Aug 2025 17:08:52 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E3=80=90ai=20=E5=A4=A7=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E3=80=91=E6=B7=B7=E5=85=83=E6=94=AF=E6=8C=81=20thinki?= =?UTF-8?q?ng=20=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/config/AiAutoConfiguration.java | 12 ++-- .../core/model/hunyuan/HunYuanChatModel.java | 4 +- .../iocoder/yudao/module/ai/util/AiUtils.java | 2 +- .../model/chat/HunYuanChatModelTests.java | 62 +++++++++++++++---- 4 files changed, 62 insertions(+), 18 deletions(-) diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/config/AiAutoConfiguration.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/config/AiAutoConfiguration.java index 193024cd89..2fe084be68 100644 --- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/config/AiAutoConfiguration.java +++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/config/AiAutoConfiguration.java @@ -14,6 +14,9 @@ import cn.iocoder.yudao.module.ai.framework.ai.core.model.siliconflow.SiliconFlo import cn.iocoder.yudao.module.ai.framework.ai.core.model.suno.api.SunoApi; import cn.iocoder.yudao.module.ai.framework.ai.core.model.xinghuo.XingHuoChatModel; import lombok.extern.slf4j.Slf4j; +import org.springframework.ai.deepseek.DeepSeekChatModel; +import org.springframework.ai.deepseek.DeepSeekChatOptions; +import org.springframework.ai.deepseek.api.DeepSeekApi; import org.springframework.ai.embedding.BatchingStrategy; import org.springframework.ai.embedding.TokenCountBatchingStrategy; import org.springframework.ai.model.tool.ToolCallingManager; @@ -152,13 +155,14 @@ public class AiAutoConfiguration { StrUtil.startWithIgnoreCase(properties.getModel(), "deepseek") ? HunYuanChatModel.DEEP_SEEK_BASE_URL : HunYuanChatModel.BASE_URL); } - // 创建 OpenAiChatModel、HunYuanChatModel 对象 - OpenAiChatModel openAiChatModel = OpenAiChatModel.builder() - .openAiApi(OpenAiApi.builder() + // 创建 DeepSeekChatModel、HunYuanChatModel 对象 + DeepSeekChatModel openAiChatModel = DeepSeekChatModel.builder() + .deepSeekApi(DeepSeekApi.builder() .baseUrl(properties.getBaseUrl()) + .completionsPath(HunYuanChatModel.COMPLETE_PATH) .apiKey(properties.getApiKey()) .build()) - .defaultOptions(OpenAiChatOptions.builder() + .defaultOptions(DeepSeekChatOptions.builder() .model(properties.getModel()) .temperature(properties.getTemperature()) .maxTokens(properties.getMaxTokens()) diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/hunyuan/HunYuanChatModel.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/hunyuan/HunYuanChatModel.java index debd0a4a90..9513c6c5f7 100644 --- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/hunyuan/HunYuanChatModel.java +++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/hunyuan/HunYuanChatModel.java @@ -6,7 +6,6 @@ import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.chat.prompt.Prompt; -import org.springframework.ai.openai.OpenAiChatModel; import reactor.core.publisher.Flux; /** @@ -22,6 +21,7 @@ import reactor.core.publisher.Flux; public class HunYuanChatModel implements ChatModel { public static final String BASE_URL = "https://api.hunyuan.cloud.tencent.com"; + public static final String COMPLETE_PATH = "/v1/chat/completions"; public static final String MODEL_DEFAULT = "hunyuan-turbo"; @@ -32,7 +32,7 @@ public class HunYuanChatModel implements ChatModel { /** * 兼容 OpenAI 接口,进行复用 */ - private final OpenAiChatModel openAiChatModel; + private final ChatModel openAiChatModel; @Override public ChatResponse call(Prompt prompt) { diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/util/AiUtils.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/util/AiUtils.java index 58ad808ce4..084cfcaf7a 100644 --- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/util/AiUtils.java +++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/util/AiUtils.java @@ -52,6 +52,7 @@ public class AiUtils { case DOU_BAO: // 复用 DeepSeek 客户端 return DeepSeekChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens) .toolNames(toolNames).toolContext(toolContext).build(); + case HUN_YUAN: // 复用 DeepSeek 客户端 case ZHI_PU: return ZhiPuAiChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens) .toolNames(toolNames).toolContext(toolContext).build(); @@ -63,7 +64,6 @@ public class AiUtils { .toolNames(toolNames).toolContext(toolContext).build(); case OPENAI: case GEMINI: // 复用 OpenAI 客户端 - case HUN_YUAN: // 复用 OpenAI 客户端 case XING_HUO: // 复用 OpenAI 客户端 case SILICON_FLOW: // 复用 OpenAI 客户端 case BAI_CHUAN: // 复用 OpenAI 客户端 diff --git a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/HunYuanChatModelTests.java b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/HunYuanChatModelTests.java index b568f5ac4b..eeafef261f 100644 --- a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/HunYuanChatModelTests.java +++ b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/HunYuanChatModelTests.java @@ -8,9 +8,9 @@ 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.openai.OpenAiChatModel; -import org.springframework.ai.openai.OpenAiChatOptions; -import org.springframework.ai.openai.api.OpenAiApi; +import org.springframework.ai.deepseek.DeepSeekChatModel; +import org.springframework.ai.deepseek.DeepSeekChatOptions; +import org.springframework.ai.deepseek.api.DeepSeekApi; import reactor.core.publisher.Flux; import java.util.ArrayList; @@ -23,12 +23,13 @@ import java.util.List; */ public class HunYuanChatModelTests { - private final OpenAiChatModel openAiChatModel = OpenAiChatModel.builder() - .openAiApi(OpenAiApi.builder() + private final DeepSeekChatModel openAiChatModel = DeepSeekChatModel.builder() + .deepSeekApi(DeepSeekApi.builder() .baseUrl(HunYuanChatModel.BASE_URL) - .apiKey("sk-bcd") // apiKey + .completionsPath(HunYuanChatModel.COMPLETE_PATH) + .apiKey("sk-abc") // apiKey .build()) - .defaultOptions(OpenAiChatOptions.builder() + .defaultOptions(DeepSeekChatOptions.builder() .model(HunYuanChatModel.MODEL_DEFAULT) // 模型 .temperature(0.7) .build()) @@ -64,12 +65,33 @@ public class HunYuanChatModelTests { flux.doOnNext(System.out::println).then().block(); } - private final OpenAiChatModel deepSeekOpenAiChatModel = OpenAiChatModel.builder() - .openAiApi(OpenAiApi.builder() + @Test + @Disabled + public void testStream_thinking() { + // 准备参数 + List messages = new ArrayList<>(); + messages.add(new UserMessage("详细分析下,如何设计一个电商系统?")); + DeepSeekChatOptions options = DeepSeekChatOptions.builder() + .model("hunyuan-a13b") +// .model("hunyuan-turbos-latest") + .build(); + + // 调用 + Flux flux = chatModel.stream(new Prompt(messages, options)); + // 打印结果 + flux.doOnNext(response -> { +// System.out.println(response); + System.out.println(response.getResult().getOutput()); + }).then().block(); + } + + private final DeepSeekChatModel deepSeekOpenAiChatModel = DeepSeekChatModel.builder() + .deepSeekApi(DeepSeekApi.builder() .baseUrl(HunYuanChatModel.DEEP_SEEK_BASE_URL) + .completionsPath(HunYuanChatModel.COMPLETE_PATH) .apiKey("sk-abc") // apiKey .build()) - .defaultOptions(OpenAiChatOptions.builder() + .defaultOptions(DeepSeekChatOptions.builder() // .model(HunYuanChatModel.DEEP_SEEK_MODEL_DEFAULT) // 模型("deepseek-v3") .model("deepseek-r1") // 模型("deepseek-r1") .temperature(0.7) @@ -94,7 +116,7 @@ public class HunYuanChatModelTests { @Test @Disabled - public void testStream_deekseek() { + public void testStream_deepseek() { // 准备参数 List messages = new ArrayList<>(); messages.add(new SystemMessage("你是一个优质的文言文作者,用文言文描述着各城市的人文风景。")); @@ -106,5 +128,23 @@ public class HunYuanChatModelTests { flux.doOnNext(System.out::println).then().block(); } + @Test + @Disabled + public void testStream_deepseek_thinking() { + // 准备参数 + List messages = new ArrayList<>(); + messages.add(new UserMessage("详细分析下,如何设计一个电商系统?")); + DeepSeekChatOptions options = DeepSeekChatOptions.builder() + .model("deepseek-r1") + .build(); + + // 调用 + Flux flux = deepSeekChatModel.stream(new Prompt(messages, options)); + // 打印结果 + flux.doOnNext(response -> { +// System.out.println(response); + System.out.println(response.getResult().getOutput()); + }).then().block(); + } }