Commit 645dfae003c723dd268ce0cacc0f0bfaea1a8314

Authored by YunaiV
1 parent 04021ce0

【代码评审】AI:讯飞星火的接入调整

Showing 18 changed files with 72 additions and 66 deletions
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/config/AiChatClientFactory.java
... ... @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum;
4 4 import org.springframework.ai.chat.ChatClient;
5 5 import org.springframework.ai.chat.StreamingChatClient;
6 6 import org.springframework.ai.models.tongyi.QianWenChatClient;
7   -import org.springframework.ai.models.xinghuo.XingHuoChatClient;
  7 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatClient;
8 8 import cn.iocoder.yudao.framework.ai.core.model.yiyan.YiYanChatClient;
9 9 import org.springframework.ai.ollama.OllamaChatClient;
10 10 import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -27,7 +27,7 @@ public class AiChatClientFactory {
27 27 public ChatClient getChatClient(AiPlatformEnum platformEnum) {
28 28 if (AiPlatformEnum.QIAN_WEN == platformEnum) {
29 29 return applicationContext.getBean(QianWenChatClient.class);
30   - } else if (AiPlatformEnum.YIYAN == platformEnum) {
  30 + } else if (AiPlatformEnum.YI_YAN == platformEnum) {
31 31 return applicationContext.getBean(YiYanChatClient.class);
32 32 } else if (AiPlatformEnum.XING_HUO == platformEnum) {
33 33 return applicationContext.getBean(XingHuoChatClient.class);
... ... @@ -42,7 +42,7 @@ public class AiChatClientFactory {
42 42 // }
43 43 if (AiPlatformEnum.QIAN_WEN == platformEnum) {
44 44 return applicationContext.getBean(QianWenChatClient.class);
45   - } else if (AiPlatformEnum.YIYAN == platformEnum) {
  45 + } else if (AiPlatformEnum.YI_YAN == platformEnum) {
46 46 return applicationContext.getBean(YiYanChatClient.class);
47 47 } else if (AiPlatformEnum.XING_HUO == platformEnum) {
48 48 return applicationContext.getBean(XingHuoChatClient.class);
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/vo/AiChatModalConfigVO.java
... ... @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.ai.dal.vo;
3 3 import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum;
4 4 import lombok.Data;
5 5 import lombok.experimental.Accessors;
6   -import org.springframework.ai.models.xinghuo.XingHuoChatModel;
  6 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatModel;
7 7 import cn.iocoder.yudao.framework.ai.core.model.yiyan.api.YiYanChatModel;
8 8  
9 9 /**
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/config/YudaoAiAutoConfiguration.java
... ... @@ -5,9 +5,9 @@ import org.springframework.ai.models.tongyi.QianWenChatClient;
5 5 import org.springframework.ai.models.tongyi.QianWenChatModal;
6 6 import org.springframework.ai.models.tongyi.QianWenOptions;
7 7 import org.springframework.ai.models.tongyi.api.QianWenApi;
8   -import org.springframework.ai.models.xinghuo.XingHuoChatClient;
9   -import org.springframework.ai.models.xinghuo.XingHuoOptions;
10   -import org.springframework.ai.models.xinghuo.api.XingHuoApi;
  8 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatClient;
  9 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoOptions;
  10 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.api.XingHuoApi;
11 11 import cn.iocoder.yudao.framework.ai.core.model.yiyan.YiYanChatClient;
12 12 import cn.iocoder.yudao.framework.ai.core.model.yiyan.YiYanChatOptions;
13 13 import cn.iocoder.yudao.framework.ai.core.model.yiyan.api.YiYanApi;
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/config/YudaoAiImageProperties.java
1 1 package cn.iocoder.yudao.framework.ai.config;
2 2  
3 3 import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum;
4   -import org.springframework.ai.models.xinghuo.XingHuoChatModel;
5   -import org.springframework.ai.models.xinghuo.XingHuoOptions;
  4 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatModel;
  5 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoOptions;
6 6 import cn.iocoder.yudao.framework.ai.core.model.yiyan.api.YiYanChatModel;
7 7 import lombok.Data;
8 8 import lombok.experimental.Accessors;
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/config/YudaoAiProperties.java
1 1 package cn.iocoder.yudao.framework.ai.config;
2 2  
3 3 import cn.iocoder.yudao.framework.ai.core.enums.AiPlatformEnum;
4   -import org.springframework.ai.models.xinghuo.XingHuoChatModel;
  4 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatModel;
5 5 import cn.iocoder.yudao.framework.ai.core.model.yiyan.api.YiYanChatModel;
6 6 import cn.iocoder.yudao.framework.ai.core.enums.OpenAiImageModelEnum;
7 7 import cn.iocoder.yudao.framework.ai.core.enums.OpenAiImageStyleEnum;
... ... @@ -21,7 +21,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
21 21 @ConfigurationProperties(prefix = "yudao.ai")
22 22 public class YudaoAiProperties {
23 23  
24   - private String initSource;
25 24 private QianWenProperties qianwen;
26 25 private XingHuoProperties xinghuo;
27 26 private YiYanProperties yiyan;
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/enums/AiPlatformEnum.java
... ... @@ -16,16 +16,23 @@ public enum AiPlatformEnum {
16 16  
17 17 OPENAI("OpenAI", "OpenAI"),
18 18 OLLAMA("Ollama", "Ollama"),
19   - YIYAN("YiYan", "文心一言"),
  19 + YI_YAN("YiYan", "文心一言"), // 百度
  20 + XING_HUO("XingHuo", "星火"), // 讯飞
  21 +
  22 + QIAN_WEN("qianwen", "千问"), // 阿里
20 23  
21   - QIAN_WEN("qianwen", "千问"),
22   - XING_HUO("xinghuo", "星火"),
23 24 OPEN_AI_DALL("dall", "dall"),
24 25 MIDJOURNEY("midjourney", "midjourney"),
25 26  
26 27 ;
27 28  
  29 + /**
  30 + * 平台
  31 + */
28 32 private final String platform;
  33 + /**
  34 + * 平台名
  35 + */
29 36 private final String name;
30 37  
31 38 // public static List<AiPlatformEnum> CHAT_PLATFORM_LIST = Lists.newArrayList(
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/xinghuo/XingHuoChatClient.java renamed to yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/model/xinghuo/XingHuoChatClient.java
1   -package org.springframework.ai.models.xinghuo;
  1 +package cn.iocoder.yudao.framework.ai.core.model.xinghuo;
2 2  
3 3 import cn.hutool.core.bean.BeanUtil;
4 4 import cn.hutool.core.exceptions.ExceptionUtil;
5 5 import cn.iocoder.yudao.framework.ai.core.exception.ChatException;
  6 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.api.XingHuoApi;
  7 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.api.XingHuoChatCompletion;
  8 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.api.XingHuoChatCompletionRequest;
6 9 import org.springframework.ai.chat.*;
7 10 import org.springframework.ai.chat.prompt.ChatOptions;
8 11 import org.springframework.ai.chat.prompt.Prompt;
9   -import org.springframework.ai.models.xinghuo.api.XingHuoApi;
10   -import org.springframework.ai.models.xinghuo.api.XingHuoChatCompletion;
11   -import org.springframework.ai.models.xinghuo.api.XingHuoChatCompletionRequest;
12 12 import lombok.extern.slf4j.Slf4j;
13 13 import org.springframework.http.ResponseEntity;
14 14 import org.springframework.retry.RetryCallback;
... ... @@ -21,6 +21,7 @@ import java.time.Duration;
21 21 import java.util.List;
22 22 import java.util.stream.Collectors;
23 23  
  24 +// TODO @fan:参考 yiyan 的修改建议,调整下 xinghuo 的实现;可以等 yiyan 修改完建议,然后我 review 完,再改这个哈;
24 25 /**
25 26 * 讯飞星火 client
26 27 * <p>
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/xinghuo/XingHuoChatModel.java renamed to yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/model/xinghuo/XingHuoChatModel.java
1   -package org.springframework.ai.models.xinghuo;
  1 +package cn.iocoder.yudao.framework.ai.core.model.xinghuo;
2 2  
3 3 import lombok.Getter;
4 4  
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/xinghuo/XingHuoOptions.java renamed to yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/model/xinghuo/XingHuoOptions.java
1   -package org.springframework.ai.models.xinghuo;
  1 +package cn.iocoder.yudao.framework.ai.core.model.xinghuo;
2 2  
3 3 import org.springframework.ai.chat.prompt.ChatOptions;
4 4 import lombok.Data;
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/xinghuo/api/XingHuoApi.java renamed to yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/model/xinghuo/api/XingHuoApi.java
1   -package org.springframework.ai.models.xinghuo.api;
  1 +package cn.iocoder.yudao.framework.ai.core.model.xinghuo.api;
2 2  
3 3 import cn.hutool.http.HttpUtil;
4 4 import cn.hutool.json.JSONUtil;
5   -import org.springframework.ai.models.xinghuo.XingHuoChatModel;
  5 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatModel;
6 6 import lombok.Data;
7 7 import org.springframework.http.HttpStatusCode;
8 8 import org.springframework.http.ResponseEntity;
... ... @@ -21,6 +21,7 @@ import java.text.SimpleDateFormat;
21 21 import java.util.*;
22 22 import java.util.stream.Collectors;
23 23  
  24 +// TODO @fan:讯飞使用 spring websocket 接入,还是 okhttp?确认了,未使用的最好删除下,反正 git 也能找回 history
24 25 /**
25 26 * 讯飞星火 属性、api
26 27 * <p>
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/xinghuo/api/XingHuoChatCompletion.java renamed to yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/model/xinghuo/api/XingHuoChatCompletion.java
1   -package org.springframework.ai.models.xinghuo.api;
  1 +package cn.iocoder.yudao.framework.ai.core.model.xinghuo.api;
2 2  
3 3 import lombok.Data;
4 4 import lombok.experimental.Accessors;
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/xinghuo/api/XingHuoChatCompletionMessage.java renamed to yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/model/xinghuo/api/XingHuoChatCompletionMessage.java
1   -package org.springframework.ai.models.xinghuo.api;
  1 +package cn.iocoder.yudao.framework.ai.core.model.xinghuo.api;
2 2  
3 3 /**
4 4 * author: fansili
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/org/springframework/ai/models/xinghuo/api/XingHuoChatCompletionRequest.java renamed to yudao-module-ai/yudao-spring-boot-starter-ai/src/main/java/cn/iocoder/yudao/framework/ai/core/model/xinghuo/api/XingHuoChatCompletionRequest.java
1   -package org.springframework.ai.models.xinghuo.api;
  1 +package cn.iocoder.yudao.framework.ai.core.model.xinghuo.api;
2 2  
3 3 import lombok.Data;
4 4 import lombok.Getter;
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoChatClientMainTests.java
... ... @@ -2,8 +2,8 @@ package cn.iocoder.yudao.framework.ai.chat;
2 2  
3 3 import cn.hutool.http.HttpUtil;
4 4 import cn.hutool.json.JSONUtil;
5   -import org.springframework.ai.models.xinghuo.api.XingHuoChatCompletion;
6   -import org.springframework.ai.models.xinghuo.api.XingHuoChatCompletionRequest;
  5 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.api.XingHuoChatCompletion;
  6 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.api.XingHuoChatCompletionRequest;
7 7 import org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient;
8 8 import org.springframework.web.reactive.socket.client.WebSocketClient;
9 9 import reactor.core.publisher.Flux;
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoChatClientTests.java
... ... @@ -5,10 +5,10 @@ import org.springframework.ai.chat.messages.Message;
5 5 import org.springframework.ai.chat.messages.SystemMessage;
6 6 import org.springframework.ai.chat.messages.UserMessage;
7 7 import org.springframework.ai.chat.prompt.Prompt;
8   -import org.springframework.ai.models.xinghuo.XingHuoChatClient;
9   -import org.springframework.ai.models.xinghuo.XingHuoChatModel;
10   -import org.springframework.ai.models.xinghuo.XingHuoOptions;
11   -import org.springframework.ai.models.xinghuo.api.XingHuoApi;
  8 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatClient;
  9 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatModel;
  10 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoOptions;
  11 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.api.XingHuoApi;
12 12 import org.junit.Before;
13 13 import org.junit.Test;
14 14 import reactor.core.publisher.Flux;
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/chat/XingHuoOkHttpTests.java
... ... @@ -2,9 +2,9 @@ package cn.iocoder.yudao.framework.ai.chat;
2 2  
3 3 import cn.hutool.http.HttpUtil;
4 4 import cn.hutool.json.JSONUtil;
5   -import org.springframework.ai.models.xinghuo.XingHuoChatClient;
6   -import org.springframework.ai.models.xinghuo.api.XingHuoChatCompletion;
7   -import org.springframework.ai.models.xinghuo.api.XingHuoChatCompletionRequest;
  5 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatClient;
  6 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.api.XingHuoChatCompletion;
  7 +import cn.iocoder.yudao.framework.ai.core.model.xinghuo.api.XingHuoChatCompletionRequest;
8 8 import okhttp3.*;
9 9 import org.jetbrains.annotations.NotNull;
10 10  
... ...
yudao-server/src/main/resources/application-local.yaml
... ... @@ -209,37 +209,6 @@ wx:
209 209  
210 210 # 芋道配置项,设置当前项目所有自定义的配置
211 211 yudao:
212   - ai:
213   - initSource: yaml
214   - qianwen:
215   - enable: true
216   - aiPlatform: QIAN_WEN
217   - max-tokens: 1500
218   - temperature: 0.85
219   - topP: 0.8
220   - topK: 0
221   - api-key: sk-Zsd81gZYg7
222   - xinghuo:
223   - enable: true
224   - aiPlatform: XING_HUO
225   - max-tokens: 1500
226   - temperature: 0.85
227   - topP: 0.8
228   - topK: 0
229   - appId: 13c8cca6
230   - appKey: cb6415c19d6162cda07b47316fcb0416
231   - secretKey: Y2JiYTIxZjA3MDMxMjNjZjQzYzVmNzdh
232   - model: XING_HUO_3_5
233   - openAiImage:
234   - enable: true
235   - api-key: ${OPEN_AI_KEY}
236   - model: dall_e_2
237   - style: vivid
238   - midjourney:
239   - enable: true
240   - token: MTE4MjE3MjY2MjkxNTY3ODIzOA.GEV1SG.c49F8lZoGCUHwsj8O0UdodmM6nyQHvuD2fXflw
241   - guild-id: 1237948819677904956
242   - channel-id: 1237948819677904960
243 212 captcha:
244 213 enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试;
245 214 security:
... ...
yudao-server/src/main/resources/application.yaml
... ... @@ -153,7 +153,7 @@ spring.ai:
153 153 yudao.ai:
154 154 yiyan:
155 155 enable: true
156   - aiPlatform: YIYAN # TODO @fan:建议每个都独立配置属性类
  156 + aiPlatform: YI_YAN # TODO @fan:建议每个都独立配置属性类
157 157 max-tokens: 1500
158 158 temperature: 0.85
159 159 topP: 0.8
... ... @@ -162,6 +162,35 @@ yudao.ai:
162 162 secretKey: R9mYF9dl9KASgi5RUq0FQt3wRisSnOcK
163 163 refreshTokenSecondTime: 86400
164 164 model: ERNIE4_3_5_8K
  165 + xinghuo:
  166 + enable: true
  167 + aiPlatform: XING_HUO # TODO @fan:建议每个都独立配置属性类
  168 + max-tokens: 1500
  169 + temperature: 0.85
  170 + topP: 0.8
  171 + topK: 0
  172 + appId: 13c8cca6
  173 + appKey: cb6415c19d6162cda07b47316fcb0416
  174 + secretKey: Y2JiYTIxZjA3MDMxMjNjZjQzYzVmNzdh
  175 + model: XING_HUO_3_5
  176 + qianwen:
  177 + enable: true
  178 + aiPlatform: QIAN_WEN
  179 + max-tokens: 1500
  180 + temperature: 0.85
  181 + topP: 0.8
  182 + topK: 0
  183 + api-key: sk-Zsd81gZYg7
  184 + openAiImage:
  185 + enable: true
  186 + api-key: ${OPEN_AI_KEY}
  187 + model: dall_e_2
  188 + style: vivid
  189 + midjourney:
  190 + enable: true
  191 + token: MTE4MjE3MjY2MjkxNTY3ODIzOA.GEV1SG.c49F8lZoGCUHwsj8O0UdodmM6nyQHvuD2fXflw
  192 + guild-id: 1237948819677904956
  193 + channel-id: 1237948819677904960
165 194  
166 195 --- #################### 芋道相关配置 ####################
167 196  
... ...