Skip to content

Claude Code 代码架构

这一页拆解 Claude Code 的代码架构:分层设计、各模块职责、关键组件如何协作。内容综合官方行为与社区逆向白皮书,重在帮你建立「一个生产级编程 Agent 是怎么搭起来的」整体认知。功能总览见 功能总览,运行机制见 核心机制

提示:具体文件名/类名来自社区逆向分析,可能随版本变化;这里用它们来说明职责划分,不必当作官方 API。

一、分层架构全景

Claude Code 大致可分为这样几层(自上而下):

┌─────────────────────────────────────────────┐
│ 入口层 (CLI)        启动、参数解析、运行时初始化   │
├─────────────────────────────────────────────┤
│ 交互层 (REPL)       React/Ink 终端 UI,输入→消息 │
├─────────────────────────────────────────────┤
│ 编排层 (Orchestrator/QueryEngine)             │
│                     回合生命周期、token 预算、    │
│                     上下文压缩触发、会话持久化     │
├─────────────────────────────────────────────┤
│ Agentic Loop 核心   组织上下文→调 API→解析工具    │
│                     调用→权限检查→执行→递归       │
├─────────────────────────────────────────────┤
│ 工具执行层          文件/命令/搜索/任务/子 Agent  │
├─────────────────────────────────────────────┤
│ 通信层              流式 HTTP,多后端适配         │
│                     (Anthropic/Bedrock/Vertex) │
└─────────────────────────────────────────────┘
              ↕ 横切:权限、Hooks、MCP、配置、遥测

每一层职责单一、向下依赖,横切关注点(权限、Hooks、MCP、配置)贯穿各层。

二、各层职责详解

入口层(CLI)

负责进程启动:解析命令行参数(交互模式 / -p 管道模式 / 各种 flag)、初始化运行时、加载配置与项目记忆。终端 Agent 的「main 函数」。

交互层(REPL)

用 React + Ink(终端里的 React 渲染器)构建交互式 UI:捕获用户输入封装成 UserMessage、流式渲染模型输出(打字机效果)、展示工具调用与权限询问。把「终端」做成了一个响应式界面。

编排层(Orchestrator / QueryEngine)

整个会话的「指挥中枢」:

  • 管理多轮对话的回合生命周期
  • 维护 token 预算(如 200K 窗口的动态计算),决定何时截断/压缩;
  • 触发上下文压缩(compaction);
  • 会话持久化(把对话记成 JSONL transcript,支持恢复、成本追踪)。

Agentic Loop 核心

决策引擎,整个系统的心脏(详见 核心机制):组织上下文 → 调模型 API → 解析模型返回的工具调用 → 权限检查 → 执行工具 → 把结果喂回 → 再调,循环至完成。支持并行工具执行、流式、错误恢复。

工具执行层

把模型的「意图」变成「真实操作」:

工具类代表要点
文件操作Read / Edit / Write去重缓存、精确替换、原子写
搜索导航Glob / Grep基于 ripgrep,快速代码检索
命令执行Bash只读检测、AST 解析、输出截断
任务管理TodoWrite / Task内存待办 + 文件系统子任务双轨
子 AgentTask / AgentTool派生子 Agent,独立上下文

通信层

流式 HTTP 调用模型 API,封装多后端适配(Anthropic / Bedrock / Vertex 等),处理 SSE token 流、重试、鉴权。

三、横切关注点(贯穿各层)

  • 权限系统:Allow/Ask/Deny 三级 + 多层规则优先级,插在「工具执行前」(见 核心机制 - 权限)。
  • Hooks:在工具调用前后等生命周期点注入用户脚本,可拦截/校验。
  • MCP:通过 MCP 协议 接入外部工具,内置 + 外部多种传输。
  • 配置系统:用户级 / 项目级 / 企业级配置合并;项目记忆 CLAUDE.md。
  • 遥测与特性开关:错误上报、A/B 实验、feature flags 控制功能灰度。

四、为什么这样设计?(架构动机)

设计解决的问题
分层 + 单一职责复杂 Agent 可维护、可测试、可替换组件
编排层独立于 Looptoken 预算/压缩/持久化和决策逻辑解耦
工具层抽象统一新增工具只需注册,模型用同一套调用协议
多后端适配层一套代码对接不同模型供应商
横切的权限/Hooks安全和工程约束不侵入业务逻辑

这套架构是「生产级编程 Agent 的参考实现」——它要解决的工程问题(长任务上下文、并行工具、权限安全、可扩展)在任何严肃的 Agent 系统里都会遇到。

高频追问

Q:Claude Code 为什么用 React/Ink 做终端 UI? Ink 是「终端里的 React」,让复杂的交互式终端界面(流式输出、工具调用展示、权限询问、可滚动历史)能用组件化、声明式的方式构建和维护,比手写 ANSI 控制码可维护得多。

Q:编排层(QueryEngine)和 Agentic Loop 是一回事吗? 不是。Loop 是「决策—执行」的核心循环(这一步调什么工具);编排层在它之外,管会话级的事务:token 预算、何时触发上下文压缩、回合生命周期、把对话持久化成 transcript、成本追踪。一个管「单步决策」,一个管「整场会话」。

Q:工具是怎么接进来的? 工具有统一的类型定义和注册机制;每个工具声明名称、参数 schema、执行逻辑、权限要求。模型通过 Function Calling 输出「调用哪个工具+参数」,框架查注册表、校验权限、执行、回传结果。新增工具只要按协议注册即可,模型不用改。

Q:这套架构对我自己做 Agent 有什么借鉴? 关键经验:① 把「单步决策的 loop」和「会话级编排(预算/压缩/持久化)」分层;② 工具用统一注册+调用协议;③ 权限/Hooks 作为横切关注点插在执行前,不污染主逻辑;④ 通信层抽象多后端。这些是任何生产级 Agent 都要面对的工程问题。

基于 MIT 许可发布