跳转到内容

代理配置

代理设置控制会公开哪种 Codex 协作界面,以及 opencodex 如何引导、路由并限制委派工作。

字段 类型 默认值 含义
multiAgentMode? "v1" | "default" | "v2" "default" v1 会把目录中的每个模型都标记为 v1;v2 会把每个模型都标记为 v2。default 会恢复上游固定值(Sol/Terra 为 v2,Luna 为 v1),否则遵循原生 multi_agent_v2 标志。适用于新会话。
subagentModels? string[] gpt-6-astra, gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5 最多五个裸原生 id、账户限定的 <selector>/<native-openai-model> id 或路由 provider/model id 会优先显示在子代理选择器中。Subagents 页面只提供裸原生和路由 id,保存时会省略精确的账户限定选项;如需精确选择,请使用 ocx agent subagents set 或直接编辑配置。Astra 一次性升级后,显式空列表会被保留。
injectionModel? string 在代理生成的 v2 委派引导中使用的首选原生或路由后的子代理模型。
injectionEffort? string 首选 effort(lowultra),只有在 injectionModel 存在时才有意义。
injectionPrompt? string 替换内置 v2 指引正文。支持 {{model}}{{effort}}{{roster}}{{fallback}}。只要配置了 injectionModel,自定义提示词就会触发。
multiAgentGuidanceEnabled? boolean true 只控制 opencodex 生成的 v1/v2 开发者引导;不会改变原生代理默认值、工具、路由、名单或 effort 上限。
syncCodexSubagentDefaults? boolean false 允许在同步或重启时,将 injectionModel 以及可选的 injectionEffort 写入为 Codex 的原生默认值。需要 injectionModel
subagentModelFallback? string[] [] 按优先级排序的全局回退模型,用于派生的子轮次。
subagentModelFallbackByModel? Record<string, string[]> {} 按请求的主模型 id 做键的 per-model 回退链。这是 per-role fallback 元数据的受支持存放位置;model_fallback 写在 Codex agent TOML 里会让 Codex 0.146+ 跳过该角色(#1190)。
subagentModelFallbackPollMs? number 60000 可用性探测缓存间隔。低于 1000 ms 的值会回退到默认值。
effortCap? string 对符合条件的 v2 主轮次和标记的派生子轮次设置硬上限。接受 lowultra
subagentEffortCap? string 仅针对派生子轮次的额外上限。两个上限同时适用时,较低者生效。
plaintextV2AgentMessages? boolean —(未设置) 实验性选项。只有显式设置为 true 才会启用。符合条件的新 spawn_agentsend_messagefollowup_task 调用会使用明文消息参数。详见明文 v2 代理消息

通过仪表板或 ocx v2 status|on|off|mode <v1|default|v2>|threads <n> 管理该界面。模式变更会应用于新会话。maxConcurrentThreadsPerSessionPUT /api/v2 字段,不是 config.json 键;ocx v2 threads <n> 会在启用 v2 后,将 max_concurrent_threads_per_session 写入 Codex 的 $CODEX_HOME/config.toml 中的 [features.multi_agent_v2] 下。

管理 API 公开 GET/PUT /api/v2/api/injection-model/api/effort-caps/api/subagent-models/api/subagent-model-fallback。injection-model 更新是部分更新;自定义 prompt 是该 API 上的 prompt 字段。

Subagents → 高级中的 始终主动委派(原名 Ultra mode)只改变触发委派的条件,不改变推理 effort。推荐预设仍遵循用户指令、权限边界、任务范围和工具规则。

GETPUT /api/v2 还会返回 multiAgentModeHintRecommendation: { text, revision }。仪表板在启用或恢复预设时使用服务器提供的文本,不会回退到硬编码文案。如果旧服务器没有提供推荐值,或返回的值格式无效,则无法应用或恢复预设;仍可编辑或清除现有的自定义提示。恢复预设只修改本地草稿,保存操作才会将其写入配置。

读取设置、无关更新和版本升级不会迁移已保存的提示。只有显式更新提示,且正文与两种已知旧版 OpenCodex 预设之一逐字节完全一致时,才会替换为当前推荐文本。其他有效的自定义文本,包括仅空白字符不同的变体,都会逐字节保留。现有的 v2 启用、功能支持检查和清除提示规则保持不变;更改会应用于新的 Codex 会话。

有效的 v2 名单,是已配置、在选择器中可见、按优先级排序的前五个模型中,存在于注入目录且未明确标记为 "disabled" 的模型。显式的 "v2" 标记支持递归子代理;"v1"null 和缺失的标记仍可作为叶子子代理。被排除的条目仍会保留在配置中,以便将来重新变为可用。

界面检测使用工具形状来判断。带命名空间的 spawn_agent,如果具有 send_inputresume_agentclose_agent,就是 v1。平铺的 spawn_agent,如果具有 send_messagefollowup_taskinterrupt_agentlist_agents,就是 v2。

V1 引导只会在 maxultra 时以主动文本形式出现。V2 只有在存在首选模型、可用名单或回退链时,才会收到代理生成的开发者消息。内置 v2 引导有 700 个字符的预算,必要时会先删减名单。引导会在 replay prefix 之间去重,并插入到末尾的 compaction_trigger 之前。

内置 v2 子代理引导和自定义 injectionPrompt 正文都使用 <opencodex_subagent_guidance>,与 Codex 原生的 <multi_agent_mode> 消息区分开来。内置文本会说明解析后的首选模型、名单和回退链,但不会指示委派、模型覆盖或 fork_turns。自定义正文的占位符替换和内容保持不变。除非启用了原生默认值同步,injectionModelinjectionEffort 仍只是建议;自定义占位符的缺失值仍替换为空字符串。

replay 去重会分别与每类标签的最新文本进行精确比较。当两个值都使用新的代理标签时,从自定义引导切回内置形式会追加当前的引导内容;期间原生模式的变化不会导致未改变的代理引导被重复添加。现有的原生消息历史和带旧标签的历史都会保留。更换包装标签并不能确定旧消息的作者,也不会撤销先前的指令;对于混合版本的历史,不能仅凭旧标签进行分类,也不保证检测到这类历史中的设置切换。

启用后,syncCodexSubagentDefaults 会写入由标记拥有的 [agents] default_subagent_modeldefault_subagent_reasoning_effort 字段。现有的、未标记的用户拥有目标字段会被视为冲突,并保持其权威性;不完整或含糊的 TOML 写入会以失败关闭。清空 injectionModel 也会同时清除该可选项。这些默认值只影响新创建的 Codex 任务,本身不会导致委派。

派生子轮次的回退顺序如下:

  1. 请求的主模型;
  2. subagentModelFallbackByModel 中的 per-model 链(按主模型做键);然后是
  3. 全局 subagentModelFallback 条目。

per-role fallback 链必须放在 opencodex 配置里。把 model_fallback 写进 $CODEX_HOME/agents/*.toml 会让 Codex 0.146+ 把整个角色文件当作未知字段拒绝并跳过该角色 (#1190)。TOML 中的旧版 model_fallback 仍会被读取以保持向后兼容,但 ocx doctor 会标记它。

opencodex 会跳过已禁用、不可路由、不健康、处于冷却中,或已达到配额阈值的候选项。可用性快照会在 subagentModelFallbackPollMs 期间缓存。对于加密的子任务,候选链只包含规范的原生 ChatGPT 目标,以及通过 allowEncryptedV2AgentTasks: true 明确信任的直接密钥认证 Responses 路由。如果没有目标能处理加密载荷,且可选恢复无法支持路由发送,请求就会失败,不会转发不可读的密文。combo 会先尝试可用的规范原生目标;如果没有可选择的原生目标或原生尝试已耗尽,且已启用 agentTaskRecovery,会在路由到 combo 目标前对加密的 NEW_TASK 恢复一次。combo 恢复只在 spawn 出的子回合生效;直接路由路径还会恢复会话中途的模型切换。

{
"multiAgentMode": "v2",
"subagentModels": ["gpt-5.5", "anthropic/claude-sonnet-5"],
"injectionModel": "gpt-5.5",
"injectionEffort": "high",
"syncCodexSubagentDefaults": true,
"subagentModelFallback": ["gpt-5.6-luna"],
"subagentModelFallbackByModel": {
"gpt-5.5": ["gpt-5.6-luna"]
},
"subagentModelFallbackPollMs": 60000,
"subagentEffortCap": "high"
}

新配置不会写入 plaintextV2AgentMessages。只有显式设置为 true 才会启用。调用方必须使用 Responses 格式,最终目标必须采用规范的 ChatGPT Codex 转发配置,即 adapter: "openai-responses"authMode: "forward" 和准确的基础地址 https://chatgpt.com/backend-api/codex。OpenAI API key provider、自定义 OpenAI 兼容网关、最终发往其他 provider 的请求,以及非 Responses 调用都不会被改写。

对于符合条件的 v2 请求,opencodex 只识别顶层 collaboration namespace,而且它必须直接包含 spawn_agent。原生 ChatGPT 收到请求前,opencodex 会删除 spawn_agentsend_messagefollowup_task 中已有的 parameters.properties.message.encrypted: true。ChatGPT 会按保留的 collaboration namespace 和三个工具名处理消息,因此请求会给这四个名称使用固定的临时别名。 修改前,opencodex 会检查顶层和 additional_tools 工具目录、嵌套 namespace、 tool_search_output 声明、tool_choice 和历史调用项。只要发现私有 namespace 或固定别名冲突, 整个请求就保持原样。opencodex 只会在 JSON、SSE 和 WebSocket 响应中恢复本次请求生成的别名, 并保留 encrypted_function_args: [],让兼容的 Codex 客户端把参数识别为明文。

这个选项不会增加恢复请求,也不会使用 agentTaskRecovery 在缓存未命中时产生的额外 ChatGPT 配额。它只能影响新工具调用,不能修改已有密文。请求已占用私有名称或有冲突引用时,opencodex 会保持该请求不变;若它后来生成加密的路由子任务,单独启用的 agentTaskRecovery 仍可处理。ChatGPT 拒绝或忽略修改后的 schema,或 Codex 客户端不识别明文响应字段时,调用可能失败。opencodex 不会用原 schema 自动重发父请求,因为重发可能重复消耗配额或重复执行工具。

每个响应的恢复检查最多处理 10,000 个身份位置。达到限制时,JSON 响应返回 HTTP 502,流式响应返回 response.failed。这两种情况都不会把私有别名发给 Codex,也不会保存该响应供后续 previous_response_id 继续使用。

成功改写后,这个选项会取消代理消息参数的应用层加密。HTTPS 仍会加密网络传输,但消息文字可能出现在 Codex 任务历史、外部模型请求、responses-state.json 及其 spill 文件,以及启用调试记录时的 usage-debug.jsonl。该行为依赖 ChatGPT 未公开的 schema 和响应字段,后端或客户端更新后可能失效。 服务启动时会打印警告。

{
"plaintextV2AgentMessages": true
}

等价命令是 ocx config set plaintextV2AgentMessages true。修改后重启代理。

上限只适用于 v2 协作功能:当主轮次的工具暴露 v2 时,它就符合条件;当子轮次在 x-codex-turn-metadata 中带有 codex-rs 的精确 x-openai-subagent: collab_spawn"subagent_kind": "thread_spawn" 标记时,它也符合条件,即使叶子工具已经不再暴露协作。V1 主轮次、multiAgentMode: "v1"、压缩、审查以及记忆整合轮次都会绕过上限。

上限只会降低 effort。它们会向下贴合到不高于上限、且模型公开的最高档位。如果模型没有 effort 控制,或者没有任何受支持的档位可用,opencodex 会移除 effort,让提供方默认值生效。maxultra 都可接受,而仪表板提供 lowxhigh

即使没有设置模型 effort pin,符合条件的原生 Chat Completions 轮次也会应用配置的上限。仅在应用 pin 或上限改变值时才映射为提供方的传输值;两者都未发生时,原生调用方值保留原始写法。

关于 v1、default 和 v2 行为的面向初学者说明,请参阅 Sub-agent surfaces