Skip to content

Commit afc44ce

Browse files
authored
Merge pull request #64 from PolarishT/tool-call-impl
[WIP TC]: Tool call impl
2 parents 95a2765 + 8eba3c0 commit afc44ce

File tree

7 files changed

+98
-16
lines changed

7 files changed

+98
-16
lines changed

spring-ai-alibaba-integration-example/backend/pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,21 @@
9191
<version>6.6.9.Final</version>
9292
</dependency>
9393

94+
<dependency>
95+
<groupId>com.alibaba.cloud.ai</groupId>
96+
<artifactId>spring-ai-alibaba-starter-function-calling-baidumap</artifactId>
97+
<version>${spring-ai-alibaba.version}</version>
98+
</dependency>
99+
100+
<dependency>
101+
<groupId>com.alibaba.cloud.ai</groupId>
102+
<artifactId>spring-ai-alibaba-starter-function-calling-baidutranslate</artifactId>
103+
<version>${spring-ai-alibaba.version}</version>
104+
</dependency>
94105
</dependencies>
95106

96107
<build>
108+
<finalName>app.jar</finalName>
97109
<plugins>
98110
<plugin>
99111
<groupId>org.springframework.boot</groupId>

spring-ai-alibaba-integration-example/backend/src/main/java/com/alibaba/cloud/ai/application/SpringAIIntegrationApplication.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919

2020
import org.springframework.boot.SpringApplication;
2121
import org.springframework.boot.autoconfigure.SpringBootApplication;
22+
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
23+
import org.springframework.boot.autoconfigure.jdbc.JdbcClientAutoConfiguration;
24+
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
2225

2326
/**
2427
* @author yuluo

spring-ai-alibaba-integration-example/backend/src/main/java/com/alibaba/cloud/ai/application/controller/SAAFunctionController.java

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,24 @@
1717

1818
package com.alibaba.cloud.ai.application.controller;
1919

20+
import com.alibaba.cloud.ai.application.annotation.UserIp;
21+
import com.alibaba.cloud.ai.application.entity.result.Result;
22+
import com.alibaba.cloud.ai.application.service.SAABaseService;
23+
import com.alibaba.cloud.ai.application.service.SAAChatService;
2024
import com.alibaba.cloud.ai.application.service.SAAFunctionService;
25+
import com.alibaba.cloud.ai.application.utils.ValidText;
26+
import com.alibaba.nacos.api.exception.runtime.NacosSerializationException;
27+
import io.swagger.v3.oas.annotations.Operation;
2128
import io.swagger.v3.oas.annotations.tags.Tag;
2229

23-
import org.springframework.web.bind.annotation.RequestMapping;
24-
import org.springframework.web.bind.annotation.RestController;
30+
import jakarta.servlet.http.HttpServletResponse;
31+
import org.springframework.util.StringUtils;
32+
import org.springframework.web.bind.annotation.*;
33+
import reactor.core.publisher.Flux;
34+
35+
import java.util.List;
36+
import java.util.Map;
37+
import java.util.Set;
2538

2639
/**
2740
* @author yuluo
@@ -35,8 +48,38 @@ public class SAAFunctionController {
3548

3649
private final SAAFunctionService functionService;
3750

38-
public SAAFunctionController(SAAFunctionService functionService) {
51+
private final SAABaseService baseService;
52+
53+
public SAAFunctionController(SAAFunctionService functionService, SAABaseService baseService) {
3954
this.functionService = functionService;
55+
this.baseService = baseService;
56+
}
57+
58+
/**
59+
* 发送指定参数获得模型响应。
60+
* 1. 发送 prompt 为空时,返回错误信息。
61+
* 2. 发送模型时,允许为空,当参数有值且在模型配置列表中,调用对应模型。如不存在返回错误。
62+
* 3. chatId 聊天记忆,由前端传递,为 Object 类型,不能重复
63+
*/
64+
@UserIp
65+
@GetMapping("tool-call")
66+
@Operation(summary = "DashScope ToolCall Chat")
67+
public Flux<Result<String>> chat(
68+
@RequestParam("prompt") String prompt,
69+
HttpServletResponse response,
70+
@RequestHeader(value = "models", required = false) String models,
71+
@RequestHeader(value = "chatId", required = false) String chatId
72+
) {
73+
74+
// 接口限流在审计平台中配置
75+
76+
if (!ValidText.isValidate(prompt)) {
77+
78+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
79+
return Flux.just(Result.failed("No chat prompt provided"));
80+
}
81+
82+
return functionService.chat(chatId, models, prompt).map(Result::success);
4083
}
4184

4285
}

spring-ai-alibaba-integration-example/backend/src/main/java/com/alibaba/cloud/ai/application/service/SAAFunctionService.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,16 @@
1717

1818
package com.alibaba.cloud.ai.application.service;
1919

20+
import com.alibaba.cloud.ai.dashscope.api.DashScopeApi;
21+
import com.alibaba.cloud.ai.dashscope.api.DashScopeResponseFormat;
22+
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
23+
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
2024
import org.springframework.ai.chat.client.ChatClient;
21-
import org.springframework.ai.chat.model.ChatModel;
2225
import org.springframework.stereotype.Service;
26+
import reactor.core.publisher.Flux;
27+
28+
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
29+
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;
2330

2431
/**
2532
* @author yuluo
@@ -29,15 +36,32 @@
2936
@Service
3037
public class SAAFunctionService {
3138

32-
private final ChatClient dashScopeChatClient;
33-
34-
public SAAFunctionService(ChatModel chatModel) {
39+
private final ChatClient defaultChatClient;
3540

36-
this.dashScopeChatClient = ChatClient
37-
.builder(chatModel)
38-
.build();
39-
}
41+
public SAAFunctionService () {
4042

43+
this.defaultChatClient =
44+
ChatClient.builder(new DashScopeChatModel(new DashScopeApi(System.getenv(
45+
"AI_DASH_SCOPE_API_KEY"))))
46+
.build();
47+
}
4148

49+
public Flux<String> chat (String chatId, String model, String chatPrompt) {
4250

51+
return defaultChatClient.prompt()
52+
.options(DashScopeChatOptions.builder()
53+
.withModel(model)
54+
.withTemperature(0.8)
55+
.withResponseFormat(DashScopeResponseFormat.builder()
56+
.type(DashScopeResponseFormat.Type.TEXT)
57+
.build())
58+
.build())
59+
.user(chatPrompt)
60+
.advisors(memoryAdvisor -> memoryAdvisor.param(CHAT_MEMORY_CONVERSATION_ID_KEY,
61+
chatId)
62+
.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
63+
.functions("baiduTranslateFunction","baiDuMapGetAddressInformationFunction")
64+
.stream()
65+
.content();
66+
}
4367
}

spring-ai-alibaba-integration-example/frontend/pnpm-lock.yaml

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

spring-ai-alibaba-mcp-example/sqlite/chatbot/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<description>Simple AI Application using MCP client to chat with SQLite</description>
1616
<properties>
1717
<java.version>17</java.version>
18-
<spring.ai.alibaba>1.0.0-M5.1-SNAPSHOT</spring.ai.alibaba>
18+
<spring.ai.alibaba>1.0.0-M5.1</spring.ai.alibaba>
1919
</properties>
2020

2121
<dependencyManagement>

spring-ai-alibaba-mcp-example/sqlite/simple/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
<properties>
1818
<java.version>17</java.version>
19-
<spring.ai.alibaba>1.0.0-M5.1-SNAPSHOT</spring.ai.alibaba>
19+
<spring.ai.alibaba>1.0.0-M5.1</spring.ai.alibaba>
2020
</properties>
2121

2222
<dependencyManagement>

0 commit comments

Comments
 (0)