工具使用与函数调用
让模型调用您的函数——请求循环、两种格式,以及浪费 token 的常见错误。
工具使用让模型能够请求你运行一个函数,然后根据结果继续处理。这是所有编程智能体背后的机制。
交互循环
- 你发送
messages以及tools,用于描述可用的工具。 - 模型回复一个
stop_reason: tool_use以及一个tool_use块,其中指定工具名称及其参数。 - 由你 执行它——网关绝不会运行你的代码。
- 你将完整历史记录连同一个
tool_result块一起发回。 - 模型生成最终答案,或请求调用另一个工具。
定义工具(Messages 格式)
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"tools": [{
"name": "get_weather",
"description": "Current weather for a city. Use when the user asks about weather.",
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string", "description": "City name"}},
"required": ["city"]
}
}],
"messages": [{"role": "user", "content": "Weather in Paris?"}]
}
返回结果
{
"role": "user",
"content": [{
"type": "tool_result",
"tool_use_id": "toolu_01ABC...",
"content": "18C, light rain"
}]
}
tool_result 放在角色为以下值的消息中 user,以及 tool_use_id 必须与模型请求中的 id 完全匹配。id 不匹配会被视为无效请求而遭到拒绝。OpenAI 格式
该 /v1/chat/completions 端点使用 OpenAI 的 tools / tool_calls 格式,结果则以角色为以下值的消息返回 tool.
工具使用的成本
- 每轮都会重新发送定义。 即使对话尚未开始,二十个冗长的工具 schema 就可能占用大部分输入 token。
- 结果会成为上下文。 如果工具返回 200 行 JSON,这些内容会全部包含在下一次请求以及此后的每次请求中。
- 每次往返都是一次计费调用。 一个需要调用五个工具的任务至少需要六次请求。
- 限制工具输出的长度,并在返回前进行摘要。在大多数智能体循环中,将结果裁剪到模型实际需要的内容,是最能发挥作用的改进。
工具 schema 在各轮之间保持稳定,因此与系统提示词一样,非常适合作为 提示词缓存 的候选内容。