Skip to content

Commit 27619c0

Browse files
committed
feat(ai\spring-ai-alibaba1): Spring AI Alibaba 的使用
1 parent e75bbf5 commit 27619c0

17 files changed

Lines changed: 3290 additions & 252 deletions

ai/spring-ai-alibaba1/README_CATALOG.md

Lines changed: 403 additions & 0 deletions
Large diffs are not rendered by default.

ai/spring-ai-alibaba1/README_NEW.md

Lines changed: 1405 additions & 0 deletions
Large diffs are not rendered by default.

ai/spring-ai-alibaba1/README_TMP.md

Lines changed: 1115 additions & 0 deletions
Large diffs are not rendered by default.

ai/spring-ai-alibaba1/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
<version>${hutool.version}</version>
5858
</dependency>
5959

60-
<!-- Spring AI Alibaba 依赖 -->
60+
<!-- Spring AI Alibaba DashScope -->
6161
<dependency>
6262
<groupId>com.alibaba.cloud.ai</groupId>
6363
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package io.github.atengk.ai.config;
2+
3+
import cn.hutool.core.util.StrUtil;
4+
import com.alibaba.cloud.ai.graph.RunnableConfig;
5+
6+
/**
7+
* Agent 执行配置工厂
8+
*
9+
* @author Ateng
10+
* @since 2026-04-24
11+
*/
12+
public class AgentRunnableConfigFactory {
13+
14+
/**
15+
* 创建 Agent 执行配置
16+
*
17+
* @param threadId 会话 ID
18+
* @param userId 用户 ID
19+
* @param tenantId 租户 ID
20+
* @return Agent 执行配置
21+
*/
22+
public static RunnableConfig create(String threadId, String userId, String tenantId) {
23+
String conversationId = StrUtil.blankToDefault(threadId, "default-thread");
24+
25+
return RunnableConfig.builder()
26+
.threadId(conversationId)
27+
.addMetadata("user_id", userId)
28+
.addMetadata("tenant_id", tenantId)
29+
.addMetadata("source", "spring-ai-alibaba-demo")
30+
.build();
31+
}
32+
33+
}

ai/spring-ai-alibaba1/src/main/java/io/github/atengk/ai/config/ChatClientConfig.java

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,52 @@
11
package io.github.atengk.ai.config;
22

3-
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
43
import com.alibaba.cloud.ai.graph.agent.ReactAgent;
4+
import com.alibaba.cloud.ai.graph.agent.hook.modelcalllimit.ModelCallLimitHook;
55
import com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;
6-
import org.springframework.ai.tool.ToolCallback;
6+
import io.github.atengk.ai.model.AnalysisResult;
7+
import lombok.extern.slf4j.Slf4j;
8+
import org.springframework.ai.chat.model.ChatModel;
79
import org.springframework.context.annotation.Bean;
810
import org.springframework.context.annotation.Configuration;
911

10-
import java.util.List;
11-
12+
/**
13+
* ReactAgent 配置
14+
*
15+
* @author Ateng
16+
* @since 2026-04-24
17+
*/
18+
@Slf4j
1219
@Configuration
1320
public class ReactAgentConfig {
1421

1522
@Bean
16-
public ReactAgent reactAgent(DashScopeChatModel dashScopeChatModel) {
23+
public ReactAgent reactAgent(ChatModel chatModel) {
24+
log.info("初始化 ReactAgent");
25+
1726
return ReactAgent.builder()
18-
.name("default_agent")
19-
.model(dashScopeChatModel)
27+
.name("dashscope_react_agent")
28+
.model(chatModel)
29+
.description("基于 DashScope 的 ReAct 智能体")
30+
.instruction("""
31+
你是一个专业的 Java 技术助手。
32+
需要先理解用户意图,再根据任务复杂度决定是否调用工具。
33+
如果工具结果不足以支撑结论,需要明确说明不确定性。
34+
""")
35+
.hooks(ModelCallLimitHook.builder().runLimit(5).build())
2036
.saver(new MemorySaver())
2137
.build();
2238
}
2339

2440
@Bean
25-
public ReactAgent toolReactAgent(
26-
DashScopeChatModel dashScopeChatModel,
27-
List<ToolCallback> toolCallbacks
28-
) {
41+
public ReactAgent structuredReactAgent(ChatModel chatModel) {
2942
return ReactAgent.builder()
30-
.name("tool_agent")
31-
.tools(toolCallbacks)
32-
.model(dashScopeChatModel)
43+
.name("structured_react_agent")
44+
.model(chatModel)
45+
.description("返回结构化分析结果的 Agent")
46+
.instruction("你需要分析用户问题,并按照指定结构返回结果。")
47+
.outputType(AnalysisResult.class)
3348
.saver(new MemorySaver())
3449
.build();
3550
}
3651

37-
}
52+
}

ai/spring-ai-alibaba1/src/main/java/io/github/atengk/ai/config/ToolConfig.java

Lines changed: 0 additions & 29 deletions
This file was deleted.

ai/spring-ai-alibaba1/src/main/java/io/github/atengk/ai/controller/BaseChatController.java

Lines changed: 0 additions & 81 deletions
This file was deleted.
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package io.github.atengk.ai.controller;
2+
3+
import cn.hutool.core.util.StrUtil;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.ai.chat.messages.UserMessage;
7+
import org.springframework.ai.chat.model.ChatModel;
8+
import org.springframework.ai.chat.model.ChatResponse;
9+
import org.springframework.ai.chat.prompt.Prompt;
10+
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.RequestParam;
12+
import org.springframework.web.bind.annotation.RestController;
13+
import reactor.core.publisher.Flux;
14+
15+
import java.util.Map;
16+
17+
/**
18+
* 文本对话接口
19+
*
20+
* @author Ateng
21+
* @since 2026-04-24
22+
*/
23+
@Slf4j
24+
@RestController
25+
@RequiredArgsConstructor
26+
public class ChatController {
27+
28+
private final ChatModel chatModel;
29+
30+
/**
31+
* 普通文本生成接口
32+
*
33+
* @param message 用户输入内容
34+
* @return 模型生成结果
35+
*/
36+
@GetMapping("/ai/generate")
37+
public Map<String, String> generate(@RequestParam(value = "message", required = false) String message) {
38+
String userMessage = StrUtil.blankToDefault(message, "请用一句话介绍 Spring AI Alibaba");
39+
log.info("收到普通聊天请求,message={}", userMessage);
40+
41+
String content = chatModel.call(userMessage);
42+
return Map.of("generation", content);
43+
}
44+
45+
/**
46+
* 流式文本生成接口
47+
*
48+
* @param message 用户输入内容
49+
* @return 流式模型响应
50+
*/
51+
@GetMapping(value = "/ai/generateStream", produces = "text/event-stream;charset=UTF-8")
52+
public Flux<String> generateStream(@RequestParam(value = "message", required = false) String message) {
53+
String userMessage = StrUtil.blankToDefault(message, "请列出 Spring AI Alibaba 的三个核心能力");
54+
log.info("收到流式聊天请求,message={}", userMessage);
55+
56+
Prompt prompt = new Prompt(new UserMessage(userMessage));
57+
return chatModel.stream(prompt)
58+
.map(ChatResponse::getResult)
59+
.map(result -> result.getOutput().getText())
60+
.filter(StrUtil::isNotBlank);
61+
}
62+
63+
}

0 commit comments

Comments
 (0)