本页介绍工具调用的生命周期:从 Claude 的响应中读取 tool_use 块、在您的回复中格式化 tool_result 块,以及发出错误信号。如需了解自动处理这些操作的 SDK 抽象层,请参阅 Tool Runner。
使用 Tool Runner 更简单:本页描述的手动工具处理流程由 Tool Runner 自动管理。当您需要对工具执行进行自定义控制时,请参考本页内容。
Claude 的响应会根据其使用的是客户端工具还是服务器工具而有所不同。
响应的 stop_reason 将为 tool_use,并包含一个或多个 tool_use 内容块,其中包括:
id:此特定工具使用块的唯一标识符。稍后将用于匹配工具结果。name:正在使用的工具的名称。input:一个对象,包含传递给工具的输入,符合该工具的 input_schema。当您收到客户端工具的工具使用响应时,您应该:
tool_use 块中提取 name、id 和 input。input。role 为 user 的新消息来继续对话,该消息包含一个 tool_result 类型的 content 块以及以下信息:
tool_use_id:此结果所对应的工具使用请求的 id。content(可选):工具的结果,可以是字符串(例如 "content": "15 degrees")、嵌套内容块列表(例如 "content": [{"type": "text", "text": "15 degrees"}]),或文档块列表(例如 "content": [{"type": "document", "source": {"type": "text", "media_type": "text/plain", "data": "15 degrees"}}])。这些内容块可以使用 text、image、document 或 search_result 类型。is_error(可选):如果工具执行导致错误,则设置为 true。重要的格式要求:
tool_result 块。在结果之后添加文本会提前结束该回合;对于 Claude 直接调用的服务器工具,请求随后会失败并返回 400 错误,错误中会指明未解析的服务器工具。请参阅停止原因和回退。例如,以下内容将导致 400 错误:
{
"role": "user",
"content": [
{ "type": "text", "text": "Here are the results:" }, // ❌ Text before tool_result
{ "type": "tool_result", "tool_use_id": "toolu_01" /* ... */ }
]
}当助手回合仅调用客户端工具时,以下内容是正确的:
{
"role": "user",
"content": [
{ "type": "tool_result", "tool_use_id": "toolu_01" /* ... */ },
{ "type": "text", "text": "What should I do next?" } // ✅ Text after tool_result
]
}如果您收到类似 "tool_use ids were found without tool_result blocks immediately after" 的错误,请检查您的工具结果格式是否正确。
工具结果通常包含来自您无法控制的来源的内容:网页、入站电子邮件、用户上传的文件、第三方 API。请将这些内容视为不可信:能够影响这些内容的攻击者可能会嵌入试图重定向 Claude 的指令(即间接提示注入,indirect prompt injection)。请将不可信内容保留在 tool_result 块中,而不是 system 提示或普通的用户 text 块中,并参阅缓解越狱和提示注入以进一步加固。
收到工具结果后,Claude 将使用该信息继续生成对原始用户提示的响应。
Claude 在内部执行工具,并将结果直接整合到其响应中,无需额外的用户交互。
一个响应可以同时包含客户端 tool_use 块和尚无结果块的 server_tool_use 块。该服务器工具调用尚未完成,其结果块将在后续响应中到达。请回复一条仅包含客户端工具的 tool_result 块的用户消息,并保持相同的 tools 数组;对于 Claude 直接调用的服务器工具,API 会在该请求上运行它,下一个响应将以其结果块开始。请参阅停止原因和回退。
与其他 API 的区别
与那些将工具使用分离出来或使用 tool 或 function 等特殊角色的 API 不同,Claude API 将工具直接集成到 user 和 assistant 消息结构中。
消息包含 text、image、tool_use 和 tool_result 块的数组。user 消息包含客户端内容和 tool_result,而 assistant 消息包含 AI 生成的内容和 tool_use。
在与 Claude 一起使用工具时,可能会发生几种不同类型的错误:
处理 Claude 在单个回合中调用多个工具的响应。
让 SDK 为您管理 tool_use 循环、结果格式化和重试。
编写 schema 和描述,引导 Claude 选择正确的工具。
Was this page helpful?