Claude API 里的 tool use 是一场协作。模型决定调什么、用什么参数。你的代码负责实际执行。Claude 从不碰你的数据库,不调你的 API,不执行任何东西。它只是提出请求。
六步流程
- 定义工具 — 你在 API 请求中描述可用的工具(名称、描述、输入 schema)。
- 发送请求 — 你把 messages 和工具定义一起发给 API。
- 模型返回
tool_use— 响应里包含一个tool_useblock,带着工具名、参数和一个唯一 ID。stop_reason是"tool_use"。 - 你执行工具 — 你的代码跑实际操作(数据库查询、API 调用、文件读取——工具做什么就做什么)。
- 你把结果送回去 — 你加一条
user消息,里面放tool_resultblock,引用原始的tool_useID。 - 模型处理结果 — Claude 把工具输出融入下一条响应中。
一次工具调用至少需要两次 API 调用:初始请求(步骤 1-3)和带结果的后续请求(步骤 5-6)。如果模型链式调用两个工具,那就是三次 API 调用。
模型不执行任何东西
这是最常见的误解。在工具使用方面,Claude API 是一个纯推理引擎。它生成结构化的请求,说明自己想要做什么。执行完全是你的事。
这种分离是刻意设计的。你的代码控制安全、限流、错误处理和权限管控。模型负责决策和参数生成。双方各管各的,互不越界。
多个工具的情况
模型可以在一条响应里请求多个工具调用——content 数组里会有多个 tool_use block。你把它们全部执行完,然后在一条消息里把所有结果送回去(多个 tool_result block)。模型也可能跨轮次链式调用:先用工具 A,处理完结果,再决定调工具 B。
一句话总结: 模型决定调什么、生成参数——你的代码执行工具、返回结果。Claude 自己从不运行任何东西。