跳转至

模型

Agents SDK 原生支持两种 OpenAI 模型:

模型配置选择

从符合你配置需求的最简单路径开始:

如果你希望…… 推荐路径 更多信息
仅使用 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 环境变量。

export OPENAI_DEFAULT_MODEL=gpt-5.6-sol
python3 my_awesome_agent.py

其次,可以通过 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.modereasoning.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 工厂的流程,应传入具体的 ComputerAsyncComputer 实例,或在发送请求前强制使用正式发布选择器。有关完整迁移详情,请参阅工具

非 GPT-5 模型

如果传入非 GPT-5 模型名称且未提供自定义 model_settings,SDK 会恢复使用与任何模型兼容的通用 ModelSettings

仅限 Responses 的工具功能

以下工具功能仅受 OpenAI Responses 模型支持:

Chat Completions 模型和非 Responses 后端会拒绝这些功能。使用延迟加载工具时,请将 ToolSearchTool() 添加到智能体,并让模型通过 autorequired 工具选择来加载工具,而不是强制使用单独的命名空间名称或仅限延迟加载的函数名称。有关配置详情和当前限制,请参阅托管工具搜索程序化工具调用

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 分钟。达到此限制后请打开新连接;需要并行运行时,请使用多个连接。
  • 该服务仅在连接本地内存中保留最近一次响应。失败的 4xx5xx 轮次会从该内存中逐出 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.summarymax_tool_calls,以及调用方提供的 multi_agentbetas 覆盖。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 提供商:

  1. set_default_openai_client 适用于希望全局使用 AsyncOpenAI 实例作为 LLM 客户端的情况。这适用于 LLM 提供商具有 OpenAI 兼容 API 端点,并且可以设置 base_urlapi_key 的情况。可配置示例请参阅 examples/model_providers/custom_example_global.py
  2. ModelProvider 位于 Runner.run 级别。这样可以指定“为此次运行中的所有智能体使用自定义模型提供商”。可配置示例请参阅 examples/model_providers/custom_example_provider.py
  3. 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 时,可以通过以下任一方式选择特定模型:

  1. 传入模型名称。
  2. 传入任意模型名称以及能够将该名称映射到 Model 实例的 ModelProvider
  3. 直接提供 Model 实现。

Note

虽然 SDK 同时支持 OpenAIResponsesModelOpenAIChatCompletionsModel 两种形式,但建议每个工作流只使用一种模型形式,因为两者支持的功能和工具集合不同。如果工作流需要混用模型形式,请确保正在使用的所有功能都同时受两者支持。

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())
  1. 直接设置 OpenAI 模型的名称。
  2. 提供 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.sourcesfile_search_call.resultsreasoning.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" 压缩路径切换为基于输入的压缩。请参阅会话指南

服务端压缩不同于 OpenAIResponsesCompactionSessioncontext_management=[{"type": "compaction", "compact_threshold": ...}] 随每次 Responses API 请求发送,当渲染后的上下文超过阈值时,API 可以在响应中发出压缩项。OpenAIResponsesCompactionSession 会在轮次之间调用独立的 responses.compact 端点,并重写本地会话历史记录。

extra_args 的传递

如果需要 SDK 尚未在顶层直接公开的提供商特定字段或较新的请求字段,请使用 extra_args

使用 OpenAI 模型时,extra_args 可以向 Responses API 和 Chat Completions API 传递可选参数,例如 userservice_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,其中包含:

  • attemptmax_retries,以便根据尝试次数作出决策。
  • stream,以便区分流式与非流式行为。
  • error,用于原始数据检查。
  • normalized 事实,例如 status_coderetry_aftererror_codeis_network_erroris_timeoutis_abort
  • provider_advice,当底层模型适配器可以提供重试指导时使用。
  • response_startedreplay_safetystateful_request,它们是在策略运行前捕获的稳定重放安全事实。replay_safety"safe""unsafe""unknown";当请求使用 previous_response_idconversation_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_startedcontext.replay_safetycontext.stateful_request,并且仅在可以接受重复执行提供商侧工作时授予批准。普通的 RetryDecision(retry=True) 绝不会绕过重放保护,approve_unsafe_replay=True 也无法授权流式重试或本地副作用。

使用 previous_response_idconversation_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_retriesbackoff,但省略回调本身。

更完整的代码示例请参阅 examples/basic/retry.py基于适配器的重试示例

非 OpenAI 提供商故障排除

追踪客户端错误 401

如果遇到与追踪相关的错误,这是因为追踪数据会上传到 OpenAI 服务器,而你没有 OpenAI API 密钥。可通过以下三种方式解决:

  1. 完全禁用追踪:set_tracing_disabled(True)
  2. 为追踪设置 OpenAI 密钥:set_tracing_export_api_key(...)。此 API 密钥仅用于上传追踪数据,并且必须来自 platform.openai.com
  3. 使用非 OpenAI 追踪处理器。请参阅追踪文档

Responses API 支持

SDK 默认使用 Responses API,但许多其他 LLM 提供商仍不支持它。因此,可能会看到 404 或类似问题。可通过以下两种方式解决:

  1. 调用 set_default_openai_api("chat_completions")。如果通过环境变量设置 OPENAI_API_KEYOPENAI_BASE_URL,此方式适用。
  2. 使用 OpenAIChatCompletionsModel。相关代码示例见此处

Chat Completions 兼容性选项

通过 Chat Completions 路由时,SDK 会静默丢弃 Chat Completions 无法发送的仅限 Responses 字段,以保持兼容性,例如 previous_response_idconversation_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.pyexamples/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.pyexamples/model_providers/litellm_provider.py 开始。可以使用 litellm/... 模型名称,或直接实例化 LitellmModel

通过 LiteLLM 适配器访问的部分提供商默认不会填充 SDK 用量指标。如果需要用量报告,请传入 ModelSettings(include_usage=True);如果依赖 structured outputs、工具调用、用量报告或适配器特定的路由行为,请验证计划部署的具体提供商后端。

如果 LiteLLM 为响应对象发出 Pydantic 序列化器警告,可以在导入 LiteLLM 适配器之前选择启用 SDK 的兼容性补丁:

export OPENAI_AGENTS_ENABLE_LITELLM_SERIALIZER_PATCH=true

该补丁默认禁用,并且仅对 1true 值启用。它通过封装一个私有 LiteLLM 日志辅助工具来抑制特定类别的 LiteLLM 响应序列化警告,因此应将其视为针对性解决方法,而不是通用序列化设置。由于它依赖私有 LiteLLM API,升级 LiteLLM 时请重新验证;当上游警告不再出现时,请移除该环境变量。