LEARN CLAUDE CODE

S02: Tool Use — dispatch map 让模型长出手臂

这一课解决什么问题

S01 的 Agent 只有一个 Bash 工具——这就像给人一把万能钥匙,看似什么门都能开,实则:

S02 的答案:把一个万能工具拆成一组专用工具,每个工具有明确的职责边界和安全约束。

核心机制

┌──────────────── dispatch map ────────────────┐ │ │ │ tools = { │ │ "read_file": read_handler, │ │ "write_file": write_handler, │ │ "list_dir": list_handler, │ │ "bash": bash_handler, │ │ } │ │ │ │ 模型回复: tool_use(name="read_file", │ │ input={path: "src/a.py"})│ │ │ │ │ ▼ │ │ handler = tools[name] ← 字典查找 │ │ │ │ │ ▼ │ │ safe_path(input.path) ← 沙箱检查 │ │ • 必须在 workspace/ 下 │ │ • 不能包含 ../ │ │ • 不能是 symlink 逃逸 │ │ │ │ │ ▼ │ │ result = handler(input) ← 执行 │ │ │ │ │ ▼ │ │ 追加到 messages[] → 继续循环 │ └───────────────────────────────────────────────┘

关键概念解释

对应到 Claude Code 官方的什么

tools.ts — 工具注册表

Claude Code 源码中有一个工具注册表,每个工具是一个对象,包含:

  • name — 工具名称
  • description — 模型看到的工具描述
  • inputSchema — Zod 定义的参数结构
  • handler() — 执行函数
  • isReadOnly — 是否只读(影响权限和并行)
  • isEnabled() — 动态判断是否在当前上下文中启用

本质就是一个增强版的 dispatch map,加了权限控制、schema 校验、feature gate 等生产级功能。

变更对比表

维度S01(只有 Bash)S02(dispatch map)
工具数量1 个(bash)4+ 个专用工具
安全性无限制safe_path() 沙箱
可扩展性硬编码字典加一行即可
模型精确度需要自己拼 bash 命令结构化参数,类型安全
权限粒度全有或全无可对每个工具单独控制
新增代码dispatch 字典 + safe_path + handler 函数
洞察:Claude Code 有 42 个内置工具,但底层机制和这 30 行的 dispatch map 完全一样——一个字典查找 + handler 调用。复杂度不在调度本身,而在每个 handler 内部的实现。