Commit 711cfcb3f6f3427258b03a62f2a82fe257eb7392

Authored by cherishsince
1 parent 26afa04e

client 移除 AbstractFunctionCallSupport

yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/chatqianwen/QianWenApi.java
@@ -78,6 +78,8 @@ public class QianWenApi { @@ -78,6 +78,8 @@ public class QianWenApi {
78 new CompletionsRequest() 78 new CompletionsRequest()
79 // 设置 appid 79 // 设置 appid
80 .setAppId(appId) 80 .setAppId(appId)
  81 + // 开启 stream
  82 + .setStream(true)
81 .setMessages(List.of(message)) 83 .setMessages(List.of(message))
82 //开启增量输出模式,后面输出不会包含已经输出的内容 84 //开启增量输出模式,后面输出不会包含已经输出的内容
83 .setParameters(new CompletionsRequest.Parameter().setIncrementalOutput(true)) 85 .setParameters(new CompletionsRequest.Parameter().setIncrementalOutput(true))
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/chatqianwen/QianWenChatClient.java
@@ -5,13 +5,7 @@ import cn.iocoder.yudao.framework.ai.chat.ChatResponse; @@ -5,13 +5,7 @@ import cn.iocoder.yudao.framework.ai.chat.ChatResponse;
5 import cn.iocoder.yudao.framework.ai.chat.Generation; 5 import cn.iocoder.yudao.framework.ai.chat.Generation;
6 import cn.iocoder.yudao.framework.ai.chat.StreamingChatClient; 6 import cn.iocoder.yudao.framework.ai.chat.StreamingChatClient;
7 import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt; 7 import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt;
8 -import cn.iocoder.yudao.framework.ai.chatqianwen.api.QianWenChatCompletionMessage;  
9 -import cn.iocoder.yudao.framework.ai.chatqianwen.api.QianWenChatCompletionRequest;  
10 -import cn.iocoder.yudao.framework.ai.chatyiyan.api.YiYanChatCompletion;  
11 -import cn.iocoder.yudao.framework.ai.chatyiyan.api.YiYanChatCompletionRequest;  
12 import cn.iocoder.yudao.framework.ai.chatyiyan.exception.YiYanApiException; 8 import cn.iocoder.yudao.framework.ai.chatyiyan.exception.YiYanApiException;
13 -import cn.iocoder.yudao.framework.ai.model.function.AbstractFunctionCallSupport;  
14 -import cn.iocoder.yudao.framework.ai.model.function.FunctionCallbackContext;  
15 import com.aliyun.broadscope.bailian.sdk.models.ChatRequestMessage; 9 import com.aliyun.broadscope.bailian.sdk.models.ChatRequestMessage;
16 import com.aliyun.broadscope.bailian.sdk.models.ChatUserMessage; 10 import com.aliyun.broadscope.bailian.sdk.models.ChatUserMessage;
17 import com.aliyun.broadscope.bailian.sdk.models.CompletionsResponse; 11 import com.aliyun.broadscope.bailian.sdk.models.CompletionsResponse;
@@ -36,13 +30,11 @@ import java.util.stream.Collectors; @@ -36,13 +30,11 @@ import java.util.stream.Collectors;
36 * time: 2024/3/13 21:06 30 * time: 2024/3/13 21:06
37 */ 31 */
38 @Slf4j 32 @Slf4j
39 -public class QianWenChatClient extends AbstractFunctionCallSupport<QianWenChatCompletionMessage, ChatRequestMessage, ResponseEntity<CompletionsResponse>>  
40 - implements ChatClient, StreamingChatClient { 33 +public class QianWenChatClient implements ChatClient, StreamingChatClient {
41 34
42 private QianWenApi qianWenApi; 35 private QianWenApi qianWenApi;
43 36
44 public QianWenChatClient(QianWenApi qianWenApi) { 37 public QianWenChatClient(QianWenApi qianWenApi) {
45 - super(null);  
46 this.qianWenApi = qianWenApi; 38 this.qianWenApi = qianWenApi;
47 } 39 }
48 40
@@ -61,10 +53,6 @@ public class QianWenChatClient extends AbstractFunctionCallSupport&lt;QianWenChatCo @@ -61,10 +53,6 @@ public class QianWenChatClient extends AbstractFunctionCallSupport&lt;QianWenChatCo
61 }) 53 })
62 .build(); 54 .build();
63 55
64 - public QianWenChatClient(FunctionCallbackContext functionCallbackContext) {  
65 - super(functionCallbackContext);  
66 - }  
67 -  
68 @Override 56 @Override
69 public ChatResponse call(Prompt prompt) { 57 public ChatResponse call(Prompt prompt) {
70 return this.retryTemplate.execute(ctx -> { 58 return this.retryTemplate.execute(ctx -> {
@@ -72,7 +60,7 @@ public class QianWenChatClient extends AbstractFunctionCallSupport&lt;QianWenChatCo @@ -72,7 +60,7 @@ public class QianWenChatClient extends AbstractFunctionCallSupport&lt;QianWenChatCo
72 // 创建 request 请求,stream模式需要供应商支持 60 // 创建 request 请求,stream模式需要供应商支持
73 ChatRequestMessage request = this.createRequest(prompt, false); 61 ChatRequestMessage request = this.createRequest(prompt, false);
74 // 调用 callWithFunctionSupport 发送请求 62 // 调用 callWithFunctionSupport 发送请求
75 - ResponseEntity<CompletionsResponse> responseEntity = this.callWithFunctionSupport(request); 63 + ResponseEntity<CompletionsResponse> responseEntity = qianWenApi.chatCompletionEntity(request);
76 // 获取结果封装 chatCompletion 64 // 获取结果封装 chatCompletion
77 CompletionsResponse response = responseEntity.getBody(); 65 CompletionsResponse response = responseEntity.getBody();
78 if (!response.isSuccess()) { 66 if (!response.isSuccess()) {
@@ -100,29 +88,4 @@ public class QianWenChatClient extends AbstractFunctionCallSupport&lt;QianWenChatCo @@ -100,29 +88,4 @@ public class QianWenChatClient extends AbstractFunctionCallSupport&lt;QianWenChatCo
100 return new ChatResponse(List.of(new Generation(res.getData().getText()))); 88 return new ChatResponse(List.of(new Generation(res.getData().getText())));
101 }); 89 });
102 } 90 }
103 -  
104 - @Override  
105 - protected QianWenChatCompletionRequest doCreateToolResponseRequest(ChatRequestMessage previousRequest, QianWenChatCompletionMessage responseMessage, List<QianWenChatCompletionMessage> conversationHistory) {  
106 - return null;  
107 - }  
108 -  
109 - @Override  
110 - protected List<QianWenChatCompletionMessage> doGetUserMessages(ChatRequestMessage request) {  
111 - return null;  
112 - }  
113 -  
114 - @Override  
115 - protected QianWenChatCompletionMessage doGetToolResponseMessage(ResponseEntity<CompletionsResponse> response) {  
116 - return null;  
117 - }  
118 -  
119 - @Override  
120 - protected ResponseEntity<CompletionsResponse> doChatCompletion(ChatRequestMessage request) {  
121 - return qianWenApi.chatCompletionEntity(request);  
122 - }  
123 -  
124 - @Override  
125 - protected boolean isToolFunctionCall(ResponseEntity<CompletionsResponse> response) {  
126 - return false;  
127 - }  
128 } 91 }
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/chatxinghuo/XingHuoChatClient.java
@@ -6,10 +6,8 @@ import cn.iocoder.yudao.framework.ai.chat.Generation; @@ -6,10 +6,8 @@ import cn.iocoder.yudao.framework.ai.chat.Generation;
6 import cn.iocoder.yudao.framework.ai.chat.StreamingChatClient; 6 import cn.iocoder.yudao.framework.ai.chat.StreamingChatClient;
7 import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt; 7 import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt;
8 import cn.iocoder.yudao.framework.ai.chatxinghuo.api.XingHuoChatCompletion; 8 import cn.iocoder.yudao.framework.ai.chatxinghuo.api.XingHuoChatCompletion;
9 -import cn.iocoder.yudao.framework.ai.chatxinghuo.api.XingHuoChatCompletionMessage;  
10 import cn.iocoder.yudao.framework.ai.chatxinghuo.api.XingHuoChatCompletionRequest; 9 import cn.iocoder.yudao.framework.ai.chatxinghuo.api.XingHuoChatCompletionRequest;
11 import cn.iocoder.yudao.framework.ai.chatxinghuo.exception.XingHuoApiException; 10 import cn.iocoder.yudao.framework.ai.chatxinghuo.exception.XingHuoApiException;
12 -import cn.iocoder.yudao.framework.ai.model.function.AbstractFunctionCallSupport;  
13 import lombok.extern.slf4j.Slf4j; 11 import lombok.extern.slf4j.Slf4j;
14 import org.springframework.http.ResponseEntity; 12 import org.springframework.http.ResponseEntity;
15 import org.springframework.retry.RetryCallback; 13 import org.springframework.retry.RetryCallback;
@@ -29,8 +27,7 @@ import java.util.stream.Collectors; @@ -29,8 +27,7 @@ import java.util.stream.Collectors;
29 * time: 2024/3/11 10:19 27 * time: 2024/3/11 10:19
30 */ 28 */
31 @Slf4j 29 @Slf4j
32 -public class XingHuoChatClient extends AbstractFunctionCallSupport<XingHuoChatCompletionMessage, XingHuoChatCompletionRequest, ResponseEntity<XingHuoChatCompletion>>  
33 - implements ChatClient, StreamingChatClient { 30 +public class XingHuoChatClient implements ChatClient, StreamingChatClient {
34 31
35 private XingHuoApi xingHuoApi; 32 private XingHuoApi xingHuoApi;
36 33
@@ -52,7 +49,6 @@ public class XingHuoChatClient extends AbstractFunctionCallSupport&lt;XingHuoChatCo @@ -52,7 +49,6 @@ public class XingHuoChatClient extends AbstractFunctionCallSupport&lt;XingHuoChatCo
52 .build(); 49 .build();
53 50
54 public XingHuoChatClient(XingHuoApi xingHuoApi) { 51 public XingHuoChatClient(XingHuoApi xingHuoApi) {
55 - super(null);  
56 this.xingHuoApi = xingHuoApi; 52 this.xingHuoApi = xingHuoApi;
57 } 53 }
58 54
@@ -64,7 +60,7 @@ public class XingHuoChatClient extends AbstractFunctionCallSupport&lt;XingHuoChatCo @@ -64,7 +60,7 @@ public class XingHuoChatClient extends AbstractFunctionCallSupport&lt;XingHuoChatCo
64 // 创建 request 请求,stream模式需要供应商支持 60 // 创建 request 请求,stream模式需要供应商支持
65 XingHuoChatCompletionRequest request = this.createRequest(prompt, false); 61 XingHuoChatCompletionRequest request = this.createRequest(prompt, false);
66 // 调用 callWithFunctionSupport 发送请求 62 // 调用 callWithFunctionSupport 发送请求
67 - ResponseEntity<XingHuoChatCompletion> response = this.callWithFunctionSupport(request); 63 + ResponseEntity<XingHuoChatCompletion> response = xingHuoApi.chatCompletionEntity(request);
68 // 获取结果封装 ChatResponse 64 // 获取结果封装 ChatResponse
69 return new ChatResponse(List.of(new Generation(response.getBody().getPayload().getChoices().getText().get(0).getContent()))); 65 return new ChatResponse(List.of(new Generation(response.getBody().getPayload().getChoices().getText().get(0).getContent())));
70 }); 66 });
@@ -102,29 +98,4 @@ public class XingHuoChatClient extends AbstractFunctionCallSupport&lt;XingHuoChatCo @@ -102,29 +98,4 @@ public class XingHuoChatClient extends AbstractFunctionCallSupport&lt;XingHuoChatCo
102 return new ChatResponse(List.of(new Generation(content))); 98 return new ChatResponse(List.of(new Generation(content)));
103 }); 99 });
104 } 100 }
105 -  
106 - @Override  
107 - protected XingHuoChatCompletionRequest doCreateToolResponseRequest(XingHuoChatCompletionRequest previousRequest, XingHuoChatCompletionMessage responseMessage, List<XingHuoChatCompletionMessage> conversationHistory) {  
108 - return null;  
109 - }  
110 -  
111 - @Override  
112 - protected List<XingHuoChatCompletionMessage> doGetUserMessages(XingHuoChatCompletionRequest request) {  
113 - return null;  
114 - }  
115 -  
116 - @Override  
117 - protected XingHuoChatCompletionMessage doGetToolResponseMessage(ResponseEntity<XingHuoChatCompletion> response) {  
118 - return null;  
119 - }  
120 -  
121 - @Override  
122 - protected ResponseEntity<XingHuoChatCompletion> doChatCompletion(XingHuoChatCompletionRequest request) {  
123 - return xingHuoApi.chatCompletionEntity(request);  
124 - }  
125 -  
126 - @Override  
127 - protected boolean isToolFunctionCall(ResponseEntity<XingHuoChatCompletion> response) {  
128 - return false;  
129 - }  
130 } 101 }
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/chatyiyan/YiYanChatClient.java
@@ -7,13 +7,9 @@ import cn.iocoder.yudao.framework.ai.chat.StreamingChatClient; @@ -7,13 +7,9 @@ import cn.iocoder.yudao.framework.ai.chat.StreamingChatClient;
7 import cn.iocoder.yudao.framework.ai.chat.messages.Message; 7 import cn.iocoder.yudao.framework.ai.chat.messages.Message;
8 import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt; 8 import cn.iocoder.yudao.framework.ai.chat.prompt.Prompt;
9 import cn.iocoder.yudao.framework.ai.chatyiyan.api.YiYanChatCompletion; 9 import cn.iocoder.yudao.framework.ai.chatyiyan.api.YiYanChatCompletion;
10 -import cn.iocoder.yudao.framework.ai.chatyiyan.api.YiYanChatCompletionMessage;  
11 import cn.iocoder.yudao.framework.ai.chatyiyan.api.YiYanChatCompletionRequest; 10 import cn.iocoder.yudao.framework.ai.chatyiyan.api.YiYanChatCompletionRequest;
12 import cn.iocoder.yudao.framework.ai.chatyiyan.exception.YiYanApiException; 11 import cn.iocoder.yudao.framework.ai.chatyiyan.exception.YiYanApiException;
13 -import cn.iocoder.yudao.framework.ai.model.function.AbstractFunctionCallSupport;  
14 -import cn.iocoder.yudao.framework.ai.model.function.FunctionCallbackContext;  
15 import lombok.extern.slf4j.Slf4j; 12 import lombok.extern.slf4j.Slf4j;
16 -  
17 import org.springframework.http.ResponseEntity; 13 import org.springframework.http.ResponseEntity;
18 import org.springframework.retry.RetryCallback; 14 import org.springframework.retry.RetryCallback;
19 import org.springframework.retry.RetryContext; 15 import org.springframework.retry.RetryContext;
@@ -32,14 +28,11 @@ import java.util.List; @@ -32,14 +28,11 @@ import java.util.List;
32 * time: 2024/3/8 19:11 28 * time: 2024/3/8 19:11
33 */ 29 */
34 @Slf4j 30 @Slf4j
35 -public class YiYanChatClient  
36 - extends AbstractFunctionCallSupport<YiYanChatCompletionMessage, YiYanChatCompletionRequest, ResponseEntity<YiYanChatCompletion>>  
37 - implements ChatClient, StreamingChatClient { 31 +public class YiYanChatClient implements ChatClient, StreamingChatClient {
38 32
39 private YiYanApi yiYanApi; 33 private YiYanApi yiYanApi;
40 34
41 public YiYanChatClient(YiYanApi yiYanApi) { 35 public YiYanChatClient(YiYanApi yiYanApi) {
42 - super(new FunctionCallbackContext());  
43 this.yiYanApi = yiYanApi; 36 this.yiYanApi = yiYanApi;
44 } 37 }
45 38
@@ -70,7 +63,7 @@ public class YiYanChatClient @@ -70,7 +63,7 @@ public class YiYanChatClient
70 // 创建 request 请求,stream模式需要供应商支持 63 // 创建 request 请求,stream模式需要供应商支持
71 YiYanChatCompletionRequest request = this.createRequest(prompt, false); 64 YiYanChatCompletionRequest request = this.createRequest(prompt, false);
72 // 调用 callWithFunctionSupport 发送请求 65 // 调用 callWithFunctionSupport 发送请求
73 - ResponseEntity<YiYanChatCompletion> response = this.callWithFunctionSupport(request); 66 + ResponseEntity<YiYanChatCompletion> response = yiYanApi.chatCompletionEntity(request);
74 // 获取结果封装 ChatResponse 67 // 获取结果封装 ChatResponse
75 YiYanChatCompletion chatCompletion = response.getBody(); 68 YiYanChatCompletion chatCompletion = response.getBody();
76 return new ChatResponse(List.of(new Generation(chatCompletion.getResult()))); 69 return new ChatResponse(List.of(new Generation(chatCompletion.getResult())));
@@ -98,40 +91,6 @@ public class YiYanChatClient @@ -98,40 +91,6 @@ public class YiYanChatClient
98 YiYanChatCompletionRequest request = this.createRequest(prompt, true); 91 YiYanChatCompletionRequest request = this.createRequest(prompt, true);
99 // 调用 callWithFunctionSupport 发送请求 92 // 调用 callWithFunctionSupport 发送请求
100 Flux<YiYanChatCompletion> response = this.yiYanApi.chatCompletionStream(request); 93 Flux<YiYanChatCompletion> response = this.yiYanApi.chatCompletionStream(request);
101 -// response.subscribe(new Consumer<YiYanChatCompletion>() {  
102 -// @Override  
103 -// public void accept(YiYanChatCompletion chatCompletion) {  
104 -// // {"id":"as-p0nfjuuasg","object":"chat.completion","created":1710033402,"sentence_id":0,"is_end":false,"is_truncated":false,"result":"编程语","need_clear_history":false,"finish_reason":"normal","usage":{"prompt_tokens":5,"completion_tokens":0,"total_tokens":5}}  
105 -// System.err.println(chatCompletion);  
106 -// }  
107 -// });  
108 - return response.map(res -> {  
109 - return new ChatResponse(List.of(new Generation(res.getResult())));  
110 - });  
111 - }  
112 -  
113 - @Override  
114 - protected YiYanChatCompletionRequest doCreateToolResponseRequest(YiYanChatCompletionRequest previousRequest, YiYanChatCompletionMessage responseMessage, List<YiYanChatCompletionMessage> conversationHistory) {  
115 - return null;  
116 - }  
117 -  
118 - @Override  
119 - protected List<YiYanChatCompletionMessage> doGetUserMessages(YiYanChatCompletionRequest request) {  
120 - return null;  
121 - }  
122 -  
123 - @Override  
124 - protected YiYanChatCompletionMessage doGetToolResponseMessage(ResponseEntity<YiYanChatCompletion> response) {  
125 - return null;  
126 - }  
127 -  
128 - @Override  
129 - protected ResponseEntity<YiYanChatCompletion> doChatCompletion(YiYanChatCompletionRequest request) {  
130 - return yiYanApi.chatCompletionEntity(request);  
131 - }  
132 -  
133 - @Override  
134 - protected boolean isToolFunctionCall(ResponseEntity<YiYanChatCompletion> response) {  
135 - return false; 94 + return response.map(res -> new ChatResponse(List.of(new Generation(res.getResult()))));
136 } 95 }
137 } 96 }
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/model/function/AbstractFunctionCallSupport.java
@@ -29,11 +29,16 @@ public abstract class AbstractFunctionCallSupport&lt;Msg, Req, Resp&gt; { @@ -29,11 +29,16 @@ public abstract class AbstractFunctionCallSupport&lt;Msg, Req, Resp&gt; {
29 protected final static boolean IS_RUNTIME_CALL = true; 29 protected final static boolean IS_RUNTIME_CALL = true;
30 30
31 /** 31 /**
  32 + * 函数回调寄存器用于按名称解析函数回调。
  33 + *
32 * The function callback register is used to resolve the function callbacks by name. 34 * The function callback register is used to resolve the function callbacks by name.
33 */ 35 */
34 protected final Map<String, FunctionCallback> functionCallbackRegister = new ConcurrentHashMap<>(); 36 protected final Map<String, FunctionCallback> functionCallbackRegister = new ConcurrentHashMap<>();
35 37
36 /** 38 /**
  39 + * 函数回调上下文用于按名称解析函数回调来自Spring上下文。
  40 + * 它是可选的,通常与Spring一起使用自动配置。
  41 + *
37 * The function callback context is used to resolve the function callbacks by name 42 * The function callback context is used to resolve the function callbacks by name
38 * from the Spring context. It is optional and usually used with Spring 43 * from the Spring context. It is optional and usually used with Spring
39 * auto-configuration. 44 * auto-configuration.
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/model/function/FunctionCallback.java
@@ -17,6 +17,13 @@ @@ -17,6 +17,13 @@
17 package cn.iocoder.yudao.framework.ai.model.function; 17 package cn.iocoder.yudao.framework.ai.model.function;
18 18
19 /** 19 /**
  20 + *
  21 + * 表示模型函数调用处理程序。实现已向注册对触发函数调用的提示进行建模和调用。
  22 + *
  23 + * https://blog.csdn.net/weixin_37546425/article/details/136402740
  24 + *
  25 + * https://www.163.com/dy/article/ICE2S20P05119NPR.html
  26 + *
20 * Represents a model function call handler. Implementations are registered with the 27 * Represents a model function call handler. Implementations are registered with the
21 * Models and called on prompts that trigger the function call. 28 * Models and called on prompts that trigger the function call.
22 * 29 *