目录

Claude Code from Source:18章深度拆解Anthropic最畅销AI编程工具的架构精髓

Claude Code from Source:18章深度拆解Anthropic最畅销AI编程工具的架构精髓

📋 学习目标

  • 理解Claude Code的六大核心抽象与数据流
  • 掌握Agent循环的4层压缩机制与错误恢复策略
  • 理解14步工具执行管道的设计与实现
  • 学会多Agent编排中的Fork模式与95%成本节省秘诀
  • 理解文件式内存系统与LLM召回机制
  • 掌握10大可迁移的架构模式,应用到自己的Agent系统

📖 项目概述

什么是Claude Code from Source

Claude Code from Source是一本揭示Anthropic Claude Code内部架构的深度技术书籍。

核心信息来源:

Claude Code发布到npm时,源码地图(source maps)也随之打包。通过读取每一个.js.map文件中的sourcesContent字段,获得了完整的原始TypeScript源码。近2000个文件,构成了完整架构图景。

项目数据

指标数值
源仓库alejandrobalderas/claude-code-from-source
章数18章
参与Agent36个AI Agent
创作耗时6小时(从源码提取到最终修订)
产出494KB原始技术文档→叙事化书籍

创作方法论

这本书的诞生本身就是一场AI生产力的演示:

阶段Agent数量任务
探索6个并行Agent阅读源码树的每一个文件
分析12个Agent产出494KB原始技术文档
写作15个Agent从零开始重写为叙事化章节
审核修订3个Reviewer Agent产出900行反馈;3个Agent应用所有修复

关键约束:最终审计确保没有直接复制源码——每个代码块都改写为伪代码,使用不同变量名,仅用于说明架构模式。


🏗️ 六大核心抽象

Claude Code的架构由六个核心抽象支撑:

┌─────────────────────────────────────────────────────┐
│                  Claude Code 核心抽象               │
├─────────────────────────────────────────────────────┤
│  1. AsyncGenerator → Agent循环(流式输出+背压)   │
│  2. Message → 类型化通信单元                       │
│  3. ToolDefinition → 工具声明与执行分离           │
│  4. PermissionSystem → 安全边界与权限控制          │
│  5. PromptCache → 前缀共享与成本优化             │
│  6. HookSystem → 生命周期扩展点                   │
└─────────────────────────────────────────────────────┘

🔄 Agent循环:异步生成器的力量

核心模式

Claude Code的Agent循环是一个AsyncGenerator

async function* agentLoop(query: Query): AsyncGenerator<Message> {
  // 1. 流式输出:模型边输出边流式返回
  for await (const token of model.stream(query)) {
    yield { type: 'token', value: token };
  }

  // 2. 工具执行:流式过程中预启动只读工具
  const speculativeReads = await executeReadToolsSpeculatively(query);

  // 3. 错误恢复:自动重试与上下文压缩
  if (error) {
    await recoverAndCompact();
  }

  // 4. 上下文压缩:4层压缩机制
  await compressContextIfNeeded();
}

4层上下文压缩

层级触发条件压缩效果用途
Snip输出超长截断中间轮次保留首尾
MicrocompactToken超50%合并相邻消息轻量压缩
CollapseToken超70%摘要合并中度压缩
AutocompactToken超90%深度摘要+重放极致压缩

每层都比上一层更彻底,但计算代价也更高。


🛠️ 工具执行:14步管道

完整执行管道

用户请求
    ↓
1. 工具定义解析
    ↓
2. 权限检查(PermissionSystem)
    ↓
3. 安全分类(Read/Write/Dangerous)
    ↓
4. 依赖分析
    ↓
5. 推测执行(Speculative Execution)
    ↓
6. 并发分组(按安全分类分区)
    ↓
7. 并行执行(只读工具)
    ↓
8. 序列化写入
    ↓
9. 结果聚合
    ↓
10. 错误处理
    ↓
11. 上下文更新
    ↓
12. 流式输出
    ↓
13. 缓存更新
    ↓
14. 返回结果

推测执行(Speculative Execution)

核心创新:在模型流式输出的同时,预启动只读工具

// 模型还在输出thinking,工具已经开始执行
async function speculativeExecute(query: Query) {
  const plan = await model.plan(query); // 首次token到达即规划

  // 只读工具可以立即执行
  const readResults = await Promise.all(
    plan.readTools.map(tool => tool.execute())
  );

  // 写工具等待模型确认
  if (plan.writeTools.length > 0) {
    await model.confirm(); // 等待完整响应
    await executeWrites(plan.writeTools);
  }

  return { readResults, writeResults };
}

并发安全分组

// 按安全分类分区
const partitions = {
  read: tools.filter(t => t.safety === 'read'),
  write: tools.filter(t => t.safety === 'write'),
  dangerous: tools.filter(t => t.safety === 'dangerous')
};

// 只读工具完全并行
const readResults = await Promise.all(
  partitions.read.map(t => t.execute())
);

// 写工具串行执行
for (const tool of partitions.write) {
  await tool.execute();
}

🔀 多Agent编排:Fork与协作

Fork Agent的Prompt Cache秘诀

Claude Code的多Agent系统最核心的创新:父子Agent共享字节完全相同的Prompt前缀

// 主Agent的Prompt结构
const mainPrompt = [
  systemPrompt,      // 系统级前缀(不变)
  projectContext,    // 项目上下文(不变)
  taskHistory,       // 任务历史(不变)
  // ↑ 这三部分 = 可缓存前缀 ↑

  currentTask        // 当前任务(每次不同)
];

// Fork Agent继承相同前缀
const forkedPrompt = [
  systemPrompt,      // 共享,0额外Token
  projectContext,    // 共享,0额外Token
  taskHistory,       // 共享,0额外Token

  forkedTask         // Fork特有任务
];

// 结果:~95%输入Token节省

Agent生命周期(15步)

步骤阶段核心行为
1-3初始化加载技能、解析任务、构建上下文
4-6规划分解任务、识别依赖、预算Token
7-9执行并发工具、推测执行、结果聚合
10-12评估判断完成度、检测循环、触发重试
13-15交付汇总结果、更新内存、清理状态

💾 内存系统:文件式记忆

4类内存分类

类型存储形式召回方式用途
SystemPrompt静态文件启动时加载角色定义
ProjectContext项目文件LLM选择代码结构
ConversationHistory消息文件时间+相关度对话记忆
** LearnedPrinciples**增量文件LLM召回经验积累

LLM召回 vs 嵌入搜索

Claude Code选择LLM召回而非嵌入向量搜索:

// 传统嵌入搜索
const results = await embeddingSearch(query, memories);

// Claude Code的LLM召回
async function recallMemories(query: Query, context: Context) {
  // 用Sonnet做side-query
  const relevantMemories = await sonnet.query(
    `Given the current task: ${query}
     And context: ${context}
     Which memories from past sessions are relevant?
     List them verbatim.`
  );

  return relevantMemories;
}

为什么LLM召回更好

  • 理解语义关联,而非关键词匹配
  • 可处理模糊、多层次、隐含的查询
  • 不需要额外的嵌入模型和向量数据库

⚡ 性能工程:每一毫秒都有意义

启动优化:240ms冷启动

// 并行I/O最大化
async function bootstrap() {
  const [
    config,      // 配置加载
    skills,      // 技能加载
    model,       // 模型初始化
    memory,      // 内存恢复
    ui           // UI初始化
  ] = await Promise.all([
    loadConfig(),
    loadSkills(),
    initModel(),
    restoreMemory(),
    initUI()
  ]);

  return { config, skills, model, memory, ui };
  // 总耗时 = max(各阶段) 而非 sum(各阶段)
}

Slot Reservation(槽位预留)

// 默认8K输出上限
const OUTPUT_SLOT = 8 * 1024;

// 当输出命中上限时,自动扩展到64K
async function handleOutputOverflow(output: string) {
  if (output.length >= OUTPUT_SLOT) {
    await escalateOutputSlot(64 * 1024);
    // 节省策略:在99%的请求中,8K足够
  }
}

Bitmap预过滤

模糊搜索使用Bitmap索引:

// 预计算的Bitmap索引
const fileIndex = {
  content: new Bitmap(),  // 内容位图
  path: new Bitmap(),      // 路径位图
  symbol: new Bitmap()     // 符号位图
};

// 先用Bitmap过滤候选文件
const candidates = fileIndex.content.and(queryBitmap);

🔌 可扩展性:技能与钩子

两阶段技能加载

阶段加载内容时机
启动时技能元数据(YAML frontmatter)Claude Code启动
调用时完整技能内容实际使用技能
// 阶段1:启动时只加载元数据
const skillMeta = {
  name: 'git操作',
  triggers: ['git commit', 'git push'],
  permissions: ['read:repo', 'write:repo'],
  // 完整内容不加载
};

// 阶段2:触发时才加载完整内容
async function invokeSkill(skill: SkillMeta) {
  if (!skill.isLoaded) {
    skill.content = await loadSkillContent(skill.path);
    skill.isLoaded = true;
  }
  return execute(skill.content);
}

27个生命周期钩子

钩子类型数量用途
PreToolUse4个工具执行前拦截
PostToolUse4个工具执行后处理
PreCompact2个上下文压缩前快照
SessionStart2个会话恢复

配置快照安全

// 启动时冻结所有配置
const frozenConfig = deepFreeze(loadConfig());

// 运行时无法修改,防止注入攻击
function preventInjection(attemptedChange: any) {
  // 任何尝试修改冻结配置的都会被拒绝
  throw new SecurityError('Config is immutable after startup');
}

📚 18章目录详解

Part 1: foundations

标题核心内容
1The Architecture of an AI Agent6大关键抽象、数据流、权限系统、构建系统
2Starting Fast — The Bootstrap Pipeline5阶段初始化、模块级I/O并行、信任边界
3State — The Two-Tier ArchitectureBootstrap单例、AppState存储、粘性门闩、成本追踪
4Talking to Claude — The API Layer多提供商客户端、Prompt Cache、流式输出、错误恢复

Part 2: The Core Loop

标题核心内容
5The Agent Loopquery.ts深度分析、4层压缩、错误恢复、Token预算
6Tools — From Definition to Execution工具接口、14步管道、权限系统
7Concurrent Tool Execution分区算法、流式执行器、推测执行

Part 3: Multi-Agent Orchestration

标题核心内容
8Spawning Sub-AgentsAgentTool、15步runAgent生命周期、内置Agent类型
9Fork Agents and the Prompt Cache字节相同前缀技巧、缓存共享、成本优化
10Tasks, Coordination, and Swarms任务状态机、Coordinator模式、Swarm消息传递

Part 4: Persistence and Intelligence

标题核心内容
11Memory — Learning Across Conversations文件式内存、4类分类、LLM召回、陈旧警告
12Extensibility — Skills and Hooks两阶段技能加载、生命周期钩子、快照安全

Part 5: The Interface

标题核心内容
13The Terminal UI自定义Ink分支、渲染管道、双缓冲、池化
14Input and Interaction键解析、键绑定、和弦支持、Vim模式

Part 6: Connectivity

标题核心内容
15MCP — The Universal Tool Protocol8种传输协议、MCP OAuth、工具包装
16Remote Control and Cloud ExecutionBridge v1/v2、CCR、上游代理

Part 7: Performance Engineering

标题核心内容
17Performance — Every Millisecond启动优化、上下文窗口、Prompt Cache、渲染、搜索
18Epilogue — What We Learned5大架构赌注、可迁移性、Agent的未来

🎯 10大可迁移架构模式

#模式核心原理可迁移场景
1AsyncGenerator驱动yields Messages,天然背压和取消所有流式Agent系统
2推测执行模型流式输出时预启动只读工具低延迟工具调用
3并发安全分组按安全分类分区,读并行写串行多工具并发系统
4Fork缓存共享父子共享字节相同前缀多Agent协作系统
54层上下文压缩snip→microcompact→collapse→autocompact长上下文管理
6LLM召回内存Sonnet side-query选择记忆长期记忆系统
7两阶段技能加载启动元数据+调用时内容动态技能平台
8粘性门闩Beta头一旦发送,永不在会话中撤销缓存稳定性
9槽位预留8K默认→64K升级输出管理
10钩子配置快照启动时冻结,运行时防注入安全边界

💡 适用读者

适合谁读

读者类型阅读方式收获
构建Agent系统的工程师精读+ Apply This练习直接应用架构模式
评估架构的技术负责人浏览叙事,跳过代码块理解决策背后的原因
对生产AI工具好奇的任何人通读+重点章节理解Claude Code如何工作

每章结尾的 Apply This

每章结尾都有"Apply This"——5个可迁移的带具体适应建议的模式。


🔒 安全与隐私

权限系统设计

const permissionMatrix = {
  // 默认拒绝
  default: 'deny',

  // 明确允许
  allow: [
    'Read:repo',      // 读取代码库
    'Write:repo',    // 修改代码
    'Execute:shell',  // 执行Shell命令
  ],

  // 明确拒绝
  deny: [
    'Execute:sudo',   // 禁止提权
    'Read:/etc/*',   // 禁止读取系统配置
    'Write:~/.ssh',  // 禁止修改SSH配置
  ]
};

快照安全原则

  • 所有敏感配置在启动时冻结
  • 运行时配置不可变
  • 任何运行时修改尝试都被拒绝

🌐 MCP:通用工具协议

Claude Code内置对MCP的支持,支持8种传输协议:

传输类型说明适用场景
stdio标准输入输出本地开发
HTTP+SSE长连接+服务端推送Web应用
WebSocket双向通信实时应用
Streamable HTTP可流式HTTP大文件传输
Server-Sent Events单向事件流简单推送
WebRTC浏览器P2P复杂Web应用
stdio (local)本地进程通信CLI工具
Docker容器化MCP隔离环境

✅ 总结

Claude Code from Source是一本揭示生产级AI编程工具架构的深度技术书籍:

  1. 架构深度:18章覆盖从启动到性能的完整架构
  2. 源码可信:基于npm实际源码地图,非逆向或推测
  3. 模式可迁移:10大架构模式可直接应用到自己的Agent系统
  4. 实践导向:每章都有Apply This,提供具体适应建议
  5. 教育纯粹:所有代码都是伪代码,仅用于说明架构,无版权问题

核心收获

  • 理解AsyncGenerator如何驱动整个Agent系统
  • 掌握14步工具执行管道的推测执行优化
  • 学会Fork模式+Prompt Cache实现95%成本节省
  • 理解4层上下文压缩如何管理Token预算
  • 掌握两阶段技能加载+钩子系统实现可扩展性

🦞