犀牛鸟 2026 研究笔记 estelledc.github.io

Codex 总架构精读

调研时间:2026-06-22 源码 commit:98845e4(2026-06-22) 本地 CLI:codex-cli 0.125.0 仓库:openai/codex(Apache-2.0)

一句话定位

Codex 是 OpenAI 的生产级开源 Coding Agent 运行时——用 Rust 实现一套统一的 Agent 核心(Codex Core),通过 App Server(JSON-RPC 2.0)对外暴露,让 CLI、IDE 扩展、Web 等多个 Surface 共享同一份 agent loop、工具编排、沙箱隔离和记忆管线。


日常类比

把 Codex 想象成一家全国性银行的 IT 系统:

类比边界:银行系统是事务制(一次转账完成即止),而 Codex Core 是 turn loop——一轮对话中模型可以反复调用工具、等待审批、再调用,直到 agent 自行判断任务完成。


架构总览

flowchart TB
  subgraph surfaces["Surfaces(UI 渠道)"]
    CLI["TUI / CLI<br/><small>codex-rs/tui</small>"]
    IDE["VS Code Extension<br/><small>codex app-server 客户端</small>"]
    Web["Codex Web<br/><small>chatgpt.com/codex</small>"]
    App["Codex App (Desktop)<br/><small>codex app</small>"]
  end

  subgraph app_server["App Server(协议层)"]
    RPC["JSON-RPC 2.0<br/>stdio / unix socket / ws"]
    TM["Thread Manager<br/>多会话生命周期"]
  end

  subgraph core["Codex Core(agent 引擎)"]
    Session["Session<br/>配置 + 历史 + 状态"]
    Turn["run_turn()<br/>agent 主循环"]
    TO["ToolOrchestrator<br/>审批→沙箱→执行→重试"]
    Compact["Compact<br/>上下文压缩"]
  end

  subgraph sandbox["安全层"]
    SB["SandboxManager"]
    Seatbelt["macOS Seatbelt"]
    BWrap["Linux bubblewrap"]
    Landlock["Linux Landlock"]
    WinSB["Windows Sandbox"]
  end

  subgraph state["持久化"]
    DB[("SQLite State DB<br/><small>codex-rs/state</small>")]
    Mem["~/.codex/memories/<br/><small>git-baseline 文件系统</small>"]
  end

  subgraph extensions["扩展面"]
    MCP["MCP Servers"]
    Skills["Skills + Plugins"]
    Hooks["Hooks<br/>SessionStart / TurnStop / PermissionRequest"]
    MultiAgent["MultiAgentV2<br/>spawn / wait / send"]
  end

  CLI --> RPC
  IDE --> RPC
  Web --> RPC
  App --> RPC
  RPC --> TM
  TM --> Session
  Session --> Turn
  Turn --> TO
  TO --> SB
  SB --> Seatbelt
  SB --> BWrap
  SB --> Landlock
  SB --> WinSB
  Turn --> Compact
  Turn -.-> DB
  Mem -.-> Session
  Turn --> MCP
  Turn --> Skills
  Turn --> Hooks
  Turn --> MultiAgent

核心 Crate 依赖表

Codex Rust workspace 共 120+ crate,下面只列最关键的 7 个层,按依赖方向从上到下:

Crate 路径 职责 证据
app-server codex-rs/app-server/ JSON-RPC 协议层,暴露 Thread/Turn/Item 原语;管理多连接、实验性 API opt-in [源码][文档]
core codex-rs/core/ Agent 引擎:Session、run_turn 循环、工具执行、compact、prompt 组装 [源码]
sandboxing codex-rs/sandboxing/ OS 级沙箱抽象:按平台选择 Seatbelt/bubblewrap/Landlock/Windows sandbox [源码]
execpolicy codex-rs/execpolicy/ 命令白名单/黑名单规则引擎,决定 Skip/NeedsApproval/Forbidden [源码]
memories codex-rs/memories/{read,write} 两阶段 AI memory pipeline:Phase1 提取 + Phase2 全局合并 [源码][文档]
state codex-rs/state/ SQLite 持久层:thread、rollout、memory stage-1 输出、watermark [源码]
protocol codex-rs/protocol/ 共享类型定义:Event、Submission、ResponseItem、ToolCall 等 [源码]

辅助 crate 速览(不展开精读):


数据流:一次完整的 Turn

从用户输入到 agent 回复,完整经过以下阶段:

┌─────────────────────────────────────────────────────────────┐
│ Surface (VS Code / CLI / Web)                              │
│   用户输入 "帮我重构这个函数"                                │
└──────────────────────────────┬──────────────────────────────┘
                               │ JSON-RPC: turn/start
                               ▼
┌─────────────────────────────────────────────────────────────┐
│ App Server                                                  │
│   validate → find/create Thread → dispatch to Core          │
└──────────────────────────────┬──────────────────────────────┘
                               │ Submission::TurnInput
                               ▼
┌─────────────────────────────────────────────────────────────┐
│ Codex Core: run_turn()                                      │
│                                                             │
│  ┌─── loop ───────────────────────────────────────────┐    │
│  │ 1. 构建 prompt(AGENTS.md + skills + history)       │    │
│  │ 2. stream → model API(responses endpoint)          │    │
│  │ 3. 收到 tool_call?                                   │    │
│  │    ├── YES → ToolOrchestrator                        │    │
│  │    │   ├── ExecPolicy 决策                           │    │
│  │    │   ├── Approval(hook → guardian → user)        │    │
│  │    │   ├── SandboxManager 选择沙箱                   │    │
│  │    │   ├── 执行 tool → 结果回写 history              │    │
│  │    │   └── sandbox 拒绝? escalation 重试             │    │
│  │    └── needs_follow_up = true → continue             │    │
│  │ 4. 收到 end_turn / assistant message                 │    │
│  │    └── needs_follow_up = false → break               │    │
│  │ 5. token limit? → auto compact → continue            │    │
│  └────────────────────────────────────────────────────┘    │
│                                                             │
│  → return last_agent_message                                │
└──────────────────────────────┬──────────────────────────────┘
                               │ Event stream (notifications)
                               ▼
┌─────────────────────────────────────────────────────────────┐
│ App Server → Surface                                        │
│   item/started, item/agentMessage/delta, turn/completed     │
└─────────────────────────────────────────────────────────────┘

关键代码:Agent 主循环

文件:codex-rs/core/src/session/turn.rs

// run_turn 的核心 loop(简化)
loop {
    // 1. 检查是否需要 compact
    if should_compact { run_inline_auto_compact_task(...).await; }

    // 2. 构建 sampling input(含完整 history + system prompt)
    let input = build_sampling_request_input(&sess, &turn_context).await;

    // 3. 流式调用模型 + 处理 tool calls
    let (result, _items) = run_sampling_request(
        &sess, &turn_context, &mut client_session, input, &cancel,
    ).await?;

    // 4. 决定是否继续循环
    if result.needs_follow_up {
        continue; // model 请求了 tool call,循环继续
    } else {
        run_stop_hooks(...).await;
        break;    // 任务完成
    }
}

[源码] try_run_sampling_request 内部使用 FuturesOrdered 并发执行多个 tool call,而非顺序等待——这是 Codex 的 turn 内并行 能力。


核心设计决策

1. Harness 统一,Surface 分离

Codex 的核心洞察:Agent loop 只写一份,所有 UI 通过 App Server 说话 [源码][文档]。

这意味着:

对比:Claude Code 各 surface 也共享 core,但 core 是 TS/Bun 实现;Codex 选择 Rust + 显式 IPC 协议层。

2. Turn Loop + 工具级并行

Codex 的编排模型是 turn-by-turn loop(不是有向图)[源码]:

这比 LangGraph 的有向图编排更简单,但也意味着编排逻辑完全依赖模型的 tool call 决策。

3. 安全在 OS 层

bubblewrap / Seatbelt / Landlock 是 OS 内核级隔离 [源码]:


与 Claude Code 的差异(待 Agent A 核对)

维度 Codex Claude Code
开源程度 Apache-2.0 全源码可读 闭源(社区通过泄露包分析)
实现语言 Rust(~96%),120+ crate workspace TypeScript / Bun 运行时
多 Surface 协议 显式 App Server + JSON-RPC 2.0 各 surface 直接链接 core 模块
编排模型 Turn loop + ToolOrchestrator 状态机 Dynamic Workflow(JS 脚本编排)
沙箱 OS 内核级(Seatbelt/bwrap/Landlock) Permission classifier + 应用层限制

具体差异点(公开层面推断):


局限性


证据等级汇总

结论 来源
Codex Core 是 Rust workspace,120+ crate [源码] Cargo.toml
Agent 主循环在 run_turn(),turn 内并行 tool calls [源码] session/turn.rs
App Server 使用 JSON-RPC 2.0,支持 stdio/unix/ws [源码][文档] app-server/README.md
SandboxManager 按平台选择 Seatbelt/bwrap/Landlock [源码] sandboxing/src/manager.rs
Memory 两阶段 pipeline(Phase1 + Phase2) [源码][文档] memories/README.md
ExecPolicy 三层配置(内置→用户→项目) [源码] exec_policy.rs
AGENTS.md 从项目根到 cwd 逐层叠加 [源码] agents_md.rs
本地 CLI 版本 0.125.0 [实测]