阅读指南 本文不是四款工具的功能测评,而是基于我们已经完成的四套源码级教程,回答三个更底层的问题:
- Pi、DeepSeek Harness、Codex、Claude Code 分别在优化什么?
- 面对不同用户、风险、规模与成本约束,应该采用哪条架构路线?
- 如果今天从零构建一个 Agent,哪些关键节点必须优先设计?
全文先做技术选型与设计哲学对比,再沉淀一套「Agent Harness 十二节点法」,作为后续构建内部 Agent、产品型 Agent 和 Agent 平台的设计检查清单。
先说结论 四者不是简单的优劣关系,而是四组约束条件下的最优解:
- Pi 优化「最小、可读、可改」;
- DeepSeek Harness 优化「可替换、可组合、可长期演化」;
- Codex 优化「可验证、可交付、可在不可信环境运行」;
- Claude Code 优化「长上下文、缓存命中率和机队级 token 成本」。
真正成熟的 Agent 架构通常不是四选一,而是分阶段组合:
用 Pi 的最小内核起步,用 dsh 的 seam 与生命周期支撑演化,用 Codex 的协议、安全和测试走向生产,再用 Claude Code 的上下文经济学解决规模成本。
模型决定 Agent 的能力上限,但 Harness 决定这份能力能不能在真实环境里稳定工作。
一个只会调用模型的程序很简单:输入消息,获得回答。但真实 Agent 还要处理:
因此,Agent Harness 更接近一个面向智能体的「操作系统」:
四套 Harness 的差异,主要不是 Agent Loop 写法不同,而是它们如何处理 Loop 周围这些昂贵、复杂且充满边界条件的工程问题。
| 对象 | 技术栈与规模 | 取证方式 | 研究版本 | 最鲜明的主张 |
|---|---|---|---|---|
| Pi | TypeScript,4 个核心包 | 官方源码、文档、教程与本机使用 | v0.80.2–v0.81.1 | 最小内核 + 激进扩展 |
| DeepSeek Harness | TypeScript,185 个 dsh 包 + cordis | npm 官方包、README、打包源码、运行日志实测 | 0.1.0-rc.6 | 一切皆插件 |
| Codex | Rust,102 个 crate、约 147 万行 | Apache-2.0 公开源码逐层取证 | 2026-08-24 快照 | 协议先行 + 产品级工程完备 |
| Claude Code | TypeScript,1902 个文件、约 51 万行 | sourcemap 还原源码 + 本机 transcript 实测 | 2026-03-31 快照,实测 2.1.241 | 上下文经济学 + 缓存前缀优先 |
不要机械比较代码量 四组数字的统计口径并不完全一致。Codex 的 147 万行包含大量测试、TUI 和跨平台沙箱;Claude Code 的 51 万行来自外部构建 sourcemap;dsh 的「185 个包」体现拆分粒度,不代表核心循环很大;Pi 则主动把许多能力留给扩展。
因此本文比较的是架构选择与工程重点,不是用包数或代码行数给项目排名。
四套教程入口:Pi-Agent 深度教程、DeepSeek Harness 深度教程、Codex Harness 深度教程、Claude Code Harness 深度教程。
Pi 的问题是:一个可用、可理解、可改造的 Agent,最少需要保留什么?
它的答案是一个依赖漏斗:
Pi 明确不内置 MCP、子 Agent、权限弹窗、Plan Mode、Todo 和后台 Bash。它不是否认这些能力有价值,而是认为:
Pi 的核心竞争力不是功能少,而是「少而不封闭」:核心保持可读,扩展系统负责长出个性化能力。
DeepSeek Harness 的问题是:Agent 运行时的每个能力,能不能都拆成可替换接缝?
它以 cordis IoC 容器为底座,把文件、Shell、进程、模型、沙箱、审批、会话、压缩、委派等能力拆成 seam:
这条路线的价值是:换后端、换部署方式、换安全策略,尽量只改配置或 Provider,不改调用方。
代价也很明确:理解 cordis、配置分层和插件图之后,才能真正理解系统行为。它用较高的认知门槛换取长期演化能力。
Codex 的问题是:如果 Agent 要跑在大量用户的电脑上、面对不可信代码库,并同时服务 TUI、IDE、桌面端、MCP 和云任务,需要补齐哪些工程能力?
它选择了 Rust、单二进制、多入口和协议先行:
Codex 展示的不是最优雅的最小架构,而是一份产品级 Agent 的完整工程账单:协议兼容、跨平台、安全隔离、恢复、诊断、测试、分发,一个都不能少。
Claude Code 的问题是:当会话规模巨大、上下文直接影响效果与成本、prompt cache 命中率关系到机队级费用时,整个系统该如何围绕上下文经济学重构?
它把这条约束贯彻到了多个子系统:
Claude Code 的核心亮点不是「做了五层压缩」,而是把 token、缓存和上下文从实现细节提升成架构预算,并建立了约定、类型和观测三层治理。
| 维度 | Pi | DeepSeek Harness | Codex | Claude Code |
|---|---|---|---|---|
| 核心组织方式 | 依赖漏斗、内核 + 叠加 | IoC 容器、插件图、能力 seam | 协议队列、crate 分层 | 一体化 Agent OS、编译期开关 |
| 交付形态 | npm 库、CLI、SDK、RPC | npm 运行时 + Profile + 插件树 | 单静态二进制、多入口 | 单 npm 产品包、多产品入口 |
| 首要优化目标 | 可读、可改、可组合 | 可替换、可配置、可长期演化 | 可验证、可交付、跨平台 | 上下文效率、缓存命中、机队成本 |
| 主要用户假设 | 能理解工具边界的开发者 | 需要定制平台的团队 | 广泛终端用户 | 大规模编码 Agent 用户 |
| 主要代价 | 开箱能力不足 | 理解与配置门槛高 | 工程体量巨大 | 内部机制复杂、强依赖遥测 |
选型判断:
| 维度 | Pi | DeepSeek Harness | Codex | Claude Code |
|---|---|---|---|---|
| 循环模型 | 最小 ReAct Loop + 外层叠加 | session / turn / step | task / turn / step | 单层 query 循环 |
| 继续条件 | stopReason 与工具调用 | 生命周期事件与 step 状态 | Task 驱动 Turn,Turn 驱动 Step | 多种 continue 与终止原因 |
| 用户中途干预 | steering / follow-up 明确分开 | 通过事件与 UI 插件介入 | 通过协议消息往返 | 队列、附件、权限反馈 |
| 工具执行 | 批次调度,错误转消息 | 五段流水线 | 注册、路由、执行服务器 | 流式工具执行,多道治理关卡 |
| 设计重点 | 内核足够小,叠加可剥离 | 生命周期与插件介入点 | 生命周期协议化 | 在复杂状态下保持缓存与恢复 |
四者共同证明:Agent Loop 本身并不复杂,复杂的是围绕每一轮发生的状态冻结、工具治理、用户插话、压缩、恢复和观测。
如果一个团队一开始就把大量业务逻辑塞进 while true,后面几乎一定会遇到无法测试、无法插拔、无法恢复的问题。
| 维度 | Pi | DeepSeek Harness | Codex | Claude Code |
|---|---|---|---|---|
| Provider 策略 | 统一事件协议 + 翻译器函数 | Provider-neutral LLM seam | 主动收敛到一种 wire protocol | 深度绑定 Claude API 与缓存能力 |
| 多模型支持 | 强,30+ Provider | 强,可替换 Provider | 产品内模型目录驱动 | Claude 家族与云渠道 |
| 提示词形态 | 极简基础提示词 + AGENTS + Skills | 多插件分段贡献并装配 | 模型元数据中的版本化模板 | 可编排 section + 动静边界 + 附件 |
| 模型差异 | 通过映射表和翻译器处理 | 通过 seam 与配置处理 | 与模型能力同住元数据目录 | 针对模型版本做补丁与 A/B |
这里有两种不同路线:
因此,多模型不是无条件正确。要先决定:你的产品更需要供应商可替换性,还是更需要吃满某一家模型的专有能力。
| 维度 | Pi | DeepSeek Harness | Codex | Claude Code |
|---|---|---|---|---|
| 基础装配 | AGENTS、Skills、消息转换 | 插件分段贡献系统提示词 | 44 类片段 + 16 个 World State section | section 注册表 + 附件通道 |
| 动态状态 | 扩展注入 | 插件与事件投影 | RFC 7386 merge patch 只发变化 | 动态信息移到缓存前缀之外 |
| 工具过多 | Skills 渐进披露 | preset 决定工具集 | 三维 ToolExposure + 检索 | 工具 schema 延迟加载与预算 |
| 压缩策略 | 单层结构化摘要 | 事件追加式遮蔽 | 本地与远端多路径 | 多层压缩,先可逆后有损 |
| 主要目标 | 简单、透明 | 可组合、可追溯 | 状态一致与兼容性 | 缓存命中与 token 成本 |
四者共同给出三个结论:
| 维度 | Pi | DeepSeek Harness | Codex | Claude Code |
|---|---|---|---|---|
| 工具管道 | 参数准备 → 校验 → 前钩子 → 执行 → 后钩子 | 五段事件流水线 | 注册、路由、策略、执行、事件 | 参数校验、权限、钩子、分类器、执行、结果处理 |
| 错误处理 | 错误编码为 ToolResultMessage | 事件与统一错误类型 | 协议化错误和违规事件 | 错误分类,供恢复与压缩后使用 |
| 沙箱 | 不内置,建议容器或外部隔离 | 多后端 seam,探测失败拒绝运行 | 多平台原生沙箱,自研实现 | 外包给独立 sandbox runtime |
| 权限理念 | 用户自担,拒绝安全表演 | fail-closed + 一次性审批 | 静态规则 + execpolicy + Guardian + 用户审批 | 多模式 + 多来源规则 + hooks + 分类器 |
| 安全默认 | 依赖部署环境 | 默认保守 | 纵深防御 | 规则治理与隔离组合 |
这里不存在统一答案,关键在威胁模型:
| 维度 | Pi | DeepSeek Harness | Codex | Claude Code |
|---|---|---|---|---|
| 会话真源 | append-only 树 | append-only 事件日志 | rollout / thread 日志 | transcript + attachment |
| 回退与分叉 | 原生树形,移动 leafId | 通过事件投影和恢复 | 线程恢复与分叉 | fork / resume / sidechain |
| 扩展方式 | TS 扩展、Skills、Packages | cordis 插件、Profile、Patch | MCP、Skills、Hooks、Plugins、Code Mode | Skills、Plugins、Hooks、MCP、Commands |
| 多 Agent | 不内置,由扩展或外部进程实现 | subagent、workflow、ralph 等 | 子进程与协作图 | fork、fresh、内建专家、teammate |
| 关键治理 | 扩展简单、能力强 | owner 生命周期与依赖声明 | 子权限单调收缩 | fork 前缀复用与验证合同 |
会话设计上,Pi 和 dsh 给出了两个非常值得保留的原则:
这使恢复、审计、分叉、压缩和调试能够建立在同一份数据之上。
| Harness | 它首先问的问题 | 用户与风险假设 | 质量保证方式 | 最典型的设计 |
|---|---|---|---|---|
| Pi | 最少需要什么 | 用户是开发者,能理解并承担风险 | 核心小到可以读完,协议边界清晰 | 明确不做六类内置功能 |
| dsh | 最多能拆成什么 | 团队要长期替换后端和部署方式 | 接口契约、生命周期、事件日志 | agent loop 也作为插件装配 |
| Codex | 全部做完要付多少 | 用户范围广,平台必须兜住风险 | 大规模测试、协议、沙箱、策略 | 多前端共用 SQ/EQ 协议 |
| Claude Code | 如何让上下文更便宜、更稳定 | 大规模长会话,token 成本可测量 | 遥测、A/B、缓存断裂检测、行为指标 | 静态与动态提示词缓存边界 |
Pi 最值得学习的不是「少」,而是每一个「不做」都能回答:
例如后台 Bash 交给 tmux,安全边界交给容器,计划交给文件,个性化工作流交给扩展。它用文件、协议和外部工具替代内建功能,避免把单一工作方式固化进核心。
**适用前提:**用户有一定技术能力,团队愿意管理扩展,且风险可以通过环境隔离承担。
dsh 把变化当作默认:模型会换、存储会换、沙箱会换、部署会换、UI 会换。因此它提前把这些位置都做成 seam,并通过依赖声明、fiber 和 dispose 管理插件生命周期。
它最重要的判断是:插件系统的核心不是「能注册功能」,而是「依赖、所有权、卸载和冲突都可管理」。
**适用前提:**系统确实存在多实现或长期平台化需求。只有单一后端的小项目,提前复制 185 包的粒度只会制造抽象债务。
Codex 不回避复杂度,因为它面对的是产品级责任:任何前端都要能接入,任何平台都要能运行,任何危险命令都不能只靠模型自觉。
它的工程纪律可以概括为:
**适用前提:**产品面向广泛用户、操作真实资源、需要跨平台交付,并且团队有能力承担长期测试与兼容成本。
Claude Code 把上下文和 prompt cache 当成类似 CPU、内存、延迟的基础资源:
它反复使用「预算 + 降级 + 打点」模式:先规定资源上限,超限时按明确顺序牺牲内容,并记录每次降级发生了什么。
**适用前提:**会话足够多、上下文足够长、成本足够大,而且团队能真正测量优化前后的变化。没有数据时照抄复杂缓存技巧,只会得到不可解释的系统。
Pi 最适合作为「第一版 Harness 的代码教科书」:它让团队先看清什么是不可缺少的,再决定往外增加什么。
dsh 最适合作为「Agent 平台接缝清单」:即使不采用 cordis,也可以用它检查自己的系统里哪些能力仍被写死。
Codex 最适合作为「生产级 Agent 工程总账」:当产品要从内部试用走向广泛交付时,它会提醒团队还有哪些债没有还。
Claude Code 最适合作为「规模化上下文工程手册」:它告诉我们,效果、成本和可靠性可以被放进同一套工程治理体系。
| 场景 | 首选参考 | 必须补充 | 不建议直接照搬 |
|---|---|---|---|
| 内部个人生产力工具 | Pi | 基础日志、环境隔离、团队扩展规范 | Codex 全套跨平台复杂度 |
| 小团队可定制 Agent | Pi + dsh 局部 seam | 插件生命周期、依赖声明、权限边界 | 一开始就全插件化 |
| 多模型、多存储、多部署平台 | dsh | 协议版本、测试矩阵、配置诊断 | 把单实现也拆成大量空 seam |
| 面向普通用户的编码 Agent | Codex | Claude Code 式上下文预算 | Pi 的 YOLO 默认 |
| 长会话、高 token 成本 Agent | Claude Code | Codex 式硬上限与测试 | 没有遥测就做五层压缩 |
| 金融、支付、下单等高风险 Agent | Codex + dsh | fail-closed、审批、审计、幂等 | 用提示词代替权限控制 |
| 快速验证新交互范式 | Pi | 最小事件日志和错误协议 | 先做完整平台治理 |
最现实的方案不是复制任何一个项目,而是按层组合:
一句话表达这套组合:
内核保持 Pi 式克制,变化位置采用 dsh 式接缝,生产边界按 Codex 式加固,规模成本用 Claude Code 式治理。
下面这套「十二节点法」不是要求第一天全部实现,而是要求在设计时逐项回答。没有答案的节点,就是未来最可能爆发的工程债。
在写 Loop 之前,先明确:
**最佳实践:**形成一页「约束与威胁模型」,所有架构复杂度必须能映射回其中一条约束。无法映射的复杂度暂缓引入。
来源启示:四者的全部差异,本质上都是用户和约束不同。
最小 Loop 只需要:
Plan Mode、Todo、压缩、子 Agent、权限弹窗都不应成为第一版 Loop 的内生分支。
**最佳实践:**让主循环只负责状态推进;压缩、复核、委派等能力建成平级任务、事件监听器或外层叠加。
来源启示:Pi 的「内核 + 叠加」、Codex 的任务类型、dsh 唯一含循环逻辑的包。
至少定义清楚:
**最佳实践:**先写事件清单、状态机和错误语义,再写具体 UI。多前端需求一旦存在,协议必须先于界面。
来源启示:Codex SQ/EQ、Pi steering/follow-up、dsh 可否决事件。
模型请求发出时,应该冻结一份不可变快照,至少包含:
不能出现「模型看到工具可用,但执行时工具已经被卸载」或「模型按旧权限规划,执行时权限突然变化」的漂移。
**最佳实践:**广告给模型的世界和实际执行的世界必须来自同一份快照;动态变化进入下一轮。
来源启示:Codex 不可变世界视图、dsh agent 平面会话级插件图。
模型调用层至少要分开:
**最佳实践:**不要在业务代码里散落 if model == ...。把模型能力和提示方式放进同一份元数据,通过翻译器或 Provider seam 处理差异。
来源启示:Pi 翻译器函数、dsh LLM seam、Codex 模型目录、Claude Code 模型版本补丁。
建议至少分成五区:
每一区都要回答:
**最佳实践:**采用「预算 + 明确降级顺序 + 打点」三段式;动态状态优先发 diff,工具与技能优先渐进披露。
来源启示:Claude Code 缓存边界与预算、Codex World State、Pi Skills、dsh 模型体验说明。
一条成熟的工具链至少包含:
最佳实践:
来源启示:Pi 五步管道、dsh 事件流水线、Codex execpolicy、Claude Code 多道工具关卡。
提示词只能负责「建议」,不能承担「强制」。真正的安全边界应该由:
**最佳实践:**安全相关故障默认 fail-closed;所有模型或用户可配置的自由度,都要有一层它们无法突破的硬上限。
来源启示:Pi 对安全边界的诚实声明、dsh fail-closed、Codex Guardian 与沙箱、Claude Code 权限模式。
不要只保存最终 messages 数组。更稳妥的真源应该能记录:
**最佳实践:**历史不原地删除;回退移动指针,分叉追加新节点;面向人和面向模型的消息从真源投影生成。
来源启示:Pi 会话树、dsh 事件溯源、Codex rollout、Claude Code transcript。
推荐顺序:
**最佳实践:**摘要不是文学总结,而是「给下一个模型的结构化交接」;固定必填字段,保留目标、事实、决策、未完成项、关键路径和验证状态。
来源启示:Pi 结构化摘要、dsh 遮蔽压缩、Codex 本地与远端路径、Claude Code 多层防线。
扩展系统至少需要:
多 Agent 至少需要:
**最佳实践:**不要把「能启动子 Agent」误认为「已经有多 Agent 架构」。没有委派合同、权限继承和结果验证,多 Agent 只是在并行制造不确定性。
来源启示:dsh 插件生命周期与多种委派、Codex 协作图与权限收缩、Claude Code fork 协议与验证 Agent、Pi 对内置子 Agent 的克制。
至少记录:
测试应覆盖:
**最佳实践:**提示词也按代码管理:有版本、有基线、有评估、有 A/B、有回滚。任何依赖「感觉更好」的提示词改动,都不应直接进入生产。
来源启示:Pi 事件断言面、dsh 事件日志、Codex 大规模测试、Claude Code 机队遥测与提示词实验。
目标是证明 Agent 闭环,而不是证明架构能力。
必须有:
主要参考:Pi。
当第二个 Provider、第二种存储或第二个产品入口出现时,再补:
主要参考:DeepSeek Harness + Pi。
当 Agent 开始操作真实资源、面向更多用户时,补齐:
主要参考:Codex。
当上下文与成本成为主要矛盾时,再引入:
主要参考:Claude Code + Codex。
复杂度的准入原则 每增加一层复杂度,至少要同时增加一种验证手段:测试、指标、日志、断言或回放。
没有可观测性的复杂度,不是能力,而是黑箱。
四套 Harness 最终留下的不是四份标准答案,而是一套判断顺序:
可以把四者的精华压缩成一条构建公式:
Pi 的克制 × dsh 的可替换 × Codex 的可验证 × Claude Code 的可度量。
因此,构建 Agent 最重要的能力,不是写出一个会调用工具的 Loop,而是持续回答:
这一层复杂度,是由什么真实约束换来的?它的边界在哪里?我们用什么证据证明它有效?
能长期回答这三个问题,才是真正的 Harness Engineering。