乐于分享
好东西不私藏

Claude Code 源码中值得大家学习的细节

Claude Code 源码中值得大家学习的细节

2026 年 3 月 31 日,Anthropic 发布 Claude Code v2.1.88 时,不慎在 npm 包里带上了一个 59.8 MB 的 source map 文件。任何人都能据此还原出完整的 TypeScript 源码——约 1,900 个文件、51.2 万行代码。这相当于一个中型 App 的完整代码量,也是迄今为止业界第一次完整暴露一款顶级 AI Agent 产品的工程实现。

本文不讨论泄露本身的对错,而是聚焦一个问题:这份源码里,有哪些值得产品经理、程序员和 AI 爱好者学习的工程细节?


一、整体架构:不是”LLM 套壳”,而是一个 Agent 操作系统

很多人以为 Claude Code 只是在命令行里套了一层 LLM 对话。源码告诉我们完全不是这样。

Claude Code 用 TypeScript + React Ink(终端 UI 框架)构建,运行在 Bun 运行时上。整个项目包含约 40 个工具模块、50 个斜杠命令、140 个界面组件。核心文件 QueryEngine.ts 单文件就有约 4.6 万行,负责所有 LLM 推理调度、Token 计数和思维链循环。

一句话总结架构哲学:

Harness 不让 Claude 变聪明——Claude 本来就聪明。Harness 给了 Claude 双手、双眼和一个工作空间。

Claude Code 没有试图用复杂的决策树替模型做判断。它的角色是提供工具、知识、上下文管理和权限边界,然后把决策权交还给模型。

学习点:构建 AI Agent 产品时,不要过度编排工作流。把精力花在给模型一个好的”工作环境”上,比花在替模型做决策上更有效。


二、三层上下文压缩策略:长对话的终极解法

长对话中模型越聊越”糊涂”(context entropy),是所有 AI 产品的通病。Claude Code 的解法是一套三层压缩机制,堪称教科书级别:

第一层:MicroCompact(微压缩)——不调用 API,直接在本地编辑缓存内容,移除过时的工具输出。零成本、零延迟。

第二层:AutoCompact(自动压缩)——当上下文接近窗口极限时自动触发。预留 13,000 token 的缓冲区,生成不超过 20,000 token 的摘要。内置熔断机制:连续失败 3 次就停止重试,避免死循环浪费 API 调用。

第三层:Full Compact(全量压缩)——把整段对话压缩成摘要,然后重新注入最近访问过的文件(每文件上限 5,000 token)、当前活跃的计划、已使用的 Skill 信息。压缩后的预算上限是 50,000 token。

此外,源码中还有 Session Memory Compaction(会话记忆沉淀)和最旧消息截断两条辅助路径。

学习点:上下文管理不是一个策略能解决的问题,需要分层设计。低成本操作先行,高成本操作兜底,加上熔断保护防止失控。做任何长对话 AI 产品,这套分层策略都可以直接借鉴。


三、记忆系统:MEMORY.md 的”指针索引”设计

Claude Code 的记忆系统以 MEMORY.md 为核心,采用了一种极为克制的设计:每条记忆只是一个约 150 字符的指针行,始终加载进上下文窗口。详细内容存储在独立的记忆文件里,按需读取。

记忆支持三种触发模式:

  • 强指令触发
    :用户明确说”你还记得吗”、”查一下之前的”,系统必须触发召回。
  • 语义隐式触发
    :模型在理解当前任务时,如果发现与已有记忆强相关,自动触发。
  • 负向门控
    :用户说”忽略记忆”,系统切断召回链路,防止历史上下文污染。

还有一条关键设计原则:记忆不是事实源。记忆里提到的文件、函数、配置,在实际使用前必须重新核验当前状态。因为代码仓库会变,把过期记忆当真相,模型反而会犯更多错。

空记忆顶多让模型少一点个性,脏记忆会直接让模型说错话。

学习点:做 AI 产品的记忆系统,关键不在于记得多,而在于记得准、召回得当、用之前能校验。索引和正文分离的设计值得参考。


四、权限系统:每个工具自己判断”我是否安全”

Claude Code 的权限模型不是简单的”读操作放行、写操作拦截”。每个工具都实现了自己的 isConcurrencySafe(input) 方法,根据具体输入参数来判断当前调用是否安全。

比如 FileReadTool 通常返回 true,但 BashTool 会根据命令内容动态决定。如果 Claude 同时请求读 5 个文件,它们会并发执行;但如果中间夹了一个写操作,就会在该操作前后切断并发。

权限模式也很灵活:default(默认弹窗确认)、plan(规划模式)、bypassPermissions(跳过权限)、auto(AI 分类器自动审批)等多种模式。

学习点:权限设计的颗粒度应该下沉到工具级别,而不是在上层一刀切。这种”工具自治”的权限模型,让系统既安全又灵活。


五、多 Agent 协作:内建的团队系统

Claude Code 的多 Agent 实现不依赖外部编排框架,而是直接内建在工具系统里。源码中有明确的角色分工:

协调者(Coordinator) 只能使用 AgentTool、TaskStopTool、SendMessageTool——不能直接操作文件。

工作者(子 Agent) 才能使用 Bash、Read、Edit 等工具。

Agent 之间通过 SendMessageTool 发消息,通过共享任务板(TaskCreate/Update)协调进度。还有一个 Swarm 模式:Lead Agent 分配任务,多个 Teammate 各自认领并行执行。

为了防止无限递归,外部构建中子 Agent 默认禁止调用 AgentTool;但 Anthropic 内部构建(USER_TYPE === 'ant')允许嵌套。

学习点:多 Agent 协作的核心是角色隔离和通信机制。协调者不碰执行,执行者不碰调度——这个原则值得所有做 Agent 系统的团队借鉴。


六、编译时死代码消除:Feature Flag 的硬核用法

Claude Code 使用 Bun 的 feature() 函数做编译时特性开关:

import { feature } from'bun:bundle'const voiceCommand = feature('VOICE_MODE')   ? require('./commands/voice/index.js').default   : null

当 flag 为 false 时,相关代码在编译阶段就被完全剥离,不会出现在最终产物中。源码中发现了 44 个 feature flag,覆盖了大量尚未发布的功能:KAIROS(全能助手模式)、VOICE_MODE(语音)、DAEMON(后台守护进程)、WEB_BROWSER_TOOL(浏览器自动化)、COORDINATOR_MODE(多 Agent 协调)等。

这意味着 Anthropic 实际上已经把很多功能写好了,只是通过 flag 控制发布节奏——大约每两周开放一个新特性。

学习点:Feature flag 不只是灰度发布工具。配合编译时消除,可以做到未发布的代码完全不暴露给用户——安全性和发布灵活性兼得(虽然这次讽刺地全暴露了)。


七、反蒸馏机制:防止竞争对手”偷学”

源码中有一个 ANTI_DISTILLATION_CC 标志。开启后,Claude Code 会在 API 请求中加入 anti_distillation: ['fake_tools'] 参数,告诉服务端在系统提示词中静默注入伪造的工具定义

如果有人录制 Claude Code 的 API 流量来训练竞品模型,这些假工具定义会污染训练数据。

还有第二道防线:服务端会把 AI 回复中的文本做摘要和加密签名。下一轮对话时,原始文本可以从签名恢复,但中间传输的只是摘要——进一步降低被蒸馏的价值。

学习点:在 AI 时代,保护模型输出不被竞对蒸馏是一个真实的工程问题。假工具注入是一种低成本但有效的对抗思路。


八、成本追踪:内建的 Token 经济学

源码中有一个 cost-tracker.ts 文件,专门追踪每次调用消耗的 token 数量和产生的费用。这意味着 Anthropic 在工具层面就内置了用量成本管理,未来很可能直接在界面上展示”这次对话花了多少钱”。

配合 /cost 斜杠命令,用户已经可以查看当前会话的花费。

学习点:AI 产品的成本可见性是用户信任的基础。把成本追踪做成基础设施级别的能力,而不是事后加的报表功能,是正确的工程姿势。


九、Undercover Mode:AI 匿名贡献开源的争议设计

源码中有一个完整的”卧底模式”子系统。当 Anthropic 员工用 Claude Code 在公共开源仓库工作时,该模式自动激活,系统提示词会注入:

“You are operating UNDERCOVER… Your commit messages… MUST NOT contain ANY Anthropic-internal information. Do not blow your cover.”

具体来说,它会禁止在 commit message 和 PR 描述中出现:内部模型代号(如 Capybara、Tengu)、未发布的模型版本号、内部工具名、Slack 频道链接、”Claude Code” 字样、任何 AI 署名。

这个设计在开源社区引发了激烈争论:AI 公司匿名向开源项目提交 AI 生成的代码,算不算”欺骗”?

学习点:抛开争议不谈,这个功能本身揭示了一个趋势——AI 辅助的代码贡献正在成为常态,如何处理 AI 署名问题是整个行业都需要面对的。


十、彩蛋与工程文化:187 个加载动词和虚拟宠物

源码中还藏着一些有趣的细节:

Buddy 宠物系统:在 buddy/ 目录下,有一个完整的虚拟宠物系统——18 个物种、稀有度等级、闪光变体,甚至还有”调试能力”、”耐心值”、”混沌值”、”智慧值”等属性。模型在首次”孵化”时会为宠物写一段灵魂描述。这个功能通过 /buddy 命令触发,目前藏在 feature flag 后面。

187 个 Spinner 动词:在等待加载时,Claude Code 会随机展示不同的动作描述。Anthropic 的工程师为此写了 187 个不同的动词。

这些细节看似无关紧要,但它们反映了一种工程文化——在严肃的产品里留有趣的空间,让工具本身也有温度。


结语

这次泄露是一个低级的打包失误,但客观上给整个行业提供了一份极其珍贵的参考资料。在此之前,没有人见过一个日活百万级的 AI Agent 产品到底是怎么在工程层面构建的。

如果你要总结一个最核心的 takeaway,我觉得是这个:

Claude Code 的工程复杂度,90% 花在了”围绕模型的基础设施”上——上下文管理、权限控制、成本追踪、记忆系统、多 Agent 协调——而不是花在”让模型更聪明”上。

这对所有想做 AI 产品的人来说,是最重要的一课。模型能力是地基,但真正决定产品体验的,是你在地基之上构建的那套工程系统。