乐于分享
好东西不私藏

我把 Claude Code 源码扒了个底朝天,发现了一些不该公开的东西

我把 Claude Code 源码扒了个底朝天,发现了一些不该公开的东西

深入分析 Claude Code 内部架构,权限系统、子代理机制、上下文压缩策略,以及那些官方从未公开的功能。

我把 Claude Code 源码扒了个底朝天,发现了一些不该公开的东西

你以为它只是个 AI 聊天工具?Too young。

前两天把 Claude Code 的源码翻了个遍。

说实话,之前我也觉得这就是个”能聊天的终端工具”,装完能用就行。但看完之后我的感受就一个:这玩意儿比想象中复杂得多。

不卖关子,直接上干货。

权限系统:三层防护

Claude Code 的权限系统不是我之前想的”问一下->同意/拒绝”这么单薄。它是三层嵌套的:

第一层 denyRules(直接拒绝):危险操作直接拦截,连弹窗都没有。比如删库、格式化磁盘这类操作,配置里直接写死,碰到就死。

第二层 allowRules(直接放行):安全操作直接通过。比如读取文件、执行测试这类操作,设置白名单,命中就放行,不再问你。

第三层 alwaysAskRules(每次都要问):既没被禁止也没被允许的操作,弹出确认框让你决定。

每层规则还带来源标记,区分这条规则是来自配置文件、工作目录的 settings.json,还是 SDK 调用方设置的。调试的时候能看清楚规则从哪来的。

还有一个字段值得注意:shouldAvoidPermissionPrompts。这个字段标记为”在后台 agent 上使用,不能弹 UI”。

这就解释了为什么 Claude Code 开启子代理时,你不会收到一堆权限弹窗。

子代理在后台运行,弹窗无处显示,它要么自动放行要么自动拒绝,不会等你操作。

Hooks:可编程的基础

很多人把 Hooks 当成边缘功能,但我看完源码觉得这就是 Claude Code 可编程性的基础。

Hooks 允许你在特定事件发生时自动触发 shell 命令或脚本。事件包括:工具执行前、工具执行后、Claude 打算停止时、API 返回之后。

关键是:用户在 settings.json 里配置的 shell hooks,和内部的 function hooks 走完全相同的触发机制。

不存在内置行为优先、用户 hook 降级的情况。

这意味着你能用 hooks 实现的事情,理论上和 Anthropic 工程师能实现的一样多。

子代理:不是简单的”再开一个对话”

Claude Code 有个子代理功能,可以让主实例启动几个子代理并行处理不同子任务。

但它不是简单的”再开一个对话”。子代理有独立权限上下文、隔离文件状态、可并发执行。

几个关键点:

  • 内置 agent 是可配置的。Explore、Plan 等 agent 定义是动态的,不是写死的。
  • Fork 模式下子代理有隔离的文件状态。两个子代理并行运行时,它们看到的”哪些文件被修改过”是相互隔离的。
  • Coordinator 模式还在开发中,是一套为多代理协作设计的架构,目前还没对外开放。

子代理的权限继承父代理设置,但有一个重要限制:shouldAvoidPermissionPrompts 自动为 true。

所以子代理遇到权限问题时不会停下来等你确认,会直接按规则自动处理。

上下文压缩:对话太长怎么办

Claude 的上下文窗口是有限制的。一次复杂编程任务可能涉及大量文件读取、代码修改、命令执行,对话会越来越长。

Claude Code 有三套压缩策略:

Auto Compac(自动摘要):快达到上限时,调用 Claude 对历史对话做一次摘要,把摘要插入对话作为新的起点,然后丢弃原始历史。

Reactive Compact(被动摘要):不预防性触发,等 API 真的返回”上下文太长”错误之后才触发摘要。更激进,但能保留更多历史。

Snip Compact(精准截断):不做整体摘要,而是精确截掉对话中某些指定的消息片段。比如一个巨大的工具调用结果,截掉它但保留前后上下文。

这几种策略并存,说明 Anthropic 在上下文管理上还在持续摸索,没有找到”一劳永逸”的方案。

几个藏在代码里的未公开功能

constants/betas.ts 里定义了所有发往 API 的 beta header,有几个值得单独提:

Fast Mode:官方解释语焉不详,源码说清楚了——它是通过请求头告诉服务端切换到不同的采样参数(更低温度、更快输出),不是换了另一个模型,就是采样策略不同。

AFK Mode(挂机模式):公开文档里从来没见过。代码里有 getAfkModeHeaderLatched()/setAfkModeHeaderLatched(),”Latched”意思是一旦激活就保持。从名字猜,应该是”我要离开电脑一段时间,你自主处理完”的模式。

任务预算和 Effort 控制:TASK_BUDGETS_BETA_HEADER 给单次 agentic turn 设置 token 上限,EFFORT_BETA_HEADER 控制推理深度。这两个近期已经开始出现在 API 文档里了。

1M 上下文实验:CONTEXT_1M_BETA_HEADER 控制是否启用 100 万 token 的超长上下文,目前还是实验状态。

这些 beta header 加起来,是观察 Anthropic 产品路线图最直接的窗口。

官方文档永远比实际进展落后半个身位,但代码不会骗人。

我的感受

读这份代码,最让我意外的是它的工程成熟度。

很多人觉得 Claude Code 就是个”AI 聊天 + 工具调用”的简单组合,但源码里能看到大量针对工程现实的细节处理:

  • 为了 resume 在 API 调用之前就写日志
  • 为了降低 API 成本精心设计提示词的缓存边界
  • 为了处理超长输出专门做自动重试恢复

这些都是实际跑起来之后遇到问题磨出来的东西。

另一个让我觉得有意思的是 feature flag 体系的彻底性。你安装的 Claude Code 和 Anthropic 内部跑的那个,在代码路径上差异相当大。

Coordinator 模式、Context Collapse、AFK Mode……这些东西现在对普通用户完全不可见,但代码里已经存在,等着某一天正式开放。