Commit c789418a7bd9aedd1097de1b160141b7dded92eb

Authored by YunaiV
1 parent e5025044

feat:【AI 大模型】依赖 spring ai 升级到 1.0.0

yudao-module-ai/pom.xml
... ... @@ -19,7 +19,8 @@
19 19 国外:OpenAI、Ollama、Midjourney、StableDiffusion、Suno
20 20 </description>
21 21 <properties>
22   - <spring-ai.version>1.0.0-M6</spring-ai.version>
  22 + <spring-ai.version>1.0.0</spring-ai.version>
  23 + <alibaba-ai.version>1.0.0.2</alibaba-ai.version>
23 24 <tinyflow.version>1.0.2</tinyflow.version>
24 25 </properties>
25 26  
... ... @@ -75,65 +76,66 @@
75 76 <!-- Spring AI Model 模型接入 -->
76 77 <dependency>
77 78 <groupId>org.springframework.ai</groupId>
78   - <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
  79 + <artifactId>spring-ai-starter-model-openai</artifactId>
79 80 <version>${spring-ai.version}</version>
80 81 </dependency>
81 82 <dependency>
82 83 <groupId>org.springframework.ai</groupId>
83   - <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
  84 + <artifactId>spring-ai-starter-model-azure-openai</artifactId>
84 85 <version>${spring-ai.version}</version>
85 86 </dependency>
86 87 <dependency>
87 88 <groupId>org.springframework.ai</groupId>
88   - <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
  89 + <artifactId>spring-ai-starter-model-ollama</artifactId>
89 90 <version>${spring-ai.version}</version>
90 91 </dependency>
91 92 <dependency>
92 93 <groupId>org.springframework.ai</groupId>
93   - <artifactId>spring-ai-stability-ai-spring-boot-starter</artifactId>
  94 + <artifactId>spring-ai-starter-model-stability-ai</artifactId>
94 95 <version>${spring-ai.version}</version>
95 96 </dependency>
96 97 <dependency>
97 98 <!-- 通义千问 -->
98 99 <groupId>com.alibaba.cloud.ai</groupId>
99   - <artifactId>spring-ai-alibaba-starter</artifactId>
100   - <version>${spring-ai.version}.1</version>
  100 + <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
  101 + <version>${alibaba-ai.version}</version>
101 102 </dependency>
102 103 <dependency>
103 104 <!-- 文心一言 -->
104   - <groupId>org.springframework.ai</groupId>
105   - <artifactId>spring-ai-qianfan-spring-boot-starter</artifactId>
106   - <version>${spring-ai.version}</version>
  105 + <groupId>org.springaicommunity</groupId>
  106 + <artifactId>qianfan-spring-boot-starter</artifactId>
  107 + <version>1.0.0</version>
107 108 </dependency>
108 109 <dependency>
109 110 <!-- 智谱 GLM -->
110 111 <groupId>org.springframework.ai</groupId>
111   - <artifactId>spring-ai-zhipuai-spring-boot-starter</artifactId>
  112 + <artifactId>spring-ai-starter-model-zhipuai</artifactId>
112 113 <version>${spring-ai.version}</version>
113 114 </dependency>
114 115 <dependency>
115 116 <groupId>org.springframework.ai</groupId>
116   - <artifactId>spring-ai-minimax-spring-boot-starter</artifactId>
  117 + <artifactId>spring-ai-starter-model-minimax</artifactId>
117 118 <version>${spring-ai.version}</version>
118 119 </dependency>
119 120 <dependency>
120   - <groupId>org.springframework.ai</groupId>
121   - <artifactId>spring-ai-moonshot-spring-boot-starter</artifactId>
122   - <version>${spring-ai.version}</version>
  121 + <!-- 月之暗灭 -->
  122 + <groupId>org.springaicommunity</groupId>
  123 + <artifactId>moonshot-spring-boot-starter</artifactId>
  124 + <version>1.0.0</version>
123 125 </dependency>
124 126  
125 127 <!-- 向量存储:https://db-engines.com/en/ranking/vector+dbms -->
126 128 <dependency>
127 129 <!-- Qdrant:https://qdrant.tech/ -->
128 130 <groupId>org.springframework.ai</groupId>
129   - <artifactId>spring-ai-qdrant-store</artifactId>
  131 + <artifactId>spring-ai-starter-vector-store-qdrant</artifactId>
130 132 <version>${spring-ai.version}</version>
131 133 </dependency>
132 134  
133 135 <dependency>
134 136 <!-- Redis:https://redis.io/docs/latest/develop/get-started/vector-database/ -->
135 137 <groupId>org.springframework.ai</groupId>
136   - <artifactId>spring-ai-redis-store</artifactId>
  138 + <artifactId>spring-ai-starter-vector-store-redis</artifactId>
137 139 <version>${spring-ai.version}</version>
138 140 </dependency>
139 141 <dependency>
... ... @@ -144,7 +146,7 @@
144 146 <dependency>
145 147 <!-- Milvus:https://milvus.io/ -->
146 148 <groupId>org.springframework.ai</groupId>
147   - <artifactId>spring-ai-milvus-store</artifactId>
  149 + <artifactId>spring-ai-starter-vector-store-milvus</artifactId>
148 150 <version>${spring-ai.version}</version>
149 151 <exclusions>
150 152 <!-- 解决和 logback 的日志冲突 -->
... ...
yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/config/AiAutoConfiguration.java
... ... @@ -14,10 +14,6 @@ import cn.iocoder.yudao.module.ai.framework.ai.core.model.siliconflow.SiliconFlo
14 14 import cn.iocoder.yudao.module.ai.framework.ai.core.model.suno.api.SunoApi;
15 15 import cn.iocoder.yudao.module.ai.framework.ai.core.model.xinghuo.XingHuoChatModel;
16 16 import lombok.extern.slf4j.Slf4j;
17   -import org.springframework.ai.autoconfigure.vectorstore.milvus.MilvusServiceClientProperties;
18   -import org.springframework.ai.autoconfigure.vectorstore.milvus.MilvusVectorStoreProperties;
19   -import org.springframework.ai.autoconfigure.vectorstore.qdrant.QdrantVectorStoreProperties;
20   -import org.springframework.ai.autoconfigure.vectorstore.redis.RedisVectorStoreProperties;
21 17 import org.springframework.ai.embedding.BatchingStrategy;
22 18 import org.springframework.ai.embedding.TokenCountBatchingStrategy;
23 19 import org.springframework.ai.model.tool.ToolCallingManager;
... ... @@ -26,6 +22,10 @@ import org.springframework.ai.openai.OpenAiChatOptions;
26 22 import org.springframework.ai.openai.api.OpenAiApi;
27 23 import org.springframework.ai.tokenizer.JTokkitTokenCountEstimator;
28 24 import org.springframework.ai.tokenizer.TokenCountEstimator;
  25 +import org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusServiceClientProperties;
  26 +import org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusVectorStoreProperties;
  27 +import org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreProperties;
  28 +import org.springframework.ai.vectorstore.redis.autoconfigure.RedisVectorStoreProperties;
29 29 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
30 30 import org.springframework.boot.context.properties.EnableConfigurationProperties;
31 31 import org.springframework.context.annotation.Bean;
... ...
yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/siliconflow/SiliconFlowImageModel.java
... ... @@ -89,7 +89,7 @@ public class SiliconFlowImageModel implements ImageModel {
89 89 var observationContext = ImageModelObservationContext.builder()
90 90 .imagePrompt(imagePrompt)
91 91 .provider(SiliconFlowApiConstants.PROVIDER_NAME)
92   - .requestOptions(imagePrompt.getOptions())
  92 + .imagePrompt(imagePrompt)
93 93 .build();
94 94  
95 95 return ImageModelObservationDocumentation.IMAGE_MODEL_OPERATION
... ...
yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java
... ... @@ -9,9 +9,6 @@ import cn.hutool.core.util.ObjUtil;
9 9 import cn.hutool.core.util.StrUtil;
10 10 import cn.hutool.extra.spring.SpringUtil;
11 11 import cn.hutool.http.HttpUtil;
12   -import cn.iocoder.yudao.module.ai.enums.model.AiPlatformEnum;
13   -import cn.iocoder.yudao.module.ai.framework.ai.core.model.midjourney.api.MidjourneyApi;
14   -import cn.iocoder.yudao.module.ai.framework.ai.core.model.siliconflow.SiliconFlowImageOptions;
15 12 import cn.iocoder.yudao.framework.common.pojo.PageResult;
16 13 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
17 14 import cn.iocoder.yudao.module.ai.controller.admin.image.vo.AiImageDrawReqVO;
... ... @@ -24,17 +21,20 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
24 21 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
25 22 import cn.iocoder.yudao.module.ai.dal.mysql.image.AiImageMapper;
26 23 import cn.iocoder.yudao.module.ai.enums.image.AiImageStatusEnum;
  24 +import cn.iocoder.yudao.module.ai.enums.model.AiPlatformEnum;
  25 +import cn.iocoder.yudao.module.ai.framework.ai.core.model.midjourney.api.MidjourneyApi;
  26 +import cn.iocoder.yudao.module.ai.framework.ai.core.model.siliconflow.SiliconFlowImageOptions;
27 27 import cn.iocoder.yudao.module.ai.service.model.AiModelService;
28 28 import cn.iocoder.yudao.module.infra.api.file.FileApi;
29 29 import com.alibaba.cloud.ai.dashscope.image.DashScopeImageOptions;
30 30 import jakarta.annotation.Resource;
31 31 import lombok.extern.slf4j.Slf4j;
  32 +import org.springaicommunity.qianfan.QianFanImageOptions;
32 33 import org.springframework.ai.image.ImageModel;
33 34 import org.springframework.ai.image.ImageOptions;
34 35 import org.springframework.ai.image.ImagePrompt;
35 36 import org.springframework.ai.image.ImageResponse;
36 37 import org.springframework.ai.openai.OpenAiImageOptions;
37   -import org.springframework.ai.qianfan.QianFanImageOptions;
38 38 import org.springframework.ai.stabilityai.api.StabilityAiImageOptions;
39 39 import org.springframework.ai.zhipuai.ZhiPuAiImageOptions;
40 40 import org.springframework.scheduling.annotation.Async;
... ... @@ -140,10 +140,10 @@ public class AiImageServiceImpl implements AiImageService {
140 140 private static ImageOptions buildImageOptions(AiImageDrawReqVO draw, AiModelDO model) {
141 141 if (ObjUtil.equal(model.getPlatform(), AiPlatformEnum.OPENAI.getPlatform())) {
142 142 // https://platform.openai.com/docs/api-reference/images/create
143   - return OpenAiImageOptions.builder().withModel(model.getModel())
144   - .withHeight(draw.getHeight()).withWidth(draw.getWidth())
145   - .withStyle(MapUtil.getStr(draw.getOptions(), "style")) // 风格
146   - .withResponseFormat("b64_json")
  143 + return OpenAiImageOptions.builder().model(model.getModel())
  144 + .height(draw.getHeight()).width(draw.getWidth())
  145 + .style(MapUtil.getStr(draw.getOptions(), "style")) // 风格
  146 + .responseFormat("b64_json")
147 147 .build();
148 148 } else if (ObjUtil.equal(model.getPlatform(), AiPlatformEnum.SILICON_FLOW.getPlatform())) {
149 149 // https://docs.siliconflow.cn/cn/api-reference/images/images-generations
... ...
yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/util/AiUtils.java
... ... @@ -2,18 +2,18 @@ package cn.iocoder.yudao.module.ai.util;
2 2  
3 3 import cn.hutool.core.util.ObjUtil;
4 4 import cn.hutool.core.util.StrUtil;
5   -import cn.iocoder.yudao.module.ai.enums.model.AiPlatformEnum;
6 5 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
7 6 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
  7 +import cn.iocoder.yudao.module.ai.enums.model.AiPlatformEnum;
8 8 import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
  9 +import org.springaicommunity.moonshot.MoonshotChatOptions;
  10 +import org.springaicommunity.qianfan.QianFanChatOptions;
9 11 import org.springframework.ai.azure.openai.AzureOpenAiChatOptions;
10 12 import org.springframework.ai.chat.messages.*;
11 13 import org.springframework.ai.chat.prompt.ChatOptions;
12 14 import org.springframework.ai.minimax.MiniMaxChatOptions;
13   -import org.springframework.ai.moonshot.MoonshotChatOptions;
14 15 import org.springframework.ai.ollama.api.OllamaOptions;
15 16 import org.springframework.ai.openai.OpenAiChatOptions;
16   -import org.springframework.ai.qianfan.QianFanChatOptions;
17 17 import org.springframework.ai.zhipuai.ZhiPuAiChatOptions;
18 18  
19 19 import java.util.Collections;
... ... @@ -43,18 +43,18 @@ public class AiUtils {
43 43 switch (platform) {
44 44 case TONG_YI:
45 45 return DashScopeChatOptions.builder().withModel(model).withTemperature(temperature).withMaxToken(maxTokens)
46   - .withFunctions(toolNames).withToolContext(toolContext).build();
  46 + .withToolNames(toolNames).withToolContext(toolContext).build();
47 47 case YI_YAN:
48 48 return QianFanChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens).build();
49 49 case ZHI_PU:
50 50 return ZhiPuAiChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens)
51   - .functions(toolNames).toolContext(toolContext).build();
  51 + .toolNames(toolNames).toolContext(toolContext).build();
52 52 case MINI_MAX:
53 53 return MiniMaxChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens)
54   - .functions(toolNames).toolContext(toolContext).build();
  54 + .toolNames(toolNames).toolContext(toolContext).build();
55 55 case MOONSHOT:
56 56 return MoonshotChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens)
57   - .functions(toolNames).toolContext(toolContext).build();
  57 + .toolNames(toolNames).toolContext(toolContext).build();
58 58 case OPENAI:
59 59 case DEEP_SEEK: // 复用 OpenAI 客户端
60 60 case DOU_BAO: // 复用 OpenAI 客户端
... ...
yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/OpenAIChatModelTests.java
... ... @@ -25,10 +25,10 @@ public class OpenAIChatModelTests {
25 25 private final OpenAiChatModel chatModel = OpenAiChatModel.builder()
26 26 .openAiApi(OpenAiApi.builder()
27 27 .baseUrl("https://api.holdai.top")
28   - .apiKey("sk-aN6nWn3fILjrgLFT0fC4Aa60B72e4253826c77B29dC94f17") // apiKey
  28 + .apiKey("sk-PytRecQlmjEteoa2RRN6cGnwslo72UUPLQVNEMS6K9yjbmpD") // apiKey
29 29 .build())
30 30 .defaultOptions(OpenAiChatOptions.builder()
31   - .model(OpenAiApi.ChatModel.GPT_4_O) // 模型
  31 + .model(OpenAiApi.ChatModel.GPT_4_1_NANO) // 模型
32 32 .temperature(0.7)
33 33 .build())
34 34 .build();
... ...
yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/TongYiChatModelTests.java
... ... @@ -22,14 +22,17 @@ import java.util.List;
22 22 */
23 23 public class TongYiChatModelTests {
24 24  
25   - private final DashScopeChatModel chatModel = new DashScopeChatModel(
26   - new DashScopeApi("sk-7d903764249848cfa912733146da12d1"),
27   - DashScopeChatOptions.builder()
  25 + private final DashScopeChatModel chatModel = DashScopeChatModel.builder()
  26 + .dashScopeApi(DashScopeApi.builder()
  27 + .apiKey("sk-47aa124781be4bfb95244cc62f63f7d0")
  28 + .build())
  29 + .defaultOptions( DashScopeChatOptions.builder()
28 30 .withModel("qwen1.5-72b-chat") // 模型
29 31 // .withModel("deepseek-r1") // 模型(deepseek-r1)
30 32 // .withModel("deepseek-v3") // 模型(deepseek-v3)
31 33 // .withModel("deepseek-r1-distill-qwen-1.5b") // 模型(deepseek-r1-distill-qwen-1.5b)
32   - .build());
  34 + .build())
  35 + .build();
33 36  
34 37 @Test
35 38 @Disabled
... ...
yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/image/OpenAiImageModelTests.java
... ... @@ -18,7 +18,7 @@ public class OpenAiImageModelTests {
18 18  
19 19 private final OpenAiImageModel imageModel = new OpenAiImageModel(OpenAiImageApi.builder()
20 20 .baseUrl("https://api.holdai.top") // apiKey
21   - .apiKey("sk-aN6nWn3fILjrgLFT0fC4Aa60B72e4253826c77B29dC94f17")
  21 + .apiKey("sk-PytRecQlmjEteoa2RRN6cGnwslo72UUPLQVNEMS6K9yjbmpD")
22 22 .build());
23 23  
24 24 @Test
... ... @@ -26,8 +26,8 @@ public class OpenAiImageModelTests {
26 26 public void testCall() {
27 27 // 准备参数
28 28 ImageOptions options = OpenAiImageOptions.builder()
29   - .withModel(OpenAiImageApi.ImageModel.DALL_E_2.getValue()) // 这个模型比较便宜
30   - .withHeight(256).withWidth(256)
  29 + .model(OpenAiImageApi.ImageModel.DALL_E_2.getValue()) // 这个模型比较便宜
  30 + .height(256).width(256)
31 31 .build();
32 32 ImagePrompt prompt = new ImagePrompt("中国长城!", options);
33 33  
... ...
yudao-server/src/main/resources/application-dev.yaml
... ... @@ -6,8 +6,8 @@ server:
6 6 spring:
7 7 autoconfigure:
8 8 exclude:
9   - - org.springframework.ai.autoconfigure.vectorstore.qdrant.QdrantVectorStoreAutoConfiguration # 禁用 AI 模块的 Qdrant,手动创建
10   - - org.springframework.ai.autoconfigure.vectorstore.milvus.MilvusVectorStoreAutoConfiguration # 禁用 AI 模块的 Milvus,手动创建
  9 + - org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreAutoConfiguration # 禁用 AI 模块的 Qdrant,手动创建
  10 + - org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusVectorStoreAutoConfiguration # 禁用 AI 模块的 Milvus,手动创建
11 11 # 数据源配置项
12 12 datasource:
13 13 druid: # Druid 【监控】相关的全局配置
... ...
yudao-server/src/main/resources/application-local.yaml
... ... @@ -10,8 +10,8 @@ spring:
10 10 - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
11 11 - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
12 12 - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
13   - - org.springframework.ai.autoconfigure.vectorstore.qdrant.QdrantVectorStoreAutoConfiguration # 禁用 AI 模块的 Qdrant,手动创建
14   - - org.springframework.ai.autoconfigure.vectorstore.milvus.MilvusVectorStoreAutoConfiguration # 禁用 AI 模块的 Milvus,手动创建
  13 + - org.springframework.ai.vectorstore.qdrant.autoconfigure.QdrantVectorStoreAutoConfiguration # 禁用 AI 模块的 Qdrant,手动创建
  14 + - org.springframework.ai.vectorstore.milvus.autoconfigure.MilvusVectorStoreAutoConfiguration # 禁用 AI 模块的 Milvus,手动创建
15 15 # 数据源配置项
16 16 datasource:
17 17 druid: # Druid 【监控】相关的全局配置
... ...