第四篇:AI对话引擎全解析,Claude Code如何编排工具调用
·
第四篇: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 个工具:统一注册中心
📌 关键设计
- 对话循环:一个 while(true) 驱动全部交互逻辑
- 并行执行:智能判断工具依赖关系
- 权限分层:禁用 / 需确认 / 自动 三层模型
- 流式渲染:逐 token 增量更新
- 上下文压缩:保留系统提示 + 最近 20 条
📅 下篇预告
深入解析 工具系统——199 个工具具体能做什么?文件操作、Bash、Git、网络工具的设计模式与实现细节。敬请期待!
💡 如果这篇文章对你有帮助,欢迎点赞、收藏、关注!
❓ 有问题欢迎在评论区讨论!
#ClaudeCode #AI引擎 #工具编排 #流式响应 #对话系统 #TypeScript
更多推荐
所有评论(0)