搭建AI完整的SpringBoot整合SpringAI配置多平台API密钥的解决方案1. 添加依赖 (pom.xml)dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai/artifactIdversion1.0.0-M5/version/dependency!-- 或根据需要添加具体供应商 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-openai-spring-boot-starter/artifactIdversion1.0.0-M5/version/dependencydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-azure-openai-spring-boot-starter/artifactIdversion1.0.0-M5/version/dependencydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-anthropic-spring-boot-starter/artifactIdversion1.0.0-M5/version/dependency2. 配置文件 (application.yml)# 应用配置spring:application:name:ai-platform-demoai:# 默认激活的平台active-platform:openai# OpenAI 配置openai:api-key:${OPENAI_API_KEY:sk-your-openai-key}base-url:https://api.openai.com/v1chat:options:model:gpt-4-turbotemperature:0.7# Azure OpenAI 配置azure:openai:api-key:${AZURE_OPENAI_API_KEY:your-azure-key}endpoint:https://your-resource.openai.azure.comdeployment-name:gpt-4chat:options:temperature:0.7max-tokens:2000# Anthropic Claude 配置anthropic:api-key:${ANTHROPIC_API_KEY:your-anthropic-key}base-url:https://api.anthropic.comchat:options:model:claude-3-opus-20240229temperature:0.7max-tokens:4096# Ollama 本地模型配置ollama:base-url:http://localhost:11434chat:options:model:llama2temperature:0.7# 多模型工厂配置model:chatgpt4provider:openai3. 配置属性类importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.stereotype.Component;DataComponentConfigurationProperties(prefixspring.ai)publicclassAIConfigProperties{privateStringactivePlatform;privateOpenAIConfigopenai;privateAzureOpenAIConfigazure;privateAnthropicConfiganthropic;privateOllamaConfigollama;DatapublicstaticclassOpenAIConfig{privateStringapiKey;privateStringbaseUrlhttps://api.openai.com/v1;privateChatOptionschatnewChatOptions();DatapublicstaticclassChatOptions{privateStringmodelgpt-4-turbo;privateDoubletemperature0.7;privateIntegermaxTokens2000;}}DatapublicstaticclassAzureOpenAIConfig{privateStringapiKey;privateStringendpoint;privateStringdeploymentNamegpt-4;privateChatOptionschatnewChatOptions();DatapublicstaticclassChatOptions{privateDoubletemperature0.7;privateIntegermaxTokens2000;}}DatapublicstaticclassAnthropicConfig{privateStringapiKey;privateStringbaseUrlhttps://api.anthropic.com;privateChatOptionschatnewChatOptions();DatapublicstaticclassChatOptions{privateStringmodelclaude-3-opus-20240229;privateDoubletemperature0.7;privateIntegermaxTokens4096;}}DatapublicstaticclassOllamaConfig{privateStringbaseUrlhttp://localhost:11434;privateChatOptionschatnewChatOptions();DatapublicstaticclassChatOptions{privateStringmodelllama2;privateDoubletemperature0.7;}}}4. 核心配置类importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.openai.OpenAiChatClient;importorg.springframework.ai.openai.OpenAiChatOptions;importorg.springframework.ai.openai.api.OpenAiApi;importorg.springframework.ai.azure.openai.AzureOpenAiChatClient;importorg.springframework.ai.azure.openai.AzureOpenAiChatOptions;importorg.springframework.ai.azure.openai.AzureOpenAiApi;importorg.springframework.ai.anthropic.AnthropicChatClient;importorg.springframework.ai.anthropic.AnthropicChatOptions;importorg.springframework.ai.anthropic.api.AnthropicApi;importorg.springframework.ai.ollama.OllamaChatClient;importorg.springframework.ai.ollama.OllamaChatOptions;importorg.springframework.ai.ollama.api.OllamaApi;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Primary;ConfigurationpublicclassAIConfiguration{privatefinalAIConfigPropertiesaiConfig;publicAIConfiguration(AIConfigPropertiesaiConfig){this.aiConfigaiConfig;}// OpenAI ClientBeanPrimarypublicOpenAiChatClientopenAiChatClient(){varconfigaiConfig.getOpenai();varapinewOpenAiApi(config.getBaseUrl(),config.getApiKey());varoptionsOpenAiChatOptions.builder().withModel(config.getChat().getModel()).withTemperature(config.getChat().getTemperature()).withMaxTokens(config.getChat().getMaxTokens()).build();returnnewOpenAiChatClient(api,options);}// Azure OpenAI ClientBeanpublicAzureOpenAiChatClientazureOpenAiChatClient(){varconfigaiConfig.getAzure();varapinewAzureOpenAiApi(config.getEndpoint(),config.getApiKey());varoptionsAzureOpenAiChatOptions.builder().withDeploymentName(config.getDeploymentName()).withTemperature(config.getChat().getTemperature()).withMaxTokens(config.getChat().getMaxTokens()).build();returnnewAzureOpenAiChatClient(api,options);}// Anthropic ClientBeanpublicAnthropicChatClientanthropicChatClient(){varconfigaiConfig.getAnthropic();varapinewAnthropicApi(config.getApiKey(),config.getBaseUrl());varoptionsAnthropicChatOptions.builder().withModel(config.getChat().getModel()).withTemperature(config.getChat().getTemperature()).withMaxTokens(config.getChat().getMaxTokens()).build();returnnewAnthropicChatClient(api,options);}// Ollama ClientBeanpublicOllamaChatClientollamaChatClient(){varconfigaiConfig.getOllama();varapinewOllamaApi(config.getBaseUrl());varoptionsOllamaChatOptions.builder().withModel(config.getChat().getModel()).withTemperature(config.getChat().getTemperature()).build();returnnewOllamaChatClient(api,options);}// 动态选择 ChatClientBeanPrimarypublicChatClientchatClient(Qualifier(openAiChatClient)OpenAiChatClientopenAiChatClient,Qualifier(azureOpenAiChatClient)AzureOpenAiChatClientazureOpenAiChatClient,Qualifier(anthropicChatClient)AnthropicChatClientanthropicChatClient,Qualifier(ollamaChatClient)OllamaChatClientollamaChatClient){returnChatClient.builder().defaultAdvisors(request-{switch(aiConfig.getActivePlatform()){caseopenai:returnrequest.advisors(advisor-advisor.param(chatClient,openAiChatClient));caseazure:returnrequest.advisors(advisor-advisor.param(chatClient,azureOpenAiChatClient));caseanthropic:returnrequest.advisors(advisor-advisor.param(chatClient,anthropicChatClient));caseollama:returnrequest.advisors(advisor-advisor.param(chatClient,ollamaChatClient));default:returnrequest.advisors(advisor-advisor.param(chatClient,openAiChatClient));}}).build();}}5. 服务层封装importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.chat.model.ChatResponse;importorg.springframework.ai.chat.prompt.Prompt;importorg.springframework.ai.chat.prompt.PromptTemplate;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.stereotype.Service;importjava.util.Map;ServicepublicclassAIChatService{privatefinalChatClientchatClient;privatefinalAIConfigPropertiesaiConfig;publicAIChatService(Qualifier(chatClient)ChatClientchatClient,AIConfigPropertiesaiConfig){this.chatClientchatClient;this.aiConfigaiConfig;}publicStringchat(Stringmessage){returnchatClient.prompt().system(你是一个有帮助的AI助手).user(message).call().content();}publicStringchatWithTemplate(Stringtemplate,MapString,Objectvariables){PromptTemplatepromptTemplatenewPromptTemplate(template);PromptpromptpromptTemplate.create(variables);ChatResponseresponsechatClient.call(prompt);returnresponse.getResult().getOutput().getContent();}publicvoidswitchPlatform(Stringplatform){aiConfig.setActivePlatform(platform);}publicStringgetActivePlatform(){returnaiConfig.getActivePlatform();}}6. 控制器示例importorg.springframework.web.bind.annotation.*;importorg.springframework.http.ResponseEntity;importjava.util.Map;RestControllerRequestMapping(/api/ai)publicclassAIController{privatefinalAIChatServiceaiChatService;publicAIController(AIChatServiceaiChatService){this.aiChatServiceaiChatService;}PostMapping(/chat)publicResponseEntityMapString,Stringchat(RequestBodyChatRequestrequest){StringresponseaiChatService.chat(request.getMessage());returnResponseEntity.ok(Map.of(response,response,platform,aiChatService.getActivePlatform()));}PostMapping(/switch-platform)publicResponseEntityMapString,StringswitchPlatform(RequestParamStringplatform){aiChatService.switchPlatform(platform);returnResponseEntity.ok(Map.of(message,已切换到平台: platform,platform,platform));}GetMapping(/current-platform)publicResponseEntityMapString,StringgetCurrentPlatform(){returnResponseEntity.ok(Map.of(platform,aiChatService.getActivePlatform()));}publicrecordChatRequest(Stringmessage){}}7. 环境变量配置 (.env 或系统环境变量)# OpenAIOPENAI_API_KEYsk-your-openai-key# Azure OpenAIAZURE_OPENAI_API_KEYyour-azure-keyAZURE_OPENAI_ENDPOINThttps://your-resource.openai.azure.com# AnthropicANTHROPIC_API_KEYyour-anthropic-key# 其他可选配置SPRING_AI_ACTIVE_PLATFORMopenai8. 使用示例ServicepublicclassBusinessService{privatefinalAIChatServiceaiChatService;publicStringanalyzeContent(Stringcontent){Stringtemplate 请分析以下内容 内容{content} 请提供 1. 主要内容总结 2. 关键点提取 3. 建议 ;returnaiChatService.chatWithTemplate(template,Map.of(content,content));}publicStringtranslateText(Stringtext,StringtargetLanguage){StringpromptString.format(请将以下文本翻译成%s: %s,targetLanguage,text);returnaiChatService.chat(prompt);}}主要使用教程多平台支持OpenAI、Azure OpenAI、Anthropic、Ollama动态切换运行时可切换不同AI平台统一接口通过统一的ChatClient调用配置灵活支持YAML配置和环境变量模板支持支持Prompt模板易于扩展可轻松添加新平台这样配置后你可以通过修改spring.ai.active-platform或调用API接口来切换不同的AI平台每个平台使用各自的API密钥。
SpringBoot整合SpringAI配置多平台API密钥
发布时间:2026/5/19 3:03:05
搭建AI完整的SpringBoot整合SpringAI配置多平台API密钥的解决方案1. 添加依赖 (pom.xml)dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai/artifactIdversion1.0.0-M5/version/dependency!-- 或根据需要添加具体供应商 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-openai-spring-boot-starter/artifactIdversion1.0.0-M5/version/dependencydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-azure-openai-spring-boot-starter/artifactIdversion1.0.0-M5/version/dependencydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-anthropic-spring-boot-starter/artifactIdversion1.0.0-M5/version/dependency2. 配置文件 (application.yml)# 应用配置spring:application:name:ai-platform-demoai:# 默认激活的平台active-platform:openai# OpenAI 配置openai:api-key:${OPENAI_API_KEY:sk-your-openai-key}base-url:https://api.openai.com/v1chat:options:model:gpt-4-turbotemperature:0.7# Azure OpenAI 配置azure:openai:api-key:${AZURE_OPENAI_API_KEY:your-azure-key}endpoint:https://your-resource.openai.azure.comdeployment-name:gpt-4chat:options:temperature:0.7max-tokens:2000# Anthropic Claude 配置anthropic:api-key:${ANTHROPIC_API_KEY:your-anthropic-key}base-url:https://api.anthropic.comchat:options:model:claude-3-opus-20240229temperature:0.7max-tokens:4096# Ollama 本地模型配置ollama:base-url:http://localhost:11434chat:options:model:llama2temperature:0.7# 多模型工厂配置model:chatgpt4provider:openai3. 配置属性类importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.stereotype.Component;DataComponentConfigurationProperties(prefixspring.ai)publicclassAIConfigProperties{privateStringactivePlatform;privateOpenAIConfigopenai;privateAzureOpenAIConfigazure;privateAnthropicConfiganthropic;privateOllamaConfigollama;DatapublicstaticclassOpenAIConfig{privateStringapiKey;privateStringbaseUrlhttps://api.openai.com/v1;privateChatOptionschatnewChatOptions();DatapublicstaticclassChatOptions{privateStringmodelgpt-4-turbo;privateDoubletemperature0.7;privateIntegermaxTokens2000;}}DatapublicstaticclassAzureOpenAIConfig{privateStringapiKey;privateStringendpoint;privateStringdeploymentNamegpt-4;privateChatOptionschatnewChatOptions();DatapublicstaticclassChatOptions{privateDoubletemperature0.7;privateIntegermaxTokens2000;}}DatapublicstaticclassAnthropicConfig{privateStringapiKey;privateStringbaseUrlhttps://api.anthropic.com;privateChatOptionschatnewChatOptions();DatapublicstaticclassChatOptions{privateStringmodelclaude-3-opus-20240229;privateDoubletemperature0.7;privateIntegermaxTokens4096;}}DatapublicstaticclassOllamaConfig{privateStringbaseUrlhttp://localhost:11434;privateChatOptionschatnewChatOptions();DatapublicstaticclassChatOptions{privateStringmodelllama2;privateDoubletemperature0.7;}}}4. 核心配置类importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.openai.OpenAiChatClient;importorg.springframework.ai.openai.OpenAiChatOptions;importorg.springframework.ai.openai.api.OpenAiApi;importorg.springframework.ai.azure.openai.AzureOpenAiChatClient;importorg.springframework.ai.azure.openai.AzureOpenAiChatOptions;importorg.springframework.ai.azure.openai.AzureOpenAiApi;importorg.springframework.ai.anthropic.AnthropicChatClient;importorg.springframework.ai.anthropic.AnthropicChatOptions;importorg.springframework.ai.anthropic.api.AnthropicApi;importorg.springframework.ai.ollama.OllamaChatClient;importorg.springframework.ai.ollama.OllamaChatOptions;importorg.springframework.ai.ollama.api.OllamaApi;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Primary;ConfigurationpublicclassAIConfiguration{privatefinalAIConfigPropertiesaiConfig;publicAIConfiguration(AIConfigPropertiesaiConfig){this.aiConfigaiConfig;}// OpenAI ClientBeanPrimarypublicOpenAiChatClientopenAiChatClient(){varconfigaiConfig.getOpenai();varapinewOpenAiApi(config.getBaseUrl(),config.getApiKey());varoptionsOpenAiChatOptions.builder().withModel(config.getChat().getModel()).withTemperature(config.getChat().getTemperature()).withMaxTokens(config.getChat().getMaxTokens()).build();returnnewOpenAiChatClient(api,options);}// Azure OpenAI ClientBeanpublicAzureOpenAiChatClientazureOpenAiChatClient(){varconfigaiConfig.getAzure();varapinewAzureOpenAiApi(config.getEndpoint(),config.getApiKey());varoptionsAzureOpenAiChatOptions.builder().withDeploymentName(config.getDeploymentName()).withTemperature(config.getChat().getTemperature()).withMaxTokens(config.getChat().getMaxTokens()).build();returnnewAzureOpenAiChatClient(api,options);}// Anthropic ClientBeanpublicAnthropicChatClientanthropicChatClient(){varconfigaiConfig.getAnthropic();varapinewAnthropicApi(config.getApiKey(),config.getBaseUrl());varoptionsAnthropicChatOptions.builder().withModel(config.getChat().getModel()).withTemperature(config.getChat().getTemperature()).withMaxTokens(config.getChat().getMaxTokens()).build();returnnewAnthropicChatClient(api,options);}// Ollama ClientBeanpublicOllamaChatClientollamaChatClient(){varconfigaiConfig.getOllama();varapinewOllamaApi(config.getBaseUrl());varoptionsOllamaChatOptions.builder().withModel(config.getChat().getModel()).withTemperature(config.getChat().getTemperature()).build();returnnewOllamaChatClient(api,options);}// 动态选择 ChatClientBeanPrimarypublicChatClientchatClient(Qualifier(openAiChatClient)OpenAiChatClientopenAiChatClient,Qualifier(azureOpenAiChatClient)AzureOpenAiChatClientazureOpenAiChatClient,Qualifier(anthropicChatClient)AnthropicChatClientanthropicChatClient,Qualifier(ollamaChatClient)OllamaChatClientollamaChatClient){returnChatClient.builder().defaultAdvisors(request-{switch(aiConfig.getActivePlatform()){caseopenai:returnrequest.advisors(advisor-advisor.param(chatClient,openAiChatClient));caseazure:returnrequest.advisors(advisor-advisor.param(chatClient,azureOpenAiChatClient));caseanthropic:returnrequest.advisors(advisor-advisor.param(chatClient,anthropicChatClient));caseollama:returnrequest.advisors(advisor-advisor.param(chatClient,ollamaChatClient));default:returnrequest.advisors(advisor-advisor.param(chatClient,openAiChatClient));}}).build();}}5. 服务层封装importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.chat.model.ChatResponse;importorg.springframework.ai.chat.prompt.Prompt;importorg.springframework.ai.chat.prompt.PromptTemplate;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.stereotype.Service;importjava.util.Map;ServicepublicclassAIChatService{privatefinalChatClientchatClient;privatefinalAIConfigPropertiesaiConfig;publicAIChatService(Qualifier(chatClient)ChatClientchatClient,AIConfigPropertiesaiConfig){this.chatClientchatClient;this.aiConfigaiConfig;}publicStringchat(Stringmessage){returnchatClient.prompt().system(你是一个有帮助的AI助手).user(message).call().content();}publicStringchatWithTemplate(Stringtemplate,MapString,Objectvariables){PromptTemplatepromptTemplatenewPromptTemplate(template);PromptpromptpromptTemplate.create(variables);ChatResponseresponsechatClient.call(prompt);returnresponse.getResult().getOutput().getContent();}publicvoidswitchPlatform(Stringplatform){aiConfig.setActivePlatform(platform);}publicStringgetActivePlatform(){returnaiConfig.getActivePlatform();}}6. 控制器示例importorg.springframework.web.bind.annotation.*;importorg.springframework.http.ResponseEntity;importjava.util.Map;RestControllerRequestMapping(/api/ai)publicclassAIController{privatefinalAIChatServiceaiChatService;publicAIController(AIChatServiceaiChatService){this.aiChatServiceaiChatService;}PostMapping(/chat)publicResponseEntityMapString,Stringchat(RequestBodyChatRequestrequest){StringresponseaiChatService.chat(request.getMessage());returnResponseEntity.ok(Map.of(response,response,platform,aiChatService.getActivePlatform()));}PostMapping(/switch-platform)publicResponseEntityMapString,StringswitchPlatform(RequestParamStringplatform){aiChatService.switchPlatform(platform);returnResponseEntity.ok(Map.of(message,已切换到平台: platform,platform,platform));}GetMapping(/current-platform)publicResponseEntityMapString,StringgetCurrentPlatform(){returnResponseEntity.ok(Map.of(platform,aiChatService.getActivePlatform()));}publicrecordChatRequest(Stringmessage){}}7. 环境变量配置 (.env 或系统环境变量)# OpenAIOPENAI_API_KEYsk-your-openai-key# Azure OpenAIAZURE_OPENAI_API_KEYyour-azure-keyAZURE_OPENAI_ENDPOINThttps://your-resource.openai.azure.com# AnthropicANTHROPIC_API_KEYyour-anthropic-key# 其他可选配置SPRING_AI_ACTIVE_PLATFORMopenai8. 使用示例ServicepublicclassBusinessService{privatefinalAIChatServiceaiChatService;publicStringanalyzeContent(Stringcontent){Stringtemplate 请分析以下内容 内容{content} 请提供 1. 主要内容总结 2. 关键点提取 3. 建议 ;returnaiChatService.chatWithTemplate(template,Map.of(content,content));}publicStringtranslateText(Stringtext,StringtargetLanguage){StringpromptString.format(请将以下文本翻译成%s: %s,targetLanguage,text);returnaiChatService.chat(prompt);}}主要使用教程多平台支持OpenAI、Azure OpenAI、Anthropic、Ollama动态切换运行时可切换不同AI平台统一接口通过统一的ChatClient调用配置灵活支持YAML配置和环境变量模板支持支持Prompt模板易于扩展可轻松添加新平台这样配置后你可以通过修改spring.ai.active-platform或调用API接口来切换不同的AI平台每个平台使用各自的API密钥。