乐于分享
好东西不私藏

连夜扒完 Claude Code 源码,我总结了价值百万的 Agent 架构指南

连夜扒完 Claude Code 源码,我总结了价值百万的 Agent 架构指南

3月31日,估值数百亿的AI 巨头Anthropic遭遇了史诗级的“底裤泄露”。因为一个打包失误,Claude Code v2.1.88版本的51万行TypeScript核心源码在npm上被全世界看光。

在各大社区都在调侃代码里隐藏的“电子水豚”宠物、或者用正则匹配用户骂人(ffsshitty)的爆笑逻辑时,真正聪明的人,已经在连夜“抄作业”了。

要知道,这可是目前地表最强AI公司用来驱动核心生产力工具的生产级Agent架构。跳出吃瓜情绪,我们深入这1906个真实的源码文件,为你提炼了顶级AI大厂构建终端Agent的4个硬核“最佳实践”。

一、抗蒸馏(Anti-Distillation):教科书级的“数据投毒”防御战

这是源码中最令人拍案叫绝的发现,也是 Anthropic 保护自己核心资产的“杀手锏”。代码中暴露了一个名为 tengu_anti_distill_fake_tool_injection 的功能开关。

这到底是个啥?我们用一个通俗的例子来还原这个攻防战。

1. 黑客是怎么“偷师”的(什么是模型蒸馏)?Claude 最值钱的能力就是它极其聪明的“工具调用(Tool Calling)”逻辑(比如它知道什么时候该用 ls 看目录,什么时候该用 grep 搜代码)。 很多同行(竞争对手或黑客)为了抄袭这种能力,会在电脑上挂一个网络抓包软件(代理)。当他们使用 Claude Code 时,抓包软件就会把 Claude 发回来的每一条完美指令都偷偷记录下来。攒够了几万条后,拿去训练他们自己开源的便宜小模型。这就叫“蒸馏”。

2. Anthropic 是怎么反杀的(Fake Tools 投毒)?为了防偷师,Anthropic 想出了一招“暗号投毒”。 当你在终端提问时,官方的 Claude Code 客户端会在发给云端大模型的请求里,偷偷塞进去几个根本不存在的假工具(Fake Tools),比如 tengu_anti_distill_read_fake_memory

  • 对正常用户:完全透明(过滤掉)。 云端的 Claude 偶尔会调用这些假工具。但不用担心,官方的 CLI 客户端底层代码认识这些“暗号”,一旦收到假工具的调用,它在后台直接拦截、丢弃,根本不会显示在你的屏幕上。你看到的依然是完美、干净的回答。

  • 对偷师的黑客:致命毒药。 黑客的抓包软件是拦截在网络传输层的,它不懂暗号。它会把这些假工具调用连同真实指令一起原封不动地抓走。当黑客把这堆“带毒”的数据喂给自己的模型训练后,他们的模型就会彻底学废——在未来的实际使用中,模型会突然神经错乱,去调用一些根本不存在的假工具,导致程序直接崩溃。

这就好比大师教徒弟做菜,为了防隔壁偷听,故意在口诀里加了一句“翻炒空气三下”。徒弟知道这是暗号不用照做,但隔壁偷听的人照着学,炒出来的菜就成了笑话。这堪称 API 级别的 DRM 防御机制!

二、“延迟高于一切”:拥抱“适度陈旧”的状态

我们常以为顶级大厂的代码一定是绝对严谨的,但 Claude Code 的源码揭示了他们在工程上做出的巨大妥协:为了交互的低延迟,牺牲绝对的正确性。

在源码中,你会频繁看到这样的命名规范:

  • getFeatureValue_CACHED_MAY_BE_STALE()

  • DANGEROUS_uncachedSystemPromptSection()

Claude Code的最大敌人不是Bug,而是等待的焦虑。为了不阻塞主循环(Main Loop),他们在很多功能开关、状态检查上直接使用本地缓存,即使数据稍微过期(Stale)也能接受。

如果你在做 AI Agent,不要在每次用户提问时都去实时校验所有权限和环境状态,学学 Anthropic,用异步刷新缓存的方式保持交互的极速响应。

三、UI 与底层的剥离:为什么要在黑框框里跑 React?

很多人以为写个命令行(CLI)工具就是简单的 console.log 加上一个无限循环等待用户输入。但打开源码,你会震惊地发现:Claude Code 的终端界面,居然是用前端写网页的 React(结合 Ink 库)构建的。

直接打印输出不行吗?为什么要在终端里搞 React 这么重的东西?

1. 传统CLI的地狱痛点:光标满天飞想象一下这个场景:你的AI Agent正在思考(屏幕上需要转圈圈的动画),同时它在后台跑了一个耗时1分钟的Shell脚本,而此时大模型的流式回复(Stream)又开始逐字往外蹦了。如果你用传统的命令式写法,你的屏幕瞬间就乱套了。新打印的文字会把转圈动画冲刷掉,后台脚本的报错会穿插在 AI 的回复中间。为了不乱,程序员必须手动计算坐标,用复杂的转义字符把光标移来移去——这最后会变成一坨根本无法维护的“屎山”。

2. React的降维打击:数据驱动视图Anthropic引入React + Ink,就是为了彻底解决这个问题。React不关心“光标要移到哪”,它只关心“数据”。利用useState 存状态,利用组件画UI。当后台脚本跑完状态更新时,React 会在内存里计算出差异,自动翻译成光标指令,精准刷新进度条,绝对不会影响正在打字的 AI 界面。这让终端界面在复杂的并发下依然能丝滑响应。

四、提示词经济学:极致的缓存压榨

所有做过Agent开发的人都知道一个残酷的真相:大模型是无状态的(Stateless),它不仅是头脑发达的学霸,更是一头吃 Token 的“吞金兽”。
在一个典型的Agent循环中:AI写代码 -> 终端报错 -> AI分析报错 -> AI修改代码。 在这4个步骤里,由于API 记不住前面的对话,你每一次请求都必须把“1万字的 System Prompt + 几千字的工具 JSON 定义 + 之前的聊天记录”全量重复发送。跑几轮下来,光是上下文Token就能把你的信用卡刷爆,而且响应速度奇慢无比。
为了解决这个问题,Anthropic官方推出了Prompt Caching(提示词缓存)技术(命中缓存的 Token 费用直降 90%,延迟大幅缩短)。但缓存不是免费午餐,它要求你发送的文本前缀必须一模一样。
为此,Claude Code在源码层面进行了一次堪称“CFO 驱动”的架构大手术,实施了极其严苛的动静分离结构:
绝对静态区(Frozen Prefix):在组装发给大模型的 payload 时,源码严格要求把最长、最厚重的部分放在最前面。这包括了:长达数千字的 System Prompt、严格的 6 级安全沙箱规则、所有工具的JSON Schema定义。这部分在整个会话期间被“死死锁住”,绝不允许任何动态变量插队。
温数据区(Historical Context):之前的对话记录、已经执行成功的终端长日志。这部分虽然会增长,但历史内容不会被修改,系统会定期打上缓存断点(Cache Breakpoint)。
极度动态区(Volatile Suffix):用户的最新输入、当前这一秒的工作目录状态(git status)、最新的一条报错。这部分被严格限制在 Payload 的最后端,按标准费率计费。
抄作业指南:很多开发者喜欢在 Prompt 的各个角落动态插入变量(比如在系统设定里插入当前时间或最新的变量)。千万别这么干!这会瞬间击穿你的缓存。阅读 Claude Code的源码你会发现,它的整个上下文组装逻辑(Context Assembler)都在向“缓存命中率”妥协。只要把静态规则放前面,动态数据放最后,你手搓的 Agent成本至少能降一半,响应速度提升3倍。

Anthropic 的这次泄露,无意间为整个行业定下了一个开源的“基准线”。

如何构建防污染的安全层?如何设计无阻塞的 CLI UI?如何用正则来捕捉用户的“挫败感”从而调整 AI 的语气?这些曾经是大厂机密的核心技术,现在已经摆在了明面上。