任务症状:Agent 能连续执行数小时,但代码、数据和外部工具一旦走到关键步骤,你仍然只能盯着终端等待。

最快解法:不要让研究人员逐步盯住 Agent,也不要把所有操作设为统一审批;按只读、可逆写入和高风险外部操作分级,在关键工具调用处暂停,持久化任务状态,并在隔离工作区中审批后续跑。

这篇部署指南适合谁

如果你正在让 Codex 承担数小时实验、代码修改、数据分析或评测任务,这套流程可以减少重复等待和失败重跑。

如果你负责 Agent 平台、任务队列或审批系统,你需要重点看状态保存、任务转交和版本冻结。

如果任务涉及 Xcode、macOS 或桌面工具,你还需要把人工接管和远程执行环境分开管理,而不是把“允许继续运行”直接等同于“允许访问整台 Mac”。

注意:OpenAI 已在 2026 年 9 月 6 日披露,其内部测量已经达到“自动研究实习生”目标,但这并不等于普通团队可以直接复制相同成功率,也不代表 OpenAI 已经发布适用于所有研究 Agent 的统一人工接管架构。本文是一套基于官方 SDK 能力形成的工程实施框架。(OpenAI 研究披露)

最后更新于 2026 年 9 月 8 日;研究范围与人工介入表述核实自上述 OpenAI 研究文章,接口行为核实自 OpenAI Agents SDK 人工审批文档及相关状态管理文档。

先把“人工接管”拆成三种风险,而不是一个总开关

研究 Agent 的动作至少要分为模型推理、文件修改、Shell 执行、实验提交和外部系统写入。真正危险的地方,不是模型说了什么,而是工具调用将要对哪个环境造成什么影响。

你可以先采用下面这套分级。它是部署建议,不是 OpenAI 对所有团队规定的统一策略。

操作类别 默认处理 审批人需要核对什么 典型停止条件
只读查询 自动执行 查询范围、数据权限、资源消耗 访问敏感数据或超出任务范围
可逆写入 条件审批 补丁内容、目标工作区、回滚方式 修改共享分支、覆盖已有文件
高风险外部操作 强制人工批准 工具参数、外部目标、预计副作用 提交实验、发布结果、发送请求、改变共享环境

这套分级有两个边界。第一,审批人只判断工具名称、参数、目标环境和影响范围,不需要读取或推断模型的隐藏推理过程。第二,RunState 只能保存和恢复运行状态,不能自动消除工具本身的外部副作用;已经发出的请求、已经写入的文件和已经提交的实验,仍然需要幂等设计与独立复核。

OpenAI Agents SDK 的人工审批流程会把待处理工具调用暴露为 interruption,并允许你通过 approve 或 reject 处理后恢复运行;如果参数无法被安全解析,SDK 的审批规则会倾向于要求人工确认,而不是直接放行。(OpenAI Agents SDK 人工审批说明)

第一步:先定义审批对象,再接入队列

不要把审批对象写成“Agent 想继续吗”。审批对象应是一个结构化记录,至少包含:

  • 任务编号和任务版本;
  • 当前 Agent、模型和提示版本;
  • 工具名称与参数摘要;
  • 代码仓库版本和工作区标识;
  • 目标执行环境;
  • 预计写入范围与外部副作用;
  • 当前责任人、备份责任人和超时时间。

这样,多个 Codex 任务才能在同一个队列中分配责任。审批人接手的是一条明确的工具调用,而不是一个无法复核的聊天窗口。

第一小时:让暂停状态离开研究人员电脑

最容易被忽略的故障是:Agent 已经暂停,但待审批状态只存在于本地终端、进程内存或聊天会话里。研究人员一关电脑,任务就变成“看起来还在运行,实际上无法恢复”。

在 OpenAI Agents SDK 中,暂停结果可以转换为 RunState,再通过 to_json() 或 to_string() 保存;恢复时使用对应的反序列化方法,并继续运行原来的顶层 Agent。官方文档明确将 RunState 定义为包含上下文、用量、审批状态和中断信息的可序列化运行快照。(OpenAI Agents SDK RunState 文档)

建议把状态拆成两层保存:

保存层 应保存内容 不应保存内容
任务数据库 任务版本、状态、责任人、工作区、审批记录 API 密钥、仓库令牌、临时密码
RunState 快照 模型响应、工具输入、待审批项、运行上下文 未经清理的敏感凭证和长期密钥

不要把密钥放入 RunContextWrapper.context,再把整个状态快照直接写入消息队列。官方上下文文档提醒,序列化运行状态时,应用自定义上下文可能随快照一起保存或传输,因此敏感信息必须在进入状态前排除。(OpenAI Agents SDK 上下文文档)

恢复时还要保留 Agent 定义和工具 Schema 的版本号。审批可能等待数小时;如果期间工具参数发生变化,旧审批决定就不能默认适用于新工具。

首次试运行:只接入可逆操作

第一次上线不要从“自动提交实验并发布结果”开始。先选择代码补丁、临时文件生成、只读数据查询或测试报告汇总,这些动作更容易清理,也更容易判断 Agent 是否真的在审批点停住。

你需要分别验证三条路径:

测试路径 预期结果 失败时怎么处理
批准 只执行被批准的工具调用,并继续原任务 检查是否误放行后续调用
拒绝 Agent 收到明确拒绝结果并安全结束或重新规划 禁止把拒绝当作网络错误无限重试
长时间无人处理 任务保持暂停,不执行隐藏的后续工具 检查队列、状态和超时转交逻辑

待审批项会出现在运行结果的中断字段中;保存状态后,审批并重新运行即可继续原任务,而不是重新提交一条全新的用户请求。(OpenAI Agents SDK 运行结果说明)

拒绝消息最好区分“业务拒绝”和“技术失败”。前者应让 Agent 结束、改写计划或等待新的用户输入;后者才进入有限次数的错误恢复。两者混在一起,会让 Agent 把明确的安全决策误判为暂时性故障。

首日:把审批队列和隔离工作区绑定

审批界面不能只显示“模型建议执行删除文件”。它至少要显示目标主机、仓库版本、工作区路径、写入文件列表和外部副作用。否则审批人可能在错误的 Mac、错误的分支或错误的容器上批准了正确的工具调用。

通用实验可以使用一次性工作区;需要 Xcode、macOS 或桌面工具的任务,则应进入独立的远程 Mac 环境。你可以先阅读 研究 Agent 隔离执行环境的部署思路,再决定哪些任务适合容器,哪些任务必须使用云端 Mac。

执行环境 适合任务 主要风险 接管要求
一次性容器或临时工作区 纯代码、只读分析、可重复实验 依赖和缓存不完整 审批后允许自动清理
独立 Linux 工作区 长时间脚本、数据处理、批量评测 资源竞争、残留进程 绑定任务编号和资源配额
云端 Mac Xcode 构建、macOS 测试、桌面工具 GUI 状态、许可证、残留文件 显示主机标识、登录用户和清理结果

云端 Mac 不是 RunState 的替代品。状态负责让 Agent 知道自己执行到哪里,工作区负责保证工具操作落在正确环境;两者缺一不可。若你需要管理多个并发工作区,可以先通过 MacPull 的控制入口核对远程环境的分配与回收方式。

四十八小时内:验证转交、超时与跨机器恢复

长任务真正上线前,至少要模拟以下故障:

  • 原审批人离线,任务转交给备份责任人;
  • Agent 进程重启,状态从另一台机器恢复;
  • 审批等待期间,代码分支产生新提交;
  • 工具定义、模型版本或提示模板发生变化;
  • 远程 Mac 被释放、重建或更换工作区;
  • 审批被拒绝后,任务需要结束或重新规划。

恢复暂停任务时,SDK 可以继续使用保存的会话标识或前一次响应标识;但会话存储需要使用相同的后端和会话标识,不能让两个独立恢复的快照同时写入同一段历史。(OpenAI Agents SDK 运行 Agent 文档)

如果审批等待期间发现仓库版本、工具 Schema 或执行环境发生变化,你应当让 Agent 重新规划并重新审批,而不是直接复用旧决定。这个规则尤其适用于远程 Mac:主机看似在线,并不代表 Xcode 版本、登录状态、工作区内容和后台进程仍然一致。

流式执行也要单独测试。先消费完事件流,再检查中断项、保存状态、处理批准或拒绝,并使用流式运行方法恢复,避免把尚未写完的事件误判为任务失败。(OpenAI Agents SDK 流式运行文档)

用这份清单决定是否扩大并发

下面的清单适合放进首轮上线记录。任何一项无法勾选,都不要直接增加更长任务或更多并发 Agent。

  • [ ] 每个工具已标记为自动执行、条件审批或强制人工批准。
  • [ ] 审批记录包含工具参数摘要、目标环境、仓库版本和工作区标识。
  • [ ] RunState 已写入数据库或持久队列,而不是只保存在终端。
  • [ ] 快照中没有 API 密钥、仓库令牌和临时登录凭证。
  • [ ] 批准、拒绝、无人处理三条路径都已实际运行。
  • [ ] 拒绝不会触发无限重试,也不会自动执行替代的高风险工具。
  • [ ] 多个 Codex 任务可以按任务编号分配责任人和备份责任人。
  • [ ] Agent 重启后能从另一台机器加载原状态。
  • [ ] 工作区与任务绑定,审批界面不会只显示自然语言说明。
  • [ ] 远程 Mac 上的任务被拒绝后,能保存状态、停止副作用并完成清理。
  • [ ] 模型、提示、工具 Schema 或主机变化后会触发重新审批。
  • [ ] 最终结果由独立人员或独立任务复测,而不是由原 Agent 自己宣布成功。

第一周:用交付证据决定自动化边界

第一周不要只统计“任务完成了多少”。更有价值的是记录介入原因、审批等待时间、拒绝后的结果、重复副作用、工作区清理状态和独立复测结论。

这些记录最终要回答三个问题:

  1. 哪类工具调用最常触发人工介入?
  2. 哪类任务在拒绝后能够安全结束或重新规划?
  3. 哪类远程环境问题会让恢复结果失真?

只有状态恢复、权限阻断、工作区隔离和最终结果复核同时通过,才适合扩大到更长任务或更多并发。对于仍然频繁修改共享仓库、依赖桌面状态或产生不可逆外部影响的任务,应继续保留人工审批。

你还可以把低风险规则逐步改成程序化批准,但不要把“曾经批准过”直接变成永久放行。人工审批机制可以按工具调用保存批准或拒绝决定,也可以对部分中断项处理后继续运行;这适合细化权限,但不应绕过任务版本和环境检查。

当前开发机和云端 Mac,应该怎样选

如果任务只是纯代码分析、短时测试或一次性脚本,本地开发机通常更简单;如果任务需要长时间运行、独立桌面环境、Xcode 或多任务并行,云端 Mac 更容易把工作区、审批对象和执行主机绑定起来。

但云端 Mac 也不是所有团队的长期答案。你需要承担环境回收、桌面状态清理、许可证和并发工作区管理;如果任务长期稳定高负载,直接购买并维护专用设备可能更合适;如果任务必须连接特定物理接口,远程租赁环境也可能不适用。

方案 优点 缺点 更适合
现有本地开发机 延迟低,依赖容易复用 难以隔离并行任务,人员离线后恢复困难 个人试验、短任务
自建专用 Mac 环境稳定,可长期保留缓存 前期采购、维护和闲置成本由团队承担 稳定高负载、固定工具链
MacPull 的云端 Mac 可按任务建立隔离环境,适合临时试验与远程接管 需要设计回收、权限和工作区清理流程 长任务试点、并发实验、远程 macOS 验证

如果你已经完成首轮暂停与恢复测试,下一步应按任务类型盘点隔离工作区需求,而不是马上把所有 Agent 都迁移过去。对于本地设备不足、需要独立 macOS 工作区或只想建立按需试验池的团队,可以继续查看 MacPull 的 Mac 方案说明;若任务是长期稳定重负载或依赖物理接口,则应先做自购设备与远程环境的总成本比较。

人工接管的目标不是把研究人员变成全天候审批员,而是让高风险动作在可观察、可追责、可恢复的边界上停下来。把审批队列、RunState、代码工作区和云端 Mac 分成四个独立对象,你才能在 Agent 连续运行数小时后,仍然知道它停在哪里、谁批准了什么,以及下一步能否安全继续。

常见问题

研究 Agent 哪些工具操作应该先等人工批准?

只读查询和可回滚的临时文件操作通常可以自动执行;会修改共享仓库、消耗高额资源、访问外部系统或产生不可逆副作用的操作,应进入人工审批。审批人只需要核对工具参数、目标环境和影响范围,不需要审查模型的隐藏推理过程。

Agent 在审批暂停后,怎样从原任务继续运行?

在任务暂停时把结果转换为 RunState,保存到数据库或持久队列,并记录任务版本、工作区和工具定义版本。审批人调用 approve 或 reject 后,使用原来的顶层 Agent 和恢复后的状态重新运行,不能新建一轮对话冒充续跑。

多个 Codex 任务如何分配人工接管责任?

不要按聊天窗口分配责任,而要按任务、工作区和风险等级建立审批队列。每个待处理项绑定唯一任务编号、仓库版本、执行主机和责任人;高风险操作设置主备审批人,超时后转交授权队列,避免同一任务被重复放行。

远程 Mac 上的长任务被拒绝后还能安全恢复吗?

可以,但前提是拒绝被记录为明确的业务决策,而不是普通工具错误。任务应停止当前副作用、保留 RunState 和工作区快照,随后让 Agent 结束、重新规划或等待新的输入。若 Mac 环境、代码版本或工具 Schema 已变化,恢复前必须重新审批。

延伸阅读