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

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 业务阶段。

全局关系图

图中的箭头描述的是职责上的主要数据/控制路径:入口把一个用户任务交给 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。文中的流程图用于标出本篇所处的运行阶段。

相关推荐
IT_陈寒1 小时前
JavaScript的this指向问题又让我加了个班
前端·人工智能·后端
行百里er1 小时前
Redis 核心数据结构(四)——Set 与 Sorted Set,去重与排名神器
redis·后端
lizhongxuan1 小时前
Firecracker 与 KVM
后端
PC2005_cloud1 小时前
Nginx 学习笔记:Server 块配置详解,域名路由与多站点部署实战
前端·后端
YIAN1 小时前
LangChain.js 对话记忆体系(一):内存存储与文件持久化,让 AI 拥有对话记忆
前端·后端·langchain
flash俊杰1 小时前
pgvector 实战:把向量检索"塞"进关系数据库,一条 SQL 搞定联合查询
后端
福兮说1 小时前
errgroup 的六个坑:Wait 之后 ctx 已取消、SetLimit 嵌套死锁,以及另外四个
后端·go
IT_陈寒1 小时前
React状态管理这个坑,我是怎么翻车的
前端·人工智能·后端
mldong1 小时前
聚合边界:为什么 ProcessTask 没有自己的 Repository
后端·架构