From 5bfa65bc0b2a0a01f0e6396d4dd8e50b25949137 Mon Sep 17 00:00:00 2001 From: Hanserwei <2628273921@qq.com> Date: Thu, 23 Oct 2025 14:27:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai):=20=E9=9B=86=E6=88=90=E9=98=BF?= =?UTF-8?q?=E9=87=8C=E4=BA=91DashScope=20AI=E6=A8=A1=E5=9E=8B=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增DashScope AI配置项,支持qwen-plus模型 - 添加AIResponse数据模型用于流式响应 - 实现普通对话和流式对话两个接口 - 引入spring-ai-alibaba-starter-dashscope依赖 - 更新OpenAIController移除无用导入 - 在pom.xml中添加spring-ai-alibaba-bom管理依赖版本 --- pom.xml | 12 ++++ .../controller/DashscopeAIController.java | 59 +++++++++++++++++++ .../airobot/controller/OpenAIController.java | 2 - .../hanserwei/airobot/model/AIResponse.java | 15 +++++ src/main/resources/application.yml | 6 ++ 5 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/hanserwei/airobot/controller/DashscopeAIController.java create mode 100644 src/main/java/com/hanserwei/airobot/model/AIResponse.java diff --git a/pom.xml b/pom.xml index 1d22c4c..7054ec9 100644 --- a/pom.xml +++ b/pom.xml @@ -50,6 +50,11 @@ org.springframework.ai spring-ai-starter-model-openai + + + com.alibaba.cloud.ai + spring-ai-alibaba-starter-dashscope + @@ -79,6 +84,13 @@ pom import + + com.alibaba.cloud.ai + spring-ai-alibaba-bom + 1.0.0.4 + pom + import + diff --git a/src/main/java/com/hanserwei/airobot/controller/DashscopeAIController.java b/src/main/java/com/hanserwei/airobot/controller/DashscopeAIController.java new file mode 100644 index 0000000..86984f9 --- /dev/null +++ b/src/main/java/com/hanserwei/airobot/controller/DashscopeAIController.java @@ -0,0 +1,59 @@ +package com.hanserwei.airobot.controller; + +import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel; +import com.hanserwei.airobot.model.AIResponse; +import jakarta.annotation.Resource; +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.model.Generation; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; + +@RestController +@RequestMapping("/v6/ai") +public class DashscopeAIController { + + @Resource + private DashScopeChatModel dashScopeChatModel; + + /** + * 普通对话 + * + * @param message 对话输入内容 + * @return 对话结果 + */ + @GetMapping("/generate") + public String generate(@RequestParam(value = "message", defaultValue = "你是谁?") String message) { + // 一次性返回结果 + ChatClient chatClient = ChatClient.builder(dashScopeChatModel).build(); + return chatClient.prompt() + .user(message) + .call() + .content(); + } + + /** + * 流式对话 + * + * @param message 对话输入内容 + * @return 对话结果 + */ + @GetMapping(value = "/generateStream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public Flux generateStream(@RequestParam(value = "message", defaultValue = "你是谁?") String message) { + ChatClient chatClient = ChatClient.builder(dashScopeChatModel).build(); + return chatClient.prompt() + .user(message) + .stream() + .chatResponse() + .mapNotNull( + chatResponse -> { + Generation generation = chatResponse.getResult(); + String text = generation.getOutput().getText(); + return AIResponse.builder().v(text).build(); + } + ); + } +} diff --git a/src/main/java/com/hanserwei/airobot/controller/OpenAIController.java b/src/main/java/com/hanserwei/airobot/controller/OpenAIController.java index 04cb942..cbe1ed6 100644 --- a/src/main/java/com/hanserwei/airobot/controller/OpenAIController.java +++ b/src/main/java/com/hanserwei/airobot/controller/OpenAIController.java @@ -12,8 +12,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; -import java.util.Objects; - @RestController @RequestMapping("/v5/ai") public class OpenAIController { diff --git a/src/main/java/com/hanserwei/airobot/model/AIResponse.java b/src/main/java/com/hanserwei/airobot/model/AIResponse.java new file mode 100644 index 0000000..2a53df5 --- /dev/null +++ b/src/main/java/com/hanserwei/airobot/model/AIResponse.java @@ -0,0 +1,15 @@ +package com.hanserwei.airobot.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AIResponse { + // 流式响应内容 + private String v; +} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 235ec2e..65068d9 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -30,6 +30,12 @@ spring: options: model: gpt-4o # 模型名称 temperature: 0.7 # 温度值 + dashscope: + api-key: ENC(cMgcKZkFllyE88DIbGwLKot9Vg02co+gsmY8L8o4/o3UjhcmqO4lJzFU35Sx0n+qFG8pDL0wBjoWrT8X6BuRw9vNlQhY1LgRWHaF9S1zzyM=) + chat: + options: + model: qwen-plus + temperature: 0.7 jasypt: encryptor: