Browse Source

chore:spring ai from 1.0.1 to 1.1.0

YunaiV 9 months ago
parent
commit
cc35749d0b

+ 3 - 3
yudao-module-ai/pom.xml

@@ -19,9 +19,9 @@
           国外:OpenAI、Ollama、Midjourney、StableDiffusion、Suno
     </description>
     <properties>
-        <spring-ai.version>1.0.1</spring-ai.version>
-        <alibaba-ai.version>1.0.0.3</alibaba-ai.version>
-        <tinyflow.version>1.0.2</tinyflow.version>
+        <spring-ai.version>1.1.0</spring-ai.version>
+        <alibaba-ai.version>1.0.0.4</alibaba-ai.version>
+        <tinyflow.version>1.2.6</tinyflow.version>
     </properties>
 
     <dependencies>

+ 12 - 8
yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/ai/core/model/AiModelFactoryImpl.java

@@ -87,7 +87,7 @@ import org.springframework.ai.model.zhipuai.autoconfigure.ZhiPuAiImageAutoConfig
 import org.springframework.ai.ollama.OllamaChatModel;
 import org.springframework.ai.ollama.OllamaEmbeddingModel;
 import org.springframework.ai.ollama.api.OllamaApi;
-import org.springframework.ai.ollama.api.OllamaOptions;
+import org.springframework.ai.ollama.api.OllamaEmbeddingOptions;
 import org.springframework.ai.openai.OpenAiChatModel;
 import org.springframework.ai.openai.OpenAiEmbeddingModel;
 import org.springframework.ai.openai.OpenAiEmbeddingOptions;
@@ -436,10 +436,12 @@ public class AiModelFactoryImpl implements AiModelFactory {
      * 可参考 {@link ZhiPuAiChatAutoConfiguration} 的 zhiPuAiChatModel 方法
      */
     private ZhiPuAiChatModel buildZhiPuChatModel(String apiKey, String url) {
-        ZhiPuAiApi zhiPuAiApi = StrUtil.isEmpty(url) ? new ZhiPuAiApi(apiKey)
-                : new ZhiPuAiApi(url, apiKey);
+        ZhiPuAiApi.Builder zhiPuAiApiBuilder = ZhiPuAiApi.builder().apiKey(apiKey);
+        if (StrUtil.isNotEmpty(url)) {
+            zhiPuAiApiBuilder.baseUrl(url);
+        }
         ZhiPuAiChatOptions options = ZhiPuAiChatOptions.builder().model(ZhiPuAiApi.DEFAULT_CHAT_MODEL).temperature(0.7).build();
-        return new ZhiPuAiChatModel(zhiPuAiApi, options, getToolCallingManager(), DEFAULT_RETRY_TEMPLATE,
+        return new ZhiPuAiChatModel(zhiPuAiApiBuilder.build(), options, getToolCallingManager(), DEFAULT_RETRY_TEMPLATE,
                 getObservationRegistry().getIfAvailable());
     }
 
@@ -601,10 +603,12 @@ public class AiModelFactoryImpl implements AiModelFactory {
      * 可参考 {@link ZhiPuAiEmbeddingAutoConfiguration} 的 zhiPuAiEmbeddingModel 方法
      */
     private ZhiPuAiEmbeddingModel buildZhiPuEmbeddingModel(String apiKey, String url, String model) {
-        ZhiPuAiApi zhiPuAiApi = StrUtil.isEmpty(url) ? new ZhiPuAiApi(apiKey)
-                : new ZhiPuAiApi(url, apiKey);
+        ZhiPuAiApi.Builder zhiPuAiApiBuilder = ZhiPuAiApi.builder().apiKey(apiKey);
+        if (StrUtil.isNotEmpty(url)) {
+            zhiPuAiApiBuilder.baseUrl(url);
+        }
         ZhiPuAiEmbeddingOptions zhiPuAiEmbeddingOptions = ZhiPuAiEmbeddingOptions.builder().model(model).build();
-        return new ZhiPuAiEmbeddingModel(zhiPuAiApi, MetadataMode.EMBED, zhiPuAiEmbeddingOptions);
+        return new ZhiPuAiEmbeddingModel(zhiPuAiApiBuilder.build(), MetadataMode.EMBED, zhiPuAiEmbeddingOptions);
     }
 
     /**
@@ -632,7 +636,7 @@ public class AiModelFactoryImpl implements AiModelFactory {
 
     private OllamaEmbeddingModel buildOllamaEmbeddingModel(String url, String model) {
         OllamaApi ollamaApi = OllamaApi.builder().baseUrl(url).build();
-        OllamaOptions ollamaOptions = OllamaOptions.builder().model(model).build();
+        OllamaEmbeddingOptions ollamaOptions = OllamaEmbeddingOptions.builder().model(model).build();
         return OllamaEmbeddingModel.builder()
                 .ollamaApi(ollamaApi)
                 .defaultOptions(ollamaOptions)

+ 8 - 4
yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/framework/security/config/SecurityConfiguration.java

@@ -2,7 +2,8 @@ package cn.iocoder.yudao.module.ai.framework.security.config;
 
 import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer;
 import jakarta.annotation.Resource;
-import org.springframework.ai.mcp.server.autoconfigure.McpServerProperties;
+import org.springframework.ai.mcp.server.common.autoconfigure.properties.McpServerSseProperties;
+import org.springframework.ai.mcp.server.common.autoconfigure.properties.McpServerStreamableHttpProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -17,7 +18,9 @@ import java.util.Optional;
 public class SecurityConfiguration {
 
     @Resource
-    private Optional<McpServerProperties> serverProperties;
+    private Optional<McpServerSseProperties> mcpServerSseProperties;
+    @Resource
+    private Optional<McpServerStreamableHttpProperties> mcpServerStreamableHttpProperties;
 
     @Bean("aiAuthorizeRequestsCustomizer")
     public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
@@ -25,11 +28,12 @@ public class SecurityConfiguration {
 
             @Override
             public void customize(AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry registry) {
-                // MCP Server
-                serverProperties.ifPresent(properties -> {
+                mcpServerSseProperties.ifPresent(properties -> {
                     registry.requestMatchers(properties.getSseEndpoint()).permitAll();
                     registry.requestMatchers(properties.getSseMessageEndpoint()).permitAll();
                 });
+                mcpServerStreamableHttpProperties.ifPresent(properties ->
+                        registry.requestMatchers(properties.getMcpEndpoint()).permitAll());
             }
 
         };

+ 1 - 1
yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/service/chat/AiChatMessageServiceImpl.java

@@ -49,7 +49,7 @@ import org.springframework.ai.chat.model.StreamingChatModel;
 import org.springframework.ai.chat.prompt.ChatOptions;
 import org.springframework.ai.chat.prompt.Prompt;
 import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
-import org.springframework.ai.mcp.client.autoconfigure.properties.McpClientCommonProperties;
+import org.springframework.ai.mcp.client.common.autoconfigure.properties.McpClientCommonProperties;
 import org.springframework.ai.tool.ToolCallback;
 import org.springframework.ai.tool.resolution.ToolCallbackResolver;
 import org.springframework.beans.factory.annotation.Autowired;

+ 2 - 2
yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/util/AiUtils.java

@@ -16,7 +16,7 @@ import org.springframework.ai.chat.prompt.ChatOptions;
 import org.springframework.ai.deepseek.DeepSeekAssistantMessage;
 import org.springframework.ai.deepseek.DeepSeekChatOptions;
 import org.springframework.ai.minimax.MiniMaxChatOptions;
-import org.springframework.ai.ollama.api.OllamaOptions;
+import org.springframework.ai.ollama.api.OllamaChatOptions;
 import org.springframework.ai.openai.OpenAiChatOptions;
 import org.springframework.ai.tool.ToolCallback;
 import org.springframework.ai.zhipuai.ZhiPuAiChatOptions;
@@ -77,7 +77,7 @@ public class AiUtils {
                 return AnthropicChatOptions.builder().model(model).temperature(temperature).maxTokens(maxTokens)
                         .toolCallbacks(toolCallbacks).toolContext(toolContext).build();
             case OLLAMA:
-                return OllamaOptions.builder().model(model).temperature(temperature).numPredict(maxTokens)
+                return OllamaChatOptions.builder().model(model).temperature(temperature).numPredict(maxTokens)
                         .toolCallbacks(toolCallbacks).toolContext(toolContext).build();
             default:
                 throw new IllegalArgumentException(StrUtil.format("未知平台({})", platform));

+ 2 - 0
yudao-server/src/main/resources/application.yaml

@@ -211,6 +211,8 @@ spring:
             filesystem:
               url: http://127.0.0.1:8089
               sse-endpoint: /sse
+        annotation-scanner:
+          enabled: false # TODO @芋艿:有 bug https://github.com/spring-projects/spring-ai/issues/4917 需要官方修复
 
 yudao:
   ai: