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: