你有没有注意过,当你让Claude Code同时搜索多个文件时,它几乎是瞬间返回结果的?这是怎么做到的?

或者,当你让它执行一个耗时命令时,你能实时看到输出,而不是干等半天。这又是怎么实现的?

答案都在工具执行编排里。今天咱们聊聊这个"后台调度系统"。

从请求到执行:完整流程

当模型决定调用工具时,执行流程是这样的:

模型发出tool_use请求
  
权限检查(三级检查)
  
并发安全评估
  
加入执行队列
  
实际执行
  
流式进度反馈
  
结果返回

每一步都有讲究。

权限检查的完整流程

工具执行前必须通过权限检查。这不是简单的一关,而是三道关卡:

第一道:用户规则检查

检查用户配置的alwaysAllow/alwaysDeny/askBefore规则。如果被deny,直接拒绝;如果在alwaysAllow,跳过后续检查。

第二道:工具级权限检查

调用工具的checkPermissions方法。这个方法由工具自己实现,可以精细控制。

比如BashTool会检查命令是否危险:

checkPermissions(input) {
  if (input.command.includes('rm -rf /')) {
    return { behavior: 'deny', reason: '禁止删除根目录' };
  }
  if (this.isReadOnly(input)) {
    return { behavior: 'allow' };
  }
  return { behavior: 'ask' };
}

第三道:YOLO分类器检查

对于一些复杂场景,使用AI分类器判断安全性。

三道关卡都通过后,工具才能执行。

并发执行的调度策略

当模型在一个回合中请求多个工具时,Claude Code会尝试并行执行。

但并行不是无限制的,需要考虑:

并发安全性:只有标记为isConcurrencySafe的工具才能与其他工具并行。

资源限制:同时执行的工具有数量上限,避免资源耗尽。

依赖关系:如果工具B依赖工具A的结果,必须等A完成才能执行B。

实际调度算法:

收到工具列表 [A, B, C, D]
分类:
  - A: 并发安全 → 立即执行
  - B: 并发安全 → 立即执行
  - C: 不安全,但队列空 → 立即执行
  - D: 不安全,队列有C → 等待
并行执行A、B、C
C完成后,执行D
所有完成,返回结果

流式进度的传播机制

对于长时间运行的工具(如BashTool执行耗时命令),Claude Code支持流式进度反馈。

实现机制:

onProgress回调:工具执行过程中,定期调用onProgress报告进度。

call(input, context, canUseTool, parentMessage, onProgress) {
  const process = spawn(command);

  process.stdout.on('data', (data) => {
    onProgress({ stdout: data.toString() });
  });

  process.stderr.on('data', (data) => {
    onProgress({ stderr: data.toString() });
  });
}

进度聚合:多个工具的进度会聚合到UI,显示各自的执行状态。

渲染更新:React Ink组件接收到进度更新,实时重绘界面。

这让用户能看到AI"正在做什么",而不是盯着空白屏幕。

中断机制:用户随时喊停

用户可以随时按Ctrl+C中断执行。这需要:

信号捕获:捕获SIGINT信号,触发取消流程。

工具取消:向正在执行的工具发送取消信号。

// BashTool取消执行
abort() {
  if (this.process) {
    this.process.kill('SIGTERM');
  }
}

状态回滚:已完成的工具结果被保留,未完成的被取消。

通知模型:向模型发送"用户已取消"的消息,让模型知道发生了什么。

错误处理:失败不是终点

工具执行可能失败,错误处理策略:

工具级错误:命令返回非零退出码、文件不存在等。这些作为tool_result返回给模型,由模型决定下一步。

系统级错误:网络中断、内存不足等。这些会报告给用户。

超时处理:每个工具有超时限制,超时后自动终止。

错误不是终点,而是信息。模型收到错误后,可以:

  • 重试
  • 换用其他工具
  • 向用户解释
  • 请求用户帮助

实战:优化工具使用

理解工具执行编排,能帮你:

利用并行:一次请求多个独立的只读操作,提高效率。

避免阻塞:不要把耗时操作和轻量操作混在一起串行执行。

合理中断:如果AI在做无用功,及时中断,避免浪费token。

处理错误:当工具报错时,给AI明确的反馈,帮助它调整策略。

总结

工具执行编排是Claude Code的"后台调度系统":

  • 三级权限检查确保安全
  • 并发调度提高效率
  • 流式反馈提升体验
  • 中断机制保持用户控制

理解这个机制,能让你更好地与AI协作,也能在自己构建AI Agent时借鉴这些设计。


文章写到这儿,希望对你理解工具执行编排有所帮助。下篇咱们聊聊模型特定调优——不同模型的"剧本"有什么不同。