乐于分享
好东西不私藏

Claude Code 源码架构解析

Claude Code 源码架构解析
摘要: Claude Code 是 Anthropic 官方推出的 CLI 编程工具,本文从源码层面深度解析其架构设计,揭示 Circuit BreakerProactive Pub/SubTool 元数据协议等核心设计模式的实现机制,并说明它在「三角架构」中的定位。
今天从源码层面,把它的核心架构拆开来看。

一、Coding Agent 赛道现状

工具
公司
定位
架构特点
Claude Code
Anthropic
CLI 编程 Agent
三角架构、熔断器、状态机
Cursor
Anysphere
IDE 插件
混合大锅炖、规则引擎
Copilot
Microsoft
补全 + Chat
云端裁判、GPT-4 平权
Cline
社区开源
VSCode 插件
轻量插件化、Tools API
Claude Code 在定位上最接近 Cline,都是纯 Tool-use 路线。但 Claude Code 在工具调用层面做了更精细的设计:Circuit Breaker(熔断器) 和 Proactive Pub/Sub(主动发布/订阅)

二、核心架构:三角关系

Claude Code 不是孤立运行的,它在更大的「三角架构」中有明确分工:
用户/终端    ↓Hermes Agent(路由/调度层)    ↓OpenClaw CEO Agent(决策/规划层)    ↓Claude Code(执行/编程层)
层级职责:
  • Hermes:接收用户请求,路由到合适的 Agent,决定用 Claude Code 还是其他工具
  • OpenClaw CEO:协调多个 Agent 工作,判断任务分解后的执行顺序
  • Claude Code:纯编程执行,根据指令完成代码生成、修改、调试
这种分离的好处是关注点分离:Hermes 不懂编程,只负责调度;Claude Code 不管项目全局,只专注代码本身。

三、源码结构解析

Claude Code 的源码结构(基于 v1.0 分析):
src/├── cli/# 命令行入口├── sessions/# 会话管理(SessionStore、session.ts)├── agent/# Agent 逻辑核心│   ├── index.ts      # Agent 主循环│   ├── circuit-breaker.ts  # 熔断器实现│   └── state-machine.ts    # 状态机├── tools/# 工具定义(核心亮点)│   ├── index.ts      # 工具注册表│   └── tool-metadata.ts    # 工具元数据协议├── transport/# 传输层(stdio / mcp)└── utils/# 工具函数

1 熔断器(Circuit Breaker)

Circuit Breaker 模式在 Claude Code 中用于防止「工具调用死循环」。
问题背景:当 AI 模型连续调用某个工具失败时,继续调用只会浪费 token 和时间。比如 Read 工具连续失败 3 次,大概率是路径问题而不是参数问题,继续调无意义。
实现逻辑
// 简化版逻辑classCircuitBreaker {private failures = newMap<stringnumber>();private threshold = 3;  // 连续失败3次就熔断  call<T>(toolNamestringfn() => T): T | null {if (this.failures.get(toolName) >= this.threshold) {// 熔断状态:跳过调用,返回 nullreturnnull;    }try {returnfn();    } catch (e) {const count = (this.failures.get(toolName) || 0) + 1;this.failures.set(toolName, count);returnnull;    }  }}
效果:避免同一工具的重复失败,提升整体任务成功率。

2 Proactive Pub/Sub 状态机

Claude Code 的 Agent 主循环不是简单的「Request → Response」,而是基于状态机驱动的 Proactive 模式。
状态流转
IDLE → THINKING → ACTING → WAITING → OBSERVING → IDLE         ↑___________||___________↓              (用户中断)         (工具调用)
关键点:WAITING 状态下,Agent 会主动等待外部事件(如文件变化、用户输入),而不是轮询。这减少了无效轮询,降低了 token 消耗。

3 工具元数据协议(Tool Metadata Protocol)

这是 Claude Code 最值得学习的部分。每个工具都有标准化的元数据:
interfaceToolMetadata {namestring;          // 工具名descriptionstring;   // AI 可读描述inputSchemaJSONSchema;  // 参数校验capabilities: ('read' | 'write' | 'execute' | 'browser')[];riskLevel'low' | 'medium' | 'high' | 'critical';confirmRequiredboolean;  // 是否需要用户确认}
元数据驱动的好处
  1. 安全分级:高风险操作(删除文件、执行命令)需要二次确认
  2. 按需调用:模型根据描述决定是否调用,而不是硬编码
  3. 可扩展:新增工具只需注册元数据,不需要改 Agent 核心
元数据驱动的好处

四、会话管理(SessionStore)

Claude Code 的会话管理采用 SessionStore 类:
classSessionStore {privatesessionsMap<stringSession>;create(userIdstring): string;   // 创建会话,返回 sessionIdget(sessionIdstring): Session;  // 获取会话append(sessionIdstringmsgMessage): void;  // 追加消息history(sessionIdstringlimit?: number): Message[];  // 历史}
会话数据存储在 ~/.claude/ 目录下,按月组织:
~/.claude/├── sessions/│   ├── 2026-05/│   │   ├── session-abc123.json│   │   └── session-def456.json
这种按月分目录的策略,避免了单目录文件过多的问题。

五、与外部系统的集成方式

Claude Code 通过 MCP(Model Context Protocol) 与外部系统通信:
// MCP 客户端初始化const client = newMCPClient({serverPath'openclaw-mcp-server',env: {SESSION_ID: currentSession,USER_ID: userId,  }});// 调用工具const result = await client.callTool('database''query', {sql'SELECT * FROM users LIMIT 10'});
MCP 的优势是协议标准化:只要实现 MCP 协议,就能接入任何支持 MCP 的 AI 应用。OpenClaw 的 MCP Server 就是这样接入 Claude Code 的。
本文基于 Claude Code 源码及官方文档验证,所有架构分析均来自源码解读。
摘要: Claude Code 是 Anthropic 官方推出的 CLI 编程工具,本文从源码层面深度解析其架构设计,揭示 Circuit BreakerProactive Pub/SubTool 元数据协议等核心设计模式的实现机制,并说明它在「三角架构」中的定位。
今天从源码层面,把它的核心架构拆开来看。

一、Coding Agent 赛道现状

工具
公司
定位
架构特点
Claude Code
Anthropic
CLI 编程 Agent
三角架构、熔断器、状态机
Cursor
Anysphere
IDE 插件
混合大锅炖、规则引擎
Copilot
Microsoft
补全 + Chat
云端裁判、GPT-4 平权
Cline
社区开源
VSCode 插件
轻量插件化、Tools API
Claude Code 在定位上最接近 Cline,都是纯 Tool-use 路线。但 Claude Code 在工具调用层面做了更精细的设计:Circuit Breaker(熔断器) 和 Proactive Pub/Sub(主动发布/订阅)

二、核心架构:三角关系

Claude Code 不是孤立运行的,它在更大的「三角架构」中有明确分工:
用户/终端    ↓Hermes Agent(路由/调度层)    ↓OpenClaw CEO Agent(决策/规划层)    ↓Claude Code(执行/编程层)
层级职责:
  • Hermes:接收用户请求,路由到合适的 Agent,决定用 Claude Code 还是其他工具
  • OpenClaw CEO:协调多个 Agent 工作,判断任务分解后的执行顺序
  • Claude Code:纯编程执行,根据指令完成代码生成、修改、调试
这种分离的好处是关注点分离:Hermes 不懂编程,只负责调度;Claude Code 不管项目全局,只专注代码本身。

三、源码结构解析

Claude Code 的源码结构(基于 v1.0 分析):
src/├── cli/# 命令行入口├── sessions/# 会话管理(SessionStore、session.ts)├── agent/# Agent 逻辑核心│   ├── index.ts      # Agent 主循环│   ├── circuit-breaker.ts  # 熔断器实现│   └── state-machine.ts    # 状态机├── tools/# 工具定义(核心亮点)│   ├── index.ts      # 工具注册表│   └── tool-metadata.ts    # 工具元数据协议├── transport/# 传输层(stdio / mcp)└── utils/# 工具函数

1 熔断器(Circuit Breaker)

Circuit Breaker 模式在 Claude Code 中用于防止「工具调用死循环」。
问题背景:当 AI 模型连续调用某个工具失败时,继续调用只会浪费 token 和时间。比如 Read 工具连续失败 3 次,大概率是路径问题而不是参数问题,继续调无意义。
实现逻辑
// 简化版逻辑classCircuitBreaker {private failures = newMap<stringnumber>();private threshold = 3;  // 连续失败3次就熔断  call<T>(toolNamestringfn() => T): T | null {if (this.failures.get(toolName) >= this.threshold) {// 熔断状态:跳过调用,返回 nullreturnnull;    }try {returnfn();    } catch (e) {const count = (this.failures.get(toolName) || 0) + 1;this.failures.set(toolName, count);returnnull;    }  }}
效果:避免同一工具的重复失败,提升整体任务成功率。

2 Proactive Pub/Sub 状态机

Claude Code 的 Agent 主循环不是简单的「Request → Response」,而是基于状态机驱动的 Proactive 模式。
状态流转
IDLE → THINKING → ACTING → WAITING → OBSERVING → IDLE         ↑___________||___________↓              (用户中断)         (工具调用)
关键点:WAITING 状态下,Agent 会主动等待外部事件(如文件变化、用户输入),而不是轮询。这减少了无效轮询,降低了 token 消耗。

3 工具元数据协议(Tool Metadata Protocol)

这是 Claude Code 最值得学习的部分。每个工具都有标准化的元数据:
interfaceToolMetadata {namestring;          // 工具名descriptionstring;   // AI 可读描述inputSchemaJSONSchema;  // 参数校验capabilities: ('read' | 'write' | 'execute' | 'browser')[];riskLevel'low' | 'medium' | 'high' | 'critical';confirmRequiredboolean;  // 是否需要用户确认}
元数据驱动的好处
  1. 安全分级:高风险操作(删除文件、执行命令)需要二次确认
  2. 按需调用:模型根据描述决定是否调用,而不是硬编码
  3. 可扩展:新增工具只需注册元数据,不需要改 Agent 核心
元数据驱动的好处

安全分级:高风险操作(删除文件、执行命令)需要二次确认

按需调用:模型根据描述决定是否调用,而不是硬编码

可扩展:新增工具只需注册元数据,不需要改 Agent 核心

四、会话管理(SessionStore)

Claude Code 的会话管理采用 SessionStore 类:
classSessionStore {privatesessionsMap<stringSession>;create(userIdstring): string;   // 创建会话,返回 sessionIdget(sessionIdstring): Session;  // 获取会话append(sessionIdstringmsgMessage): void;  // 追加消息history(sessionIdstringlimit?: number): Message[];  // 历史}
会话数据存储在 ~/.claude/ 目录下,按月组织:
~/.claude/├── sessions/│   ├── 2026-05/│   │   ├── session-abc123.json│   │   └── session-def456.json
这种按月分目录的策略,避免了单目录文件过多的问题。

五、与外部系统的集成方式

Claude Code 通过 MCP(Model Context Protocol) 与外部系统通信:
// MCP 客户端初始化const client = newMCPClient({serverPath'openclaw-mcp-server',env: {SESSION_ID: currentSession,USER_ID: userId,  }});// 调用工具const result = await client.callTool('database''query', {sql'SELECT * FROM users LIMIT 10'});
MCP 的优势是协议标准化:只要实现 MCP 协议,就能接入任何支持 MCP 的 AI 应用。OpenClaw 的 MCP Server 就是这样接入 Claude Code 的。
本文基于 Claude Code 源码及官方文档验证,所有架构分析均来自源码解读。