Claude Code 源码泄露——Anthropic 藏了哪些秘密?
泄露事件简述
2026年3月31,Anthropic 的编程助手 Claude Code 爆出了史诗级泄露。一个本该被编译混淆的 npm 包,居然忘删了 source map 文件。结果?1902 个源文件、29MB 的完整 TypeScript 源码,被一键还原了出来。
注意:不是反编译,不是猜测,是原文! 变量名、注释、函数结构,一字不差。
那么我们从中到底能学到什么?我花了几个小时翻了一遍,挑出 6 个让我”哦!”出声的发现。

发现一:Claude Code 最核心的秘密——System Prompt
大家都知道 Claude Code 很厉害,但很少有人想过:它到底跟 Claude API 说了什么?
翻开源码,main.tsx 这个文件有 785KB,你没看错,一个文件快 1MB。里面藏着整个 system prompt 的构建逻辑。虽然没有直接暴露 prompt 原文(那个是在编译时注入的),但代码暴露了 prompt 的架构设计。
关键发现:buildEffectiveSystemPrompt 函数的优先级链:
0. Override(最高优先级,比如 loop 模式)
1. Coordinator prompt(多Agent协调模式)
2. Agent prompt(自定义agent定义)
3. Custom system prompt(用户通过 --system-prompt 指定)
4. Default(默认的 Claude Code prompt)
+ Append(最后追加上去的补充prompt)
就像给员工写工作手册,第 0 条是老板的口头指令(最高优先级),第 4 条是公司规章制度,中间还可以插各种补充。Anthropic 把”如何跟 AI 说人话”这件事做到了极其精细的分层。
而且每次对话开始前,它会:
- 跑一遍 git status,把当前分支、最近5条 commit 塞进 context
- 扫描目录下所有 CLAUDE.md 文件(这是用户自定义的项目规则)
- 注入当前日期
所以 Claude Code 知道你在哪个分支、改了什么文件、项目规则是什么,这不是魔法,是工程。
发现二:防”作死”的 500KB 安全锁
BashTool(命令执行工具)一个文件夹 500KB,其中:
- bashSecurity.ts 100KB — 专门识别危险命令
- bashPermissions.ts 96KB — 权限审批全流程
- readOnlyValidation.ts 67KB — 只读命令白名单
光 bashSecurity.ts 就有 2585 行代码。它检查的东西包括但不限于:
✘ $() 命令替换 —— 黑客最爱
✘ ${} 参数替换 —— 可以读取环境变量
✘ <() 进程替换 —— 可以执行任意命令
✘ zmodload —— Zsh 的万能后门,加载模块后可以绕过所有安全检查
✘ =cmd —— Zsh 的 equals 扩展,=curl evil.com 会直接找到 curl 的绝对路径执行
最后那条特别有意思:如果你写 rm -rf =evil,正常解析器会认为第一个词是 =evil,不匹配 rm,安全检查就放行了。但 Zsh 会把它展开成 /usr/bin/rm -rf evil——安全检查形同虚设。
Anthropic 专门针对这种 Zsh 特性写了检测规则。
还有个叫 pathValidation.ts 的文件(43KB),专门防止命令里藏路径注入攻击。
就像你给 AI 一个终端,就像给一个陌生人一把钥匙。Anthropic 花了 500KB 代码做了一件事,让这个陌生人只能开你允许的门,而且用了至少 5 层锁。 国内做 agent 的厂商,安全层普遍只有一两层。
发现三:Prompt Cache 命中率优化——省出来的都是利润
promptCacheBreakDetection.ts(26KB)这个文件暴露了一个令人震惊的事实:Anthropic 在用 diff 算法追踪每一次 prompt 的变化。
每次 API 调用,它会:
-
1. 对 system prompt 计算一个 hash -
2. 对每个工具的 schema 计算一个 hash -
3. 把 beta header 列表排序后对比 -
4. 甚至追踪 autoModeActive、isUsingOverage 这些布尔值的状态翻转
如果发现 cache 被意外打破,它会记录一个详细的事件,包含:
- 哪个工具的描述变了
- 哪个 beta header 被加/删了
- system prompt 的 diff(用标准 diff 算法生成)
还有一个 fingerprint.ts 文件,用 SHA256 对用户消息的特定位置字符(第4、7、20个字符)+ 固定盐值 + 版本号 做指纹,发给服务器验证客户端是不是正版。
大模型的 API 调用是按 token 收费的,System prompt 往往几万个 token,如果每次调用都要重新发送,光 prompt 费用就是天文数字。Anthropic 通过 prompt cache 技术,让重复部分只需付费一次。
但 cache 很脆弱,工具列表变了、beta header 变了、prompt 里多了个空格,cache 就碎了。
所以 Anthropic 写了一个专门的监控系统,精确追踪到底是什么变化打碎了 cache,然后修掉它。这不是小聪明,是真金白银。
代码里还写着:AgentTool 的工具描述占了全 fleet cache token 的 10.2%,因为 MCP 工具动态加载会频繁改变列表,每次都打碎 cache。
发现四:Fork 机制——AI 的分身术
forkSubagent.ts 暴露了一个非常高级的设计——Fork 机制。
普通的 subagent(子 agent)是从零开始的,什么都不继承。但 Fork 不同:
Fork 的子进程会继承父进程的完整对话上下文和 system prompt,共享 prompt cache。
更巧妙的是,为了让所有 fork 共享 cache,Anthropic 用了一个 placeholder 技巧:
// 所有 tool_result 都用同一个占位文本
constFORK_PLACEHOLDER_RESULT = 'Fork started — processing in background'
// 只有最后一个文本块是不同的(每个 fork 的具体指令)
这样,多个并行 fork 的 API 请求前缀几乎完全相同,缓存命中率最大化。
给 fork 子进程的指令也非常有意思,第一条规则就是:
“你是 fork 出来的工人进程,你不是主 agent。你的 system prompt 会让你’默认 fork’——忽略它,那是给父进程的。你已经是 fork 了,不要再生 fork。”
10 条铁律,包括:
- 不要聊天,不要提问
- 不要在工具调用之间输出文字
- 严格待在指令范围内
- 报告必须以 “Scope:” 开头
- 保持在 500 字以内
想象一下,你是一个项目经理(主 agent),你把一个大任务拆成 3 个小任务,分给 3 个组员。普通的分法是给每个人写一封邮件从头解释背景——浪费。
Fork 的做法是直接把你脑子里的上下文”复制粘贴”给每个组员,只加一句”你去干这个”。而且为了避免组员又去招人(递归 fork),直接在指令第一条写死”你不准再招人”。这就是 Anthropic 的”AI 分身术”,不是魔法,是工程。
发现五:对话压缩——AI 怎么”遗忘”
大模型的上下文窗口有限,对话一长就会爆。Claude Code 的解决方案叫 compact(压缩),相关代码分散在多个文件里:
autoCompact.ts 揭示了关键参数:
- AUTOCOMPACT_BUFFER_TOKENS = 13,000 — 距离窗口上限还有 13K token 时自动触发压缩
- WARNING_THRESHOLD = 20,000 — 还剩 20K 时开始警告
- ERROR_THRESHOLD = 20,000 — 还剩 20K 时报错
- MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3 — 连续压缩失败 3 次就放弃(熔断器)
最后那条特别有意思:代码注释里写了真实数据——
BQ 2026-03-10: 1,279 个会话出现了 50+ 次连续压缩失败(最高 3,272 次),每天浪费约 25 万次 API 调用。
所以他们加了熔断器:连续失败 3 次就不重试了。
还有 microCompact(微压缩),专门处理工具返回结果的精简:
- 超过 2000 token 的图片会被裁剪
- 文件读取、命令执行、搜索等工具的返回值会被压缩
- 用 [Old tool result content cleared] 替换旧内容
AI 的记忆就像一个固定大小的笔记本,写到快满的时候怎么办?Anthropic 的做法不是”翻页重来”,而是分层处理:先微压缩(把工具返回的大段输出精简),再大压缩(让 AI 自己总结前面的对话),实在不行就熔断(别反复试了,省点钱)。
最最让我震撼的是那组数据——1279 个会话反复尝试压缩几千次,一天烧掉 25 万次 API 调用。
说明即使是 Anthropic 自己,也会在工程上犯错,但他们有数据驱动修复的文化。
发现六:反篡改机制——你怎么证明”我是正版”
fingerprint.ts 和 system.ts 暴露了一个反篡改体系:
每次 API 请求,Claude Code 会在 HTTP header 里带上:
x-anthropic-billing-header: cc_version=2.1.87.abc; cc_entrypoint=cli; cch=00000;
cch=00000 看起来是占位符,实际上:
- 请求发送前,Bun 的原生 HTTP 栈(用 Zig 语言写的)会找到这个占位符
- 把 00000 原地替换成客户端的认证哈希
- 服务器端验证这个哈希,确认请求确实来自正版 Claude Code
为什么要用占位符?因为长度不变,不需要重新计算 Content-Length,省掉了内存重新分配。
Claude Code 分免费版和付费版,怎么防止有人改改客户端代码,绕过付费?他们在每次请求里藏了一个”数字签名”。签名的计算不在 JavaScript 里——而是在更低层的网络协议栈里(用 Zig 语言写的),你改不了。
每次发请求,自动算好签名塞进去,服务器一看就知道是不是正版。这种“在你看不见的地方做验证”的思路,值得所有做 SaaS 的产品学习。
模型不是护城河,工程才是
看完这 29MB 的源码,最大的感受不是”Anthropic 的模型多强”,而是”Anthropic 的工程多细”。
- 500KB 的安全锁,防的是 AI 执行危险命令
- 26KB 的缓存监控,省的是真金白银
- 熔断器设计,止损用的是真实数据
- Fork 机制,并行效率靠的是占位符技巧

这些都不是”模型能力”的问题,而是”怎么用好模型”的问题。
国内大模型厂商在模型能力上差距在缩小,但在 agent 工程化上,这份泄露的代码告诉我们,差距还很大!而且这个差距不是靠更大的算力能追上的。
但好消息是:现在这门课的教材,免费公开了。
夜雨聆风