OpenAI 如何为 Responses API 构建智能体运行时

深度OpenAI2026年3月11日6 分钟阅读
OpenAI 如何为 Responses API 构建智能体运行时
OpenAI 通过 Responses API、shell 工具和托管容器,为智能体(Agent)构建了一个计算机环境,解决了文件存储、网络访问和长任务执行等实际问题。这套系统让模型能执行复杂工作流,从生成文本扩展到处理真实世界任务。

我们正从使用擅长特定任务的模型,转向使用能处理复杂工作流的智能体(Agent)。单纯提示模型只能调用训练好的智能,但给模型一个计算机环境,就能解锁更多用例,比如运行服务、调用 API 获取数据,或生成电子表格、报告等实用成果。

构建智能体时会遇到一些实际问题:中间文件放哪、如何避免把大表格塞进提示词、怎么安全地给工作流网络访问权限,以及如何处理超时和重试而不必自己造轮子。

与其让开发者自己搭建执行环境,我们构建了必要组件,为 Responses API 配备计算机环境,可靠地执行真实世界任务。

OpenAI 的 Responses API,加上 shell 工具和托管容器工作区,就是为解决这些问题设计的。模型提出步骤和命令;平台在隔离环境中运行它们,提供文件系统用于输入输出、可选的结构化存储(如 SQLite)和受限制的网络访问。

这篇文章会拆解我们如何为智能体构建计算机环境,并分享一些早期经验,教你用它实现更快、更可重复、更安全的生产工作流。

智能体工作流的核心:执行循环

一个好的智能体工作流始于紧密的执行循环:模型提出一个动作(比如读取文件或用 API 获取数据),平台执行它,结果反馈给下一步。我们先从 shell 工具——这个循环最简单的体现——开始,然后覆盖容器工作区、网络、可复用技能(Skills)和上下文压缩(Compaction)。

要理解 shell 工具,先得明白大语言模型(LLM)如何使用工具:比如调用函数或与计算机交互。训练时,模型会看到工具使用示例及其效果,一步步学习何时以及如何使用工具。当我们说“使用工具”,模型实际上只是提议一个工具调用,它自己无法执行。

shell 工具让模型能力大幅提升:它通过命令行与计算机交互,执行从搜索文本到发送 API 请求的各种任务。基于熟悉的 Unix 工具,我们的 shell 工具能做任何你期望的事,grepcurlawk 等工具开箱即用。

相比我们现有的代码解释器(只执行 Python),shell 工具支持更广泛的用例,比如运行 Go 或 Java 程序,或启动 NodeJS 服务器。这种灵活性让模型能完成复杂的智能体任务。

Responses API:模型与工具的编排器

模型自己只能提议 shell 命令,但这些命令如何执行?我们需要一个编排器(Orchestrator)来获取模型输出、调用工具,并将工具响应传回模型,循环直到任务完成。

Responses API 是开发者与 OpenAI 模型交互的方式。使用自定义工具时,Responses API 会将控制权交还给客户端,客户端需要自己的执行框架(Harness)来运行工具。但这个 API 也能开箱即用地编排模型和托管工具。

当 Responses API 收到提示时,它会组装模型上下文:用户提示、之前的对话状态和工具指令。要让 shell 执行生效,提示必须提及使用 shell 工具,且所选模型必须经过训练能提议 shell 命令——GPT‑5.2 及后续模型都为此训练过。有了这些上下文,模型决定下一步动作。如果选择 shell 执行,它会返回一个或多个 shell 命令给 Responses API 服务。API 服务将这些命令转发给容器运行时,流式传回 shell 输出,并在下一个请求的上下文中喂给模型。模型可以检查结果、发出后续命令或生成最终答案。Responses API 重复这个循环,直到模型返回一个不包含额外 shell 命令的完成响应。

Responses API 执行 shell 命令时,会与容器服务保持流式连接。输出产生时,API 会近乎实时地中继给模型,让模型决定是等待更多输出、运行另一个命令,还是转向最终响应。

模型可以在一步中提议多个 shell 命令,Responses API 可以使用独立的容器会话并发执行它们。每个会话独立流式输出,API 将这些流多路复用到结构化工具输出作为上下文。换句话说,智能体循环可以并行工作,比如搜索文件、获取数据和验证中间结果。

当命令涉及文件操作或数据处理时,shell 输出可能变得非常大,消耗上下文预算却不增加有用信号。为控制这点,模型为每个命令指定输出上限。Responses API 强制执行该上限,返回一个保留输出开头和结尾的有界结果,同时标记省略的内容。例如,你可以将输出限制在 1000 个字符,保留开头和结尾:

code
text at the beginning ... 1000 chars truncated ... text at the end

并发执行和有界输出一起,让智能体循环既快速又上下文高效,模型能持续推理相关结果,而不是被原始终端日志淹没。

上下文压缩:应对长任务

智能体循环的一个潜在问题是任务可能运行很长时间。长任务会填满上下文窗口(Context Window),而上下文窗口对于跨轮次和跨智能体提供上下文很重要。想象一个智能体调用技能(Skill)、获得响应、添加工具调用和推理摘要——有限的上下文窗口很快就被填满。为避免在智能体继续运行时丢失重要上下文,我们需要一种方法来保留关键细节并移除无关内容。与其要求开发者设计和维护自定义摘要或状态携带系统,我们在 Responses API 中添加了原生压缩(Compaction),旨在与模型行为和训练方式对齐。

我们最新的模型经过训练,能分析先前的对话状态,并生成一个压缩项,以加密且 token 高效的方式保留关键先前状态。压缩后,下一个上下文窗口由这个压缩项和先前窗口的高价值部分组成。这使得工作流能跨窗口边界连贯地继续,即使在扩展的多步骤和工具驱动会话中也是如此。Codex 依赖这个机制来维持长运行编码任务和迭代工具执行,而不降低质量。

压缩功能可以通过服务器内置或独立的 /compact 端点使用。服务器端压缩让你配置阈值,系统自动处理压缩时机,无需复杂的客户端逻辑。它允许稍大的有效输入上下文窗口,在压缩前容忍少量溢出,这样接近限制的请求仍能被处理和压缩,而不是被拒绝。随着模型训练演进,原生压缩解决方案也会随每个 OpenAI 模型版本一起演进。

Codex 在作为早期用户的同时,帮助我们构建了压缩系统。当一个 Codex 实例遇到压缩错误时,我们会启动第二个实例来调查。结果是 Codex 通过解决这个问题,获得了一个原生、有效的压缩系统。Codex 检查和改进自身的能力,已成为在 OpenAI 工作的一个特别有趣的部分。大多数工具只需要用户学习如何使用;Codex 则与我们一同学习。

容器:状态与资源的工作环境

容器不仅是运行命令的地方,也是模型的工作上下文。在容器内,模型可以读取文件、查询数据库,并在网络策略控制下访问外部系统。

容器上下文的第一部分是文件系统,用于上传、组织和管理资源。我们构建了容器和文件 API,给模型提供可用数据的地图,帮助它选择有针对性的文件操作,而不是执行宽泛、嘈杂的扫描。

一个常见的反模式是将所有输入直接塞进提示上下文。随着输入增长,过度填充提示变得昂贵且模型难以导航。更好的模式是将资源暂存在容器文件系统中,让模型决定用什么 shell 命令打开、解析或转换。就像人类一样,模型在有组织的信息上工作得更好。

容器上下文的第二部分是数据库。在许多情况下,我们建议开发者将结构化数据存储在 SQLite 等数据库中并查询它们。例如,与其将整个电子表格复制到提示中,你可以给模型表格的描述——存在哪些列及其含义——让它拉取需要的行。

例如,如果你问“本季度哪些产品销售额下降?”,模型可以查询_仅_相关行,而不是扫描整个电子表格。这更快、更便宜,对更大数据集更具可扩展性。

容器上下文的第三部分是网络访问,这是智能体工作负载的重要组成部分。智能体工作流可能需要获取实时数据、调用外部 API 或安装软件包。同时,给容器无限制的互联网访问可能带来风险:可能将信息暴露给外部网站、无意中触及敏感的内部或第三方系统,或使凭证泄露和数据外泄更难防范。

为解决这些担忧而不限制智能体的实用性,我们构建了托管容器来使用边车出口代理(Sidecar Egress Proxy)。所有出站网络请求流经集中策略层,强制执行允许列表和访问控制,同时保持流量可观测。对于凭证,我们在出口处使用域范围秘密注入(Domain-scoped Secret Injection)。模型和容器只看到占位符,而原始秘密值保持在模型可见上下文之外,仅应用于批准的目的地。这降低了泄露风险,同时仍支持经过身份验证的外部调用。

技能:可复用的工作流模块

shell 命令很强大,但许多任务重复相同的多步骤模式。智能体每次运行都得重新发现工作流——重新规划、重新发出命令、重新学习惯例——导致结果不一致和执行浪费。智能体技能将这些模式打包成可复用、可组合的构建块。具体来说,一个技能(Skill)是一个文件夹包,包含 [SKILL.md](http://skill.md/)(包含元数据和指令)以及任何支持资源,如 API 规范和 UI 资产。

这种结构自然映射到我们之前描述的运行时架构。容器提供持久文件和执行上下文,shell 工具提供执行接口。两者就位后,模型可以在需要时使用 shell 命令(lscat 等)发现技能文件、解释指令,并在同一个智能体循环中运行技能脚本。

我们提供API 来管理 OpenAI 平台中的技能。开发者上传并存储技能文件夹作为版本化包,之后可以通过技能 ID 检索。在将提示发送给模型之前,Responses API 加载技能并将其包含在模型上下文中。这个序列是确定性的:

  1. 获取技能元数据,包括名称和描述。
  2. 获取技能包,复制到容器中并解包。
  3. 用技能元数据和容器路径更新模型上下文。

在决定技能是否相关时,模型逐步探索其指令,并通过容器中的 shell 命令执行其脚本。

整合所有组件

将所有部分整合起来:Responses API 提供编排,shell 工具 提供可执行动作,托管容器 提供持久运行时上下文,技能 层叠可复用工作流逻辑,压缩 允许智能体长时间运行并获得所需上下文。

有了这些原语,单个提示可以扩展为端到端工作流:发现正确的技能、获取数据、将其转换为本地结构化状态、高效查询并生成持久工件。

下图展示了这个系统如何从实时数据创建电子表格。

我们很兴奋看到开发者用这套原语构建什么。语言模型的意义不止于生成文本、图像和音频——我们将继续演进我们的平台,使其更有能力大规模处理复杂的真实世界任务。

觉得有用?分享给更多人

获取每周 AI 工具精选

工具推荐、实战教程和生态洞察,每周更新。

相关文章

Simon Willison 正在重构 LLM Python 库的抽象层,以支持服务器端工具执行等新功能。他利用 Claude Code 分析了四大 LLM 提供商的客户端库,生成了用于测试的 curl 命令和 JSON 输出。这些调研材料已开源,旨在帮助设计更通用的 API 抽象。

深度Simon Willison·4月5日·1 分钟

智能体技能——包含程序性知识和可执行资源的结构化包,供智能体在推理时动态加载——已成为增强 LLM 智能体的可靠机制。然而,推理时技能增强存在根本性限制:检索噪声引入无关指导,注入的技能内容带来大量 token 开销,而模型从未真正习得它所遵循的知识。我们提出一个问题:技能是否可以被内化到模型参数中,使其在无需任何运行时技能检索的情况下实现零样本自主行为?我们提出 Skill0,一个专为技能内化设计的上下文强化学习框架。Skill0 引入了一种训练时课程,从提供完整技能上下文开始,逐步撤除。技能按类别离线分组,并与交互历史一起渲染为紧凑的视觉上下文,教授模型工具调用和多轮任务完成。动态课程机制…

深度·4月5日·17 分钟

评论