ARTICLE · 1064548
AI 编程工具的「壳」工程:ZCode、DeepSeek Harness 对比 Claude Code、Codex 与 oh-my-pi
9 月 18 日,开发者 ferstar 通过逆向和抓包曝光,智谱的 AI 编程工具 ZCode 只要处于登录状态,后台就会把用户本地整个工作区打包加密,上传到阿里云 OSS。抓取范围不止当前代码,还有完整的 .git 目录,全部提交历史、分支配置、操作日志,连同早期提交里写过、后来删掉的密钥,全部打包。据曝料的二手转述,即使在设置里手动关闭了数据上传开关,上传依然继续。三天后的 9 月 21 日,智谱道歉、宣布开源,并在新版本里移除了触发上传的 Repo Wiki 功能。据媒体报道,信通院与绿盟两家机构随后给出审计结论,称云端存储桶已清空、新版本未发现可触发快照外发的路径;社区同时质疑「桶删了只能证明现在空,证明不了没人读过」。
这场风波逼着所有人正视一件事,这个平时被一笔带过、叫做「壳」的东西,到底对我们的代码做了什么。
壳的正式名字叫 agent harness。按 LangChain 的定义,它是模型之外的一切代码、配置与执行逻辑,管循环怎么跑、上下文怎么裁、工具怎么调、权限怎么判。多数人挑 AI 编程工具时只看背后是哪家模型,这个习惯可能挑错了地方。普林斯顿的 CORE-Bench 测试里,同一个模型换两种运行框架,得分分别是 42% 和 78%,差了 36 分。Terminal-Bench 2.0 上,第三方 harness Letta 用 Claude Opus 4.5 跑出 59.1%,超过了 Claude Code 用同一个模型的 41.6%。Vercel 把自己 agent 的工具砍掉 80%,成功率反而从 80% 升到 100%,延迟从 724 秒降到 141 秒。
买模型买到的是能力上限,兑现几成要看壳。上面这几个数字来自第三方横评的汇总,具体数值可以再核,量级足以说明问题。而现在,国内两大模型厂商都把自己的壳开源了。DeepSeek 的 Harness(下称 dsh)8 月中旬上线,据第三方记录约两天 star 数过了九万;智谱的 ZCode 9 月 21 日带着争议开源。这给了我们一个少有的机会,不用猜黑箱,直接拆开看。
这篇文章基于对开源仓库的逐文件深读。ZCode 读了 37 个文件,dsh 读了 14 个(含工具调度器的完整源码),Codex 的压缩实现读完全文,oh-my-pi 和 Claude Code 以官方文档为主。不聊功能清单,只讲五家在几个核心工程问题上各自交出了什么答法。

一、Agent Loop,循环由谁驱动,何时停
所有 agent 的核心都是同一个循环,调模型,模型要调工具就执行工具,把结果塞回上下文,再调模型,直到模型不再要工具。五家的差别,就是这个循环写成了什么形状。
ZCode 把循环写成了显式状态机。一个回合的状态依次流转,从处理输入、等模型响应、流式输出、调度工具、(可能等待授权)、执行工具、聚合结果,到完成或出错。任何没有定义的状态跳转直接抛异常,宁可崩溃,也不让运行时进入未定义状态。这个选择透露出一种工程审美,把所有可能的路径摆在明面上,用类型系统而不是测试覆盖来兜底。
ZCode 还有一个和 Claude Code 相反的失败语义。它的聚合阶段只要发现有工具失败或被用户拒绝,整个回合直接终止,不把失败结果回灌给模型;而 Claude Code 的做法是把工具失败当作普通结果交回模型,让模型自己决定下一步怎么办。两种策略各有道理,前者防止模型在一个已经出错的回合里继续叠加动作,后者给模型自我修复的机会。哪种更好没有定论,但知道一款工具选了哪种,能解释你用的时候遇到的很多现象。
dsh 走了另一条路,循环本身是插件。它定义了一个 Agent 接口和一套注册表,官方的 agent-loop 包只是这个接口的默认实现,文档明说「仅在标准的调用模型、跑工具、重复生命周期不够用时」才需要换掉它。换循环就是换一行配置。更坦白的是,dsh 在文档里承认默认循环没有内置回合预算,工具调用会无限延续当前回合,要约束失控,得从生命周期扩展点外部施加。把缺陷写进文档当作设计边界,这个动作本身值得记下。
Codex 的循环在 Rust 实现里叫 run_turn,是模型交互的基本单元,循环内部在采样前做压缩、注入上下文、处理工具,然后再次采样。它的特点是终端交互、CI 脚本、给 IDE 用的后台服务、软件开发包四个入口共享同一个核心循环。Claude Code 闭源,看不到循环实现,官方对 agent 的定义是「LLM 在循环中自主使用工具」,模型越强,自主性越高。oh-my-pi 则在循环之上叠了一层模型路由,九个逻辑角色(默认、慢速、规划、小型、顾问等)映射到六十多家模型服务商,规划阶段用最强的模型,落笔写代码瞬间自动降档到便宜模型。
循环怎么写,决定了「一步」是什么。
二、上下文管理,窗口装不下时丢什么、留什么
模型的工作记忆是有限的,而且塞得越多,任何单条信息被真正看见的概率越低。Anthropic 官方确认过所有模型都存在这个衰减。所以长任务的上下文管理是最紧的一关,任务信息量近乎无限,窗口有硬顶,压缩必然发生,而压缩一定有损。工程水平就体现在三件事上,什么时候压、丢什么保什么、崩溃之后还能不能对上账。
ZCode 的答案是两级压缩,所有参数都写在源码里,可以直接读。第一级叫 microcompact,做轻量回收,不动对话结构,只把旧的工具结果正文替换成一行「旧工具结果已清除」的占位符。触发条件有两个,满足其一即可,距离上次模型回复超过 60 分钟(会话闲置太久,旧结果大概率不再需要),或者 token 用量达到全量压缩阈值的 90%。它保留最近 5 组工具结果,只清理读文件、执行命令、搜索、网页抓取这类工具的输出;图片、视频、文件类内容块明确不清,源码注释里还留着一个修复记录,曾有版本把读取视频的结果误判漏掉了,被这级清理误删。还有个成本核算,如果清理后节省不足 256 个 token,就整个放弃,白跑一趟不划算。
第二级 autocompact 做全量摘要,参数同样具体。默认按 20 万 token 窗口计算,预留 3.2 万给输出(因为输入输出共享同一个窗口,自动压缩只能让出输入侧),再加 1.3 万的缓冲,得到触发线。它配了熔断器,连续 3 次压缩失败就停手,防止压缩本身陷入死循环;还有振荡保护,如果压缩完立刻又被工具结果填满,连续发生就报错终止回合,因为这说明任务本身在超限生产上下文,压缩救不了。
Codex 的压缩实现里藏着全文最有意思的一处源码注释。它的压缩分回合前、独立回合、回合中三个时机。回合中压缩后重建历史时,初始上下文必须注入到最后一条真实用户消息之前,注释直译过来是「模型被训练为把压缩摘要视为历史的最后一项」。翻译成人话,就是 OpenAI 的壳给 OpenAI 的模型喂压缩结果时,数据的排列形状是按模型的训练分布定制的。这是 harness 与模型协同的直接证据,也解释了为什么第一方工具有天然优势,它知道模型是怎么被教出来的。Codex 压缩后还会保留最多 2 万 token 的近期真实用户消息,从最新往旧装填;如果压缩请求本身撞上窗口超限,就从最旧的历史条目开始逐条裁剪重试。压缩完成时它会弹一句警告:「长线程加多次压缩会让模型准确度下降,尽量开新线程」。官方自己承认压缩有代价。
Claude Code 的压缩策略在文档层面有一个清晰的理念,磁盘是真相源,上下文是缓存。压缩后,CLAUDE.md 指令、auto memory、计划文档全部从磁盘重新注入,git 状态重新读一份。官方文档逐项列了「压缩存活表」,声明什么能活下来;至于压缩算法本身,2025 年 9 月的工程博客描述过「摘要加最近访问的 5 个文件继续」的做法,但现行文档已不再复述这个细节,具体阈值数字官方也没有公布,以官方最新文档为准。
oh-my-pi 把压缩做成了五级方法链,远端原生压缩、位图快照、交接摘要、机械省略、软压缩,逐个降级。其中位图快照(Snapcompact)是独门做法。它把要丢弃的历史序列化后渲染成一张黑白 PNG 位图,让多模态模型直接「看图回忆」,位图尺寸按模型的计费形状定制,Claude 用 1932 像素宽的帧,正好压在 4784 个视觉 token 的计费上限内,Gemini 每图固定 1120 token,所以用 2048 像素宽。整个过程不调模型、不联网、结果确定,所以连溢出恢复这种最危险的时刻也能安全使用。它还有投机压缩,进入阈值前的预备带就在后台分支上先算好摘要,真越线瞬间提交,把摘要延迟藏进正常执行。压缩前的剪枝也有明确数字,保护最新 4 万 token 的工具输出,最低节省 2 万,小于 50 token 的结果永不剪,因为替换占位符本身要花约 8 个 token,太小反而变大的还搅缓存。
dsh 在压缩上选择先解决另一个问题,记账。它的会话是一个只追加的事件日志,模型看到的一切都必须记在日志里,「模型可见即已记录」有运行时断言保证,是条铁律。压缩在这个日志里是一个协议而非函数。开始和结束两个事件构成一把括号锁,崩溃在中间会留下可检测的孤儿锁而不是假成功;摘要作为恰好一次的替换操作骑在日志上,被遮蔽的原始事件留在原地,重放永远可复现;切压缩边界时有专门的检查,保证不会把一个还没等到回复的工具调用从中间撕开。每个包的文档还强制披露这个改动对 KV 缓存的影响,压缩从第一个被遮蔽的 token 起让缓存失效,这种代价被当作一等工程约束来管理。
五家对比下来有个观感,压缩是最见功力的部件。ZCode 参数全公开可审计,Codex 为模型训练分布定制形状,oh-my-pi 用信息工程的极端手段压成本,dsh 先保证账本不错再谈效率,Claude Code 靠磁盘重注入保住关键事实。

三、记忆系统,ZCode 抄了 Claude Code,然后加了自己的锁
先说机理。模型是无状态的,每次调用都是从零开始的一次函数计算,权重冻结,没有「上次」。所有跨会话记忆都是壳在函数外部代管的文件,每次调用时重新注入。所以记忆系统的本质是状态外置的行政管理,存在哪、谁有权写、每次注入多少、写错了怎么删。
这一章的重头戏是个发现,ZCode 的记忆系统与 Claude Code 几乎逐字相同。
ZCode 的系统提示词要求模型维护一个「持久文件式记忆」,每条记忆一个文件、带类型标注的元数据头,四种类型(用户画像、反馈纠正、项目状态、外部参考),其中反馈和项目两类必须写明「为什么」和「怎么应用」,记忆之间用双方括号互链,一个索引文件每次会话载入上下文,每条记忆在索引里占一行。写记忆前先查索引,「更新已有文件而不是创建重复」,被要求记住代码结构这类可推导的内容时应当反问对方「这里面什么是非显然的」。这些规则、句式、类型划分,与 Claude Code 官方文档描述的 auto memory 设计一一对应,差异只有一处,Claude Code 的项目指令文件叫 CLAUDE.md,ZCode 叫 AGENTS.md。同构证据不止记忆。ZCode 内置的只读探索子代理,其描述文字与 Claude Code 的同名内置代理几乎一字不差;权限拒绝时回给模型的文案是同款句式;hook 事件名高度一致。结论可以下得比较实,ZCode 在协议层大量对齐了 Claude Code,它的官方模型接入走的本来就是 Anthropic 的消息协议,对齐是顺理成章的工程选择。
ZCode 在 Claude Code 的骨架上加了相当重的治理锁。记忆提取本身是个独立子循环,用辅助模型跑,工具白名单严格到苛刻。读、搜索、列目录放行;写和编辑仅限记忆目录内的 markdown;执行命令仅限只读命令,外加一种严格形态的删除,必须绝对路径、必须以 .md 结尾、必须在记忆目录内、不许通配符、不许递归,任何一条不满足直接拒绝。写入路径还有一份敏感目录黑名单,记忆文件不许被写进 skills、commands、agents 这些会影响 agent 行为的目录。这是防注入,攻击者诱导模型把恶意指令写成一条「记忆」,放进会被执行的目录,就能劫持后续行为。路径检查前还会先剥离 Unicode 不可见字符,防的是用零宽字符混淆绕过黑名单。会话关闭时,提取调度器被显式叫停,注释里写了原因,进程还活着,不关的话旧的提取任务可能继续请求模型、继续写文件。
对照其他三家。Codex 的记忆薄得多,就是 AGENTS.md 一层文件,全局一份加项目沿途目录各一份,从根往下拼接,越靠近当前目录的覆盖力越强,合并上限 32 KiB。仓库里能找到一个 memories 相关的代码包,但公开资料不足以断言它做不做自动记忆,这里如实存疑。oh-my-pi 把记忆做成可插拔后端,关闭(默认)、本地两阶段摘要、远程向量库、本地 SQLite 引擎、摩擦门控的决策文件,五种任选;本地方案分两步,先对每个历史会话提取耐久信号,再跨会话整合出长期记忆索引、注入用摘要和自动生成的技能文档,注入共享 5000 token 上限。它还有 18 个配置发现器,直接原生读 Claude Code、Codex、Cursor、Gemini 等别家的配置文件,官方口号是「你的现有配置今晚照常工作」。dsh 干脆没有内置记忆,55 个包组里没有记忆包,官方示例是外挂一个叫 Engram 的记忆服务,走标准协议接入,存储和项目管理都归外部服务。它只保证会话内的一件事,模型可见的一切都能从日志重建。
五种答法放在一起看,问题变成了记忆该归谁管。Claude Code 归框架内置,ZCode 内置加治理,oh-my-pi 归可换的后端,Codex 归人写的文件,dsh 归生态。这是同一个数学事实的五种行政方案。

四、工具调用,接口的精度与结果的秩序
工具是模型和世界之间的机械接口。oh-my-pi 的作者有个论断叫「harness 问题」,老代码库上的失败大多出在机械接口上,补丁格式漂移、空白不匹配、并发改文件冲突,跟模型智力关系不大,作者的比喻是「怪模型等于怪飞行员的起落架」。他们做过一轮 8640 次会话的编辑基准测试(厂商自报数字),只换编辑工具的格式,Grok Code Fast 1 的通过率从 6.7% 升到 68.3%,十倍;Grok 4 Fast 做同样的工作少花 61% 的输出 token;Gemini 3 Flash 比谷歌自己给模型定的最佳格式还高 5 个百分点。
oh-my-pi 的解法叫 hashline。读文件时,返回的每一行都带着内容哈希标签;模型改文件时锚定这个标签,而不是重新抄写原文。文件如果在两次操作之间被别人改过,标签就对不上,补丁在写盘之前被直接拒绝。模型从此不必逐字重打目标行,空白战争消失了;并发子代理改同一批文件时,冲突能被安全检出。连搜索工具的输出也渲染成同样的格式,读和改无缝衔接。配套的哲学是「原生优先」,别的 harness 开子进程去跑的搜索、shell、文件遍历,它全部编译进自己的二进制,进程内完成。
dsh 的工具层把功夫花在秩序上。执行管道固定五段,前置门(可放行、拒绝或转人工审批)→ 单调守卫(一旦拒绝,后续监听器不能改回允许)→ 执行(超时重试的包装点)→ 后置处理 → 结果定稿。调度器源码里有一个精确的设计,独占类工具构成屏障,并行类工具进有界池(默认上限 10 个并发),调度可以乱序重叠,但结果严格按模型序提交,先完成的调用会等着,直到排在它前面的都落账。每个调用在启动前还会被重新分类,运行中工具注册表一变,还没启动的调用立刻竖起屏障。中止时要为未启动的调用补写一对合成的调用与结果事件,让日志回放依然合法。它还有个独有的 PTC 模式,把整个工具面收拢成一个「跑代码」入口加一份按语言生成的类型化 SDK,模型不再面对几十个工具 schema,而是写一段程序调用它们,换来的是提示词结构的稳定和更细的组合表达。
ZCode 的工具注册表走元数据路线,每个工具注册时声明只读还是写、是否破坏性、是否并发安全、副作用范围、要不要审批、输出上限、超时时长。调度器拿这些声明建依赖图,拓扑排序后分层,同层内可并行的组队跑(默认并发 10),破坏性工具强制串行。搜索能力它选择自带,仓库内嵌了广度优先搜索、ripgrep、ugrep 三个搜索二进制,带校验和打包,不依赖系统环境。
Claude Code 官方对工具设计的观点值得单独记一笔,工具是 agent 与信息、行动空间的契约,最常见的失败模式是工具集臃肿、功能重叠,人类工程师都说不清该用哪个的时候,模型不可能选得更好。Vercel 砍 80% 工具反而变强,验证的就是这个判断。
五、执行模式,从一次性循环到持久目标
循环解决「下一步做什么」,执行模式解决「这件事什么时候算完」。分界线在停止判据,跑完一步算完(loop),还是达成目标算完(goal)。
dsh 的 goal 做成了持久对象,一个 agent 会话可以跨重启、跨恢复、跨分叉去追一个记在日志里的目标,每个会话同时只有一个当前目标,记录的是完成状态而不是待办清单。配套一个可选的自动续航驱动,把活跃目标变成一轮一轮的顺序执行。它的计划模式有句值得抄下来的设计原则:「引导而非限制」。计划模式下每个工具都还可用,沙箱和审批的限制是另一套体系单独配置的,两件事不正交地搅在一起就会产生「计划模式下为什么连文件都读不了」这类困惑。
ZCode 的目标续航更细,每一轮执行后先验证完成度,验证通过才继续;用户中途插入的新指令成为新的权威,旧的续航让位。真正的重头是它的三层多智能体。第一层是子代理,一次性派生、可自动转后台、甚至已终止的子代理还能在后台复活续跑;所有权规则写得很清楚,父回合结束不能终止子代理,子代理的状态由它自己的事实决定。第二层是内置的八阶段专家工作流,澄清、任务分析、架构分解、环境准备、元提示、执行、终审、收尾,每个阶段由独立的子代理会话执行、产出落盘的工件。第三层最有想象力,叫动态工作流,模型直接写 TypeScript 脚本来编排多个 actor,编译器对脚本做类型检查、污点分析、因果图分析,脚本跑在子进程沙箱里,执行日志写进 SQLite,可回放。这条路线把多智能体协作从「提示词里的口头约定」变成「可验证的程序」。
dsh 在这一层有个出圈的设计,把竞品当子代理。它有两个官方子代理提供者,一个通过 OpenAI 的官方协议跑真实的 Codex 进程,一个通过 Anthropic 的官方 SDK 跑真实的 Claude Code 进程,dsh 负责编排,重活让别家壳里的模型干。实验性的 Agent Teams 更进一步,持久名册、跨会话邮箱、共享任务 DAG,团队状态从根会话日志回放重建。oh-my-pi 对应的方案是工作树群,每个子代理一个隔离的工作区副本(macOS 上用写时复制,建一个沙箱不到 10 毫秒),子代理返回的结果是经过 schema 校验的类型化对象,父代理直接读字段,不用解析自然语言。它还有个顾问看门狗,给旁听角色配第二个模型,逐回合审阅主代理的行为,注入提醒或硬拦截,原则是干活的不给自己打分。
Claude Code 的执行模式组合是计划模式加子代理。计划模式下只读探索、产出计划、等用户批准后执行;子代理用来隔离上下文(大读取留在子代理窗口里,只回传摘要)、限制工具、跨项目复用。Anthropic 官方还推荐过验证闭环的三级递进,验证写进提示词、用钩子卡住回合(脚本不过不许结束,连续拦截数次后强制收回)、独立验证子代理。
六、安全与权限,闸门设在哪一层
模型每一步都在采样,出错是结构性的。而文件系统和生产环境不给第二次机会。所以每家都得在概率动作和不可逆世界之间设一道闸。差异在于闸门用什么东西修。
Codex 的闸门修在操作系统层。安全模型是正交的两层,沙箱管「技术上能做什么」(三档,只读、工作区可写但默认断网、完全放开),审批管「什么时候必须问人」(三档,出界才问、失败才问、从不问),两层自由组合。沙箱不是模拟的,macOS 用系统自带的沙箱机制,Linux 用 bubblewrap 加 seccomp,策略罩住整棵进程树;工作区内的 .git 目录递归只读,防止 agent 改写历史;网络默认关,开也是域名白名单加 DNS 重绑定防护。在这之上还有一层「用模型审模型」。自动审查只看那些本来就需要审批的请求,审查策略开源可审计,解析或审查失败一律按拒绝处理,失败时关闸而不是开闸。
Claude Code 的闸门修在规则和分类器层。六种权限模式从逐项询问到全自动不等;规则三态(允许、询问、拒绝)按固定顺序求值,拒绝压过一切,允许无法在拒绝上开洞。官方还明确说过一个原则,权限决定由壳做而不是模型做,提示词里写什么「不要动我的文件」都没用,授权和收权只能走权限系统。它的 auto 模式引入了分权,多数动作由一个独立的分类器模型代批,只拦截疑似危险项,权限系统从「问人」演进到「问另一个模型」。
oh-my-pi 的闸门最薄,但它诚实。文档原话说,它的规则匹配管的是「审批」,不是进程或文件系统围堵,批准过的命令保留 shell 的全部能力。默认模式就是全自动,只有少量内联的极端命令模式(删根目录、fork 炸弹之类)强制弹窗。它把隔离交给了子代理的工作树副本,而不是主进程的沙箱。dsh 是三档权限预设加一个升级阶梯,被沙箱拒绝时,模型可以请求更宽的模式,需要用户批准那一次调用。
ZCode 在争议事件之后的闸门,重心从「拦动作」移到了「透明」。开源仓库里有一份不多见的外发行为披露文档,逐条列明这个工具会对外的所有请求,官方模型网关的转发规则(连「命中官方端点时保留哪些请求头、包括请求中的认证信息」都写明)、内容分享、闲时任务、更新检查、插件的外发面。遥测默认关闭,纯自愿开启,不配置标准环境变量就不初始化,禁用路径下连 SDK 都不加载。错误上报有一道脱敏器,错误消息截断后过一遍覆盖十余种密钥形态(各种 token、密钥前缀、邮箱、家目录路径)的正则清洗,同一错误只记录在最靠近来源的链路节点,不层层复制。生产日志明确不落提示词和流式内容。作为对照,事件里那个「代码库索引」功能的上传行为,曝光前没有任何明确的提示或披露。同一个团队,闸门哲学在九月的头三周里完成了换轴。
把 ZCode 事件放进行业背景看,它不是孤例。据第三方横评盘点,Grok Build 在 2026 年 7 月被曝在用户明确说「别读我文件」时仍上传含 .env 的完整仓库;Claude Code 的 npm 包在 2026 年 3 月误附了五十多万行源码映射文件,暴露了远程关闭开关的存在;OpenCode 到某个版本一直把会话首条消息发给外部服务用于起名。壳这一层的信任问题由来已久,ZCode 的特殊之处在于它对质疑的回应是开源,让上传链路彻底没了这件事第一次可以被任何人顺着源码验证,比任何审计报告都有说服力,这是一次「可验证大于承诺」的行业演示。
七、插件化,谁能改这个壳
最后一个问题是开放性,这个壳的哪些部分,用户和生态能动手换。
dsh 把答案推到了极致,一切皆插件。55 个包组里没有特权核心,模型适配器、工具注册表、会话日志、连 agent 循环本身都是插件,全部可以从配置替换。它的插件框架(Cordis)有几个讲究。能力按「接缝」组织,一个接缝三个角色,声明接口的定义、提供实现的提供者、通常是模型可见工具的消费者;换提供者,接口和消费者不动。把 shell 的实现从本地换到远程沙箱,模型看到的 bash 工具描述一字不变,迁移对模型不可见。注册是可逆的,提示词片段、工具、监听器全部以「效果」的形式安装,插件卸载时按注册逆序回卷,不留残渣。组合用三层 YAML 配置,档案选组合、组合带代码、补丁做覆盖,一条命令能打印出本机实际启动的完整插件树,任何一行都可以被自己的补丁替换。启动纪律靠脚本强制,仓库的校验脚本把每个入口归类,机械地拒绝任何绕过主启动方式的路径,「不做第二个入口」是被 CI 守着的架构约束。甚至 Creator 模式让模型自己管理插件,检查、安装、开关插件,每次操作都要最高权限或逐次审批。
Claude Code 走的是反向路线,核心循环不开放,但把扩展点铺满整个生命周期。技能机制做渐进披露,描述常驻上下文,正文用到才加载,长参考材料的闲置成本接近零;hook 事件有二十多个,覆盖会话、回合、每次工具调用、压缩前后、子代理起止。权限模式调闸门的松紧,压缩和记忆的配置调调度的轻重,松紧本身做成了用户可调的选项。
ZCode 的开放重心在模型层。它的提供者注册表内置二十多个模型服务商模板,Anthropic 和 OpenAI 的官方接口在表里只是并列的两项;官方模型 GLM-5.3 走 Anthropic 消息协议接入。它对底层 AI SDK 直接打补丁,给两家协议网关都加上视频输入的 content 块,视频在这个壳里是一等公民,连压缩清理都明确保护视频结果。dsh 对 DeepSeek 模型的协同则有另一番意味,它在发给官方接口的请求里带上当前加载的插件清单字段,为服务端感知客户端组合、做模型侧适配留了数据通道,SDK 的默认路由指向自家的 deepseek-v4-flash。仓库里没有「专为某代模型优化」的直接表述,证据止步于这些扩展点。但如果模型厂商自己做壳,壳和模型的边界本来就可以比第三方做的更模糊,这条路值得盯着看。
Codex 的选择是反方向的纪律,Rust 工作区拆成八十多个 crate,贡献规范里写着「抵制向核心 crate 添加代码」,逼着新能力长成独立模块而不是往主干上堆。oh-my-pi 的开放性体现在视角转换上,16 个内部 URL 协议把 GitHub 的 PR、issue、子代理输出、合并冲突全部统一成文件系统,读一个 PR 和读一个源码文件是同一个动作,冲突的每一面都是一个可以写回的 URL。
八、五种产品,五种承重墙
现在可以把五家放回一张图里看。
模型有四个改不掉的毛病,无状态、窗口有限、概率采样、能力固定。世界有四个改不掉的事实,信息无限、任务超长、不可逆、需求开放。每一对落差,长出一类设计。窗口装不下任务,有了上下文调度(压缩、记忆、子代理隔离);一步走不完长任务,外置循环来接手(loop、goal、检查点、多 agent 分片);概率动作撞上不可逆世界,得设行动闸门(沙箱、审批、白名单);固定能力接不住开放需求,就开插件协议(MCP、技能、一切皆插件)。四根柱子,撑起你在各家壳里见到的设计,那些看着独立的功能,多数都能折叠回这四根的组合。
五家产品的分野,在于把哪根柱子当承重墙。Codex 重注闸门,操作系统级沙箱、正交审批、模型审模型,调度相对朴素,安全换笨重。oh-my-pi 重注调度,一切为 token 效率和机械精度让路,默认放行,快而野,丢掉的事实找不回。ZCode 是重调度加工作台形态,子代理运行状态在界面上可见,桌面、Web、终端三端一个运行时,什么都有,代价是重。dsh 的选择最特别,核心小到只剩协议,调度和闸门都下放成插件,想要哪种就装哪种,裸归裸,可搬家。Claude Code 站在中间偏重的位置,但它有个自己的打法,调度和闸门的松紧都交给用户来调。
没有任何一家四根全占,四根都当承重墙的,最后长出来的已经是平台。

九、怎么评估一个壳
如果你要选一个 AI 编程工具,或者评估任何一个 agent 产品,别先看功能清单,拿着四个问题去翻它的文档和源码。
第一问,上下文策略的透明度。压缩参数读得到吗?丢什么、保什么,是官方声明的还是黑箱?崩溃之后回放能对上账吗?ZCode 的两级压缩每个数字都在源码里,Codex 把压缩后的事实保留规则写进了实现注释,Claude Code 用一张压缩存活表逐项声明,这三家的共同点是你可以预判压缩会拿走什么。做不到这一点的工具,长任务跑崩时你连原因都查不到。
第二问,记忆治理。记忆存在哪,谁能写,每次注入上下文多少,写错了怎么删,会不会被写进影响行为的位置。ZCode 那套「删除命令必须是绝对路径、必须 .md 结尾、不许通配符、不许递归」的白名单,和「记忆文件不许写进 skills 目录」的黑名单,是这个问题目前见到的最细答案。没有治理的记忆是隐患,它决定模型明天会相信什么。
第三问,权限模型。闸门拦在哪一层,是提示词、审批弹窗,还是操作系统?拒绝规则能不能被允许规则穿透?审查失败时是开闸还是关闸?这一问直接对应 ZCode 事件的教训,一个工具对本地代码的每一次读取和上传是否可见、可控、可审计,比任何「零数据留存」的承诺都实在。这次是靠抓包发现的,开源之后才能靠读源码发现,可验证性本身就是安全属性。
第四问,可替换性。循环、模型、工具、记忆,哪些能换,换的代价是一行配置还是一次重写。dsh 把这个问题做成了产品本身;oh-my-pi 用十八个配置发现器把迁移成本压到零;Claude Code 用外围扩展点换取核心的稳定。没有标准答案,但答案的诚实度有高下,最差的那种是文档里写着可扩展、实际上每条路都通向厂商自己的服务。
最后回到开头那件事。ZCode 用一次事故换来的开源,意外的贡献是让「壳工程」从黑话变成了可以逐行审读的东西。模型是买来的常数,壳是还能动的变量,常数兑现几成,就看变量怎么调。下一次看到「同一个模型,我们跑分更高」的宣传,先别看跑分,去看看它的壳,把上面四个问题问一遍。