Claude Code 与 Codex 的 Harness 工程对比

harness 一词来自 Uber 那篇「软件工厂」文章,指 agent 的执行环境 / 工具台——具体到 Claude Code 与 Codex,就是这两个 CLI 工具作为「AI 编程 agent 运行时」的工程架构本身。 本文从技术栈、架构形态、对外协议、配置、沙箱、会话、扩展等维度拆解两者的实现,并给出源码层面的证据。结论性观点标注「实证 / 推断」。


一、结论先行(TL;DR)

维度 Claude Code Codex
实现语言 TypeScript / Node.js Rust(codex-rs)
架构形态 单进程 CLI,agent 逻辑就在 CLI 进程里 前后端分离:codex(TUI 前端)+ codex app-server(后端进程)
对外协议 JSONL 流式(--output-format stream-json) ACP(Agent Client Protocol) RPC,stdio:// / http://
配置 settings.json + 环境变量(ANTHROPIC_*) config.toml + models.json(带 schema 校验)
安全模型 permission mode(bypassPermissions 等) 真沙箱(seatbelt / bwrap / Landlock / Windows sandbox)
会话 ~/.claude/history.jsonl + --resume thread-store(线程持久化,thread/start、thread/resume)
扩展 hooks、slash commands、subagents、plugins、Agent SDK plugins、skills、code-mode、hooks
MCP 原生,--mcp-config codex-mcp crate,mcp_servers 段
子代理模型 CLAUDE_CODE_SUBAGENT_MODEL(显式独立) 由模型路由/配置决定

一句话本质:Claude Code 是「把 CLI 输出协议化」的单进程 harness;Codex 是「把 agent 做成一个可被多方连接的 server」的 client-server harness(更接近 LSP 的设计思想)。


二、Claude Code 的 Harness 工程

1. 技术栈

2. 架构形态:单进程

3. 对外协议:JSONL 流式(stream-json)

这意味着任何外部程序(如 Multica)都能通过「解析 stdout 的 JSON 流」来驱动 Claude Code,而不必理解其内部状态机。

4. 配置体系

5. 权限模型

6. 会话管理

7. 扩展机制


三、Codex 的 Harness 工程

1. 技术栈

2. 架构形态:前后端分离(app-server)

3. 对外协议:ACP(Agent Client Protocol)

4. 配置体系

5. 沙箱(Codex 的强项)

6. 会话管理

7. 扩展机制


四、核心对比表(工程视角)

维度 Claude Code Codex
语言 TypeScript/Node.js Rust
进程模型 单进程 前端 + app-server 后端
协议 JSONL stream-json ACP(RPC)
通信 stdin/stdout 事件流 stdio/http RPC
配置 settings.json + env config.toml + models.json(schema 校验)
安全 permission mode(无沙箱) 真沙箱(seatbelt/bwrap/Landlock)
会话 history.jsonl thread-store
运行隔离 共享 ~/.claude 运行级 CODEX_HOME
子代理 Task 工具 + 独立模型变量 模型路由/配置
代码模式 无 code-mode(省 token)
可嵌入性 Agent SDK(代码构建 agent) ACP(协议连接 agent)
失败信号 terminal_reason ACP 状态 + 语义停滞检测

五、架构差异的本质

Claude Code = 把「CLI 输出」协议化。 它是一台「自带 UI 的 agent 机器」,外部程序通过解析它的 JSON 输出流来遥控它。优点:简单、启动即用、生态成熟(hooks/subagents/Agent SDK);缺点:无沙箱、前端与引擎耦合、可编程性靠"解析文本流"。

Codex = 把「agent」做成一个 server。 它把 agent 引擎抽成 app-server,用 ACP(类 LSP 协议)让任意前端连接。优点:前后端解耦、真沙箱、Rust 性能、code-mode 等成本优化、IDE/CLI/桌面可共享同一引擎;缺点:架构更重、协议更复杂、生态相对新。

本质:两者代表了 agent harness 的两个代际——「流式事件」 vs 「结构化 RPC」,类似「日志驱动」vs「API 驱动」的关系。


六、选型建议


七、附:从 Multica 源码看真实对接差异(实证)

Multica(适配 26 种 agent CLI 的开源平台)的 server/pkg/agent/ 目录里,每个工具一个 Go 文件。两者启动方式的差异一望即知:

// claude.go —— 直接起 CLI,用 stream-json 流式协议
args := []string{
    "--output-format", "stream-json",
    "--input-format", "stream-json",
    "--permission-mode", "bypassPermissions",
    "--mcp-config", mcpConfigPath,   // MCP 写临时文件传入
}

// codex.go —— 起 app-server 子进程,用 stdio 承载 ACP 协议
args := []string{"app-server", "--listen", "stdio://"}

这组源码对照,正是本文「单进程流式协议 vs app-server RPC 协议」结论的最硬证据。


来源:openai/codex 仓库(codex-rs 架构、app-server、ACP、sandboxing、code-mode 等 crate)、multica-ai/multica 仓库(server/pkg/agent/claude.go、codex.go 及 acp_*.go)、DeepSeek 官方文档(Codex/Claude Code 接入配置)。标注「实证」的均来自源码或官方文档;标注「推断」的为架构判断。