三角对照:Claude Code 子进程模型 → Codex 多宿主架构 → Hermes 单循环
TL;DR
Codex CLI 是 OpenAI 的编程 Agent CLI。它经历了一次彻底的语言重写——从 TypeScript/Node.js 整体迁移到 Rust。这不是为了"更快"或"更酷",而是 OpenAI 官方承认 Node.js 在企业部署中"令人沮丧甚至成为阻碍"。
Rust 重写带来了三个根本性变化:跨平台原生沙箱(macOS Seatbelt / Linux Landlock / Windows ACL——不是 Docker 外挂)、多宿主统一核心(CLI/TUI/IDE/Web 共享同一个 Rust 引擎)、零运行时依赖(不需要 Node.js、不需要 npm)。
本文从 60+ crate 的 Rust workspace 拆解 Codex 的五层架构、run_turn 主循环、跨平台沙箱模型、AGENTS.md 项目记忆系统,并与 Claude Code(Node.js 子进程)和 Hermes(Python 单循环)做三角对照——三种语言,三种哲学,一个共同的工程终点。
一、先看全貌:从 Node.js 到 Rust 的生死抉择
1.1 为什么 OpenAI 放弃了 TypeScript?
2025 年 6 月,OpenAI 在一个 PR 中把整个 Codex CLI 的 TypeScript 代码库替换为 Rust。官方给出的理由有三条:
"Node.js can be frustrating or a blocker for some users. Rust gives us better performance, security, and avoids dependence on Node.js entirely." 翻译成工程语言: | 原 Node.js 问题 | Rust 解决的 | |---|---| | 安装需要 Node.js 18+ 和 npm | 单个原生二进制,零依赖 | |
node_modules膨胀、版本冲突 | 静态编译,无运行时 | |child_process沙箱靠 Docker | 系统级沙箱(Seatbelt/Landlock/ACL) | | JavaScript 单线程瓶颈 | Rust 异步运行时 + 真并发 |
1.2 宏观结构:TypeScript 壳 + Rust 核心
codex-main/
├── codex-cli/bin/codex.js # TypeScript 薄壳:平台检测 → 启动原生二进制
├── codex-rs/ # Rust Workspace(60+ crate)
│ ├── cli/ # CLI 参数解析
│ ├── tui/ # TUI(ratatui + crossterm)
│ ├── exec/ # 无交互模式
│ ├── core/ # ★ Agent 大脑:Session/Turn/Context/ModelClient
│ ├── protocol/ # Op/Event 核心协议
│ ├── app-server/ # IDE/桌面宿主
│ ├── app-server-protocol/ # JSON-RPC v1/v2
│ ├── tools/ # 工具注册表
│ ├── sandboxing/ # 跨平台沙箱抽象层
│ ├── linux-sandbox/ # Landlock + bubblewrap
│ ├── windows-sandbox-rs/ # 受限 token + ACL + WFP
│ ├── core-skills/ # 技能系统
│ ├── core-plugins/ # 插件系统
│ └── thread-store/ # 线程/会话持久化
└── sdk/ # Python / TypeScript SDK
关键设计:TypeScript 只做一件事——codex-cli/bin/codex.js 检测操作系统和 CPU 架构,找到对应平台的 Rust 二进制,spawn 它。整个 Agent 逻辑全部在 Rust 侧。
1.3 三角对照:技术栈选择
| Claude Code | Hermes Agent | Codex CLI | |
|---|---|---|---|
| 核心语言 | TypeScript (Node.js) | Python | Rust |
| 入口 | npm @anthropic-ai/claude-code |
Python run_conversation() |
npm @openai/codex → 原生二进制 |
| 运行时依赖 | Node.js 18+ | Python 3.10+ | 零(静态编译) |
| 沙箱实现 | Docker (CLI Runner) | execute_code 沙箱 | 系统级(Seatbelt/Landlock/ACL) |
| TUI 框架 | Ink (React) | 无(终端模式) | ratatui + crossterm |
| 并发模型 | 单线程 event loop | 单线程 | 异步运行时 (Tokio) |
| --- | |||
| ## 二、五层架构:协议驱动的 Agent Runtime | |||
| Codex 的架构可以清晰地划分为五层。每一层都是独立的 crate,通过 trait 解耦。 | |||
| ### 2.1 用户入口层:多宿主设计 | |||
| Codex 是三个框架中唯一支持多宿主的——同一个 core 引擎同时服务五种入口: | |||
| 入口 | 用途 | 实现 | |
| ------ | ------ | ------ | |
| CLI | 命令行一次性任务 | cli/ 解析参数 → core |
|
| TUI | 交互式终端 REPL | tui/ 渲染 UI → core |
|
| exec | CI/CD 非交互模式 | exec/ 静默执行 |
|
| App Server | IDE 插件宿主 | app-server/ JSON-RPC 服务 |
|
| MCP Server | 标准工具协议 | codex-mcp/ 暴露为 MCP Server |
|
| 这一点 Claude Code 和 Hermes 都做不到。Claude Code 只有 CLI+TUI,Hermes 只有 terminal+WebUI。Codex 的"一份 core 服务五种宿主"是 Rust trait 抽象能力的直接体现。 | |||
| ### 2.2 协议层:SQ/EQ 事件驱动 | |||
| Codex 的核心通信不是函数调用,而是事件队列: |
Submission Queue (Op) → 用户提交操作
UserTurn → 发起对话轮次
Interrupt → 中断当前执行
ConfigureSession → 修改会话配置
Event Queue (EventMsg) ← Agent 推送事件
TurnStarted ← 轮次开始
AgentMessageDelta ← 流式文本增量
ExecCommandBegin ← 开始执行命令
ToolCallRequest ← 请求工具调用
PermissionRequest ← 请求权限审批
设计好处:
- 多端统一消费——IDE 插件和 CLI 监听同一个 Event 流
- 实时流式——AgentMessageDelta 支持逐字推送
- 可录制可回放——Ops 和 Events 共同构成完整审计日志
2.3 核心层:run_turn 主循环
codex-rs/core/src/session/turn.rs 中的 run_turn 是 Codex 的"心跳"。简化后的伪代码:
// codex-rs/core/src/session/turn.rs
pub async fn run_turn(session: &mut Session) -> Result<AgentMessage> {
// 0. 创建 ModelClientSession(每 turn 独立,不跨 turn 复用)
let client_session = create_model_client_session(session).await?;
// 1. 上下文过长 → 先压缩
run_pre_sampling_compact_if_needed(session).await?;
// 2. 构建上下文:AGENTS.md + 技能 + 插件 + 工具声明 + 环境信息
let context = build_context(session)?;
// 3. 执行 hooks + 记录输入
run_pre_turn_hooks(session).await?;
// 4. 进入循环
loop {
let output = run_sampling_request(&client_session, &context).await?;
if output.needs_tool_follow_up {
// 模型请求工具调用 → 执行 → 结果注入历史 → 继续
execute_tools_and_record(&output.tool_calls).await?;
continue;
}
if has_pending_interrupt().await {
// 有中断信号 → 处理 → 继续
continue;
}
// 模型返回普通文本 → 记录 → 结束 turn
return Ok(output.last_agent_message);
}
}
与 Hermes 的 run_conversation() 对比:
| | Hermes Agent Loop | Codex run_turn |
|---|---|---|
| 实现语言 | Python | Rust |
| 模型通信 | HTTP POST 同步 | WebSocket prewarm + SSE 流式 |
| 上下文压缩 | budget 超限 → compact | 预采样检测 → compact |
| 工具执行 | 同步逐个执行 | 异步并发(RwLock 分离读写) |
| 中断处理 | 无 | CancellationToken + 安全取消 |
2.4 工具层:类型安全 + 并行控制
Codex 的工具系统用 Rust 的类型系统做了 Claude Code 和 Hermes 都做不到的事——编译期安全检查。
// tools/registry.rs
pub trait ToolHandler: Send + Sync {
fn name(&self) -> &str;
fn description(&self) -> &str;
fn input_schema(&self) -> serde_json::Value;
async fn execute(&self, input: serde_json::Value) -> Result<ToolOutput>;
}
并行控制(tools/parallel.rs):
// 只读工具共享读锁,有副作用的工具拿写锁
let lock = if tool.is_read_only() {
RwLock::read(&self.parallel_state)
} else {
RwLock::write(&self.parallel_state)
};
内置工具一览(从源码提取):
shell、unified_exec、apply_patch、mcp、plan、request_permissions、request_user_input、tool_search、view_image、current_time、multi_agents、agent_jobs、new_context_window
三、跨平台沙箱:三重原生隔离
Codex 的安全模型是三个框架中最底层的——不是靠 Docker 外挂,不是靠用户确认,而是靠操作系统原生的强制访问控制。
3.1 三层沙箱对照
| 操作系统 | Codex 沙箱 | 原理 |
|---|---|---|
| macOS | Seatbelt (sandbox-exec) | 内核级沙箱,限制文件系统/网络/进程 |
| Linux | Landlock + bubblewrap (linux-sandbox/) |
无特权沙箱,Linux 5.13+ 原生支持 |
| Windows | 受限 Token + ACL + WFP (windows-sandbox-rs/) |
Windows 安全子系统原生机制 |
| ### 3.2 沙箱抽象层 |
// sandboxing/src/lib.rs
pub struct SandboxCommand {
pub executable: PathBuf,
pub args: Vec<String>,
pub env: HashMap<String, String>,
pub working_dir: PathBuf,
pub network_access: NetworkPolicy, // None | LocalOnly | Full
pub filesystem_access: FilesystemPolicy, // ReadOnly | WorkspaceWrite | Full
}
三种网络策略:
- None:完全断网(Full Auto 模式默认)
- LocalOnly:只允许 localhost
- Full:允许外网(需用户审批)
三种文件系统策略:
- ReadOnly:只读项目文件
- WorkspaceWrite:只能写项目目录
- Full:完全访问(YOLO 模式)
3.3 三角对照:安全模型进化
| Claude Code | Hermes Agent | Codex CLI | |
|---|---|---|---|
| 沙箱方式 | Docker 容器(CLI Runner) | execute_code 进程隔离 | 系统级(Seatbelt/Landlock/ACL) |
| 网络控制 | Docker network | 无 | SandboxCommand.network_access |
| 文件控制 | Docker volume mount | 无 | SandboxCommand.filesystem_access |
| 跨平台 | Docker 依赖 | Python 通用 | 三平台原生 |
| 零依赖 | ❌(需 Docker) | ✅ | ✅(内核 API) |
| --- | |||
| ## 四、上下文工程:AGENTS.md + Prompt Cache | |||
| ### 4.1 AGENTS.md:项目级记忆 | |||
| Codex 的 AGENTS.md 等同于 Claude Code 的 CLAUDE.md——项目规则文件,但设计更精细: |
发现顺序(从当前目录向上到 .git 根):
./AGENTS.md
../AGENTS.md
../../AGENTS.md
...直到 .git 根目录
覆盖规则:
AGENTS.override.md 覆盖同目录的 AGENTS.md
(Claude Code 用 .local.md 实现类似效果)
限制:project_doc_max_bytes,默认约 50KB——比 Hermes 的 25KB Memory.md 和 Claude Code 的 Auto-Memory 都大。
4.2 上下文组成
每次 turn 的上下文由以下部分组装: 1. 系统提示:role、capabilities、tools 声明 2. AGENTS.md:项目规则,按目录逐层收集 3. 技能说明:按需注入当前匹配的 skills 4. 插件上下文:已安装插件的指令 5. 对话历史:含工具执行结果 6. 环境信息:cwd、OS、shell 类型、日期、项目结构提示
4.3 Prompt Cache 优化
Codex 在上下文构建上有明确的性能意识:
"避免频繁改变模型可见上下文前缀,以提升缓存命中率。Codex 倾向于结构稳定、增量变化的上下文构建。" 这与 Hermes 的"System Prompt 按 skill 动态拼接"形成对比——Hermes 每次请求的 System Prompt 都可能不同,缓存命中率天然低于 Codex 和 Claude Code 的"固定前缀 + 增量追加"策略。
4.4 三角对照:记忆与上下文
| Claude Code | Hermes Agent | Codex CLI | |
|---|---|---|---|
| 项目规则文件 | CLAUDE.md ×3 | SOUL.md + skills/ | AGENTS.md ×N(逐层收集) |
| 记忆大小限制 | 25KB Auto-Memory | PG 无上限 | 50KB AGENTS.md |
| 上下文构建 | 固定前缀 + 增量 | 动态拼接(skill 注入) | 固定前缀 + 增量 |
| Prompt Cache 友好度 | 高 | 低(每次不同) | 高 |
| 压缩策略 | /compact 手动 |
budget 自动压缩 | 预采样检测 + 自动 compact |
| --- | |||
| ## 五、多 Agent:multi_agents + agent_jobs | |||
| ### 5.1 Codex 的子 Agent 模型 | |||
| Codex 在 v0.137.0(2026 年 6 月)引入了 multi-agent v2: | |||
- multi_agents 工具:主 Agent 可以 spawn 子 Agent |
|||
- agent_jobs 工具:批量作业调度 |
|||
| - 每个子 Agent 的运行时保存在 thread 中,独立于主 thread | |||
- hide_spawn_agent_metadata 默认 true——子 Agent 的内部元数据对用户透明 |
|||
与 Claude Code 的 @agent-name 对比: |
|||
| Claude Code | Codex CLI | ||
| --- | --- | --- | |
| 调用方式 | @agent-name task |
multi_agents 工具调用 |
|
| 配置 | .claude/agents/*.md |
thread 级别配置 | |
| 元数据可见性 | 可见 | 默认隐藏 (v2) | |
| 运行时隔离 | fork() 子进程 | thread 内隔离 | |
| ### 5.2 三角对照:多 Agent 实现终局 | |||
| Claude Code | Hermes Agent | Codex CLI | |
| --- | --- | --- | --- |
| 实现语言 | TypeScript | Python | Rust |
| 调用接口 | @agent-name(最简洁) |
delegate_task(工具层) |
multi_agents(工具层) |
| 进程隔离 | fork() | 子进程 | thread 内隔离 |
| 并行上限 | 无硬限制 | 5 | 无硬限制 |
| 版本 | 稳定 | v0.16 引入 | v0.137.0 v2 |
| --- | |||
| ## 六、完整数据流:从用户输入到结果返回 |
用户输入 "Refactor auth module"
│
▼
┌──────────────────────────────────────┐
│ 1. codex-cli/bin/codex.js │ TypeScript 壳
│ 检测平台 → spawn Rust 二进制 │
└──────────────┬───────────────────────┘
▼
┌──────────────────────────────────────┐
│ 2. cli/ 解析命令 │ Rust
│ codex exec "Refactor auth module" │
└──────────────┬───────────────────────┘
▼
┌──────────────────────────────────────┐
│ 3. core/ 创建 Session + Thread │
│ 加载 AGENTS.md ×3 │
│ 加载 Skills / Plugins │
│ 初始化 ModelClientSession │
└──────────────┬───────────────────────┘
▼
┌──────────────────────────────────────┐
│ 4. run_turn 主循环 │
│ ┌─ build_context() │
│ ├─ run_sampling_request() │
│ │ └─ OpenAI Responses API │
│ │ (WebSocket prewarm) │
│ ├─ [工具调用?] → execute_tools() │
│ │ ├─ sandboxing::sandbox_cmd() │
│ │ ├─ Seatbelt/Landlock/ACL │
│ │ └─ 结果写入历史 │
│ └─ [文本?] → 记录 → 结束 turn │
└──────────────┬───────────────────────┘
▼
┌──────────────────────────────────────┐
│ 5. protocol/ 推送 Event 给所有宿主 │
│ AgentMessageDelta → TUI 流式显示 │
│ PermissionRequest → IDE 弹窗 │
└──────────────────────────────────────┘
七、终局对照:四维选型矩阵
| 维度 | Claude Code | Hermes Agent | Codex CLI |
|---|---|---|---|
| 最佳场景 | 终端编程助手 | 深度定制 Agent 运行时 | 企业级多宿主 Agent 平台 |
| 核心语言 | TypeScript | Python | Rust |
| 运行时依赖 | Node.js 18+ | Python 3.10+ | 零 |
| 沙箱 | Docker | execute_code | 系统级原生 |
| 多宿主 | CLI + TUI | Terminal + WebUI | CLI/TUI/IDE/Web/MCP |
| 多 Agent | @agent-name | delegate_task | multi_agents v2 |
| 项目记忆 | CLAUDE.md (25KB) | SOUL + skills + Hindsight PG | AGENTS.md (50KB ×N 层) |
| 语义记忆 | ❌ | ✅ pgvector 472ms | ❌ |
| 协议标准 | ACP + MCP | 自研 | ACP + MCP + JSON-RPC |
| TUI 框架 | Ink (React) | 无 | ratatui (Rust) |
| 学习曲线 | 低 | 中 | 中 |
| 编译/启动 | npm install | pip install | 单二进制下载 |
| --- | |||
| ## 八、总结:三种语言,一个终局 | |||
Claude Code(TypeScript / Node.js):务实路线。 npm 生态最大公约数,@agent-name 是最简洁的多 Agent 接口。代价是 Node.js 运行时依赖 + Docker 沙箱外挂。适合个人开发者快速上手。 |
|||
| Hermes Agent(Python):深度路线。 Hindsight PG + pgvector 语义记忆是独一无二的护城河。四层安全防御(Prompt → Policy → Terminal → Vault)从系统层拦截威胁。代价是通道少、无标准协议。 | |||
| Codex CLI(Rust):工程化路线。 零运行时依赖 + 系统级原生沙箱 + 五入口多宿主——这是三个框架中工程化程度最高的。不是"写代码更快",而是"部署到生产更安全"。Rust 的类型系统和异步运行时让 60+ crate 的 workspace 保持可维护。 | |||
| 共同终局:三个框架在子进程隔离、协议标准化(ACP/MCP)、项目记忆文件(CLAUDE.md / AGENTS.md / SOUL.md)上走向了同一个方向。差异在实现深度——Codex 把沙箱做到了内核层,Hermes 把记忆做到了数据库层,Claude Code 把交互做到了对话层。 | |||
| > 下一篇预告:Cursor/Windsurf Agent 拆解——IDE 内嵌 Agent 的架构设计,与 CLI Agent 的本质差异。 |
本文由 admin 原创,转载请注明出处。

评论
0