Commit 645dfae003c723dd268ce0cacc0f0bfaea1a8314
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
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
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
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
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
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 | ... | ... |