模型
Agents SDK 原生支持两种 OpenAI 模型:
- 推荐:
OpenAIResponsesModel,它使用新的 Responses API 调用 OpenAI API。 OpenAIChatCompletionsModel,它使用 Chat Completions API 调用 OpenAI API。
模型配置选择
从符合你配置需求的最简单路径开始:
| 如果你希望…… | 推荐路径 | 更多信息 |
|---|---|---|
| 仅使用 OpenAI 模型 | 使用默认 OpenAI 提供商和 Responses 模型路径 | OpenAI 模型 |
| 通过 WebSocket 传输使用 OpenAI Responses API | 保持使用 Responses 模型路径并启用 WebSocket 传输 | Responses WebSocket 传输 |
| 使用由 OpenAI 托管的子智能体 | 使用实验性的托管多智能体模型 | 托管多智能体 |
| 使用一个非 OpenAI 提供商 | 从内置的提供商集成点开始 | 非 OpenAI 模型 |
| 在不同智能体之间混用模型或提供商 | 按每次运行或每个智能体选择提供商,并查看功能差异 | 在一个工作流中混用模型和跨提供商混用模型 |
| 调整高级 OpenAI Responses 请求设置 | 在 OpenAI Responses 路径上使用 ModelSettings |
高级 OpenAI Responses 设置 |
| 使用第三方适配器进行非 OpenAI 或混合提供商路由 | 比较受支持的 Beta 适配器,并验证计划发布的提供商路径 | 第三方适配器 |
OpenAI 模型
对于大多数仅使用 OpenAI 的应用,推荐使用字符串模型名称和默认 OpenAI 提供商,并保持使用 Responses 模型路径。
当 Agent 未指定模型时,为满足成本敏感型、高吞吐量智能体工作流的需求,Agents SDK 默认使用带有 reasoning.effort="none" 和 verbosity="low" 的 gpt-5.6-luna。需要前沿能力的应用可以显式设置 model="gpt-5.6-sol",并选择适合相应工作负载的 model_settings。
如果要切换到 gpt-5.6-sol 等其他模型,可通过两种方式配置智能体。
默认模型
首先,如果希望所有未设置自定义模型的智能体始终使用某个特定模型,请在运行智能体之前设置 OPENAI_DEFAULT_MODEL 环境变量。
其次,可以通过 RunConfig 为一次运行设置默认模型。如果未给智能体设置模型,则会使用此次运行的模型。
from agents import Agent, RunConfig, Runner
agent = Agent(
name="Assistant",
instructions="You're a helpful agent.",
)
result = await Runner.run(
agent,
"Hello",
run_config=RunConfig(model="gpt-5.6-sol"),
)
GPT-5 模型
以这种方式使用任何 GPT-5 模型(例如 gpt-5.6-sol)时,SDK 会应用默认的 ModelSettings。它会设置最适合大多数用例的值。若要调整默认模型的推理强度,请传入你自己的 ModelSettings:
from openai.types.shared import Reasoning
from agents import Agent, ModelSettings
my_agent = Agent(
name="My Agent",
instructions="You're a helpful agent.",
# If OPENAI_DEFAULT_MODEL=gpt-5.6-sol is set, passing only model_settings works.
# It's also fine to pass a GPT-5 model name explicitly:
model="gpt-5.6-sol",
model_settings=ModelSettings(reasoning=Reasoning(effort="high"), verbosity="low")
)
若要降低延迟,建议为 GPT-5 模型使用 reasoning.effort="none"。
GPT-5.6 还支持推理模式、跨对话轮次保留的推理上下文,以及通过现有 reasoning 设置指定的 "max" 强度级别。这些控制项可用于 Responses API 路径:
from openai.types.shared import Reasoning
from agents import Agent, ModelSettings
agent = Agent(
name="Deep research agent",
model="gpt-5.6-sol",
model_settings=ModelSettings(
reasoning=Reasoning(
mode="pro",
effort="max",
context="all_turns",
),
),
)
reasoning.mode 和 reasoning.context 是仅限 Responses 的设置。Chat Completions 仅使用 reasoning.effort,支持的强度级别取决于模型和 API 接口。请使用 Responses API 设置 GPT-5.6 的 "max" 强度。Chat Completions 适配器会忽略模式和上下文并发出警告;在 OpenAI 提供商上设置 strict_feature_validation=True 可将该警告转为错误。
使用 context="all_turns" 时,请通过 previous_response_id、服务端 Responses API 对话,或在下一次请求中包含之前的推理项来保留对话。对于无状态的 store=False 调用,请在响应中请求 reasoning.encrypted_content,然后在下一次请求中将这些推理项作为输入包含在内。
ComputerTool 模型选择
如果智能体包含 ComputerTool,则实际 Responses 请求中生效的模型将决定 SDK 发送哪种计算机工具载荷。显式的 gpt-5.5 请求使用正式发布的内置 computer 工具,而显式的 computer-use-preview 请求则继续使用旧版 computer_use_preview 载荷。
由提示词管理的调用是主要例外。如果提示词模板指定了模型,并且 SDK 在请求中省略了 model,SDK 会默认使用与预览版兼容的计算机载荷,以避免猜测提示词固定的是哪个模型。若要在此流程中继续使用正式发布路径,可以在请求中显式指定 model="gpt-5.5",或使用 ModelSettings(tool_choice="computer") 或 ModelSettings(tool_choice="computer_use") 强制选择正式发布版本。
注册 ComputerTool 后,tool_choice="computer"、"computer_use" 和 "computer_use_preview" 会被规范化为与实际请求模型匹配的内置选择器。如果未注册 ComputerTool,这些字符串将继续像普通函数名称一样工作。
与预览版兼容的请求必须预先序列化 environment 和显示尺寸,因此,由提示词管理且使用 ComputerProvider 工厂的流程,应传入具体的 Computer 或 AsyncComputer 实例,或在发送请求前强制使用正式发布选择器。有关完整迁移详情,请参阅工具。
非 GPT-5 模型
如果传入非 GPT-5 模型名称且未提供自定义 model_settings,SDK 会恢复使用与任何模型兼容的通用 ModelSettings。
仅限 Responses 的工具功能
以下工具功能仅受 OpenAI Responses 模型支持:
ToolSearchTooltool_namespace()@function_tool(defer_loading=True)及其他延迟加载的 Responses 工具接口ProgrammaticToolCallingTool、allowed_callers和tool_choice="programmatic_tool_calling"
Chat Completions 模型和非 Responses 后端会拒绝这些功能。使用延迟加载工具时,请将 ToolSearchTool() 添加到智能体,并让模型通过 auto 或 required 工具选择来加载工具,而不是强制使用单独的命名空间名称或仅限延迟加载的函数名称。有关配置详情和当前限制,请参阅托管工具搜索和程序化工具调用。
Responses WebSocket 传输
默认情况下,OpenAI Responses API 请求使用 HTTP 传输。使用 OpenAI Responses 提供商路径时,可以选择启用 WebSocket 传输。
基本配置
from agents import set_default_openai_responses_transport
set_default_openai_responses_transport("websocket")
这会影响默认 OpenAI 提供商解析模型名称时生成的 OpenAI Responses 模型,包括 "gpt-5.6-sol" 等字符串模型名称。
SDK 将模型名称解析为模型实例时会选择传输方式。如果传入具体的 Model 对象,其传输方式已经固定:OpenAIResponsesWSModel 使用 WebSocket,OpenAIResponsesModel 使用 HTTP,而 OpenAIChatCompletionsModel 继续使用 Chat Completions。如果传入 RunConfig(model_provider=...),则由该提供商而非全局默认配置控制传输方式的选择。
提供商或运行级配置
也可以按提供商或按运行配置 WebSocket 传输:
from agents import Agent, OpenAIProvider, RunConfig, Runner
provider = OpenAIProvider(
use_responses_websocket=True,
# Optional; if omitted, OPENAI_WEBSOCKET_BASE_URL is used when set.
websocket_base_url="wss://your-proxy.example/v1",
# Optional low-level websocket keepalive settings.
responses_websocket_options={"ping_interval": 20.0, "ping_timeout": 60.0},
)
agent = Agent(name="Assistant")
result = await Runner.run(
agent,
"Hello",
run_config=RunConfig(model_provider=provider),
)
通过 SDK 的 OpenAI 集成进行路由的提供商也接受可选的智能体注册配置。这是一项高级选项,适用于 OpenAI 配置需要提供商级注册元数据(例如测试框架 ID)的情况。
from agents import (
Agent,
OpenAIAgentRegistrationConfig,
OpenAIProvider,
RunConfig,
Runner,
)
provider = OpenAIProvider(
use_responses_websocket=True,
agent_registration=OpenAIAgentRegistrationConfig(harness_id="your-harness-id"),
)
agent = Agent(name="Assistant")
result = await Runner.run(
agent,
"Hello",
run_config=RunConfig(model_provider=provider),
)
使用 MultiProvider 的高级路由
如果需要基于前缀的模型路由,例如在一次运行中混用 openai/... 和 any-llm/... 模型名称,请使用 MultiProvider,并在其中设置 openai_use_responses_websocket=True。
MultiProvider 保留了两个历史默认行为:
openai/...被视为 OpenAI 提供商的别名,因此openai/gpt-4.1会以模型gpt-4.1进行路由。- 未知前缀会引发
UserError,而不是直接传递。
将 OpenAI 提供商指向需要字面量命名空间模型 ID 的 OpenAI 兼容端点时,请显式启用直通行为。在启用 WebSocket 的配置中,也要在 MultiProvider 上保留 openai_use_responses_websocket=True:
from agents import Agent, MultiProvider, RunConfig, Runner
provider = MultiProvider(
openai_base_url="https://openrouter.ai/api/v1",
openai_api_key="...",
openai_use_responses_websocket=True,
openai_prefix_mode="model_id",
unknown_prefix_mode="model_id",
)
agent = Agent(
name="Assistant",
instructions="Be concise.",
model="openai/gpt-4.1",
)
result = await Runner.run(
agent,
"Hello",
run_config=RunConfig(model_provider=provider),
)
当后端需要字面量 openai/... 字符串时,请使用 openai_prefix_mode="model_id"。当后端需要 openrouter/openai/gpt-4.1-mini 等其他命名空间模型 ID 时,请使用 unknown_prefix_mode="model_id"。这些选项同样适用于 WebSocket 传输之外的 MultiProvider;此示例继续启用 WebSocket,是因为它属于本节所述的传输配置。同样的选项也适用于 responses_websocket_session()。
如果通过 MultiProvider 进行路由时需要相同的提供商级注册元数据,请传入 openai_agent_registration=OpenAIAgentRegistrationConfig(...),它会被转发给底层 OpenAI 提供商。
如果使用自定义 OpenAI 兼容端点或代理,WebSocket 传输还需要兼容的 WebSocket /responses 端点。在这些配置中,可能需要显式设置 websocket_base_url。
注意事项
- 这是通过 WebSocket 传输的 Responses API,而不是 Realtime API。它不适用于 Chat Completions。只有非 OpenAI 提供商支持 Responses WebSocket
/responses端点时,它才适用于这些提供商。 - 如果环境中尚未提供
websockets软件包,请安装它。 - 启用 WebSocket 传输后,可以直接使用
Runner.run_streamed()。对于希望跨轮次以及嵌套的“智能体作为工具”调用复用同一 WebSocket 连接的多轮工作流,建议使用responses_websocket_session()辅助工具。请参阅运行智能体指南和examples/basic/stream_ws.py。 - 对于长时间推理轮次或存在延迟峰值的网络,请使用
responses_websocket_options自定义 WebSocket 保活行为。增大ping_timeout以容忍延迟的 pong 帧,或将ping_timeout=None设置为禁用心跳超时,同时继续启用 ping。当可靠性比 WebSocket 延迟更重要时,请优先使用 HTTP/SSE 传输。 - 默认情况下,SDK 会禁用传入消息大小限制(
max_size=None)。对于位于代理之后或内存受限容器中的长期运行智能体进程,请设置responses_websocket_options={"max_size": 8 * 1024 * 1024}以限制每条消息的内存用量。 - Responses API WebSocket 服务在每个连接上一次处理一个响应,并将每个连接限制为 60 分钟。达到此限制后请打开新连接;需要并行运行时,请使用多个连接。
- 该服务仅在连接本地内存中保留最近一次响应。失败的
4xx或5xx轮次会从该内存中逐出previous_response_id引用的响应。重新连接后,只要已存储的响应仍可用,便仍可继续该响应;但store=False和 ZDR 流程没有持久化回退方案。请使用previous_response_id=None启动新链并发送完整输入上下文,或根据本地管理的会话状态重建该上下文。
托管多智能体(实验性)
OpenAI Responses API 托管多智能体 Beta 版允许 GPT-5.6 根模型创建并协调服务端托管的子智能体。Agents SDK 可以继续使用其常规 Runner:托管编排在服务端进行,而开发者定义的函数工具则在应用中执行。
此集成为实验性功能,使用 Responses WebSocket 传输,以便通过 response.inject 将本地函数输出返回给活跃的托管智能体。它要求使用 openai[realtime] 2.45.0 或更高版本的构建,该构建需公开 client.beta.responses.connect。接口和 Beta 项架构可能会在正式发布前发生变化。
模型配置
从实验性模块导入模型,并将其分配给 SDK Agent:
from agents import Agent
from agents.extensions.experimental.hosted_multi_agent import OpenAIHostedMultiAgentModel
agent = Agent(
name="Research coordinator",
instructions="Delegate independent research tasks, then synthesize the findings.",
model=OpenAIHostedMultiAgentModel(model="gpt-5.6-sol", config={"max_concurrent_subagents": 3}),
)
构造 OpenAIHostedMultiAgentModel 会启用 multi_agent.enabled 并发送 OpenAI-Beta: responses_multi_agent=v1 WebSocket 标头。除非提供 openai_client,否则模型使用默认 OpenAI 客户端。如果省略 max_concurrent_subagents,则使用服务默认值。
本地函数工具
所有托管智能体共享为请求配置的模型和工具。Responses API 决定由哪个托管智能体调用函数。常规 SDK Runner 会在本地执行函数,并将具有相同调用 ID 的 function_call_output 注入活跃的 WebSocket 响应,使服务能够恢复最初的托管调用方。函数执行仍会经过 Runner 的常规安全防护措施、钩子和失败转换。不支持 SDK 工具审批中断:任何 needs_approval 设置不为 False 的函数工具都会在发送请求前被拒绝。
当工具需要感知调用方的日志记录或授权时,请使用 get_hosted_agent_metadata():
from typing import Any
from agents.decorators import tool
from agents.extensions.experimental.hosted_multi_agent import get_hosted_agent_metadata
from agents.tool_context import ToolContext
@tool
def lookup_document(ctx: ToolContext[Any], section: str) -> str:
metadata = get_hosted_agent_metadata(ctx)
caller = metadata.agent_name if metadata else "unknown"
print(f"tool caller: {caller}; call ID: {ctx.tool_call_id}")
return f"Contents for {section}"
托管智能体名称是观测元数据,而不是本地路由机制。请使用 SDK 提供的调用 ID 路由输出。对于具有副作用的工具,请将该调用 ID 用作幂等键,并在工具执行之前或期间通过应用代码实施所有必要的授权;请勿在此模型中使用 needs_approval。工具参数和输出会跨越 Responses API 边界。
输出和流式传输行为
只有归属于 /root 且阶段为 final_answer 的消息才会成为常规最终消息。实验性适配器会从高级 RunResult 中过滤掉子智能体消息和托管编排记录;SDK 绝不会将这些记录作为本地函数执行。
原始流式传输会继续公开 Beta Responses 事件,包括托管输出项和 response.inject.created 确认。当函数调用就绪时,适配器会将一个活跃的提供商响应划分为 SDK 可见的逻辑模型轮次;Runner 生成输出后,再恢复同一个提供商响应。请将 get_hosted_agent_metadata() 与原始托管项或 ToolContext 一起使用,以识别该项或工具调用归属的托管智能体。
与 SDK 编排的关系
托管多智能体与 SDK 任务转移和 Agents-as-tools 相互独立:
- 托管多智能体在 OpenAI 服务上创建子智能体。你的应用不会创建或调度这些子智能体。
- SDK 任务转移会更改活跃的本地 SDK
Agent。使用此实验性模型时,任务转移会被拒绝,因为每个托管智能体都会收到相同的任务转移工具,从而造成所有权冲突。 - Agents-as-tools 仍然可用,但使用它们会创建嵌套的客户端和服务端编排。请审慎评估由此增加的延迟、成本和工具暴露范围。
当前限制
实验性模型会拒绝 reasoning.summary、max_tool_calls,以及调用方提供的 multi_agent 或 betas 覆盖。Beta 版不支持 Responses /compact 端点,不过可以使用显式的 context_management.compact_threshold,因为服务会自动分别压缩每个托管智能体的上下文。
一个 OpenAIHostedMultiAgentModel 实例一次最多拥有一个活跃的托管响应。如果在等待本地函数输出时放弃某次运行,请调用 await model.close() 释放其 WebSocket。目前不支持在其他进程或事件循环中恢复进行中的托管响应。
有关底层 Responses API Beta 行为,请参阅 OpenAI 多智能体指南。有关非流式和流式 SDK 用法,请参阅 examples/agent_patterns/hosted_multi_agent_beta.py。
非 OpenAI 模型
如果需要非 OpenAI 提供商,请从 SDK 的内置提供商集成点开始。对于许多配置,这已足够,无需添加第三方适配器。每种模式的代码示例位于 examples/model_providers。
非 OpenAI 提供商集成方式
| 方式 | 适用场景 | 作用域 |
|---|---|---|
set_default_openai_client |
一个 OpenAI 兼容端点应作为大多数或所有智能体的默认端点 | 全局默认 |
ModelProvider |
一个自定义提供商应应用于单次运行 | 每次运行 |
Agent.model |
不同智能体需要不同提供商或具体模型对象 | 每个智能体 |
| 第三方适配器 | 由于内置路径无法提供所需能力,因此需要适配器提供的提供商覆盖范围或路由 | 请参阅第三方适配器 |
可以通过以下内置路径集成其他 LLM 提供商:
set_default_openai_client适用于希望全局使用AsyncOpenAI实例作为 LLM 客户端的情况。这适用于 LLM 提供商具有 OpenAI 兼容 API 端点,并且可以设置base_url和api_key的情况。可配置示例请参阅 examples/model_providers/custom_example_global.py。ModelProvider位于Runner.run级别。这样可以指定“为此次运行中的所有智能体使用自定义模型提供商”。可配置示例请参阅 examples/model_providers/custom_example_provider.py。Agent.model允许在特定 Agent 实例上指定模型。这样可以为不同智能体灵活搭配不同提供商。可配置示例请参阅 examples/model_providers/custom_example_agent.py。
如果没有 platform.openai.com 的 API 密钥,建议通过 set_tracing_disabled() 禁用追踪,或配置其他追踪处理器。
from agents import Agent, AsyncOpenAI, OpenAIChatCompletionsModel, set_tracing_disabled
set_tracing_disabled(disabled=True)
client = AsyncOpenAI(api_key="Api_Key", base_url="Base URL of Provider")
model = OpenAIChatCompletionsModel(model="Model_Name", openai_client=client)
agent= Agent(name="Helping Agent", instructions="You are a Helping Agent", model=model)
Note
在这些代码示例中,我们使用 Chat Completions API/模型,因为许多 LLM 提供商仍不支持 Responses API。如果你的 LLM 提供商支持 Responses API,建议使用 Responses。
在一个工作流中混用模型
在单个工作流中,可能希望每个智能体使用不同的模型。例如,可以使用更小、更快的模型进行分流,同时使用更大、能力更强的模型处理复杂任务。配置 Agent 时,可以通过以下任一方式选择特定模型:
- 传入模型名称。
- 传入任意模型名称以及能够将该名称映射到 Model 实例的
ModelProvider。 - 直接提供
Model实现。
Note
虽然 SDK 同时支持 OpenAIResponsesModel 和 OpenAIChatCompletionsModel 两种形式,但建议每个工作流只使用一种模型形式,因为两者支持的功能和工具集合不同。如果工作流需要混用模型形式,请确保正在使用的所有功能都同时受两者支持。
import asyncio
from agents import Agent, Runner, AsyncOpenAI, OpenAIChatCompletionsModel
spanish_agent = Agent(
name="Spanish agent",
instructions="You only speak Spanish.",
model="gpt-5-mini", # (1)!
)
english_agent = Agent(
name="English agent",
instructions="You only speak English",
model=OpenAIChatCompletionsModel( # (2)!
model="gpt-5-nano",
openai_client=AsyncOpenAI()
),
)
triage_agent = Agent(
name="Triage agent",
instructions="Handoff to the appropriate agent based on the language of the request.",
handoffs=[spanish_agent, english_agent],
model="gpt-5.6-sol",
)
async def main():
result = await Runner.run(triage_agent, input="Hola, ¿cómo estás?")
print(result.final_output)
if __name__ == "__main__":
asyncio.run(main())
- 直接设置 OpenAI 模型的名称。
- 提供
Model实现。
如果要进一步配置智能体使用的模型,可以传入 ModelSettings,它提供 temperature 等可选模型配置参数。
from agents import Agent, ModelSettings
english_agent = Agent(
name="English agent",
instructions="You only speak English",
model="gpt-4.1",
model_settings=ModelSettings(temperature=0.1),
)
高级 OpenAI Responses 设置
使用 OpenAI Responses 路径并需要更多控制时,请从 ModelSettings 开始。
常用高级 ModelSettings 选项
使用 OpenAI Responses API 时,多个请求字段已具有对应的 ModelSettings 直接字段,因此无需为它们使用 extra_args。
parallel_tool_calls:允许或禁止在同一轮中进行多次工具调用。truncation:设置"auto",使 Responses API 在上下文即将溢出时丢弃最早的对话项,而不是请求失败。store:控制生成的响应是否存储在服务端以供以后检索。这对于依赖响应 ID 的后续工作流,以及在store=False时可能需要回退到本地输入的会话压缩流程非常重要。context_management:配置服务端上下文处理,例如使用compact_threshold进行 Responses 压缩。prompt_cache_retention:为较早的模型系列配置延长保留时间,例如 使用"24h"。prompt_cache_options:选择隐式或显式提示词缓存,并为 GPT-5.6 配置"30m"缓存 TTL。response_include:请求更丰富的响应载荷,例如web_search_call.action.sources、file_search_call.results或reasoning.encrypted_content。top_logprobs:请求输出文本的最高概率 token logprobs。SDK 还会自动添加message.output_text.logprobs。retry:选择启用由 Runner 管理的模型调用重试设置。请参阅由 Runner 管理的重试。
from agents import Agent, ModelSettings
research_agent = Agent(
name="Research agent",
model="gpt-5.6-sol",
model_settings=ModelSettings(
parallel_tool_calls=False,
truncation="auto",
store=True,
context_management=[{"type": "compaction", "compact_threshold": 200000}],
prompt_cache_options={"mode": "explicit", "ttl": "30m"},
response_include=["web_search_call.action.sources"],
top_logprobs=5,
),
)
使用显式提示词缓存时,请在结束可复用前缀的内容部分添加断点。相同的 ModelSettings.prompt_cache_options 字段会透传到 Responses 和 Chat Completions 请求,Chat Completions 转换器会保留文本、图像、音频和文件内容部分上的断点。
from agents import Runner
result = await Runner.run(
research_agent,
[
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "Reusable background material...",
"prompt_cache_breakpoint": {"mode": "explicit"},
},
{
"type": "input_text",
"text": "Analyze the latest question.",
},
],
}
],
)
prompt_cache_retention 仍可用于采用旧版
保留控制的较早模型系列。请勿同时使用直接 ModelSettings 字段和
extra_args 中的同名键。
设置 store=False 后,Responses API 不会保留该响应供以后在服务端检索。这适用于无状态或零数据保留类型的流程,但也意味着原本会复用响应 ID 的功能必须改为依赖本地管理的状态。例如,当上一个响应未存储时,OpenAIResponsesCompactionSession 会将其默认 "auto" 压缩路径切换为基于输入的压缩。请参阅会话指南。
服务端压缩不同于 OpenAIResponsesCompactionSession。context_management=[{"type": "compaction", "compact_threshold": ...}] 随每次 Responses API 请求发送,当渲染后的上下文超过阈值时,API 可以在响应中发出压缩项。OpenAIResponsesCompactionSession 会在轮次之间调用独立的 responses.compact 端点,并重写本地会话历史记录。
extra_args 的传递
如果需要 SDK 尚未在顶层直接公开的提供商特定字段或较新的请求字段,请使用 extra_args。
使用 OpenAI 模型时,extra_args 可以向 Responses API 和 Chat Completions API 传递可选参数,例如 user 和 service_tier。对于受支持的模型,设置 extra_args={"service_tier": "fast"} 可使用快速模式;"priority" 仍与其等效。请勿同时通过直接 ModelSettings 字段设置同一请求字段。
from agents import Agent, ModelSettings
english_agent = Agent(
name="English agent",
instructions="You only speak English",
model="gpt-4.1",
model_settings=ModelSettings(
temperature=0.1,
extra_args={"service_tier": "flex", "user": "user_12345"},
),
)
由 Runner 管理的重试
重试仅在运行时生效,并且需要选择启用。除非设置 ModelSettings(retry=...) 且重试策略决定重试,否则 SDK 不会重试常规模型请求。
在 Responses WebSocket 传输中,retry_policies.provider_suggested() 会将响应前的过载帧和无代码的 server_error 帧识别为重试建议。这本身不会启用重试:仍需设置 ModelRetrySettings,并且常规重放安全检查仍然适用。如果已经收到任何响应事件,SDK 不会重放请求。
from agents import Agent, ModelRetrySettings, ModelSettings, retry_policies
agent = Agent(
name="Assistant",
model="gpt-5.6-sol",
model_settings=ModelSettings(
retry=ModelRetrySettings(
max_retries=4,
backoff={
"initial_delay": 0.5,
"max_delay": 5.0,
"multiplier": 2.0,
"jitter": True,
},
policy=retry_policies.any(
retry_policies.provider_suggested(),
retry_policies.retry_after(),
retry_policies.network_error(),
retry_policies.http_status([408, 409, 429, 500, 502, 503, 504]),
),
)
),
)
ModelRetrySettings 包含三个字段:
| 字段 | 类型 | 说明 |
|---|---|---|
max_retries |
int | None |
初始请求之后允许的重试次数。 |
backoff |
ModelRetryBackoffSettings | dict | None |
当策略进行重试但未返回显式延迟时使用的默认延迟策略。backoff.max_delay 仅限制计算得出的退避延迟,不限制策略返回的显式延迟或 retry-after 提示。 |
policy |
RetryPolicy | None |
决定是否重试的回调。此字段仅在运行时生效,不会被序列化。 |
重试策略会接收一个 RetryPolicyContext,其中包含:
attempt和max_retries,以便根据尝试次数作出决策。stream,以便区分流式与非流式行为。error,用于原始数据检查。normalized事实,例如status_code、retry_after、error_code、is_network_error、is_timeout和is_abort。provider_advice,当底层模型适配器可以提供重试指导时使用。response_started、replay_safety和stateful_request,它们是在策略运行前捕获的稳定重放安全事实。replay_safety是"safe"、"unsafe"或"unknown";当请求使用previous_response_id或conversation_id时,stateful_request为 true。
策略可以返回以下任一内容:
True/False,用于简单的重试决策。- 当需要覆盖延迟、附加诊断原因或显式批准范围有限的不安全重放时,返回
RetryDecision。
SDK 在 retry_policies 上导出了现成的辅助工具:
| 辅助工具 | 行为 |
|---|---|
retry_policies.never() |
始终不启用。 |
retry_policies.provider_suggested() |
在提供商提供重试建议时遵循该建议。 |
retry_policies.network_error() |
匹配临时传输和超时故障。 |
retry_policies.http_status([...]) |
匹配选定的 HTTP 状态码。 |
retry_policies.retry_after() |
仅在提供 retry-after 提示时重试,并使用该延迟。此辅助工具将 retry-after 值视为显式策略延迟,因此 backoff.max_delay 不会限制它。 |
retry_policies.any(...) |
当任一嵌套策略选择启用时重试。 |
retry_policies.all(...) |
仅当所有嵌套策略都选择启用时重试。 |
组合策略时,provider_suggested() 是最安全的首个基础组件,因为当提供商能够区分否决和重放安全批准时,它会保留这些信息。
安全边界
以下某些故障绝不会重试:
- 中止错误。
- 已经开始输出且重放会不安全的流式运行。
- 存在单独本地副作用重放否决的请求,包括程序化工具调用请求,除非提供商已独立将重放标记为安全。
默认情况下,提供商标记为不安全的故障也会被阻止。对于不存在单独本地副作用否决的非流式请求,应用可以通过返回 RetryDecision(retry=True, approve_unsafe_replay=True) 接受提供商侧的重放风险。授予此批准前,请检查 context.response_started、context.replay_safety 和 context.stateful_request,并且仅在可以接受重复执行提供商侧工作时授予批准。普通的 RetryDecision(retry=True) 绝不会绕过重放保护,approve_unsafe_replay=True 也无法授权流式重试或本地副作用。
使用 previous_response_id 或 conversation_id 的有状态后续请求在重放安全性未知时会以失败关闭。对于这些请求,仅使用 network_error() 或 http_status([500]) 等非提供商谓词还不够。请包含提供商的重放安全批准,通常通过 retry_policies.provider_suggested() 实现;或者按照上述方式,显式批准提供商标记为不安全的非流式故障。
Runner 与智能体合并行为
retry 会在 Runner 级和智能体级 ModelSettings 之间进行深度合并:
- 智能体可以仅覆盖
retry.max_retries,并继续继承 Runner 的policy。 - 智能体可以仅覆盖
retry.backoff的一部分,并保留 Runner 的同级退避字段。 policy仅在运行时生效,因此序列化的ModelSettings会保留max_retries和backoff,但省略回调本身。
更完整的代码示例请参阅 examples/basic/retry.py 和基于适配器的重试示例。
非 OpenAI 提供商故障排除
追踪客户端错误 401
如果遇到与追踪相关的错误,这是因为追踪数据会上传到 OpenAI 服务器,而你没有 OpenAI API 密钥。可通过以下三种方式解决:
- 完全禁用追踪:
set_tracing_disabled(True)。 - 为追踪设置 OpenAI 密钥:
set_tracing_export_api_key(...)。此 API 密钥仅用于上传追踪数据,并且必须来自 platform.openai.com。 - 使用非 OpenAI 追踪处理器。请参阅追踪文档。
Responses API 支持
SDK 默认使用 Responses API,但许多其他 LLM 提供商仍不支持它。因此,可能会看到 404 或类似问题。可通过以下两种方式解决:
- 调用
set_default_openai_api("chat_completions")。如果通过环境变量设置OPENAI_API_KEY和OPENAI_BASE_URL,此方式适用。 - 使用
OpenAIChatCompletionsModel。相关代码示例见此处。
Chat Completions 兼容性选项
通过 Chat Completions 路由时,SDK 会静默丢弃 Chat Completions 无法发送的仅限 Responses 字段,以保持兼容性,例如 previous_response_id、conversation_id、Responses API prompt 字段,或并非纯文本的工具输出。如果希望这些不匹配问题在开发期间快速失败,请在 OpenAI 提供商上启用严格功能验证:
from agents import Agent, OpenAIProvider, RunConfig, Runner
provider = OpenAIProvider(
use_responses=False,
strict_feature_validation=True,
)
agent = Agent(name="Assistant")
result = await Runner.run(
agent,
"Hello",
run_config=RunConfig(model_provider=provider),
)
如果使用 MultiProvider,请改为传入 openai_strict_feature_validation=True。
OpenAI Chat Completions API 可以返回音频输出,但 OpenAIChatCompletionsModel 当前不会将音频输出转换为 Agents SDK 运行项。如果非流式消息或流式增量包含音频输出,适配器会引发 AgentsException("Audio is not currently supported"),而不是返回部分结果或空结果。对于由 SDK 管理的音频工作流,请使用实时智能体或语音智能体。
一些 OpenAI 兼容的 Chat Completions 提供商会以分块形式流式传输工具调用增量,其可靠性不足以支持 SDK 增量处理。在这种情况下,请启用流式工具调用缓冲,使 SDK 仅在提供商流结束后发出工具调用:
from agents import OpenAIProvider
provider = OpenAIProvider(
use_responses=False,
buffer_streamed_tool_calls=True,
)
对于 MultiProvider,请使用 openai_buffer_streamed_tool_calls=True。
structured outputs 支持
一些模型提供商不支持 structured outputs。这有时会导致类似以下内容的错误:
BadRequestError: Error code: 400 - {'error': {'message': "'response_format.type' : value is not one of the allowed values ['text','json_object']", 'type': 'invalid_request_error'}}
这是某些模型提供商的不足之处——它们支持 JSON 输出,但不允许指定用于输出的 json_schema。我们正在解决此问题,但建议依赖支持 JSON schema 输出的提供商,否则应用经常会因格式错误的 JSON 而中断。
跨提供商混用模型
你需要了解模型提供商之间的功能差异,否则可能会遇到错误。例如,OpenAI 支持 structured outputs、多模态输入、托管文件检索和网络检索,但许多其他提供商不支持这些功能。请注意以下限制:
- 不要向无法理解的提供商发送不受支持的
tools - 调用纯文本模型前过滤掉多模态输入
- 请注意,不支持结构化 JSON 输出的提供商偶尔会生成无效 JSON。
第三方适配器
仅当 SDK 的内置提供商集成点不足以满足需求时,才使用第三方适配器。如果只通过此 SDK 使用 OpenAI 模型,请优先选择内置的 OpenAIResponsesModel 路径,而不是 Any-LLM 或 LiteLLM。第三方适配器适用于需要将 OpenAI 模型与非 OpenAI 提供商结合使用,或需要只有适配器才能提供的提供商覆盖范围或路由的情况。适配器会在 SDK 与上游模型提供商之间增加一层兼容层,因此功能支持和请求语义可能因提供商而异。SDK 当前以尽力支持的 Beta 适配器集成形式包含 Any-LLM 和 LiteLLM。
Any-LLM
对于需要由 Any-LLM 管理提供商覆盖范围或路由的情况,Any-LLM 支持以尽力支持的 Beta 形式提供。
根据上游提供商路径,Any-LLM 可能会使用 Responses API、与 Chat Completions 兼容的 API,或提供商特定的兼容层。
如果需要 Any-LLM,请安装 openai-agents[any-llm],然后从 examples/model_providers/any_llm_auto.py 或 examples/model_providers/any_llm_provider.py 开始。可以将 any-llm/... 模型名称与 MultiProvider 配合使用,直接实例化 AnyLLMModel,或在运行作用域使用 AnyLLMProvider。如果需要显式固定模型接口,请在构造 AnyLLMModel 时传入 api="responses" 或 api="chat_completions"。
Any-LLM 仍是第三方适配器层,因此提供商依赖项和能力缺口由上游 Any-LLM 而非 SDK 定义。当上游提供商返回用量指标时,这些指标会自动传播,但流式 Chat Completions 后端可能需要 ModelSettings(include_usage=True) 才会发出用量数据块。如果依赖 structured outputs、工具调用、用量报告或 Responses 特定行为,请验证计划部署的具体提供商后端。
LiteLLM
对于需要 LiteLLM 特定提供商覆盖范围或路由的情况,LiteLLM 支持以尽力支持的 Beta 形式提供。
如果需要 LiteLLM,请安装 openai-agents[litellm],然后从 examples/model_providers/litellm_auto.py 或 examples/model_providers/litellm_provider.py 开始。可以使用 litellm/... 模型名称,或直接实例化 LitellmModel。
通过 LiteLLM 适配器访问的部分提供商默认不会填充 SDK 用量指标。如果需要用量报告,请传入 ModelSettings(include_usage=True);如果依赖 structured outputs、工具调用、用量报告或适配器特定的路由行为,请验证计划部署的具体提供商后端。
如果 LiteLLM 为响应对象发出 Pydantic 序列化器警告,可以在导入 LiteLLM 适配器之前选择启用 SDK 的兼容性补丁:
该补丁默认禁用,并且仅对 1 或 true 值启用。它通过封装一个私有 LiteLLM 日志辅助工具来抑制特定类别的 LiteLLM 响应序列化警告,因此应将其视为针对性解决方法,而不是通用序列化设置。由于它依赖私有 LiteLLM API,升级 LiteLLM 时请重新验证;当上游警告不再出现时,请移除该环境变量。