Codex 源码导读:第一部分——工程分层

文章来源声明: 原文作者:美好世界; 来源站点:掘金; 原文链接:https://juejin.cn/post/7689263358285856819; 本文基于上述来源整理/加工,觅优补充点评,仅供技术学习交流。版权归原作者所有。
觅优短评

对想读 Codex 源码的工程师很有价值:先建立分层主干再按推荐顺序深入 core 与编排循环,能少走弯路,适合架构学习、技术选型与二次开发参考。

Codex 源码导读:第一部分——工程分层 ---------------------

本文基于 OpenAI Codex 开源仓库当前检出的源码,而不是根据产品界面推测。这里的“层”是便于理解职责和运行路径的概念分层:Rust crate 之间可以跨层依赖,不能把它误解成严格的六层网络协议。

先给结论:Codex 不是单一的 CLI,也不是单一的视图

Codex 是一个本地运行的 coding agent 系统。codex CLI 是最常见的产品入口;codex-rs/tui 是运行在终端里的交互视图;IDE、桌面 App 这类富客户端则可以通过 codex-rs/app-server 接入。它们共享核心的 agent 业务逻辑:codex-rs/core。

因此更准确的结构是:多个交互入口 → 一套 agent runtime → 模型、上下文、工具与安全能力。

仓库的物理结构

仓库根目录并非所有代码都直接放在一起。

目录作用是否是主要运行时
`codex-rs/`Rust workspace;包含 CLI、TUI、核心 agent、模型通信、工具执行、沙箱、MCP 等是,主要实现所在地
`codex-cli/`npm 分发/启动包装层不是核心 agent runtime
`sdk/`TypeScript、Python SDK对外编程接入
`docs/`、`scripts/`、`bazel/`文档、构建/测试/开发辅助支撑工程

接下来分析的重点是 codex-rs/。其 Cargo.toml 把大量 crate 组织为一个 Rust workspace,这也是 Codex 不应被看作“一个 CLI 二进制”的直接证据。

六个运行层

1. 交互入口与适配层

这一层接收用户输入,展示过程和结果,并把不同界面的调用统一转入 agent runtime。

组件职责
`codex-rs/cli`命令行入口、参数解析和子命令调度。
`codex-rs/tui`基于终端的交互界面;负责把用户看到的流式消息、工具进度和审批交互呈现出来。
`codex-rs/app-server`面向 IDE/桌面等富客户端的服务适配层;通过双向 JSON-RPC 2.0 通知与请求传递 Thread、Turn、Item。它不是视图本身。
`codex-rs/app-server-protocol`、`protocol`交互边界两侧使用的数据类型与协议定义。
`sdk/`让 TypeScript/Python 代码以编程方式使用 Codex 的对外入口。

这里最容易混淆的地方是:TUI 是视图层,App Server 是接入协议层,CLI 是产品入口;三者都不是 agent 推理和工具编排本体。

2. Agent 编排层(系统中枢)

以 codex-rs/core 为中心。它承载“收到一次用户任务后,如何形成一次 agent 执行”的业务逻辑,并被不同 Rust UI 复用。

相邻的 rollout、state、thread-store、thread-manager-sample 等 crate 为一次执行及其生命周期提供编排、状态和持久化能力。第二部分分析 loop 时,重点会落在这一层:它决定何时请求模型、何时执行工具、何时继续下一步,以及何时完成一个 Turn。

3. 会话、上下文与持久化层

这一层解决两个问题:当前模型应看到什么,以及这次交互如何在之后被找回。

组件主要职责
`prompts`系统提示词和提示词资产的组织。
`context-fragments`可组合的上下文片段。
`history`、`message-history`历史消息与会话记录处理。
`thread-store`Thread 存储边界;源码说明它保存 canonical history 与可查询的 metadata。
`state`、`config`本地状态与配置。
`memories/read`、`memories/write`记忆的读取和写入能力。

在 App Server 的语义中,最小交互层级是:Thread(一个会话)→ Turn(一次用户发起的执行)→ Item(消息、工具调用、文件编辑等过程项)。这组模型同时服务于 UI 展示、上下文重建和持久化。

4. 模型与后端接入层

这层负责身份认证、模型选择、请求发送与不同后端的适配;它不决定用户界面,也不直接承担本地命令执行。

主要模块包括 codex-api、codex-client、backend-client、model-provider、model-provider-info、models-manager、login、chatgpt、responses-api-proxy,以及 ollama、lmstudio 等本地/兼容后端接入。

从上层看,它提供的语义是“向选定模型发起一次流式 agent 请求并接收事件”;具体 HTTP、认证、模型格式差异被尽量封装在这里。模型返回的文本或工具调用意图会回到编排层,由编排层决定后续动作。

5. 工具执行与安全边界层

这一层把模型生成的动作请求变成实际副作用,同时确保副作用处于用户配置的权限和沙箱边界内。

类别代表模块
命令与进程`exec`、`exec-server`、`shell-command`、`shell-escalation`
文件与代码操作`file-system`、`file-search`、`file-watcher`、`apply-patch`、`git-utils`、`worktree`
审批与策略`execpolicy`、`sandboxing`、`linux-sandbox`、`bwrap`、`process-hardening`

execpolicy 的源码文档表明,它可以将命令按规则判为 allow、prompt 或 forbidden;所以“模型建议执行一个 shell 命令”与“命令已经在机器上执行”之间,存在明确的策略/审批/沙箱关口。

6. 扩展、协作与外部能力层

Codex 不把所有能力硬编码进 core。这一层把可插拔的能力接到 agent runtime:

能力代表模块
MCP`codex-mcp`、`rmcp-client`、`mcp-server`、`ext/mcp`
Skills / 插件 / Hooks`skills`、`plugin`、`hooks`、`core-plugins`、`ext/skills`
外部连接器`connectors`、`ext/connectors`
云端、代码模式与协作`cloud-tasks*`、`code-mode*`、`collaboration-mode-templates`、`agent-roles`、`agent-identity`

它们的共同点是:为 agent 增加可调用的上下文、工具或运行方式;它们本身仍受上面的编排层和安全边界约束。

横切基础设施

除六层之外,还有一组不属于单一业务阶段、但几乎所有层都会使用的能力:http-client、network-proxy、otel、analytics、diagnostics、secrets、keyring-store、utils/*。可以把它们理解为网络、可观测性、凭证与通用基础设施,而不是第七个独立的 agent 业务阶段。

全局关系图

flowchart TB
    User[用户或宿主程序]
    Entry[交互入口与适配层<br/>CLI · TUI · App Server · SDK]
    Runtime[Agent 编排层<br/>core · rollout · state]
    Context[会话、上下文与持久化层<br/>prompts · context-fragments · history · thread-store · memories]
    Model[模型与后端接入层<br/>model-provider · codex-client · codex-api · login]
    Action[工具执行与安全边界层<br/>exec · file/git/apply-patch · execpolicy · sandboxing]
    Extend[扩展、协作与外部能力层<br/>MCP · Skills · Plugins · Hooks · Connectors · Cloud]
    Infra[横切基础设施<br/>protocol · HTTP · telemetry · diagnostics · secrets]

    User --> Entry
    Entry --> Runtime
    Runtime <--> Context
    Runtime <--> Model
    Runtime --> Action
    Runtime <--> Extend
    Entry -.数据类型与事件.-> Infra
    Runtime -.网络、日志、凭证.-> Infra
    Model -.网络、日志、凭证.-> Infra
    Action -.策略、审计.-> Infra

流程图 1

图中的箭头描述的是职责上的主要数据/控制路径:入口把一个用户任务交给 runtime;runtime 读取和写回会话上下文、请求模型、调度工具;扩展能力以可插拔方式参与。真实 crate 依赖会比图更细,且部分模块跨越多个概念层。

读源码时的推荐入口

如果目标是理解“它如何工作”,不建议从几千个 crate 平铺地读。先按下面顺序建立主干:

  1. codex-rs/app-server/README.md:先掌握 Thread / Turn / Item 与外部交互生命周期。
  2. codex-rs/core/:理解 agent runtime 的业务中枢。
  3. codex-rs/thread-store/、history/、context-fragments/、prompts/:理解上下文和会话如何被组织。
  4. codex-rs/codex-client/、model-provider/、codex-api/:理解模型请求如何离开本地进程。
  5. codex-rs/exec/、execpolicy/、sandboxing/:理解模型意图如何变成受控动作。
  6. codex-rs/codex-mcp/、skills/、plugin/:最后理解外部能力怎样挂入主链路。

本系列文章导航

本文是系列第 1 篇。后续篇目分别展开 Turn 生命周期、沙箱执行、上下文压缩、事件出口、模型网络、Skill/Agent、Agent Loop、工具路由以及 Session/Thread/Memory。每篇文章均独立成文,源码锚点直接指向公开仓库,不依赖本地目录或本地 Markdown 文件。

主线即上文预告的那一条:从 Turn 进入 core,追踪一次用户输入如何驱动「模型 → 工具 → 模型」的循环、在哪些状态下终止,以及被批准的命令最终在什么笼子里跑起来。全程只读,基线 d58d0e5841。

源码证据

源码基线:OpenAI Codex d58d0e5841e0de08e251673db2d5af8cf3a1ad51。文中的流程图用于标出本篇所处的运行阶段。