运行时行为
Codex 框架在一轮中拥有哪些内容,以及哪些内容仍保留在 OpenClaw 中。这是 Codex 框架 指南的一部分;每个章节迁移到了哪里 列出了所有章节。
动态工具与网络搜索¶
Codex 动态工具默认使用 searchable 加载方式。OpenClaw 通常不会暴露与 Codex 原生工作区操作重复的动态工具:read、write、edit、apply_patch、exec、process、get_goal、create_goal、update_goal、tool_call、tool_describe 和 tool_search。目标操作保持为 Codex 原生操作,因此 OpenClaw 不会向 Codex 轮次投影第二个目标存储。大多数其余的 OpenClaw 集成工具,例如消息、媒体、cron、浏览器、节点、网关、progress_card 和 heartbeat_respond,可通过 Codex 工具搜索在 openclaw 命名空间下使用,从而保持初始模型上下文更小。受限轮次 shell 回退是 exec 和 process 的例外情况,当有限允许列表禁用原生 Code Mode 时适用;运行时允许列表和 codexDynamicToolsExclude 仍然适用。当原生 shell 仍然处于活动状态且 Gateway 访问符合策略条件时,OpenClaw 改为发布不同的 gateway_exec 和 gateway_process 名称,以免原生 shell 与 OpenClaw 管理的环境路径混淆。
标记为 catalogMode: "direct-only" 的工具,包括 OpenClaw 的 computer 工具,改用 openclaw_direct 命名空间。Codex 将该命名空间视为 DirectModelOnly,因此这些工具在普通线程和仅 Code Mode 线程中保持对模型直接可见,而不是跨越嵌套 Code Mode 的 tools.* 调用。
当搜索已启用且未选择托管提供商时,网络搜索默认使用 Codex 的托管 web_search 工具。原生托管搜索和 OpenClaw 的托管 web_search 动态工具互斥,因此托管搜索无法绕过原生域名限制。当托管搜索不可用、被显式禁用或被选定的托管提供商替换时,OpenClaw 使用托管工具。OpenClaw 保持 Codex 的独立 web.run 扩展处于禁用状态,因为生产 app-server 流量会拒绝其用户定义的 web 命名空间。tools.web.search.enabled: false 会禁用这两条路径,工具禁用的仅 LLM 运行也会禁用它们。Codex 将 "cached" 视为偏好,并针对不受限制的 app-server 轮次将其解析为实时外部访问。当设置了原生 allowedDomains 时,自动托管回退会失败关闭,因此允许列表无法被绕过。持久生效的搜索策略更改会在下一轮之前轮换绑定的 Codex 线程;临时逐轮限制使用临时受限线程,并保留现有绑定以便后续恢复。
sessions_yield、sessions_spawn 和仅限消息工具的源回复保持直接,因为它们是轮次控制或委派契约。指南仍然优先将 Codex 的原生 spawn_agent 作为主要的 Codex 子代理入口,而显式的 OpenClaw 或 ACP 委派仍可通过 sessions_spawn 直接调用。在 Codex Code Mode 中,通用 OpenClaw 动态工具结果是 JSON 文本而不是 JavaScript 对象,因此在读取字段之前请解析看似 JSON 的结果。Codex 还会串行化嵌套动态调用;请在有界循环中提交多个 sessions_spawn 调用,而不是期望 Promise.all 并发启动它们。已接受的子会话仍可在后续调用提交时重叠。有关完整模式,请参阅 Swarm。当启用结构化响应时,计划心跳用户消息会标识 heartbeat_respond;该工具仍可通过 Codex 工具搜索发现。
仅在连接到无法搜索延迟动态工具的自定义 Codex app-server,或调试完整工具负载时,才设置 codexDynamicToolsLoading: "direct"。
检查工具输出¶
长工具结果在 Control UI 中有折叠预览。显示完整输出 以纯文本打开已保存的结果;复制和下载使用该文本,而不是预览。重新加载对话会读取相同的已保存结果。检查受 Gateway 的消息大小限制和已配置的转录脱敏约束。工具输出检查请求每个文本字段支持的最大 2,000,000 个字符;仍然被限制的结果会明确标记为不可用。预览限制并不意味着 Codex 截断了模型的输入。
OpenClaw 保留 Codex 的 rawResponseItem/completed 通知暴露的完整工具响应文本,包括空白和 Codex 自身的截断通知。结构化响应将其文本块保留为 JSON;非文本负载被标记为省略,而不是复制到文本检查器中。OpenClaw 在检查点记录结果之前,将响应与其工具调用 ID 关联。如果只有执行事件可用,则结果被标记为执行输出。Code-mode 响应 ID 与嵌套命令 ID 不同。
这两个事件都不能证明确切的最终模型输入。Codex 可以在构造响应后应用额外的历史截断和上下文规范化;其 app-server 不会在此处暴露该最终请求表示。OpenClaw 会标注此限制,而不是将原始 stdout 视为模型可见输出。
带有 OpenClaw truncated Codex native tool output 通知的旧记录在持久化之前丢失了省略的文本。它们明确显示完整输出不可用。当只接收到有界执行流,且没有完整响应或完成输出到达时,也适用相同的限制。打开、复制或下载此类记录无法恢复其缺失的文本。
后台文本补全¶
在使用本地 stdio 传输和默认 appServer.homeScope: "agent" 时,Codex 用于记忆叙述和会话标题的补全在新的私有 Codex 主目录和工作区中运行。它们保留所选模型和作用域认证,具有只读沙箱,并且没有模型可调用的工具、应用或 MCP 服务器。普通用户和项目钩子无法进入该私有进程;管理员管理的钩子仍然处于活动状态。
私有补全支持可直接执行的启动器和 Node 脚本包装器。内联 shell/eval 命令和含义模糊的启动器参数会以隔离错误失败;对于这些自定义启动,请使用可直接执行的包装器。
用户主目录模式会保留原生 Codex 账户,即使同时存在 OpenClaw 身份验证配置。Stdio 代理和远程传输会保留其已配置的服务器。这些连接会保持其现有的受限补全行为,并在无法验证其隔离时拒绝托管钩子。强制冲突工具能力的托管要求仍会拒绝该补全。
图像加载器所有权¶
对于启用 Codex 原生工具且支持图像的模型,Codex 拥有 view_image,OpenClaw 会抑制其重复加载器。原生 Codex schema 接受一个本地文件系统 path。对于纯文本模型,或当原生工具界面被禁用时,OpenClaw 提供带有其 path/paths schema 和委托视觉路由的 view_image。调用方必须使用当前运行所通告的 schema。
当 OpenClaw 将对话历史恢复到 Codex 线程时,已保存的图像会保留在引用历史中其原始消息旁边。当前请求及其附件跟随该历史,因此后续文本或语音回合不会将旧截图呈现为新附加的图像。如果上下文限制移除了图像的原始消息,其图像输入也会被省略;已保存的转录和附件保持不变。
发送另一个附件不会抑制最终回复中的生成图像。只有当 OpenClaw 能够将该图像的已确认投递与回复目标匹配时,才会省略生成图像。具有不确定附件结果的局部投递可能会留下重复图像,而不是丢失未发送的图像。
回合存活与超时¶
Codex 拥有提供商流存活状态和原生回合完成。OpenClaw 会等待确切的 turn/completed 结果,而不是中断静默回合或将助手输出视为完成。格式错误的完成载荷不会结束运行:OpenClaw 会等待有效的原生结果,而不是虚构缺失的项目、工具参数或完成状态。现有的 agents.defaults.timeoutSeconds 限制是每次尝试的已用执行预算:进度不会重置它,0 表示无限执行。OpenClaw 仍然限制其自身请求、动态工具、取消和本地结算。参见 超时 了解这些预算、Stop 和重放行为,以及 Doctor 对已弃用空闲设置的迁移。
失败的 app-server 启动会在返回错误前等待子进程关闭。如果启动在进程注册期间超时或被取消,清理会加入该注册并关闭任何迟到的子进程。清理可能会超过启动截止时间。当另一个调用方仍拥有启动时,被取消的调用方会让启动继续运行。
OpenClaw 会保留随初始原生项提供的助手文本和随已完成项提供的推理,即使 Codex 未发送文本增量。已完成项(包括空消息)会将转录与 Codex 的最终内容进行协调。原始提供商副本无法恢复 Codex 已删除的文本。当 Codex 在回合完成摘要中重复标记为异步投递的消息时,这些消息仍与最终回复保持分离。
网络安全通知¶
当 Codex 报告高风险网络活动的网络安全缓冲、网络安全策略拒绝或提供商模型重定向时,Control UI 会在 composer 上方显示通知。这些通知使用结构化的 app-server 事件;OpenClaw 不会从助手的措辞中推断分类器活动。
缓冲表示提供商仍在处理请求。当助手输出开始或回合结束时,其通知会清除。被阻止的通知会保留到下一回合或会话重置。重定向通知会报告提供商选择的模型。
Gateway agent-event 消费者会在 notice 流上接收这些更新,其中 phase: "provider_policy"、provider: "openai"、category: "cyber",以及 state 为 buffering、blocked、fallback、escalated、unavailable 或 cleared。当上游事件提供模型字段时,这些字段会存在。建议的回退模型仅供参考,并不能证明该账户可以使用它。
自动 Daybreak 升级¶
OpenAI 会拒绝其通用模型上的一些防御性网络安全工作,并将已批准的工作区引导至 Daybreak 模型。当回合以网络安全策略拒绝结束时,OpenClaw 会在配置的 Daybreak 模型上重试一次,使被拒绝的工作到达允许回答它的层级。此功能默认开启,并在 plugins.entries.codex.config.appServer.cyberFailover 下配置。
Daybreak 在能力上落后于通用模型,因此升级仅限于实际被拒绝的工作:
- 每个回合最多一次升级尝试。在 Daybreak 下的第二次拒绝会保持阻止并停止。
- 已在配置的 Daybreak 模型上运行的回合永远不会升级。
- 已经采取行动的回合永远不会重试。升级需要该尝试自身的重放安全判定,因此一个在发送消息、添加 cron 条目、派生会话、启动原生延续或生成媒体之后被拒绝的回合会保留其结果。取消、超时或后续失败也会阻止升级,即使结果保留了拒绝诊断。
- 只有被拒绝的回合才会被路由到 Daybreak。每个回合都从会话选择的模型开始,未被拒绝的回合永远不会到达较弱的层级。
- 重试不会将提示词第二次镜像到转录中。被拒绝尝试自身的终止行会与其结果一起丢弃,而不是暂存,因此成功的升级会返回 Daybreak 答案;被拒绝的回合仍存在于上游的原生 Codex 线程中,OpenClaw 不会重写它。
- 只有 OpenAI 在当前尝试上的自身网络安全拒绝才会升级。其他提供商的拒绝、其他类别以及从较早回合继承的拒绝都会保持结果不变。
- 升级永远不会更改会话中存储的模型选择,唯一保留的状态是下面的未授权目标记录,它是进程本地的,而不是持久化的。
授权始终由服务端持有。model/list 向每个客户端通告 Daybreak,因此目录中存在该模型并不构成授权证明:未获授权的 workspace 在使用时仍会收到 401/403,而每一次此类尝试都会付出传输层完整重连阶梯的代价。因此,OpenClaw 将重试本身视为唯一证据,并报告 unavailable 通知而非静默拦截。如果回退目标在无工具活动、副作用、原生续接或中断的情况下被拒绝,即使回退未产生任何助手消息,OpenClaw 也会保留原始拒绝。否则,其结果会被保留,以便这些事实能够到达 runner。
由于授权归属于已认证的 workspace 和目标模型,而非任何单个对话,因此未授权目标在该 workspace 下的每个会话中只被记录一次,并且不会因会话更替而被清除。另一个已获授权的 workspace 会继续正常升级,记录会在 cooloffMs 到期后自行释放。对于给定的 workspace 和目标,同一时间只会运行一个探测,因此在首个结果返回之前,同时被拒绝的兄弟会话不会各自承担一次重连阶梯的代价。
并行聊天与线程归属¶
独立聊天可以共享同一个 Codex app-server 并并发运行。恢复空闲聊天不需要等待无关聊天、模型发现或工具目录读取完成。OpenClaw 会为每个原生线程协调自身的生命周期操作,并在普通恢复过程中保持该线程的标识不变。已关闭、被替换或已退役的客户端仍然无法完成过期的交接。
受管理的本地连接共享一个有界推理中继。最多 16 个请求准备和上传操作可同时运行,另有 16 个按到达顺序等待。响应在其上传容量释放后仍会继续流式传输,因此长响应不会阻塞第 17 个聊天或原生子代理启动。
该中继允许最多 80 个 HTTP 操作与 WebSocket 连接合计存在,并为 16 个待处理或正在关闭的准入请求留有空间。它最多保留 64 个可用的 WebSocket,并在任一传输层需要空间时回收最旧的已完成空闲连接。活跃响应和等待首个请求的新建连接不会被驱逐。HTTP 连接在每次响应后关闭;原生 WebSocket 复用保持不变。64 个已准入根上下文的单独限制不变;传输容量不是已保存对话的数量。
新建 WebSocket 在打开上游连接之前会先等待;准入及其握手共享一个 10 秒的截止时间。HTTP 准入和排队中的 WebSocket 上传最多等待 30 秒。已取消或被取代的排队工作不会到达提供方。已经开始执行的准备和传输清理工作会保留其容量,直到其所属操作完成。
这些限制适用于共享该中继的聊天和原生子代理。队列容量耗尽或截止时间到达时,会返回可重试的繁忙响应。持续过载仍可能在 Codex 用尽重试后导致某一轮失败。
如果已准入的 WebSocket 无法连接上游,中继返回 HTTP 502;上游握手超时则返回 504。这些错误使用固定消息,不包含凭据或模型内容。原生 Codex 保留对重试和 HTTPS 回退的控制权。提供方的 HTTP 失败保留其原始状态码和响应体。
在一次完整的提供方失败之后,你可以在同一聊天中继续使用其现有配置。OpenClaw 会保留已配置的原生线程,包括通过 /codex resume 恢复该聊天已绑定线程的情况。原生提供方的策略拒绝会结束当前尝试,而不会进行原生重试。上文描述的 OpenClaw 配置的 cyber 回退是另一次独立尝试。后续用户消息是独立的一轮;它不会提供原生策略覆盖或用户确认。
在使用 Codex app-server 0.153.4 时,首次采用或更改已加载失败线程的配置仍需要原生卸载。OpenClaw 会保留该线程,并报告缺少配置确认,而不是假定更改已生效。现有的活跃轮次检查和父级控制线程检查仍然适用。
这种协调并不能使原生配置替换对 Codex 内部控制器具有原子性。原生子代理重载或其他原生控制器可以在 OpenClaw 的线程队列之外运行。应避免通过多个控制器并发重新配置同一原生线程;仅观察到原生拆除本身并不能防止后续的原生重载。
运行时边界¶
Codex harness 只更改底层嵌入式代理执行器。
- 支持 OpenClaw 动态工具。Codex 会要求 OpenClaw 执行这些工具,因此 OpenClaw 始终处于执行路径中。
- Codex 原生的 shell、patch、MCP 和原生应用工具归 Codex 所有。OpenClaw 可以通过受支持的中继观察或阻止选定的原生事件,但它不会改写原生工具参数。
gateway_exec和gateway_process是 OpenClaw 拥有的动态工具。它们有意重新进入 Gateway exec 准备流程,以获取代理可读的 Secret Store 环境和受保护的出口;这些值永远不会流入 Codex 原生 shell。- Codex 拥有原生压缩(compaction)。OpenClaw 维护一份转录镜像,用于频道历史、搜索、
/new、/reset以及未来的模型或 harness 切换,但不会用 OpenClaw 或上下文引擎的摘要器替代 Codex 压缩。已完成的评论和工具活动会在本轮期间保存,而不是等待最终答案,从而在 Gateway 中断时保留已完成的工作。 - 媒体生成、媒体理解、TTS、审批和消息工具输出继续通过匹配的 OpenClaw 提供方/模型设置进行处理。
tool_result_persist适用于 OpenClaw 拥有的转录工具结果,而非 Codex 原生工具结果记录。
关于钩子层、受支持的 V1 接口面、原生权限处理、队列引导、Codex 反馈上传机制和压缩细节,请参阅 Codex harness 运行时。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw