feat(ai): 集成阿里云DashScope AI模型支持

- 新增DashScope AI配置项,支持qwen-plus模型
- 添加AIResponse数据模型用于流式响应
- 实现普通对话和流式对话两个接口
- 引入spring-ai-alibaba-starter-dashscope依赖
- 更新OpenAIController移除无用导入
- 在pom.xml中添加spring-ai-alibaba-bom管理依赖版本
This commit is contained in:
2025-10-23 14:27:38 +08:00
parent 0782148820
commit 5bfa65bc0b
5 changed files with 92 additions and 2 deletions

View File

@@ -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<AIResponse> 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();
}
);
}
}

View File

@@ -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 {

View File

@@ -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;
}