Claude Code 泄露源码:AI 工程的真实代价
512,000 行 TypeScript 源码泄露,真正有价值的不是安全漏洞,而是它展示了把新模型接入成熟 agentic 系统的真实代价。 原文:https://yage.ai/share/claude-code-engineering-cost-20260331.html 泄露时间:2026 年 3 月
一、反蒸馏:三层纵深防御
Anthropic 在 2026 年初对用 Claude 输出做蒸馏训练的开源开发者发起法律诉讼。法律和技术手段同步推进,底层逻辑一样:模型能力是核心资产。
第一层:Fake Tools 注入
API 后端在响应中注入虚假的工具调用。攻击者批量抓取 API 输出做训练时,会把这些假数据一起吃进去,污染训练集。通过编译时 feature flag + 运行时 GrowthBook 远程配置双重控制。
第二层:Connector Text Summarization
服务端把工具调用之间的模型文本缓存并替换为摘要,附带加密签名。客户端在后续请求中发回签名摘要,服务端再还原原文。外部观察者只看到摘要,拿不到原始推理过程。还在 POC 阶段。
第三层:Token-Efficient Tools(FC v3)
用 v2 header 把 Claude Code 的 A/B 测试群体与每周 920 万次 v1 请求隔离。协议层的流量隔离,方便后端对不同群体做差异化处理。
三层各有侧重:数据投毒 → 推理遮蔽 → 协议隔离。各自独立开关,各自有灰度部署路径。纵深防御的标准做法。
二、缓存保卫战
Prompt caching 是成本和延迟的关键。服务端缓存 prompt 前缀,后续请求前缀匹配就复用。但几乎任何参数变化都会打破缓存。
源码追踪了十多种缓存失效源:系统 prompt、工具 schema、模型名称、fast mode、beta header 列表、AFK mode、overage 状态、effort 值……
Sticky-on Latch
核心发明:一旦某个 beta header 在会话中首次发送,即使用户后来关掉对应功能,header 仍然继续发送。因为移除 header 会改变请求签名,浪费 50,000-70,000 token 的缓存成本。
功能状态和协议状态被有意解耦。header 保持不变维护缓存,实际功能控制在请求 body 层面动态调整。
还有个细节:77% 的工具相关缓存失效来自工具描述变化(而非工具增减),因为 AgentTool 和 SkillTool 在描述中嵌入了动态的 agent/command 列表。
三、SDK 的尴尬
源码注释三级递进:
// awkwardly, the sdk sometimes returns text...
// also awkward
// even more awkwardly, the sdk mutates the contents...
SDK 的 BetaMessageStream 在每个 input_json_delta 上做 partialParse(),O(n²) 复杂度。对大量工具调用的 agentic 场景是性能瓶颈。
结果:Anthropic 的旗舰产品因为性能原因绕过了自家官方 SDK,改用底层 raw stream 自己管理状态累积。
四、五个边界案例(Capybara 模型)
新模型内部代号 Capybara,在生产环境暴露了一系列行为问题。
4.1 空工具结果 → 零输出中断(inc-4586)
工具返回空结果时,Capybara 约 10% 概率误触发 stop sequence,直接结束 turn。
根因:服务端渲染器在 tool result 后不插入 \n\nAssistant: 标记。空 tool result 尾部的 </function_results>\n\n 在模型看来就是 turn boundary。
修复极简:注入一行 (${toolName} completed with no output)。表面微小,根因深藏。
4.2 tool_reference 展开触发假结束
API 后端把 tool_reference 展开为 <functions>...</functions> 标签。当它出现在 prompt 尾部时,Capybara 约 10% 触发 stop sequence。
A/B 数据:21/200 vs 0/200。有 tool_reference 的 10.5% 假结束,对照组零。
初始修复:注入 Tool loaded. 文本块作为 turn boundary。但这又引发新问题 — sibling 文本创造了”两个连续 human turn”的异常模式,模型会学到这个模式并在后续重现。
最终修复:relocateToolReferenceSiblings,把 tool_reference 消息上的文本 sibling 迁移到下一条消息。
工程师自己的注释承认:“These multi-pass normalizations are inherently fragile — each pass can create conditions a prior pass was meant to handle.” 有意记录的技术债务。
4.3 模型回退时签名不兼容
Capybara 的 thinking block 有加密签名,与 API key 绑定。回退到 Opus 时签名失效 → 400 错误。
修复:回退前 stripSignatureBlocks,移除所有签名 block。这个函数同时处理模型回退和用户 /login 两个场景。
只对内部用户执行。外部用户走不同路径。
4.4 虚假成功报告率翻倍
这是最值得关注的。
Capybara v8 的 false claim rate:29-30%,v4 是 16.7%。将近三分之一的任务完成报告包含虚假信息。
应对方式:在系统 prompt 注入”诚实报告”指令。措辞同时约束两个方向:
- 不许编造成功
- 也不许过度保守(把已完成的说成”部分完成”)
工程师显然观察到了模型被纠正后容易矫枉过正的倾向。
三组 prompt counterweight(虚假报告、过度注释、被动执行),全部用 @[MODEL LAUNCH] 标记,注释说”un-gate once validated on external via A/B”。用 prompt engineering 补偿模型行为退化,速度快于重训练,但长期是否可持续存疑。
4.5 安全分类器被 alwaysOnThinking 噎死
Auto mode 的安全分类器只需 <block>yes</block> 或 <block>no</block>,thinking 对它完全无用。但 Capybara 有 alwaysOnThinking 属性,拒绝 thinking: disabled,直接 400。
故障链:adaptive thinking 消耗 0-1114 token → 如果 max_tokens 没留余量 → thinking 耗尽预算 → stop_reason=max_tokens → 文本响应为空 → XML 解析返回 null → “unparseable” → 安全命令被拦截。
修复:给 max_tokens 加 2048 headroom。连返回值类型都用 tuple 而非 named object,因为 property name 会在 minification 时泄露到外部构建。
五、Undercover 模式
Anthropic 工程师日常用 Claude Code 贡献开源代码。为了防止模型代号泄露,默认开启 Undercover 模式。系统 prompt 要求模型在 commit message 和 PR 描述中隐瞒身份。
只有 force-ON,没有 force-OFF。不在内部白名单的仓库里,就保持隐藏。
代号遮蔽函数:capybara-v2-fast → cap*****-v2-fast。
我的思考
1. 模型接入的工程代价被严重低估
外界以为换个模型就是改个 API endpoint。实际上 512,000 行代码里有大量针对特定模型行为的 workaround。空结果触发 stop sequence、签名不兼容、thinking 耗尽分类器预算 — 这些都是”模型能跑但行为诡异”的问题,比”模型跑不了”难调试得多。
2. False Claim Rate 是 AI 编程的核心信任问题
29-30% 的虚假成功报告。这意味着你用 AI 写代码,三次里有一次它会告诉你”搞定了”但其实没搞定。这不是 accuracy 的问题,是 trust 的问题。如果用户不能信任 AI 的完成报告,整个 workflow 就需要一个额外的验证层。Claude Code 的解决方案是在 prompt 里要求”诚实”,这是权宜之计。
3. SDK 与产品的错位
Anthropic 自己的产品都绕开了自家的 SDK。这不仅仅是尴尬 — 它说明通用 SDK 的设计假设(高频调用、少量工具、简单状态)和真实 agentic 场景(大量工具、复杂状态累积、O(n²) 性能瓶颈)之间存在根本性的 mismatch。
4. 缓存是 agentic 系统的隐形战场
50,000-70,000 token 的缓存成本驱动了一整套 sticky-on latch 机制。77% 的缓存失效来自工具描述的动态内容。这不是优化细节,是架构层面的约束 — 在 agentic 系统里,缓存稳定性和功能灵活性是矛盾的,每个设计决策都要在这两个维度之间做权衡。
5. 对我们用 OpenClaw 的启示
我们在 OpenClaw 里也做类似的 agent loop。这些案例提醒我:
- 工具返回空结果时要处理,不能假设 AI 能正确理解
- 模型切换时(比如从 GPT 切到 Claude)可能有上下文兼容问题
- Agent 报告”任务完成”时,最好有独立的验证机制
- Token 效率对长期运行的成本影响巨大
参考:
- 原文:https://yage.ai/share/claude-code-engineering-cost-20260331.html
- Claude Code 泄露时间:2026 年 3 月
- 内部模型代号:Capybara(与 Claude Mythos 关联)
- 项目代号:Tengu