Skip to main content

OpenAI SDK Chat (Official)

Spring AI 通过 OpenAI Java SDK 支持 OpenAI 的语言模型,提供与 OpenAI 服务(包括 Microsoft Foundry 和 GitHub Models)的稳健且官方维护的集成。

注意: 此实现使用来自 OpenAI 的官方 OpenAI Java SDK。对于替代的 Spring AI 实现,请参阅 OpenAI Chat

OpenAI SDK 模块根据您提供的 base URL 自动检测服务提供商(OpenAI、Microsoft Foundry 或 GitHub Models)。

Authentication

身份验证使用 base URL 和 API Key 完成。该实现通过 Spring Boot 属性或环境变量提供灵活的配置选项。

Using OpenAI

如果您直接使用 OpenAI,请在 OpenAI signup page 创建账户,并在 API Keys page 生成 API key。

base URL 不需要设置,因为它默认为 https://api.openai.com/v1

spring.ai.openai-sdk.api-key=<your-openai-api-key>
# base-url is optional, defaults to https://api.openai.com/v1

或使用环境变量:

export OPENAI_API_KEY=<your-openai-api-key>
# OPENAI_BASE_URL is optional, defaults to https://api.openai.com/v1

Using Microsoft Foundry

使用 Microsoft Foundry URL 时会自动检测 Microsoft Foundry。您可以使用属性配置它:

spring.ai.openai-sdk.base-url=https://<your-deployment-url>.openai.azure.com
spring.ai.openai-sdk.api-key=<your-api-key>
spring.ai.openai-sdk.microsoft-deployment-name=<your-deployment-name>

或使用环境变量:

export OPENAI_BASE_URL=https://<your-deployment-url>.openai.azure.com
export OPENAI_API_KEY=<your-api-key>

Passwordless Authentication (Recommended for Azure):

Microsoft Foundry 支持无密码身份验证,无需提供 API key,这在 Azure 上运行时更安全。

要启用无密码身份验证,请添加 com.azure:azure-identity 依赖项:

<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
</dependency>

然后配置时不使用 API key:

spring.ai.openai-sdk.base-url=https://<your-deployment-url>.openai.azure.com
spring.ai.openai-sdk.microsoft-deployment-name=<your-deployment-name>
# No api-key needed - will use Azure credentials from environment

Using GitHub Models

使用 GitHub Models base URL 时会自动检测 GitHub Models。您需要创建一个具有 models:read 范围的 GitHub Personal Access Token (PAT)。

spring.ai.openai-sdk.base-url=https://models.inference.ai.azure.com
spring.ai.openai-sdk.api-key=github_pat_XXXXXXXXXXX

或使用环境变量:

export OPENAI_BASE_URL=https://models.inference.ai.azure.com
export OPENAI_API_KEY=github_pat_XXXXXXXXXXX

提示: 为了在处理敏感信息(如 API keys)时增强安全性,您可以在属性中使用 Spring Expression Language (SpEL):

spring.ai.openai-sdk.api-key=${OPENAI_API_KEY}

Add Repositories and BOM

Spring AI artifacts 发布在 Maven Central 和 Spring Snapshot 仓库中。 请参阅 Artifact Repositories 部分,将这些仓库添加到您的构建系统中。

为了帮助进行依赖管理,Spring AI 提供了一个 BOM (bill of materials),以确保在整个项目中使用一致版本的 Spring AI。请参阅 Dependency Management 部分,将 Spring AI BOM 添加到您的构建系统中。

Auto-configuration

Spring AI 为 OpenAI SDK Chat Client 提供 Spring Boot auto-configuration。 要启用它,请将以下依赖项添加到项目的 Maven pom.xml 或 Gradle build.gradle 构建文件中:

<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai-sdk</artifactId>
</dependency>
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-openai-sdk'
}

提示: 请参阅 Dependency Management 部分,将 Spring AI BOM 添加到您的构建文件中。

Configuration Properties

Connection Properties

前缀 spring.ai.openai-sdk 是用于配置 OpenAI SDK 客户端的属性前缀。

PropertyDescriptionDefault
spring.ai.openai-sdk.base-url要连接到的 URL。如果未设置,则从 OPENAI_BASE_URL 环境变量自动检测。https://api.openai.com/v1
spring.ai.openai-sdk.api-keyAPI Key。如果未设置,则从 OPENAI_API_KEY 环境变量自动检测。-
spring.ai.openai-sdk.organization-id可选指定用于 API 请求的组织。-
spring.ai.openai-sdk.timeout请求超时持续时间。-
spring.ai.openai-sdk.max-retries失败请求的最大重试次数。-
spring.ai.openai-sdk.proxyOpenAI 客户端的代理设置(Java Proxy 对象)。-
spring.ai.openai-sdk.custom-headers要在请求中包含的自定义 HTTP headers。header 名称到 header 值的映射。-

Microsoft Foundry (Azure OpenAI) Properties

OpenAI SDK 实现为 Microsoft Foundry (Azure OpenAI) 提供原生支持,并自动配置:

PropertyDescriptionDefault
spring.ai.openai-sdk.microsoft-foundry启用 Microsoft Foundry 模式。如果 base URL 包含 openai.azure.comcognitiveservices.azure.com.openai.microsoftFoundry.com,则自动检测。false
spring.ai.openai-sdk.microsoft-deployment-nameMicrosoft Foundry 部署名称。如果未指定,将使用模型名称。也可通过别名 deployment-name 访问。-
spring.ai.openai-sdk.microsoft-foundry-service-versionMicrosoft Foundry API 服务版本。-
spring.ai.openai-sdk.credential用于无密码身份验证的凭据对象(需要 com.azure:azure-identity 依赖项)。-

提示: Microsoft Foundry 支持无密码身份验证。添加 com.azure:azure-identity 依赖项,当未提供 API key 时,实现将自动尝试使用环境中的 Azure 凭据。

GitHub Models Properties

提供对 GitHub Models 的原生支持:

PropertyDescriptionDefault
spring.ai.openai-sdk.github-models启用 GitHub Models 模式。如果 base URL 包含 models.github.aimodels.inference.ai.azure.com,则自动检测。false

提示: GitHub Models 需要一个具有 models:read 范围的 Personal Access Token。通过 OPENAI_API_KEY 环境变量或 spring.ai.openai-sdk.api-key 属性设置它。

Chat Model Properties

前缀 spring.ai.openai-sdk.chat 是用于配置 chat model 实现的属性前缀:

PropertyDescriptionDefault
spring.ai.openai-sdk.chat.options.model要使用的 OpenAI chat model 名称。您可以在以下模型之间选择:gpt-5-minigpt-4ogpt-4o-minigpt-4-turboo1o3-mini 等。有关更多信息,请参阅 models 页面。gpt-5-mini
spring.ai.openai-sdk.chat.options.temperature用于控制生成 completions 的明显创造力的采样 temperature。较高的值将使输出更加随机,而较低的值将使结果更加聚焦和确定性。不建议为同一个 completions 请求修改 temperaturetop_p,因为这两个设置的交互很难预测。1.0
spring.ai.openai-sdk.chat.options.frequency-penalty介于 -2.0 和 2.0 之间的数字。正值会根据到目前为止文本中现有频率对新 tokens 进行惩罚,降低模型逐字重复同一行的可能性。0.0
spring.ai.openai-sdk.chat.options.logit-bias修改指定 tokens 出现在 completion 中的可能性。-
spring.ai.openai-sdk.chat.options.logprobs是否返回输出 tokens 的 log probabilities。false
spring.ai.openai-sdk.chat.options.top-logprobs介于 0 和 5 之间的整数,指定在每个 token 位置返回的最可能的 tokens 数量。需要 logprobs 为 true。-
spring.ai.openai-sdk.chat.options.max-tokens要生成的最大 tokens 数。用于非推理模型(例如,gpt-4o、gpt-3.5-turbo)。不能用于推理模型(例如,o1、o3、o4-mini 系列)。与 maxCompletionTokens 互斥-
spring.ai.openai-sdk.chat.options.max-completion-tokens可以为 completion 生成的 tokens 数量的上限,包括可见输出 tokens 和推理 tokens。推理模型必需(例如,o1、o3、o4-mini 系列)。不能用于非推理模型与 maxTokens 互斥-
spring.ai.openai-sdk.chat.options.n为每个输入消息生成多少个 chat completion 选择。1
spring.ai.openai-sdk.chat.options.output-modalities输出模态列表。可以包括 "text" 和 "audio"。-
spring.ai.openai-sdk.chat.options.output-audio音频输出参数。使用 AudioParameters,包含 voice(ALLOY、ASH、BALLAD、CORAL、ECHO、FABLE、ONYX、NOVA、SAGE、SHIMMER)和 format(MP3、FLAC、OPUS、PCM16、WAV、AAC)。-
spring.ai.openai-sdk.chat.options.presence-penalty介于 -2.0 和 2.0 之间的数字。正值会根据到目前为止是否出现新 tokens 进行惩罚。0.0
spring.ai.openai-sdk.chat.options.response-format.type响应格式类型:TEXTJSON_OBJECTJSON_SCHEMATEXT
spring.ai.openai-sdk.chat.options.response-format.json-schema当类型为 JSON_SCHEMA 时用于结构化输出的 JSON schema。-
spring.ai.openai-sdk.chat.options.seed如果指定,系统将尽最大努力进行确定性采样以获得可重现的结果。-
spring.ai.openai-sdk.chat.options.stop最多 4 个序列,API 将停止生成更多 tokens。-
spring.ai.openai-sdk.chat.options.top-p除了 temperature 采样之外,还有一种称为 nucleus sampling 的替代方法。-
spring.ai.openai-sdk.chat.options.user代表您的最终用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用。-
spring.ai.openai-sdk.chat.options.parallel-tool-calls是否在工具使用期间启用并行 function calling。true
spring.ai.openai-sdk.chat.options.reasoning-effort约束推理模型在推理上的努力:lowmediumhigh-
spring.ai.openai-sdk.chat.options.verbosity控制模型响应的详细程度。-
spring.ai.openai-sdk.chat.options.store是否存储此 chat completion 请求的输出以供在 OpenAI 的模型蒸馏或评估产品中使用。false
spring.ai.openai-sdk.chat.options.metadata开发人员定义的标签和值,用于在仪表板中过滤 completions。-
spring.ai.openai-sdk.chat.options.service-tier指定要使用的延迟层级:autodefaultflexpriority-
spring.ai.openai-sdk.chat.options.stream-options.include-usage是否在 streaming 响应中包含使用统计信息。false
spring.ai.openai-sdk.chat.options.stream-options.include-obfuscation是否在 streaming 响应中包含混淆。false
spring.ai.openai-sdk.chat.options.tool-choice控制模型调用哪个(如果有)function。-
spring.ai.openai-sdk.chat.options.internal-tool-execution-enabled如果为 false,Spring AI 将把 tool calls 代理到客户端进行手动处理。如果为 true(默认值),Spring AI 将在内部处理 function calls。true

注意: 使用 GPT-5 模型(如 gpt-5gpt-5-minigpt-5-nano)时,不支持 temperature 参数。 这些模型针对推理进行了优化,不使用 temperature。 指定 temperature 值将导致错误。 相比之下,对话模型(如 gpt-5-chat)确实支持 temperature 参数。

提示: 所有前缀为 spring.ai.openai-sdk.chat.options 的属性都可以通过在 Prompt 调用中添加请求特定的 chat-options 在运行时覆盖。

Token Limit Parameters: Model-Specific Usage

OpenAI 提供两个互斥的参数来控制 token 生成限制:

ParameterUse CaseCompatible Models
maxTokens非推理模型gpt-4o、gpt-4o-mini、gpt-4-turbo、gpt-3.5-turbo
maxCompletionTokens推理模型o1、o1-mini、o1-preview、o3、o4-mini 系列

重要: 这些参数是互斥的。同时设置两者将导致 OpenAI 的 API 错误。

Usage Examples

对于非推理模型(gpt-4o、gpt-3.5-turbo):

ChatResponse response = chatModel.call(
new Prompt(
"Explain quantum computing in simple terms.",
OpenAiSdkChatOptions.builder()
.model("gpt-4o")
.maxTokens(150) // Use maxTokens for non-reasoning models
.build()
));

对于推理模型(o1、o3 系列):

ChatResponse response = chatModel.call(
new Prompt(
"Solve this complex math problem step by step: ...",
OpenAiSdkChatOptions.builder()
.model("o1-preview")
.maxCompletionTokens(1000) // Use maxCompletionTokens for reasoning models
.build()
));

Runtime Options [[chat-options]]

OpenAiSdkChatOptions.java 类提供模型配置,例如要使用的模型、temperature、frequency penalty 等。

在启动时,可以使用 OpenAiSdkChatModel(options) 构造函数或 spring.ai.openai-sdk.chat.options.* 属性来配置默认选项。

在运行时,您可以通过向 Prompt 调用添加新的、请求特定的选项来覆盖默认选项。 例如,要覆盖特定请求的默认模型和 temperature:

ChatResponse response = chatModel.call(
new Prompt(
"Generate the names of 5 famous pirates.",
OpenAiSdkChatOptions.builder()
.model("gpt-4o")
.temperature(0.4)
.build()
));

提示: 除了模型特定的 OpenAiSdkChatOptions 之外,您还可以使用可移植的 ChatOptions 实例,该实例使用 ChatOptions#builder() 创建。

Tool Calling

您可以将自定义 Java functions 或 methods 注册到 OpenAiSdkChatModel,并让 OpenAI 模型智能地选择输出包含参数以调用一个或多个已注册 functions/tools 的 JSON 对象。 这是一种将 LLM 功能与外部工具和 APIs 连接的强大技术。 了解更多关于 Tool Calling

使用示例:

var chatOptions = OpenAiSdkChatOptions.builder()
.toolCallbacks(List.of(
FunctionToolCallback.builder("getCurrentWeather", new WeatherService())
.description("Get the weather in location")
.inputType(WeatherService.Request.class)
.build()))
.build();

ChatResponse response = chatModel.call(
new Prompt("What's the weather like in San Francisco?", chatOptions));

Multimodal

Multimodality 是指模型同时理解和处理来自各种来源的信息的能力,包括文本、图像、音频和其他数据格式。

Vision

提供 vision multimodal 支持的 OpenAI 模型包括 gpt-4gpt-4ogpt-4o-mini。 请参阅 Vision 指南了解更多信息。

Spring AI 的 Message 接口通过引入 Media 类型来促进 multimodal AI 模型。

以下是一个代码示例,说明了用户文本与图像的融合:

var imageResource = new ClassPathResource("/multimodal.test.png");

var userMessage = new UserMessage(
"Explain what do you see on this picture?",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageResource)));

ChatResponse response = chatModel.call(
new Prompt(userMessage,
OpenAiSdkChatOptions.builder()
.model("gpt-4o")
.build()));

或使用图像 URL:

var userMessage = new UserMessage(
"Explain what do you see on this picture?",
List.of(Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(URI.create("https://docs.spring.io/spring-ai/reference/_images/multimodal.test.png"))
.build()));

ChatResponse response = chatModel.call(new Prompt(userMessage));

提示: 您也可以传递多个图像。

Audio

提供音频输入支持的 OpenAI 模型包括 gpt-4o-audio-preview。 请参阅 Audio 指南了解更多信息。

Spring AI 支持 base64 编码的音频文件与消息。 目前,OpenAI 支持以下媒体类型:audio/mp3audio/wav

音频输入示例:

var audioResource = new ClassPathResource("speech1.mp3");

var userMessage = new UserMessage(
"What is this recording about?",
List.of(new Media(MimeTypeUtils.parseMimeType("audio/mp3"), audioResource)));

ChatResponse response = chatModel.call(
new Prompt(userMessage,
OpenAiSdkChatOptions.builder()
.model("gpt-4o-audio-preview")
.build()));

Output Audio

gpt-4o-audio-preview 模型可以生成音频响应。

生成音频输出的示例:

var userMessage = new UserMessage("Tell me a joke about Spring Framework");

ChatResponse response = chatModel.call(
new Prompt(userMessage,
OpenAiSdkChatOptions.builder()
.model("gpt-4o-audio-preview")
.outputModalities(List.of("text", "audio"))
.outputAudio(new AudioParameters(Voice.ALLOY, AudioResponseFormat.WAV))
.build()));

String text = response.getResult().getOutput().getContent(); // audio transcript
byte[] waveAudio = response.getResult().getOutput().getMedia().get(0).getDataAsByteArray(); // audio data

Structured Outputs

OpenAI 提供自定义 Structured Outputs APIs,确保您的模型生成严格符合您提供的 JSON Schema 的响应。

Configuration

您可以使用 OpenAiSdkChatOptions 构建器以编程方式设置响应格式:

String jsonSchema = """
{
"type": "object",
"properties": {
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"explanation": { "type": "string" },
"output": { "type": "string" }
},
"required": ["explanation", "output"],
"additionalProperties": false
}
},
"final_answer": { "type": "string" }
},
"required": ["steps", "final_answer"],
"additionalProperties": false
}
""";

Prompt prompt = new Prompt(
"how can I solve 8x + 7 = -23",
OpenAiSdkChatOptions.builder()
.model("gpt-4o-mini")
.responseFormat(ResponseFormat.builder()
.type(ResponseFormat.Type.JSON_SCHEMA)
.jsonSchema(jsonSchema)
.build())
.build());

ChatResponse response = chatModel.call(prompt);

Integrating with BeanOutputConverter

您可以利用现有的 BeanOutputConverter 工具:

record MathReasoning(
@JsonProperty(required = true, value = "steps") Steps steps,
@JsonProperty(required = true, value = "final_answer") String finalAnswer) {

record Steps(
@JsonProperty(required = true, value = "items") Items[] items) {

record Items(
@JsonProperty(required = true, value = "explanation") String explanation,
@JsonProperty(required = true, value = "output") String output) {
}
}
}

var outputConverter = new BeanOutputConverter<>(MathReasoning.class);
String jsonSchema = outputConverter.getJsonSchema();

Prompt prompt = new Prompt(
"how can I solve 8x + 7 = -23",
OpenAiSdkChatOptions.builder()
.model("gpt-4o-mini")
.responseFormat(ResponseFormat.builder()
.type(ResponseFormat.Type.JSON_SCHEMA)
.jsonSchema(jsonSchema)
.build())
.build());

ChatResponse response = chatModel.call(prompt);
MathReasoning mathReasoning = outputConverter.convert(
response.getResult().getOutput().getContent());

Sample Controller

Create 一个新的 Spring Boot 项目,并将 spring-ai-openai-sdk 添加到您的 pom(或 gradle)依赖项中。

src/main/resources 目录下添加一个 application.properties 文件,以配置 OpenAI SDK chat model:

spring.ai.openai-sdk.api-key=YOUR_API_KEY
spring.ai.openai-sdk.chat.options.model=gpt-5-mini
spring.ai.openai-sdk.chat.options.temperature=0.7

提示:api-key 替换为您的 OpenAI 凭据。

这将创建一个 OpenAiSdkChatModel 实现,您可以将其注入到您的类中。 以下是一个简单的 @RestController 类的示例,它使用 chat model 进行文本生成。

@RestController
public class ChatController {

private final OpenAiSdkChatModel chatModel;

@Autowired
public ChatController(OpenAiSdkChatModel chatModel) {
this.chatModel = chatModel;
}

@GetMapping("/ai/generate")
public Map<String,String> generate(
@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of("generation", chatModel.call(message));
}

@GetMapping("/ai/generateStream")
public Flux<ChatResponse> generateStream(
@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
Prompt prompt = new Prompt(new UserMessage(message));
return chatModel.stream(prompt);
}
}

Manual Configuration

OpenAiSdkChatModel 实现了 ChatModel 并使用官方 OpenAI Java SDK 连接到 OpenAI 服务。

spring-ai-openai-sdk 依赖项添加到项目的 Maven pom.xml 文件中:

<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-sdk</artifactId>
</dependency>

或添加到您的 Gradle build.gradle 构建文件中:

dependencies {
implementation 'org.springframework.ai:spring-ai-openai-sdk'
}

提示: 请参阅 Dependency Management 部分,将 Spring AI BOM 添加到您的构建文件中。

接下来,创建一个 OpenAiSdkChatModel 并将其用于文本生成:

var chatOptions = OpenAiSdkChatOptions.builder()
.model("gpt-4o")
.temperature(0.7)
.apiKey(System.getenv("OPENAI_API_KEY"))
.build();

var chatModel = new OpenAiSdkChatModel(chatOptions);

ChatResponse response = chatModel.call(
new Prompt("Generate the names of 5 famous pirates."));

// Or with streaming responses
Flux<ChatResponse> response = chatModel.stream(
new Prompt("Generate the names of 5 famous pirates."));

Microsoft Foundry Configuration

对于 Microsoft Foundry:

var chatOptions = OpenAiSdkChatOptions.builder()
.baseUrl("https://your-resource.openai.azure.com")
.apiKey(System.getenv("OPENAI_API_KEY"))
.deploymentName("gpt-4")
.azureOpenAIServiceVersion(AzureOpenAIServiceVersion.V2024_10_01_PREVIEW)
.azure(true) // Enables Microsoft Foundry mode
.build();

var chatModel = new OpenAiSdkChatModel(chatOptions);

提示: Microsoft Foundry 支持无密码身份验证。将 com.azure:azure-identity 依赖项添加到您的项目中。如果您不提供 API key,实现将自动尝试使用环境中的 Azure 凭据。

GitHub Models Configuration

对于 GitHub Models:

var chatOptions = OpenAiSdkChatOptions.builder()
.baseUrl("https://models.inference.ai.azure.com")
.apiKey(System.getenv("GITHUB_TOKEN"))
.model("gpt-4o")
.githubModels(true)
.build();

var chatModel = new OpenAiSdkChatModel(chatOptions);

Key Differences from Spring AI OpenAI

此实现与 Spring AI OpenAI 实现在几个方面有所不同:

AspectOfficial OpenAI SDKExisting OpenAI
HTTP ClientOkHttp(通过官方 SDK)Spring RestClient/WebClient
API Updates通过 SDK 更新自动手动维护
Azure Support原生支持无密码身份验证手动 URL 构造
GitHub Models原生支持不支持
Audio/Moderation尚未支持完全支持
Retry LogicSDK 管理(指数退避)Spring Retry(可自定义)
Dependencies官方 OpenAI SDKSpring WebFlux

何时使用 OpenAI SDK:

  • 您正在启动一个新项目
  • 您主要使用 Microsoft Foundry 或 GitHub Models
  • 您希望从 OpenAI 获得自动 API 更新
  • 您不需要音频转录或审核功能
  • 您更喜欢官方 SDK 支持

何时使用 Spring AI OpenAI:

  • 您有一个使用它的现有项目
  • 您需要音频转录或审核功能
  • 您需要细粒度的 HTTP 控制
  • 您需要原生 Spring reactive 支持
  • 您需要自定义重试策略

Observability

OpenAI SDK 实现通过 Micrometer 支持 Spring AI 的 observability 功能。 所有 chat model 操作都经过检测以进行监控和跟踪。

Limitations

OpenAI SDK 实现中尚未支持以下功能:

  • 音频语音生成(TTS)
  • 音频转录
  • Moderation API
  • File API 操作

这些功能在 Spring AI OpenAI 实现中可用。

Additional Resources

Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。