任务症状: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 自己宣布成功。
第一周:用交付证据决定自动化边界
第一周不要只统计“任务完成了多少”。更有价值的是记录介入原因、审批等待时间、拒绝后的结果、重复副作用、工作区清理状态和独立复测结论。
这些记录最终要回答三个问题:
- 哪类工具调用最常触发人工介入?
- 哪类任务在拒绝后能够安全结束或重新规划?
- 哪类远程环境问题会让恢复结果失真?
只有状态恢复、权限阻断、工作区隔离和最终结果复核同时通过,才适合扩大到更长任务或更多并发。对于仍然频繁修改共享仓库、依赖桌面状态或产生不可逆外部影响的任务,应继续保留人工审批。
你还可以把低风险规则逐步改成程序化批准,但不要把“曾经批准过”直接变成永久放行。人工审批机制可以按工具调用保存批准或拒绝决定,也可以对部分中断项处理后继续运行;这适合细化权限,但不应绕过任务版本和环境检查。
当前开发机和云端 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 已变化,恢复前必须重新审批。