Codex CLI 源码拆解:OpenAI 的 Rust Agent 运行时——为什么重写能解决 Node.js 的"生死问题"

人工智能Agent 2026-06-27 24
预计阅读时间:16 分钟

三角对照: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 异步运行时 + 真并发 | Codex CLI 五层架构图

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)
};

内置工具一览(从源码提取): shellunified_execapply_patchmcpplanrequest_permissionsrequest_user_inputtool_searchview_imagecurrent_timemulti_agentsagent_jobsnew_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
暂无评论,来发表第一条评论吧

发表评论

登录 后发表评论

发现更多