🔥 Claude Code 源码解析二揭秘对话匕擎的栞心机制

49 阅读5分钟

䞀、匕蚀

倧家奜我是䞀䞪源码爱奜者。圚䞊䞀篇文章䞭我们了解了 Claude Code 的敎䜓架构和启劚流皋。今倩让我们深入到栞心暡块——对话匕擎的实现细节。

盞信埈倚人郜奜奇圓我们圚终端蟓入䞀䞪问题时Claude 是劂䜕理解并给出回答的这䞪过皋背后隐藏着怎样的技术细节

圚深入源码之前我想分享䞀䞪什人震惊的发现Claude Code 的对话匕擎竟然实现了四层压猩策略来倄理长对话䞊䞋文这意味着即䟿是长蟟数癟蜮的对话系统也胜保持高效运行。

二、对话匕擎的栞心架构

2.1 敎䜓架构抂览

让我们先来看䞀䞋对话匕擎的敎䜓架构

甚户蟓入
    │
    ▌
┌─────────────────────────────────────┐
│    QueryEngine对话管理噚         │
│    - 䌚话状态管理                    │
│    - 消息流蜬控制                    │
│    - SDK 协议适配                    │
└─────────────────────────────────────┘
    │
    ▌
┌─────────────────────────────────────┐
│    query()栞心查询埪环           │
│    - 消息压猩倄理                    │
│    - API 调甚管理                    │
│    - 工具执行协调                    │
│    - 错误恢倍机制                    │
└─────────────────────────────────────┘
    │
    ▌
┌─────────────────────────────────────┐
│    Anthropic API / MCP 服务噚       │
│    - 暡型调甚                       │
│    - 工具执行                       │
│    - 消息流倄理                     │
└─────────────────────────────────────┘

2.2 QueryEngine对话的"倧脑"

QueryEngine 是敎䞪对话系统的栞心莟莣管理对话的完敎生呜呚期

export class QueryEngine {
private config: QueryEngineConfig;      // 配眮信息
private mutableMessages: Message[];     // 消息列衚
private abortController: AbortController; // 䞭断控制噚
private permissionDenials: SDKPermissionDenial[]; // 权限拒绝记圕
private totalUsage: NonNullableUsage;   // API 䜿甚统计
private readFileState: FileStateCache;  // 文件读取猓存
}

这里我螩了䞪倧坑 䞀匀始我以䞺 QueryEngine 只是䞀䞪简单的消息蜬发噚䜆深入后发现它其实承担了

  • 䌚话状态管理
  • 权限远螪
  • 资源消耗统计
  • 文件猓存管理

这四䞪栞心职莣

䞉、消息倄理流皋深床剖析

3.1 消息分类䞎倄理策略

QueryEngine 倄理倚种消息类型每种类型郜有䞓闚的倄理逻蟑

消息类型倄理策略甚途
assistant标准化后蟓出AI 助手响应
user增加回合计数甚户蟓入
progress立即记圕工具执行进床
attachment提取结构化蟓出附件和元数据
stream_event曎新䜿甚统计流匏事件
system倄理压猩蟹界系统控制信号

3.2 栞心方法submitMessage

这是 QueryEngine 的栞心方法倄理甚户蟓入并返回响应

async *submitMessage(prompt, options) {
// 1. 包装权限检查凜数
const wrappedCanUseTool = async (tool, input, ...) => {
    const result = await canUseTool(tool, input, ...);
    if (result.behavior !== 'allow') {
    this.permissionDenials.push({ 
        tool_name: tool.name, 
        tool_use_id: toolUseID 
    });
    }
    return result;
};

// 2. 获取系统提瀺和䞊䞋文
const { defaultSystemPrompt, userContext, systemContext } = 
    await fetchSystemPromptParts({ tools, mainLoopModel, ... });

// 3. 倄理甚户蟓入
const { messages: messagesFromUserInput, shouldQuery } = 
    await processUserInput({ input: prompt, mode: 'prompt', ... });

// 4. 持久化消息
if (persistSession && messagesFromUserInput.length > 0) {
    await recordTranscript(messages);
}

// 5. 执行查询埪环
for await (const message of query({ messages, systemPrompt, ... })) {
    // 倄理各类消息...
}
}

关键讟计点

  • 䜿甚 async* 生成噚暡匏支持流匏蟓出
  • 包装权限检查凜数记圕所有权限拒绝
  • 消息持久化确保䌚话可恢倍

四、四层压猩策略倄理长对话的秘密歊噚

4.1 压猩层次结构

这是我发现的最什人惊叹的讟计Claude Code 实现了四层压猩策略

┌─────────────────────────────────────────────┐
│ 第1层: Snip 压猩快速枅理                │
│ - 移陀僵尞消息和陈旧标记                     │
│ - 蜻量级快速执行                          │
└─────────────────────────────────────────────┘
        │
        ▌
┌─────────────────────────────────────────────┐
│ 第2层: Microcompact猓存䌘化             │
│ - 基于猓存猖蟑的细粒床压猩                   │
│ - 保持对话连莯性                            │
└─────────────────────────────────────────────┘
        │
        ▌
┌─────────────────────────────────────────────┐
│ 第3层: Context Collapse䞊䞋文折叠        │
│ - 基于视囟投圱的智胜折叠                     │
│ - 保持对话粒床                             │
└─────────────────────────────────────────────┘
        │
        ▌
┌─────────────────────────────────────────────┐
│ 第4层: Autocompact自劚压猩              │
│ - 基于AI总结的重量级压猩                    │
│ - 生成摘芁消息                             │
└─────────────────────────────────────────────┘

4.2 压猩实现代码

// Snip 压猩
if (feature('HISTORY_SNIP')) {
const snipResult = snipModule.snipCompactIfNeeded(messages);
messages = snipResult.messages;
}

// Microcompact
const microcompactResult = await deps.microcompact(messages, context);
messages = microcompactResult.messages;

// Context Collapse
if (feature('CONTEXT_COLLAPSE')) {
const collapseResult = await contextCollapse.applyCollapsesIfNeeded(messages);
messages = collapseResult.messages;
}

// Autocompact
const { compactionResult } = await deps.autocompact(messages, context, options);
if (compactionResult) {
const postCompactMessages = buildPostCompactMessages(compactionResult);
messages = postCompactMessages;
}

讟计䌘势

  • 析进匏压猩从快速到深床按需选择
  • 可配眮性通过 feature flag 控制各层是吊启甚
  • 智胜决策根据䞊䞋文情况自劚选择压猩策略

五、API 调甚䞎错误恢倍机制

5.1 流匏倄理䞎工具执行

系统支持工具的流匏执行提升甚户䜓验

for await (const message of deps.callModel({
messages: prependUserContext(messagesForQuery, userContext),
systemPrompt: fullSystemPrompt,
tools: toolUseContext.options.tools,
signal: toolUseContext.abortController.signal,
options: {
    model: currentModel,
    fallbackModel,
    fastMode: appState.fastMode,
},
})) {
// 检测工具䜿甚
if (message.type === 'assistant') {
    const toolUseBlocks = message.message.content.filter(
    content => content.type === 'tool_use'
    );
    
    if (toolUseBlocks.length > 0) {
    needsFollowUp = true;  // 需芁执行工具
    }
}
}

5.2 倚重错误恢倍策略

系统实现了倚层次的错误恢倍

策略䞀暡型降级

if (innerError instanceof FallbackTriggeredError && fallbackModel) {
currentModel = fallbackModel;
yield createSystemMessage(
    `Switched to ${fallbackModel} due to high demand...`,
    'warning'
);
continue;
}

策略二响应匏压猩

if (isWithheld413 && reactiveCompact) {
const compacted = await reactiveCompact.tryReactiveCompact({
    messages: messagesForQuery,
    ...
});
if (compacted) {
    messages = buildPostCompactMessages(compacted);
    continue;
}
}

策略䞉蟓出token限制恢倍

if (maxOutputTokensRecoveryCount < MAX_OUTPUT_TOKENS_RECOVERY_LIMIT) {
const recoveryMessage = createUserMessage({
    content: 'Output token limit hit. Resume directly...',
    isMeta: true,
});
messages.push(recoveryMessage);
maxOutputTokensRecoveryCount++;
continue;
}

六、䌚话持久化䞎数据安党

6.1 消息记圕机制

䌚话持久化是保证甚户䜓验的关键

// 消息记圕策略
if (persistSession && messagesFromUserInput.length > 0) {
const transcriptPromise = recordTranscript(messages);

// Bare 暡匏䞋非阻塞写入
if (isBareMode()) {
    void transcriptPromise;
} else {
    await transcriptPromise;
    
    // 区制刷新场景
    if (isEnvTruthy(process.env.CLAUDE_CODE_EAGER_FLUSH)) {
    await flushSessionStorage();
    }
}
}

记圕时机

  • 甚户消息接收后立即记圕
  • 助手消息匂步记圕
  • 压猩蟹界时刷新

6.2 安党性讟计

// Windows 路埄劫持防技
process.env.NoDefaultCurrentDirectoryInExePath = '1';

// Git 呜什安党检查
function prefetchSystemContextIfSafe() {
const hasTrust = checkHasTrustDialogAccepted();
if (hasTrust) {
    void getSystemContext();
}
}

䞃、总结䞎思考

通过深入分析 Claude Code 的对话匕擎我有以䞋几点深刻䜓䌚

  1. 分层讟计的重芁性QueryEngine 侎 query() 的职莣分犻䜿埗代码易于绎技和扩展
  2. 压猩策略的粟劙四层压猩策略兌顟了性胜和对话莚量
  3. 错误恢倍的完敎性倚种恢倍策略确保系统的鲁棒性
  4. 安党性的重视倚倄安党检查䜓现了䌁䞚级应甚的䞥谚性

䞋䞀篇预告 我们将深入分析 Claude Code 的工具系统讟计揭秘它是劂䜕实现代码执行、文件操䜜等栞心胜力的

八、互劚亀流

䜠们觉埗这䞪四层压猩策略讟计埗怎么样还有什么曎奜的方法来倄理长对话䞊䞋文欢迎圚评论区亀流

劂果觉埗这篇文章对䜠有垮助请点赞关泚支持䞀䞋我们䞋䞀篇见🚀

原创䞍易点赞关泚支持䞀䞋