$catSERPAPI||~16 min

Claude Code Agent Runtime架构与核心机制深度拆解

advertisement

Claude Code Agent Runtime架构与核心机制深度拆解

说实话,我第一次打开Claude Code的源码包的时候,直接愣住了。1884个TypeScript文件,光核心引擎QueryEngine一个模块就46K行代码???我当时心想,这玩意儿不就是个命令行AI工具吗,至于搞这么复杂?

但深入看下去我才明白——Claude Code压根不是什么"代码补全器",它是一个完整的Agent Runtime框架。它定义了AI Agent怎么感知环境、调度工具、管理状态、协同执行。我踩了不少坑才把这些机制搞明白,今天就把这些东西掰开了揉碎了聊一聊。

系统架构:三层分离的设计

Claude Code的架构遵循三层分离,跟我们平时写的单体应用完全不同:

  • 交互层:管用户输入、终端渲染、权限确认这些事儿,说白了就是"眼睛和嘴巴"
  • 核心引擎层:QueryEngine坐镇,负责意图理解、任务规划、上下文管理、LLM对话编排——这是"大脑"
  • 工具与执行层:Tool System、Command System和MCP协议实现,负责把决策变成具体操作——这是"手和脚"

这种分层的好处太明显了。我之前想把底层模型从Claude换成其他模型,只动了引擎层配置,交互层和工具层一行没改,跑得好好的。要是单体架构,这种改动能把人搞疯。

启动流程到底干了啥

我扒了源码的启动逻辑,大概长这样(我简化重构过的,方便理解):

typescript
1
async function bootstrap(config: StartupConfig) {
2
  // 1. 先把项目上下文收集齐了
3
  const projectContext = await gatherProjectContext({
4
    rootPath: config.workingDirectory,
5
    gitStatus: await parseGitInfo(),
6
    dependencyGraph: await buildDependencyGraph(),
7
    claudeMd: await loadClaudeMd()  // 项目级配置
8
  });
9
 
10
  // 2. 初始化QueryEngine
11
  const engine = new QueryEngine({
12
    model: config.model || 'claude-sonnet',
13
    contextWindow: 200_000,  // 200K token窗口
14
    tools: await registerTools(projectContext),
15
    hooks: await loadHooks(projectContext),
16
    skills: await loadSkills(projectContext)
17
  });
18
 
19
  // 3. 进入事件循环,开始干活
20
  await engine.enterEventLoop(projectContext);
21
}

这里有个关键设计:环境感知在模型调用之前。Claude Code在跟LLM说话之前,就已经把项目的全景图构建好了。我一开始不理解为啥它能"理解整个项目",看了这段代码才恍然大悟——人家启动时就把你项目扫了个遍。

QueryEngine:46K行代码的"大脑"

QueryEngine是整个系统最核心的东西,46K行代码不是白写的。它干四件事:

  1. 意图解析:把你说的人话变成结构化的任务描述
  2. 上下文压缩:200K token听着多,大项目根本塞不下,得动态管理优先级
  3. 工具编排:决定什么时候调什么工具,按什么顺序组合
  4. 错误恢复:工具执行挂了,自动调整策略重试

上下文压缩这块我踩过坑。之前在一个超大monorepo里用Claude Code,它总是"忘记"之前聊过的内容。后来我看了源码才知道,QueryEngine用了多级缓存:

  • L1缓存:当前正在改的文件,完整内容,优先级最高
  • L2缓存:依赖链路上的相关文件,存的是摘要
  • L3缓存:项目结构、接口定义这些元信息

理解了这个之后,我就知道为啥有时候它会"忘东西"了——不是它笨,是L2/L3缓存被挤掉了。所以我现在习惯在关键对话中主动把相关文件路径告诉它,确保进L1。

Plan模式到底怎么实现的

Plan模式是我用得最多的一个功能。从架构上看,它就是在QueryEngine里插了一个预执行拦截器

code
1
用户输入 → 意图解析 → [Plan拦截器] → 生成执行计划 → 你确认 → 才真正执行

拦截器会生成一个详细清单:要读哪些文件、要改哪些文件、预期改什么、有啥风险。你点了确认,引擎才动手。

我实测过,Plan模式能把token消耗降30-40%,代码质量也明显更好。因为"规划"这个过程本身就是深度推理,比直接让AI一头扎进去改代码靠谱多了。我有次没开Plan模式让它重构一个模块,结果它改了8个文件,其中3个改错了方向,浪费了一堆token。从此以后我基本只用Plan模式。

五大核心机制

Skills系统:把经验变成可复用的模板

Skills不是简单的提示词模板,是一套完整的认知框架。比如我给团队写了一个API端点生成的Skill:

yaml
1
name: "api-endpoint-generator"
2
description: "创建符合项目规范的RESTful API端点"
3
trigger:
4
  patterns: ["创建接口", "新增API", "add endpoint"]
5
context_gathering:
6
  - scan_existing_controllers  # 先学现有代码风格
7
  - load_route_config
8
  - check_auth_middleware
9
execution_flow:
10
  - step: analyze_existing_patterns
11
    prompt: "分析现有API的命名规范、错误处理、响应格式"
12
  - step: generate_endpoint
13
    depends_on: [analyze_existing_patterns]
14
    validation: run_linter
15
  - step: generate_tests
16
    depends_on: [generate_endpoint]
17
validation:
18
  - lint_check
19
  - type_check
20
  - run_related_tests

Skills最大的价值是把隐性知识显性化。我们团队老大写的代码有他自己的一套风格,新人来了根本学不会。但把这些习惯封装成Skill之后,AI自动就按这个风格来,新人的代码一致性直接拉满。

Hooks机制:不用人盯的质量保障

Hooks是我认为Claude Code里最有工程价值的设计。它在Agent执行的生命周期里定义了一堆事件锚点:

  • pre-tool-call:工具调用前,做权限校验
  • post-tool-call:工具调用后,验证结果
  • pre-commit:提交前,强制质量检查
  • file-change:文件改了,联动构建
json
1
{
2
  "hooks": {
3
    "pre-commit": [
4
      { "command": "npm run lint", "on_failure": "block" },
5
      { "command": "npm run type-check", "on_failure": "warn" }
6
    ],
7
    "post-generation": [
8
      { "command": "npm test -- --related ${changed_files}", "timeout": 60000 }
9
    ]
10
  }
11
}

以前我们团队靠人工Review来兜底质量,经常有人忘记跑lint就提交了。配了Hooks之后,lint不过根本提交不了,type-check不过会警告。质量保障从"靠人记"变成了"靠系统兜"。

我踩过一个坑:Hooks里的命令执行失败时,on_failure设成block会直接中断整个流程。有次我设了个太严格的检查,结果AI生成啥都提交不了,排查了半天才发现是Hooks卡住了。

MCP Servers:让AI跳出编辑器

MCP(Model Context Protocol)是让Claude Code从"编辑器里的玩具"变成"系统级Agent"的关键。通过MCP,Claude Code可以:

  • 直接查数据库
  • 调云服务API(AWS、GCP、阿里云)
  • 跟Jira、Linear这些项目管理工具交互
  • 操作Docker、K8s

MCP走的是客户端-服务器模型,Claude Code是客户端,通过JSON-RPC协议跟各种MCP Server通信。我第一次配MCP Server的时候踩了个大坑——忘了在配置里声明Server的capabilities,结果工具列表死活加载不出来,debug了两个小时。

Subagents:并行干活的杀手锏

Subagents是我处理复杂任务时最依赖的机制。它支持两种并行模式:

任务拆分模式:一个大任务拆成多个子任务,分给不同的Subagent同时干。比如重构一个大模块,同时派三个Subagent分别处理接口层、数据层和测试层。

MapReduce模式:一个操作要批量应用到多个目标时,并行启动多个Subagent分别处理。比如批量改100个文件的import路径。

code
1
主Agent(协调者)
2
├── Subagent-1: 重构 auth/controller.ts
3
├── Subagent-2: 重构 auth/service.ts
4
├── Subagent-3: 更新 auth/__tests__/
5
└── 汇总结果 → 生成变更摘要

每个Subagent有独立的上下文空间,互不干扰。主Agent负责协调和冲突检测。我之前试过同时开5个Subagent改同一个模块的不同文件,结果有两个Subagent改了同一个接口的不同部分,合并的时候冲突了。所以现在我拆任务时会特别注意文件级别的隔离。

Plugins:打包一切的终极封装

Plugins是最高级别的封装。一个Plugin可以把Skills、Hooks、MCP Server配置、自定义工具全打包在一起:

typescript
1
const myTeamPlugin = {
2
  name: "team-standards",
3
  skills: [apiGeneratorSkill, testGeneratorSkill, codeReviewSkill],
4
  hooks: {
5
    "pre-commit": [lintHook, typeCheckHook],
6
    "post-generation": [testHook]
7
  },
8
  mcpServers: {
9
    "company-jira": { command: "jira-mcp-server" },
10
    "company-db": { command: "db-query-server" }
11
  },
12
  config: {
13
    codeStyle: "airbnb",
14
    testFramework: "vitest",
15
    apiStyle: "restful"
16
  }
17
};

新人入职装上Plugin,立马就跟团队其他人用一样的AI协作体验。我们团队现在每个项目都有自己的Plugin,维护成本比以前低多了。

实战心法

四种模式怎么选

  • Plan模式:90%的场景都该用,特别是多文件修改。降低试错成本,提升精确度
  • Extended Thinking:架构设计、复杂算法、跨模块重构才开。简单任务开这个就是烧钱加等半天
  • Sandbox模式:在生产环境附近操作时的安全网
  • Headless模式:塞进CI/CD流水线,自动化代码审查、构建失败分析

验证闭环:让AI自己审自己

这是我实践中最有效的一招。核心思路是在代码生成和提交之间,让AI"换个帽子"审查自己的产出:

code
1
需求 → AI生成代码 → [AI切换审查者角色] → 发现问题 → 自动修正 → 你确认 → 提交

生成和审查是两种不同的认知模式。同一个AI"换帽子"审自己,能抓到很多生成阶段忽略的bug。我实测下来,这个闭环能把bug率降60-80%。

CLAUDE.md别写完就扔

CLAUDE.md应该是活的文档。我的维护策略:

  1. Code Review发现共性问题,提炼成规则追加进去
  2. PR反馈里提取可复用的编码规范
  3. 定期清理过时或冲突的规则
  4. 架构决策的关键结论写进去

效果就是:AI对项目的理解越来越深,重复犯错越来越少。

跟其他工具的对比

跟Cursor和Codex比,Claude Code的定位完全不同:

  • Cursor本质是编辑器增强,Codex是云端代码生成服务,Claude Code是本地Agent Runtime。本地Runtime能直接访问文件系统、Git历史、运行环境,上下文获取能力碾压
  • 扩展能力:Cursor和Codex受限于各自的插件体系,Claude Code通过MCP协议实现了更开放的服务集成
  • 模型不绑定:Claude Code可以通过配置API端点接入其他模型,需要数据合规的团队这点特别重要

写在最后

Claude Code的源码给我最大的感受是:Anthropic在认真构建标准化的Agent Runtime基础设施。三层架构、五大核心机制、四大运行模式,这套东西定义了AI Agent跟开发环境深度交互的技术范式。

我的建议就三条:第一,把CLAUDE.md的配置机制吃透,学会把团队知识注入Agent;第二,动手搞Hooks和Skills的自定义开发,掌握Agent行为的精细调控;第三,盯紧MCP协议的生态演进,这是Agent突破工具边界的关键。

Agent Runtime的竞争才刚开始,Claude Code目前的架构选择,确实给这场竞争立了个高标准的起点。

advertisement

Claude Code Agent Runtime架构与核心机制深度拆解 — AI Hub