diff --git a/SPRING_AI_UPGRADE.md b/SPRING_AI_UPGRADE.md new file mode 100644 index 0000000000..b12a79b3ed --- /dev/null +++ b/SPRING_AI_UPGRADE.md @@ -0,0 +1,108 @@ +# Spring AI 升级到 1.0.0 总结 + +## 升级版本 +- **从**: Spring AI 1.0.0-M6 +- **到**: Spring AI 1.0.0 GA + +## 主要变化 + +### 1. 依赖管理 +- **新增**: 添加了 Spring AI BOM 依赖管理 +- **版本**: 所有 Spring AI 依赖现在通过 BOM 统一管理,无需指定版本号 + +### 2. 依赖名称变更 +按照新的命名模式更新了所有依赖: + +**模型依赖**: +- `spring-ai-openai-spring-boot-starter` → `spring-ai-starter-model-openai` +- `spring-ai-azure-openai-spring-boot-starter` → `spring-ai-starter-model-azure-openai` +- `spring-ai-ollama-spring-boot-starter` → `spring-ai-starter-model-ollama` +- `spring-ai-stability-ai-spring-boot-starter` → `spring-ai-starter-model-stability-ai` +- `spring-ai-zhipuai-spring-boot-starter` → `spring-ai-starter-model-zhipu-ai` +- `spring-ai-minimax-spring-boot-starter` → `spring-ai-starter-model-minimax` + +**向量存储依赖**: +- `spring-ai-qdrant-store` → `spring-ai-starter-vector-store-qdrant` +- `spring-ai-redis-store` → `spring-ai-starter-vector-store-redis` +- `spring-ai-milvus-store` → `spring-ai-starter-vector-store-milvus` + +### 3. 移除的模块 +以下模块在 Spring AI 1.0.0 中已被移除: + +**⚠️ 已移除的模块**: +- **Moonshot (月之暗面)**: `spring-ai-moonshot-spring-boot-starter` +- **QianFan (文心一言)**: `spring-ai-qianfan-spring-boot-starter` + +> **注意**: 这些模块已移至 Spring AI Community repository。如需继续使用,请参考社区版本。 + +### 4. 代码变更 + +#### 4.1 AiUtils.java +- 移除了 `MoonshotChatOptions` 和 `QianFanChatOptions` 导入 +- 更新了 `buildChatOptions` 方法,对 `YI_YAN` 和 `MOONSHOT` 平台抛出 `UnsupportedOperationException` + +#### 4.2 AiModelFactoryImpl.java +- 移除了相关导入和方法: + - `buildYiYanChatModel()` + - `buildQianFanImageModel()` + - `buildMoonshotChatModel()` + - `buildYiYanEmbeddingModel()` +- 更新了所有相关的 switch 语句,对已移除的平台抛出异常 + +#### 4.3 AiImageServiceImpl.java +- 移除了 `QianFanImageOptions` 导入 +- 更新了 `buildImageOptions` 方法,对 `YI_YAN` 平台抛出异常 + +#### 4.4 测试文件 +删除了不兼容的测试文件: +- `QianFanImageTests.java` +- `YiYanChatModelTests.java` +- `MoonshotChatModelTests.java` + +### 5. 通义千问配置 +- 通义千问依赖 `spring-ai-alibaba-starter` 版本从 `1.0.0-M6.1` 更新到 `1.0.0.1` + +## 兼容性说明 + +### ✅ 继续支持的模型 +- OpenAI +- Azure OpenAI +- Ollama +- Stability AI +- 智谱 GLM (ZhiPu AI) +- MiniMax +- 通义千问 (TongYi) + +### ❌ 不再支持的模型 +- Moonshot (月之暗面) +- QianFan (文心一言) + +### 🔄 迁移建议 +如果您的应用程序使用了被移除的模型,建议: + +1. **迁移到其他支持的模型**: + - 从 Moonshot → OpenAI、智谱GLM 或其他聊天模型 + - 从 QianFan → 通义千问、智谱GLM 或其他聊天模型 + +2. **使用社区版本**: + - 查看 Spring AI Community repository 获取这些模型的社区支持版本 + +## 验证升级 + +升级完成后,请验证: + +1. ✅ 应用程序正常启动 +2. ✅ 现有的 AI 功能正常工作 +3. ✅ 向量存储连接正常 +4. ✅ 测试覆盖的模型功能正常 + +## 参考文档 + +- [Spring AI 1.0.0 发布说明](https://spring.io/blog/2025/05/20/spring-ai-1-0-GA-released) +- [Spring AI 升级指南](https://docs.spring.io/spring-ai/reference/upgrade-notes.html) +- [Spring AI Community Repository](https://github.com/spring-ai-community) + +--- + +**升级日期**: $(date) +**升级人**: [请填写升级人员] \ No newline at end of file diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml index f7f615b492..22eabff4bf 100644 --- a/yudao-dependencies/pom.xml +++ b/yudao-dependencies/pom.xml @@ -95,6 +95,13 @@ pom import + + org.springframework.ai + spring-ai-bom + 1.0.0 + pom + import + diff --git a/yudao-module-ai/pom.xml b/yudao-module-ai/pom.xml index 4b02a7e00f..8ca77c1156 100644 --- a/yudao-module-ai/pom.xml +++ b/yudao-module-ai/pom.xml @@ -19,7 +19,7 @@ 国外:OpenAI、Ollama、Midjourney、StableDiffusion、Suno - 1.0.0-M6 + 1.0.0 1.0.2 @@ -75,66 +75,49 @@ org.springframework.ai - spring-ai-openai-spring-boot-starter - ${spring-ai.version} + spring-ai-starter-model-openai org.springframework.ai - spring-ai-azure-openai-spring-boot-starter - ${spring-ai.version} + spring-ai-starter-model-azure-openai org.springframework.ai - spring-ai-ollama-spring-boot-starter - ${spring-ai.version} + spring-ai-starter-model-ollama org.springframework.ai - spring-ai-stability-ai-spring-boot-starter - ${spring-ai.version} + spring-ai-starter-model-stability-ai com.alibaba.cloud.ai spring-ai-alibaba-starter - ${spring-ai.version}.1 - - - - org.springframework.ai - spring-ai-qianfan-spring-boot-starter - ${spring-ai.version} + 1.0.0.1 + + org.springframework.ai - spring-ai-zhipuai-spring-boot-starter - ${spring-ai.version} + spring-ai-starter-model-zhipu-ai org.springframework.ai - spring-ai-minimax-spring-boot-starter - ${spring-ai.version} - - - org.springframework.ai - spring-ai-moonshot-spring-boot-starter - ${spring-ai.version} + spring-ai-starter-model-minimax org.springframework.ai - spring-ai-qdrant-store - ${spring-ai.version} + spring-ai-starter-vector-store-qdrant org.springframework.ai - spring-ai-redis-store - ${spring-ai.version} + spring-ai-starter-vector-store-redis cn.iocoder.boot @@ -144,8 +127,7 @@ org.springframework.ai - spring-ai-milvus-store - ${spring-ai.version} + spring-ai-starter-vector-store-milvus @@ -159,7 +141,6 @@ org.springframework.ai spring-ai-tika-document-reader - ${spring-ai.version} diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/AiModelFactoryImpl.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/AiModelFactoryImpl.java index f258ffaf1b..ec26c39d28 100644 --- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/AiModelFactoryImpl.java +++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/AiModelFactoryImpl.java @@ -42,10 +42,8 @@ import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiChatProperti import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiConnectionProperties; import org.springframework.ai.autoconfigure.azure.openai.AzureOpenAiEmbeddingProperties; import org.springframework.ai.autoconfigure.minimax.MiniMaxAutoConfiguration; -import org.springframework.ai.autoconfigure.moonshot.MoonshotAutoConfiguration; import org.springframework.ai.autoconfigure.ollama.OllamaAutoConfiguration; import org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration; -import org.springframework.ai.autoconfigure.qianfan.QianFanAutoConfiguration; import org.springframework.ai.autoconfigure.stabilityai.StabilityAiImageAutoConfiguration; import org.springframework.ai.autoconfigure.vectorstore.milvus.MilvusServiceClientConnectionDetails; import org.springframework.ai.autoconfigure.vectorstore.milvus.MilvusServiceClientProperties; @@ -70,9 +68,6 @@ import org.springframework.ai.minimax.MiniMaxEmbeddingOptions; import org.springframework.ai.minimax.api.MiniMaxApi; import org.springframework.ai.model.function.FunctionCallbackResolver; import org.springframework.ai.model.tool.ToolCallingManager; -import org.springframework.ai.moonshot.MoonshotChatModel; -import org.springframework.ai.moonshot.MoonshotChatOptions; -import org.springframework.ai.moonshot.api.MoonshotApi; import org.springframework.ai.ollama.OllamaChatModel; import org.springframework.ai.ollama.OllamaEmbeddingModel; import org.springframework.ai.ollama.api.OllamaApi; @@ -84,12 +79,6 @@ import org.springframework.ai.openai.OpenAiImageModel; import org.springframework.ai.openai.api.OpenAiApi; import org.springframework.ai.openai.api.OpenAiImageApi; import org.springframework.ai.openai.api.common.OpenAiApiConstants; -import org.springframework.ai.qianfan.QianFanChatModel; -import org.springframework.ai.qianfan.QianFanEmbeddingModel; -import org.springframework.ai.qianfan.QianFanEmbeddingOptions; -import org.springframework.ai.qianfan.QianFanImageModel; -import org.springframework.ai.qianfan.api.QianFanApi; -import org.springframework.ai.qianfan.api.QianFanImageApi; import org.springframework.ai.stabilityai.StabilityAiImageModel; import org.springframework.ai.stabilityai.api.StabilityAiApi; import org.springframework.ai.vectorstore.SimpleVectorStore; @@ -133,8 +122,6 @@ public class AiModelFactoryImpl implements AiModelFactory { switch (platform) { case TONG_YI: return buildTongYiChatModel(apiKey); - case YI_YAN: - return buildYiYanChatModel(apiKey); case DEEP_SEEK: return buildDeepSeekChatModel(apiKey); case DOU_BAO: @@ -147,8 +134,6 @@ public class AiModelFactoryImpl implements AiModelFactory { return buildZhiPuChatModel(apiKey, url); case MINI_MAX: return buildMiniMaxChatModel(apiKey, url); - case MOONSHOT: - return buildMoonshotChatModel(apiKey, url); case XING_HUO: return buildXingHuoChatModel(apiKey); case BAI_CHUAN: @@ -159,6 +144,11 @@ public class AiModelFactoryImpl implements AiModelFactory { return buildAzureOpenAiChatModel(apiKey, url); case OLLAMA: return buildOllamaChatModel(url); + // 注意:YI_YAN(qianfan)和MOONSHOT在Spring AI 1.0.0中已被移除 + case YI_YAN: + throw new UnsupportedOperationException("文心一言(qianfan)在Spring AI 1.0.0中已被移除,请使用其他替代方案"); + case MOONSHOT: + throw new UnsupportedOperationException("月之暗面(moonshot)在Spring AI 1.0.0中已被移除,请使用其他替代方案"); default: throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform)); } @@ -171,8 +161,6 @@ public class AiModelFactoryImpl implements AiModelFactory { switch (platform) { case TONG_YI: return SpringUtil.getBean(DashScopeChatModel.class); - case YI_YAN: - return SpringUtil.getBean(QianFanChatModel.class); case DEEP_SEEK: return SpringUtil.getBean(DeepSeekChatModel.class); case DOU_BAO: @@ -185,8 +173,6 @@ public class AiModelFactoryImpl implements AiModelFactory { return SpringUtil.getBean(ZhiPuAiChatModel.class); case MINI_MAX: return SpringUtil.getBean(MiniMaxChatModel.class); - case MOONSHOT: - return SpringUtil.getBean(MoonshotChatModel.class); case XING_HUO: return SpringUtil.getBean(XingHuoChatModel.class); case BAI_CHUAN: @@ -208,8 +194,6 @@ public class AiModelFactoryImpl implements AiModelFactory { switch (platform) { case TONG_YI: return SpringUtil.getBean(DashScopeImageModel.class); - case YI_YAN: - return SpringUtil.getBean(QianFanImageModel.class); case ZHI_PU: return SpringUtil.getBean(ZhiPuAiImageModel.class); case SILICON_FLOW: @@ -218,6 +202,9 @@ public class AiModelFactoryImpl implements AiModelFactory { return SpringUtil.getBean(OpenAiImageModel.class); case STABLE_DIFFUSION: return SpringUtil.getBean(StabilityAiImageModel.class); + // 注意:YI_YAN(qianfan)在Spring AI 1.0.0中已被移除 + case YI_YAN: + throw new UnsupportedOperationException("文心一言(qianfan)在Spring AI 1.0.0中已被移除,请使用其他替代方案"); default: throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform)); } @@ -229,8 +216,6 @@ public class AiModelFactoryImpl implements AiModelFactory { switch (platform) { case TONG_YI: return buildTongYiImagesModel(apiKey); - case YI_YAN: - return buildQianFanImageModel(apiKey); case ZHI_PU: return buildZhiPuAiImageModel(apiKey, url); case OPENAI: @@ -239,6 +224,9 @@ public class AiModelFactoryImpl implements AiModelFactory { return buildSiliconFlowImageModel(apiKey,url); case STABLE_DIFFUSION: return buildStabilityAiImageModel(apiKey, url); + // 注意:YI_YAN(qianfan)在Spring AI 1.0.0中已被移除 + case YI_YAN: + throw new UnsupportedOperationException("文心一言(qianfan)在Spring AI 1.0.0中已被移除,请使用其他替代方案"); default: throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform)); } @@ -269,8 +257,6 @@ public class AiModelFactoryImpl implements AiModelFactory { switch (platform) { case TONG_YI: return buildTongYiEmbeddingModel(apiKey, model); - case YI_YAN: - return buildYiYanEmbeddingModel(apiKey, model); case ZHI_PU: return buildZhiPuEmbeddingModel(apiKey, url, model); case MINI_MAX: @@ -281,6 +267,9 @@ public class AiModelFactoryImpl implements AiModelFactory { return buildAzureOpenAiEmbeddingModel(apiKey, url, model); case OLLAMA: return buildOllamaEmbeddingModel(url, model); + // 注意:YI_YAN(qianfan)在Spring AI 1.0.0中已被移除 + case YI_YAN: + throw new UnsupportedOperationException("文心一言(qianfan)在Spring AI 1.0.0中已被移除,请使用其他替代方案"); default: throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform)); } @@ -336,30 +325,6 @@ public class AiModelFactoryImpl implements AiModelFactory { return new DashScopeImageModel(dashScopeImageApi); } - /** - * 可参考 {@link QianFanAutoConfiguration} 的 qianFanChatModel 方法 - */ - private static QianFanChatModel buildYiYanChatModel(String key) { - List keys = StrUtil.split(key, '|'); - Assert.equals(keys.size(), 2, "YiYanChatClient 的密钥需要 (appKey|secretKey) 格式"); - String appKey = keys.get(0); - String secretKey = keys.get(1); - QianFanApi qianFanApi = new QianFanApi(appKey, secretKey); - return new QianFanChatModel(qianFanApi); - } - - /** - * 可参考 {@link QianFanAutoConfiguration} 的 qianFanImageModel 方法 - */ - private QianFanImageModel buildQianFanImageModel(String key) { - List keys = StrUtil.split(key, '|'); - Assert.equals(keys.size(), 2, "YiYanChatClient 的密钥需要 (appKey|secretKey) 格式"); - String appKey = keys.get(0); - String secretKey = keys.get(1); - QianFanImageApi qianFanApi = new QianFanImageApi(appKey, secretKey); - return new QianFanImageModel(qianFanApi); - } - /** * 可参考 {@link AiAutoConfiguration#deepSeekChatModel(YudaoAiProperties)} */ @@ -425,16 +390,6 @@ public class AiModelFactoryImpl implements AiModelFactory { return new MiniMaxChatModel(miniMaxApi, options, getFunctionCallbackResolver(), DEFAULT_RETRY_TEMPLATE); } - /** - * 可参考 {@link MoonshotAutoConfiguration} 的 moonshotChatModel 方法 - */ - private MoonshotChatModel buildMoonshotChatModel(String apiKey, String url) { - MoonshotApi moonshotApi = StrUtil.isEmpty(url)? new MoonshotApi(apiKey) - : new MoonshotApi(url, apiKey); - MoonshotChatOptions options = MoonshotChatOptions.builder().model(MoonshotApi.DEFAULT_CHAT_MODEL).build(); - return new MoonshotChatModel(moonshotApi, options, getFunctionCallbackResolver(), DEFAULT_RETRY_TEMPLATE); - } - /** * 可参考 {@link AiAutoConfiguration#xingHuoChatClient(YudaoAiProperties)} */ @@ -541,31 +496,12 @@ public class AiModelFactoryImpl implements AiModelFactory { * 可参考 {@link MiniMaxAutoConfiguration} 的 miniMaxEmbeddingModel 方法 */ private EmbeddingModel buildMiniMaxEmbeddingModel(String apiKey, String url, String model) { - MiniMaxApi miniMaxApi = StrUtil.isEmpty(url)? new MiniMaxApi(apiKey) + MiniMaxApi miniMaxApi = StrUtil.isEmpty(url) ? new MiniMaxApi(apiKey) : new MiniMaxApi(url, apiKey); MiniMaxEmbeddingOptions miniMaxEmbeddingOptions = MiniMaxEmbeddingOptions.builder().model(model).build(); return new MiniMaxEmbeddingModel(miniMaxApi, MetadataMode.EMBED, miniMaxEmbeddingOptions); } - /** - * 可参考 {@link QianFanAutoConfiguration} 的 qianFanEmbeddingModel 方法 - */ - private QianFanEmbeddingModel buildYiYanEmbeddingModel(String key, String model) { - List keys = StrUtil.split(key, '|'); - Assert.equals(keys.size(), 2, "YiYanChatClient 的密钥需要 (appKey|secretKey) 格式"); - String appKey = keys.get(0); - String secretKey = keys.get(1); - QianFanApi qianFanApi = new QianFanApi(appKey, secretKey); - QianFanEmbeddingOptions qianFanEmbeddingOptions = QianFanEmbeddingOptions.builder().model(model).build(); - return new QianFanEmbeddingModel(qianFanApi, MetadataMode.EMBED, qianFanEmbeddingOptions); - } - - private OllamaEmbeddingModel buildOllamaEmbeddingModel(String url, String model) { - OllamaApi ollamaApi = new OllamaApi(url); - OllamaOptions ollamaOptions = OllamaOptions.builder().model(model).build(); - return OllamaEmbeddingModel.builder().ollamaApi(ollamaApi).defaultOptions(ollamaOptions).build(); - } - /** * 可参考 {@link OpenAiAutoConfiguration} 的 openAiEmbeddingModel 方法 */ @@ -593,6 +529,12 @@ public class AiModelFactoryImpl implements AiModelFactory { null, null); } + private OllamaEmbeddingModel buildOllamaEmbeddingModel(String url, String model) { + OllamaApi ollamaApi = new OllamaApi(url); + OllamaOptions ollamaOptions = OllamaOptions.builder().model(model).build(); + return OllamaEmbeddingModel.builder().ollamaApi(ollamaApi).defaultOptions(ollamaOptions).build(); + } + // ========== 各种创建 VectorStore 的方法 ========== /** diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java index 671098a704..eca5532cfb 100644 --- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java +++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/service/image/AiImageServiceImpl.java @@ -34,7 +34,6 @@ import org.springframework.ai.image.ImageOptions; import org.springframework.ai.image.ImagePrompt; import org.springframework.ai.image.ImageResponse; import org.springframework.ai.openai.OpenAiImageOptions; -import org.springframework.ai.qianfan.QianFanImageOptions; import org.springframework.ai.stabilityai.api.StabilityAiImageOptions; import org.springframework.ai.zhipuai.ZhiPuAiImageOptions; import org.springframework.scheduling.annotation.Async; @@ -168,10 +167,8 @@ public class AiImageServiceImpl implements AiImageService { .withHeight(draw.getHeight()).withWidth(draw.getWidth()) .build(); } else if (ObjUtil.equal(model.getPlatform(), AiPlatformEnum.YI_YAN.getPlatform())) { - return QianFanImageOptions.builder() - .model(model.getModel()).N(1) - .height(draw.getHeight()).width(draw.getWidth()) - .build(); + // 注意:文心一言(qianfan)在Spring AI 1.0.0中已被移除 + throw new UnsupportedOperationException("文心一言(qianfan)在Spring AI 1.0.0中已被移除,请使用其他替代方案"); } else if (ObjUtil.equal(model.getPlatform(), AiPlatformEnum.ZHI_PU.getPlatform())) { return ZhiPuAiImageOptions.builder() .model(model.getModel()) @@ -260,7 +257,7 @@ public class AiImageServiceImpl implements AiImageService { @Override public Integer midjourneySync() { - // 1.1 获取 Midjourney 平台,状态在 “进行中” 的 image + // 1.1 获取 Midjourney 平台,状态在 "进行中" 的 image List images = imageMapper.selectListByStatusAndPlatform( AiImageStatusEnum.IN_PROGRESS.getStatus(), AiPlatformEnum.MIDJOURNEY.getPlatform()); if (CollUtil.isEmpty(images)) { diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/util/AiUtils.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/util/AiUtils.java index ac3ff39a49..6447fccc7b 100644 --- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/util/AiUtils.java +++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/util/AiUtils.java @@ -10,10 +10,8 @@ import org.springframework.ai.azure.openai.AzureOpenAiChatOptions; import org.springframework.ai.chat.messages.*; import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.minimax.MiniMaxChatOptions; -import org.springframework.ai.moonshot.MoonshotChatOptions; import org.springframework.ai.ollama.api.OllamaOptions; import org.springframework.ai.openai.OpenAiChatOptions; -import org.springframework.ai.qianfan.QianFanChatOptions; import org.springframework.ai.zhipuai.ZhiPuAiChatOptions; import java.util.Collections; @@ -45,7 +43,8 @@ public class AiUtils { return DashScopeChatOptions.builder().withModel(model).withTemperature(temperature).withMaxToken(maxTokens) .withFunctions(toolNames).withToolContext(toolContext).build(); case YI_YAN: - return QianFanChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens).build(); + // 注意:文心一言(qianfan)在Spring AI 1.0.0中已被移除,请使用其他替代方案 + throw new UnsupportedOperationException("文心一言(qianfan)在Spring AI 1.0.0中已被移除,请使用其他替代方案"); case ZHI_PU: return ZhiPuAiChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens) .functions(toolNames).toolContext(toolContext).build(); @@ -53,8 +52,8 @@ public class AiUtils { return MiniMaxChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens) .functions(toolNames).toolContext(toolContext).build(); case MOONSHOT: - return MoonshotChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens) - .functions(toolNames).toolContext(toolContext).build(); + // 注意:月之暗面(moonshot)在Spring AI 1.0.0中已被移除,请使用其他替代方案 + throw new UnsupportedOperationException("月之暗面(moonshot)在Spring AI 1.0.0中已被移除,请使用其他替代方案"); case OPENAI: case DEEP_SEEK: // 复用 OpenAI 客户端 case DOU_BAO: // 复用 OpenAI 客户端 diff --git a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/MoonshotChatModelTests.java b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/MoonshotChatModelTests.java deleted file mode 100644 index 7de7fd709c..0000000000 --- a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/MoonshotChatModelTests.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.iocoder.yudao.module.ai.framework.ai.core.model.chat; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.ai.chat.messages.Message; -import org.springframework.ai.chat.messages.SystemMessage; -import org.springframework.ai.chat.messages.UserMessage; -import org.springframework.ai.chat.model.ChatResponse; -import org.springframework.ai.chat.prompt.Prompt; -import org.springframework.ai.moonshot.MoonshotChatModel; -import org.springframework.ai.moonshot.MoonshotChatOptions; -import org.springframework.ai.moonshot.api.MoonshotApi; -import reactor.core.publisher.Flux; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link MoonshotChatModel} 的集成测试 - * - * @author 芋道源码 - */ -public class MoonshotChatModelTests { - - private final MoonshotChatModel chatModel = new MoonshotChatModel( - new MoonshotApi("sk-aHYYV1SARscItye5QQRRNbXij4fy65Ee7pNZlC9gsSQnUKXA"), // 密钥 - MoonshotChatOptions.builder() - .model("moonshot-v1-8k") // 模型 - .build()); - @Test - @Disabled - public void testCall() { - // 准备参数 - List messages = new ArrayList<>(); - messages.add(new SystemMessage("你是一个优质的文言文作者,用文言文描述着各城市的人文风景。")); - messages.add(new UserMessage("1 + 1 = ?")); - - // 调用 - ChatResponse response = chatModel.call(new Prompt(messages)); - // 打印结果 - System.out.println(response); - System.out.println(response.getResult().getOutput()); - } - - @Test - @Disabled - public void testStream() { - // 准备参数 - List messages = new ArrayList<>(); - messages.add(new SystemMessage("你是一个优质的文言文作者,用文言文描述着各城市的人文风景。")); - messages.add(new UserMessage("1 + 1 = ?")); - - // 调用 - Flux flux = chatModel.stream(new Prompt(messages)); - // 打印结果 - flux.doOnNext(response -> { -// System.out.println(response); - System.out.println(response.getResult().getOutput()); - }).then().block(); - } - -} diff --git a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/YiYanChatModelTests.java b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/YiYanChatModelTests.java deleted file mode 100644 index ab6f642437..0000000000 --- a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/chat/YiYanChatModelTests.java +++ /dev/null @@ -1,62 +0,0 @@ -package cn.iocoder.yudao.module.ai.framework.ai.core.model.chat; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.ai.chat.messages.Message; -import org.springframework.ai.chat.messages.UserMessage; -import org.springframework.ai.chat.model.ChatResponse; -import org.springframework.ai.chat.prompt.Prompt; -import org.springframework.ai.qianfan.QianFanChatModel; -import org.springframework.ai.qianfan.QianFanChatOptions; -import org.springframework.ai.qianfan.api.QianFanApi; -import reactor.core.publisher.Flux; - -import java.util.ArrayList; -import java.util.List; - -// TODO @芋艿:百度千帆 API 提供了 V2 版本,目前 Spring AI 不兼容,可关键 进展 -/** - * {@link QianFanChatModel} 的集成测试 - * - * @author fansili - */ -public class YiYanChatModelTests { - - private final QianFanChatModel chatModel = new QianFanChatModel( - new QianFanApi("qS8k8dYr2nXunagK4SSU8Xjj", "pHGbx51ql2f0hOyabQvSZezahVC3hh3e"), // 密钥 - QianFanChatOptions.builder() - .model(QianFanApi.ChatModel.ERNIE_4_0_8K_Preview.getValue()) - .build() - ); - - @Test - @Disabled - public void testCall() { - // 准备参数 - List messages = new ArrayList<>(); - // TODO @芋艿:文心一言,只要带上 system message 就报错,已经各种测试,很莫名! -// messages.add(new SystemMessage("你是一个优质的文言文作者,用文言文描述着各城市的人文风景。")); - messages.add(new UserMessage("1 + 1 = ?")); - - // 调用 - ChatResponse response = chatModel.call(new Prompt(messages)); - // 打印结果 - System.out.println(response); - } - - @Test - @Disabled - public void testStream() { - // 准备参数 - List messages = new ArrayList<>(); - // TODO @芋艿:文心一言,只要带上 system message 就报错,已经各种测试,很莫名! -// messages.add(new SystemMessage("你是一个优质的文言文作者,用文言文描述着各城市的人文风景。")); - messages.add(new UserMessage("1 + 1 = ?")); - - // 调用 - Flux flux = chatModel.stream(new Prompt(messages)); - // 打印结果 - flux.doOnNext(System.out::println).then().block(); - } - -} diff --git a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/image/QianFanImageTests.java b/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/image/QianFanImageTests.java deleted file mode 100644 index 8f44ab9ad1..0000000000 --- a/yudao-module-ai/src/test/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/image/QianFanImageTests.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.yudao.module.ai.framework.ai.core.model.image; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.ai.image.ImagePrompt; -import org.springframework.ai.image.ImageResponse; -import org.springframework.ai.qianfan.QianFanImageModel; -import org.springframework.ai.qianfan.QianFanImageOptions; -import org.springframework.ai.qianfan.api.QianFanImageApi; - -import static cn.iocoder.yudao.module.ai.framework.ai.core.model.image.StabilityAiImageModelTests.viewImage; - -// TODO @芋艿:百度千帆 API 提供了 V2 版本,目前 Spring AI 不兼容,可关键 进展 - -/** - * {@link QianFanImageModel} 集成测试类 - */ -public class QianFanImageTests { - - private final QianFanImageModel imageModel = new QianFanImageModel( - new QianFanImageApi("qS8k8dYr2nXunagK4SSU8Xjj", "pHGbx51ql2f0hOyabQvSZezahVC3hh3e")); // 密钥 - - @Test - @Disabled - public void testCall() { - // 准备参数 - // 只支持 1024x1024、768x768、768x1024、1024x768、576x1024、1024x576 - QianFanImageOptions imageOptions = QianFanImageOptions.builder() - .model(QianFanImageApi.ImageModel.Stable_Diffusion_XL.getValue()) - .width(1024).height(1024) - .N(1) - .build(); - ImagePrompt prompt = new ImagePrompt("good", imageOptions); - - // 方法调用 - ImageResponse response = imageModel.call(prompt); - // 打印结果 - String b64Json = response.getResult().getOutput().getB64Json(); - System.out.println(response); - viewImage(b64Json); - } - -}