前置:application.yml(阿里云百炼作为 OpenAI 兼容端点)
yaml
spring:
ai:
openai:
api-key: ${DASHSCOPE_API_KEY}
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
chat:
options:
model: qwen-plus
说明:api-key 使用百炼控制台里的 API Key;model 用百炼里在「OpenAI 兼容」下支持的模型名(如 qwen-plus、qwen-max 等,以控制台为准)。
方法一:同一模型类型(都是 OpenAiChatModel / 百炼),多个 ChatClient
差别只在 ChatClient 层默认行为(例如不同系统提示),底层仍是同一个注入的 OpenAiChatModel。
kotlin
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BailianMultiClientConfig {
@Bean
public ChatClient conciseBailianClient(OpenAiChatModel chatModel) {
return ChatClient.builder(chatModel)
.defaultSystem("你是简洁助手,回答尽量短。")
.build();
}
@Bean
public ChatClient detailedBailianClient(OpenAiChatModel chatModel) {
return ChatClient.builder(chatModel)
.defaultSystem("你是详细助手,先列要点再展开。")
.build();
}
}
用 @Qualifier("conciseBailianClient") / @Qualifier("detailedBailianClient") 注入即可。
方法二:不同模型类型,多个 ChatClient(百炼 OpenAI 兼容 + 另一家)
这里 第一类仍是百炼(OpenAiChatModel + 上面 yml)。第二类换厂商时用另一种 ChatModel(示例用 Anthropic;需引入对应 Spring AI starter 并配置密钥)。
kotlin
import org.springframework.ai.anthropic.AnthropicChatModel;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MultiVendorChatClientConfig {
/** 百炼:OpenAI 兼容,底层是 OpenAiChatModel */
@Bean
public ChatClient bailianChatClient(OpenAiChatModel openAiChatModel) {
return ChatClient.builder(openAiChatModel)
.defaultSystem("你通过阿里云百炼(OpenAI 兼容)回答问题。")
.build();
}
/** 另一家:原生 Anthropic API */
@Bean
public ChatClient anthropicChatClient(AnthropicChatModel anthropicChatModel) {
return ChatClient.builder(anthropicChatModel)
.defaultSystem("你通过 Anthropic API 回答问题。")
.build();
}
}
要点:百炼走 OpenAI 兼容 → OpenAiChatModel;Anthropic 走自己的 AnthropicChatModel,这是「不同模型类型」在 Spring AI 里的典型拆法。
方法三:多个 OpenAI 兼容端点(百炼 + 另一个 OpenAI 兼容服务)
仍只用 OpenAiApi / OpenAiChatModel,通过 mutate() 改 baseUrl、apiKey、默认 model。第二个端点可以是:官方 OpenAI、Groq、其它国内兼容网关等,协议形状与 OpenAI 一致即可。
scss
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MultiOpenAiCompatibleEndpointsService {
@Autowired
private OpenAiChatModel baseChatModel;
@Autowired
private OpenAiApi baseOpenAiApi;
public void compareTwoEndpoints(String userMessage) {
// 端点 A:阿里云百炼(北京 OpenAI 兼容)
OpenAiApi bailianApi = baseOpenAiApi.mutate()
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.build();
OpenAiChatModel bailianModel = baseChatModel.mutate()
.openAiApi(bailianApi)
.defaultOptions(OpenAiChatOptions.builder()
.model("qwen-plus")
.temperature(0.3)
.build())
.build();
// 端点 B:另一个 OpenAI 兼容服务(示例:请换成你真实的 URL / Key / 模型名)
OpenAiApi otherApi = baseOpenAiApi.mutate()
.baseUrl("https://api.openai.com/v1") // 或其它兼容网关
.apiKey(System.getenv("OPENAI_API_KEY"))
.build();
OpenAiChatModel otherModel = baseChatModel.mutate()
.openAiApi(otherApi)
.defaultOptions(OpenAiChatOptions.builder()
.model("gpt-4o-mini")
.temperature(0.3)
.build())
.build();
String r1 = ChatClient.builder(bailianModel).build()
.prompt(userMessage).call().content();
String r2 = ChatClient.builder(otherModel).build()
.prompt(userMessage).call().content();
// 使用 r1 / r2
}
}
若两个都是百炼,只是 地域或模型不同,把「端点 B」改成例如新加坡兼容地址,并只改 model 即可