Skip to content

查询引擎

这是整个 Claude Code 最核心的代码。如果你只看一个文件,看 query.ts。1200+ 行的 while 循环,每一轮都是一次完整的 AI 交互。

双文件架构

查询引擎分成两个文件,职责不同:

  • QueryEngine.ts(~1000 行)— 会话管理器,维护消息列表、token 统计、会话生命周期
  • query.ts(~1200 行)— 核心查询循环,每一轮的具体逻辑

查询循环的 11 步

query.ts 的核心是一个 while 循环。每一轮迭代包含:

第 1-4 步:上下文压缩

1. Snip 压缩      — 标记过期内容(feature-gated)
2. 微压缩          — 工具结果级别的精简
3. 上下文折叠      — 折叠不重要的历史(feature-gated)
4. 自动压缩        — 上下文过大时触发完整压缩

为什么需要 4 种压缩?因为 AI 的上下文窗口是有限的(200K token),而一次复杂的编程任务可能产生大量工具调用结果。不压缩的话,几轮下来就把上下文撑爆了。

4 种压缩的粒度不同:snip 最轻量(打个标记),自动压缩最重(调 AI 做摘要)。系统会根据当前上下文使用率选择合适的策略。

第 5 步:Token 预算

typescript
// BudgetTracker 计算本轮可用 token
const budget = calculateBudget({
  contextWindow: 200_000,
  currentUsage: messages.tokenCount,
  compressionThreshold: 0.7  // 70% 时触发压缩
})

预算系统会在 70%-95% 的范围内动态调整,既要给 AI 足够的输出空间,又不能浪费上下文。

第 6 步:API 调用

带着裁剪后的消息和 token 预算,调用 Claude API。流式返回。

第 7 步:流式工具执行

AI 响应中如果包含工具调用,边接收边执行。支持并发——多个工具调用可以同时跑。

第 8 步:回填工具结果

工具执行完毕,结果拼入消息列表,作为下一轮循环的输入。

第 9-11 步:收尾检查

9.  阻塞限制检查  — 是否触及 API 限流
10. 错误恢复      — 4 级恢复机制
11. 停止钩子检查  — 是否该结束循环

错误恢复机制

4 级递进恢复,从轻到重:

级别策略触发条件
1反应式压缩上下文超限
2上下文折叠排空压缩后仍超限
3最大输出 token 恢复输出被截断
4媒体错误恢复图片/文件处理失败

这种递进式设计很有经验——先试最小代价的修复,不行再升级。不会一上来就用最激进的策略。

Token 预算系统

BudgetTracker 负责精细化管理上下文窗口:

  • 压缩触发阈值:上下文使用 70% 时开始压缩
  • 强制压缩阈值:95% 时强制执行
  • 输出预留:始终为 AI 响应保留足够空间
  • 缓存感知:prompt cache 命中的 token 成本更低

循环终止条件

while 循环什么时候停?

  1. AI 没有返回工具调用(纯文本响应)
  2. 达到最大轮次限制(--max-turns
  3. 停止钩子返回 true
  4. 遇到不可恢复的错误
  5. 用户手动中断(Ctrl+C)