Multi-Agent¶
Codex 的 multi-agent 不是简单开多个模型请求。它把每个子 agent 表示为一个独立 thread,并用 AgentControl 维护 root thread 范围内的 agent registry、spawn 限额、residency、inter-agent communication 和 fork 语义。
AgentControl¶
codex-rs/core/src/agent/control.rs 说明:AgentControl 在一个 root session tree 内共享。它持有:
session_id:root 与所有 sub-agent 共享。Weak<ThreadManagerState>:避免引用环。AgentRegistry:记录 agent metadata、状态和 parent/child 关系。V2Residency:multi-agent v2 的 resident thread 管理。AgentExecutionLimiter:spawn/执行容量限制。RolloutBudget:agent 树共享 rollout budget。
Spawn Agent¶
spawn 逻辑在 codex-rs/core/src/agent/control/spawn.rs:
- 根据 config 和 session source 解析 multi-agent version。
- 检查执行容量和 spawn 深度。
- 如果是 v2 resident source,预留 residency slot。
- 预留 agent registry slot。
- 继承 parent environments、exec policy、multi-agent mode。
- 根据
fork_mode决定新线程或 forked thread。 - 注册 metadata,通知 parent,并提交初始操作。
Fork Mode¶
SpawnAgentForkMode 支持:
FullHistoryLastNTurns(usize)
fork 时不会盲目复制所有 rollout item。keep_forked_rollout_item 会保留 system/developer/user message、final assistant answer、必要的 TurnContext、compacted/event/session metadata;丢弃 reasoning、tool call、tool output 等不适合直接放入子线程的中间项。
V2 Residency¶
codex-rs/core/src/agent/control/residency.rs 实现 LRU resident thread 管理:
reserve_slot会先尝试预留 pending slot。- 容量满时扫描 resident candidates。
- 只卸载 completed、errored、interrupted 且没有 active turn、没有 pending mailbox 的线程。
- 卸载前确保 rollout materialized,再 shutdown 并从 live thread map 移除。
- protected thread 不会被本次卸载选中。
这让 v2 sub-agent 可以按需恢复,同时控制 live thread 数量。
Inter-Agent Communication¶
父子 agent 之间使用 InterAgentCommunication 作为 protocol item。它可以作为 fork turn boundary,也会更新 agent 的 last task message。这样 UI 可以展示每个 agent 当前任务,而不是只知道它“正在跑”。
工具暴露¶
multi-agent 工具分 v1/v2:
- v1:spawn、send input、wait、close、resume 等。
- v2:list agents、spawn、send message、wait、interrupt、followup task 等。
这些工具仍然通过 ToolRouter -> ToolRegistry -> ToolCallRuntime 进入统一工具 harness。
可学习的设计¶
Multi-agent 的关键不是并发本身,而是 residency 和历史继承:
- 每个 agent 是 thread,天然复用持久化、压缩、权限和工具系统。
- fork 时按 turn boundary 和 item 类型清洗历史。
- v2 用 LRU resident 管理控制资源。
- inter-agent communication 是协议对象,而不是普通字符串。