Tool Calling(工具调用) 工具与循环
别名:
函数调用 · Function Calling
模型在回复中声明「我想调用某个工具、参数是什么」,而真正的执行永远发生在我们的进程里。完整闭环:模型返回 `tool_calls` → 解析参数 → 执行工具 → 把结果作为 `tool` 消息按 `tool_call_id` 配对回填 → 带扩展后的消息数组发起第二次请求。这是所有 Agent 行动的起点,见[第 06 章](/chapters/06-tool-calling/)。
它是什么
Tool Calling(工具调用,也叫 Function Calling)是模型在回复中以结构化数据声明「我想调用哪个工具、参数是什么」的能力——模型不会真正执行任何东西,执行永远发生在你的进程里。一次完整调用由三个参与者构成:工具声明(tools 数组,模型只能看到这份 schema)、模型请求(响应里的 tool_calls)、harness 执行(我们的代码解析参数、运行实现、回填结果)。
完整闭环:解析 → 执行 → 回填 → 二次请求
第 06 章手写的最小闭环分四步:
- 请求带
tools,模型返回tool_calls(id/name/arguments,其中arguments是 JSON 字符串,必须先JSON.parse再校验); - 执行工具:按名字查表调用实现,结果必须是字符串(模型只能读文本);
- 回填:把带
tool_calls的 assistant 消息原样追加,再为每个调用配一条role: 'tool'消息,用tool_call_id与调用id一一配对; - 用扩展后的消息数组原样发起第二次请求——模型是无状态的,丢掉任何一环,第二轮就会「失忆」答非所问。
边界与厂商差异
工具调用把「行动的选择权」交给模型、「执行权」留给 harness,安全边界就在这里:模型可以提出任何请求(包括危险的),放行与否由我们的代码决定(权限设计在第 18 章展开)。OpenAI 的 tool_calls / role: 'tool' 与 Anthropic 的 tool_use block / tool_result 载体不同,但「拿到请求 → 解析 → 执行 → 按 id 配对回填 → 二次请求」的闭环逻辑相同——这正是第 04 章的 Provider 抽象要翻译的那一层。
小结
一句话:模型负责思考,你负责动手。Tool Calling 是所有 Agent 行动的起点——把它装进一个 while 循环,就成了第 07 章的 Agent Loop。