第四篇:AI 对话引擎全解析,Claude Code 如何编排工具调用

📚 系列文章 04/10 · 📅 2026年6月27日 · ⏱️ 阅读时间约 15 分钟


🧠 一、assistant 模块架构总览

src/assistant/ 是 Claude Code 最复杂的模块,负责:消息管理、工具编排、上下文维护、流式响应。

src/assistant/
├── index.ts          # 对外接口,对话入口
├── chat.ts           # 核心对话循环
├── toolExecution.ts  # 工具编排引擎(最重要的文件,~800行)
├── provider.ts       # AI 模型适配层
├── streaming.ts      # 流式响应处理
├── context.ts        # 上下文窗口压缩
└── types.ts          # 类型定义

🔄 二、核心对话循环

chat.ts 实现了对话的核心逻辑——一个精密的 while 循环:

用户输入
    ↓
1. 追加消息到 history[]
    ↓
2. 构建 Prompt(含系统提示 + 历史 + 工具定义)
    ↓
3. 调用 AI 模型
    ↓
4. 解析响应(文本 / 工具调用 / 思考)
    ↓
5. 执行工具(toolExecution.ts)
    ↓
6. 返回结果 → 继续循环
    ↓
7. 直到 AI 返回纯文本响应
    ↓
8. 渲染输出给用户

关键源码

// src/assistant/chat.ts(简化版)
async function chat(input: string) {
  // 追加用户消息
  history.push({ role: 'user', content: input });
  
  while (true) {
    // 构建请求
    const messages = buildPrompt(history);
    
    // 调用模型
    const response = await provider.complete({
      messages,
      tools: TOOL_DEFINITIONS,
      max_tokens: 8192,
      stream: true
    });
    
    // 处理 AI 响应
    const { text, toolCalls } = parseResponse(response);
    
    if (toolCalls.length > 0) {
      // 执行工具
      const results = await executeToolCalls(toolCalls);
      
      // 将结果追加到历史
      history.push({ role: 'assistant', content: text, toolCalls });
      history.push({ role: 'tool', results });
      
      // 继续循环,让 AI 处理工具结果
      continue;
    }
    
    // 纯文本响应,返回给用户
    return { text };
  }
}

🔧 三、工具编排引擎(核心)

toolExecution.ts 是整个系统最值钱的文件(约 800 行)。

3.1 工具调用生命周期

// AI 模型返回的 tool_calls
[
  {
    id: 'call_abc123',
    type: 'function',
    function: {
      name: 'FileRead',
      arguments: '{"path": "/src/main.ts"}'
    }
  },
  {
    id: 'call_def456',
    type: 'function',
    function: {
      name: 'Bash',
      arguments: '{"command": "ls -la"}'
    }
  }
]

3.2 并行执行策略

Claude Code 会智能判断工具是否可以并行执行:

// src/assistant/toolExecution.ts
async function executeToolCalls(calls: ToolCall[]) {
  // 分组:检查依赖关系
  const groups = groupByDependency(calls);
  
  // 无依赖 → 并行执行
  if (groups.length === 1) {
    return Promise.all(groups[0].map(runTool));
  }
  
  // 有依赖 → 串行分组
  const results = [];
  for (const group of groups) {
    const batch = await Promise.all(group.map(runTool));
    results.push(...batch);
  }
  return results;
}

3.3 权限检查

async function runTool(call: ToolCall) {
  const tool = registry.get(call.function.name);
  
  // 权限检查
  if (!permissions.check(call.function.name)) {
    return {
      tool: call.function.name,
      error: '此工具已被禁用',
      status: 'denied'
    };
  }
  
  // 敏感操作确认
  if (tool.needsConfirmation) {
    const confirmed = await promptUser(
      '允许执行 ' + call.function.name + ' 吗?'
    );
    if (!confirmed) {
      return { status: 'rejected' };
    }
  }
  
  // 执行工具
  return tool.handler(JSON.parse(call.function.arguments));
}

🎭 四、Provider 适配层:多模型支持

4.1 支持的模型

模型 提供商 特点
claude-opus-4 Anthropic 最强推理,复杂任务
claude-sonnet-4 Anthropic 平衡速度与质量
claude-haiku-3.5 Anthropic 最快响应,简单任务

4.2 Provider 抽象

// provider.ts
interface AIProvider {
  complete(request: Request): Promise<Response>;
  stream(request: Request): AsyncIterable<Chunk>;
}

class AnthropicProvider implements AIProvider {
  private client: Anthropic;
  
  async complete(request: Request) {
    const response = await this.client.messages.create({
      model: request.model,
      messages: request.messages,
      tools: request.tools,
      max_tokens: 8192,
      stream: false
    });
    return response;
  }
  
  async stream(request: Request) {
    const stream = await this.client.messages.create({
      ...request,
      stream: true
    });
    return stream;
  }
}

class OllamaProvider implements AIProvider {
  // 本地模型支持(预留接口)
}

💨 五、流式响应系统

Claude Code 的流式响应让用户体验非常好,边生成边输出:

// src/assistant/streaming.ts
async function* streamResponse(response: AsyncIterable<Chunk>) {
  let content = '';
  let toolCalls: ToolCall[] = [];
  
  for await (const chunk of response) {
    switch (chunk.type) {
      case 'text':
        content += chunk.text;
        yield { type: 'delta', text: chunk.text };
        break;
        
      case 'tool_call_start':
        yield { type: 'tool_start', name: chunk.name };
        break;
        
      case 'tool_call_end':
        yield { type: 'tool_end', result: chunk.result };
        break;
        
      case 'thinking':
        yield { type: 'thinking', text: chunk.text };
        break;
    }
  }
  
  return { content, toolCalls };
}

💡 流式设计要点

  • text delta:每收到一段文本就立刻更新终端 UI
  • tool call:先渲染"🔍 正在搜索…",执行完更新结果
  • thinking:推理模型专有的思考片段,可以折叠显示

📦 六、消息上下文管理

AI 对话上下文窗口有限(Claude Opus 支持 200K token),需要智能管理:

// src/assistant/context.ts
function manageContext(history: Message[]): Message[] {
  const TOTAL_BUDGET = 100000; // token 预算
  
  let total = countTokens(history);
  
  if (total <= TOTAL_BUDGET) {
    return history;
  }
  
  // 保留系统提示 + 最近 20 条
  const systemMsg = history[0];
  const recentMsg = history.slice(-20);
  
  // 中间历史做摘要
  const middle = history.slice(1, -20);
  const compressed = summarizer.compress(middle);
  
  return [systemMsg, ...compressed, ...recentMsg];
}

上下文压缩策略

策略 说明 压缩比
丢弃 删除最早的对话 最高
摘要 用 AI 压缩历史 约 10:1
选择性保留 保留关键信息 约 5:1
不压缩 完整保留(预算内) 1:1

🛠 七、199 个工具的注册机制

// src/tools/index.ts
const TOOLS: Tool[] = [
  FileRead, FileWrite, FileEdit, FileDelete,
  Bash, Script, Terminal,
  CodeSearch, SymbolLookup, ASTParse,
  GitStatus, GitDiff, GitCommit, GitLog,
  WebSearch, WebFetch, HTTPRequest,
];

export function getToolDefinitions(): ToolDef[] {
  return TOOLS.map(t => ({
    name: t.name,
    description: t.description,
    input_schema: t.inputSchema
  }));
}

📋 总结

本篇解析了 Claude Code 最核心的 AI 对话引擎:

  • chat.ts:精密的 while(true) 对话循环
  • toolExecution.ts:约 800 行核心文件,工具编排 + 并行 + 权限
  • provider.ts:策略模式抽象多模型支持
  • streaming.ts:流式渲染系统,逐 token 更新
  • context.ts:上下文窗口压缩
  • 199 个工具:统一注册中心

📌 关键设计

  1. 对话循环:一个 while(true) 驱动全部交互逻辑
  2. 并行执行:智能判断工具依赖关系
  3. 权限分层:禁用 / 需确认 / 自动 三层模型
  4. 流式渲染:逐 token 增量更新
  5. 上下文压缩:保留系统提示 + 最近 20 条

📅 下篇预告

深入解析 工具系统——199 个工具具体能做什么?文件操作、Bash、Git、网络工具的设计模式与实现细节。敬请期待!


💡 如果这篇文章对你有帮助,欢迎点赞、收藏、关注!

有问题欢迎在评论区讨论!

#ClaudeCode #AI引擎 #工具编排 #流式响应 #对话系统 #TypeScript

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐