- Agents API 处于 beta 阶段。REST 请求需要带上请求头
OpenAI-Beta: agents=v11,Python SDK 的入口在client.beta.agents.*下。它在 2026-09-10 随 openai-python 3.13.0 加入 SDK2;本文基于 openai-python 3.26.1。 - beta 期间,接口、事件名、计费方式都可能调整。文中代码已用 pyright 对照 3.26.1 做过类型检查;没有 API Key,因此没有实际运行。
- 资料截至 2026-10-09,本文不随官方同步更新,请对照 Agents API 文档 使用。
- Agents API 通过一个 OpenAI 托管的 API 提供 Codex harness。会话、编排、上下文压缩、故障恢复都由 OpenAI 负责;你只需要提供工具,并选择执行环境3。
- 四个核心概念:Agent(配置)、Environment(可选的沙箱)、Session(持久的 agent 实例)、Events / Items(实时事件和已保存的工作记录)3。
- 执行环境有三种:
none、openai_hosted、self_hosted4。 - 它与 3.4 Claude Managed Agents 是同一类产品,也就是分层模型中的 L5。
1. 它是什么,和 Agents SDK 有什么不同#
| Agents API(本文) | Agents SDK | |
|---|---|---|
| agent 循环在哪运行 | OpenAI 托管的 Codex harness | 你的进程 |
| 状态存在哪 | OpenAI 保存的 session、turns、items | 你的存储,或者 Responses 的会话状态 |
| 执行环境 | OpenAI 托管沙箱、自托管沙箱,或不使用沙箱 | 你自己的运行时 |
| 集成工作量 | 低 | 中 |
以上取自官方对比表5。
托管的 harness 提供以下能力3:
- 在沙箱中执行命令和代码;
- 应用相关的 skills 和指令;
- 通过工具或 MCP 连接外部数据;
- 在 agent 工作过程中进行引导(steering);
- 自动总结之前的工作,以管理上下文窗口;
- 把工作拆成子任务,委派给 subagent;
- 从中断处恢复会话。
计费:模型用量按所选模型的 API 价格计费;OpenAI 工具按标准价格计费;OpenAI 托管的沙箱按容器价格计费3。
2. 架构:三个角色#
官方对三个角色的定义6:
- Harness:OpenAI 托管的 Codex 实例,运行模型和工具循环,维护 agent 的 session。
- Environment:agent 执行命令、运行代码、操作文件的地方。可以是远程沙箱、你的笔记本、Docker 容器,或者 AWS Lambda。
- Application server:你的代码。它负责提交任务、接收事件、处理函数工具;如果环境由你提供,还要负责环境的生命周期。
| 环境类型 | 适合什么 | 注意事项 |
|---|---|---|
none | 问答,或者只调用外部服务 | 没有内置的 Bash、apply-patch、工作区文件和 executor MCP6 |
openai_hosted | 跑脚本、改文件、生成产物 | 工作目录是 /workspace。可以配置 packages、files、setup_commands、env、网络。容器规格:small 为 1 vCPU / 1 GB,medium(默认)为 2 vCPU / 4 GB,large 为 4 vCPU / 16 GB7 |
self_hosted | 需要私有网络、自定义镜像,或者自己的算力 | 由你启动环境并连接 executor,同时负责开通、重连、关闭以及文件留存6 |
3. 第一个 Session#
from openai import OpenAI
with OpenAI() as client: with client.beta.agents.sessions.create( agent={ "model": "gpt-6-astra", "instructions": "写干净的代码,运行它,并报告真实的输出。", }, environment={"type": "openai_hosted"}, # 由 OpenAI 开通并管理沙箱 input="创建 tree.py,打印当前目录的文件树。运行它,并把输出给我看。", stream=True, ).with_result_collection() as stream: for event in stream: print(event.to_json(indent=None), flush=True) # 实时事件 result = stream.get_final_result() print(result.output_text) session_id = result.session_id # 保存起来,后续轮次要用这是官方 quickstart 的中文化版本1。
4. Session、Turn、Item#
- Turn 是 session 中的一个工作周期。消息发给空闲的 session,会开启一个新 turn;发给正在工作的 session,则用来引导当前 turn1。
- turn 是异步运行的,你可以通过流式事件或者 webhook 跟踪进度1。
- Events 是实时进度;Items 是已保存的消息和工具调用,可以事后读取8。
- 流不会重放错过的事件。断线之后,要先读取 session 及其已保存的 item 来恢复状态1。
4.1 发送后续消息:使用幂等键#
from uuid import uuid4
from openai import OpenAI
def send_message(client: OpenAI, session_id: str, text: str, submission_key: str) -> None: client.beta.agents.sessions.events.create( session_id, idempotency_key=submission_key, # 重试时复用同一个 key,避免重复提交 events=[ { "type": "agent.session.input.message", "input": [{"role": "user", "content": [{"type": "input_text", "text": text}]}], } ], )
submission_key = str(uuid4()) # 官方建议:先把 key 和消息一起保存,再提交改编自官方示例1。另外几个常见操作:
- 取消当前 turn:发送
{"type": "agent.session.input.cancel"}; - 修改一个已存在 session 的模型、推理强度、服务等级:调用
POST /v1/agents/sessions/{id}14。
4.2 判断结果:只看到“空闲”不等于成功#
官方要求你检查以下三个事件之一,确定 turn 的结局:agent.session.turn.completed、agent.session.turn.failed、agent.session.turn.cancelled。即使 turn 已经 completed,也不能保证每个工具都执行成功,还要检查 agent 的输出18。
5. 复用 Agent 配置#
from openai import OpenAI
client = OpenAI()
# 1) 创建一次,得到 agent.id(可以把它当作“岗位模板”)agent = client.beta.agents.create( model="gpt-6-astra", instructions="准确回答技术问题。", reasoning={"summary": "auto"},)
# 2) 每次开新 session 时,通过 agent_id 引用它session = client.beta.agents.sessions.create( agent_id=agent.id, environment={"type": "none"}, input="解释一下 agent 是怎么连接 MCP 服务器的。",)print(session.id)- 修改已保存的 agent,只影响之后新建的 session。每个 session 在创建时复制一份配置,之后一直沿用。
- 创建 session 时同时传
agent_id和agent,可以对这一个 session 覆盖部分配置。传入的对象或数组会整体替换对应字段,而不是合并。 - 凭据放在 vault 里,和保存的配置分开存放。
6. 函数工具:在你这边执行#
当 agent 需要调用你的函数时,session 会发出 agent.session.requires_action 事件。你执行函数后,通过 agent.session.input.tool_result 把结果送回去9。SDK 提供了一个类型化的辅助写法:流式迭代的同时自动调用本地处理函数10。
from openai import OpenAIfrom openai.lib.beta.agents import function_tool
client = OpenAI()
@function_tool(name="get_weather", description="查询城市今天的天气")def get_weather(city: str) -> str: return {"北京": "晴,25°C", "上海": "小雨,22°C"}.get(city, "暂无数据")
with client.beta.agents.sessions.create( agent={"model": "gpt-6-astra", "tools": [get_weather.definition]}, # 声明工具 environment={"type": "none"}, input="北京今天适合跑步吗?", stream=True, tool_handlers={get_weather.name: get_weather}, # 本地处理函数:迭代流时自动执行) as stream: print(stream.get_final_result().output_text)断线后,你需要重新读取 session,从 required_actions 里找出还在等待的调用。如果函数已经执行过,就用同一个 turn_id 和 call_id 重新提交保存下来的结果;不确定是否执行过时,先检查实际结果,不要直接重跑9。
7. 多 Agent:托管的 subagent#
from openai import OpenAI
client = OpenAI()
with client.beta.agents.sessions.create( agent={ "model": "gpt-6-astra", "instructions": "把每个版本说明分别委派给一个 subagent," "提取对用户可见的变化和迁移步骤,等两边都完成后合并成一份摘要。", "multi_agent": {"enabled": True, "max_concurrent_subagents": 2}, }, environment={"type": "none"}, input="版本 A:搜索支持按日期过滤。版本 B:导出接口改为返回下载 URL。", stream=True,).with_result_collection() as stream: for _event in stream: pass result = stream.get_final_result()print(result.output_text)改编自官方示例11。要点如下:
- 打开
multi_agent.enabled之后,harness 会自动提供创建、发送消息、等待、中断 subagent 的工具,不需要你自己声明11。 - 每个 subagent 有独立的上下文,可以并行工作。适合互不依赖的任务;短任务和彼此依赖的步骤,留在主 agent 里做更合适11。
8. 其他能力一览#
| 能力 | 说明 | 文档 |
|---|---|---|
| Computer use | 执行浏览器任务,处理网站授权和登录 | Computer use |
| MCP 连接 | 连接 OpenAI 侧或你的环境中的 MCP server | MCP connections |
| Plugins / Skills | 把 skills 和 MCP 配置打包,在多个 session 间复用 | Plugins |
| Vaults | 凭据存放在 vault 中,沙箱里看不到真实的密钥 | Vaults |
| Files & Artifacts | 上传输入文件,下载产出的文件 | Files and artifacts |
| Webhooks | 不用一直保持流,也能响应生命周期变化 | Session webhooks |
| Tracing | 在 Dashboard 里查看,或者导出为 OTLP JSON | Tracing |
| 第三方沙箱 | 文档提供了 AWS Lambda、Cloudflare、Daytona、E2B、Modal、Runloop 等的接入指南 | 官方 llms.txt 索引 |
9. 什么时候用 Agents API#
| 适合 | 不太适合 |
|---|---|
| 长时间运行、需要沙箱的任务,比如写代码并运行、处理文件、生成报告 | 需要严格控制每一步循环逻辑的场景(用 Agents SDK,或者自己写循环) |
| 不想运维 agent 基础设施(会话存储、恢复、压缩) | 对数据驻留和存储有严格要求、不能把会话交给厂商保存 |
| 希望直接复用 OpenAI 自己在 Codex 中打磨过的 harness | 多厂商模型混用(它只能用 OpenAI 模型) |
右栏是笔者根据官方定位做的归纳,并非官方原文。
小结#
- Agents API 把循环、会话、压缩、恢复、subagent都交给 OpenAI 的托管 Codex harness,你负责配置 agent、选择环境、处理函数工具和事件。
- 记住三件事:session ID 要自己保存;消息要带幂等键;turn 的结局只看 completed、failed、cancelled 三个事件。
- 想对照理解,可以看 Anthropic 的同类产品 3.4 Claude Managed Agents。两者的概念几乎一一对应:Agent、Environment、Session、Events。
相关笔记#
参考资料#
注释与出处#
-
OpenAI,Run and continue sessions,https://developers.openai.com/api/docs/guides/agents-api/sessions ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
openai/openai-python,
CHANGELOG.md中 3.13.0(2026-09-10)条目 “add Agents API”,https://github.com/openai/openai-python/blob/9301e319ea33ef28fba380f39a289dedc14652c1/CHANGELOG.md ↩ -
OpenAI,Agents API,https://developers.openai.com/api/docs/guides/agents-api/overview ↩ ↩2 ↩3 ↩4
-
OpenAI,Configuring Agents,https://developers.openai.com/api/docs/guides/agents-api/configuration ↩ ↩2 ↩3 ↩4
-
OpenAI,Agents(Compare agent runtime options 一节),https://developers.openai.com/api/docs/guides/agents ↩
-
OpenAI,Architecture,https://developers.openai.com/api/docs/guides/agents-api/architecture ↩ ↩2 ↩3
-
OpenAI,OpenAI-hosted sandboxes,https://developers.openai.com/api/docs/guides/agents-api/environments/openai-hosted ↩
-
OpenAI,Events and items,https://developers.openai.com/api/docs/guides/agents-api/sessions/events ↩ ↩2
-
OpenAI,Functions(Agents API),https://developers.openai.com/api/docs/guides/agents-api/tools/functions ↩ ↩2
-
openai/openai-python,
helpers.md(Typed beta Agents tools 一节),https://github.com/openai/openai-python/blob/9301e319ea33ef28fba380f39a289dedc14652c1/helpers.md ↩ -
OpenAI,Multi-agent(Agents API),https://developers.openai.com/api/docs/guides/agents-api/multi-agent ↩ ↩2 ↩3