现在我们来到了工具使用工作流程的最后一步。在运行我们的工具并获得结果之后,我们需要将所有内容发送回 Claude,以便它能够为用户提供完整的响应。

这个过程很简单:将我们生成的所有工具结果部分打包成一条用户消息,然后将整个对话历史连同原始工具模式一起发送回 Claude。
添加助手消息
首先,我们需要确保我们的对话历史是完整的。在 Claude 对工具使用请求做出初始响应之后,我们需要使用 add_assistant_message() 将该响应添加到我们的消息历史中。

这确保了我们拥有完整的对话流程:用户问题 → 助手工具请求 → 工具结果 → 最终助手响应。
运行工具并创建工具结果
run_tools() 函数处理来自 Claude 响应的所有工具使用请求,并创建格式正确的工具结果部分。每个工具结果包括:
- 工具使用 ID(与原始请求匹配)
- 运行工具的实际输出
- 表示成功或错误的状态

该函数能够优雅地处理成功的工具执行和错误情况,将所有内容包装在 Claude 期望的正确 JSON 结构中。
将工具结果添加到对话中
一旦我们有了工具结果,我们就使用 add_user_message() 将它们添加到对话中:
add_user_message(messages, run_tools(parts))这会创建一条包含所有工具结果部分的用户消息。现在对话已经具备了 Claude 提供最终响应所需的完整往返交流。

最后一次调用 Claude
最后一步是将所有内容发送回 Claude。这需要两个重要元素:
- 完整的消息历史(用户 → 助手 → 用户)
- 原始工具模式
text, parts = chat(messages, tools=[get_current_datetime_schema])包含工具模式至关重要。如果没有它们,Claude 会对对话历史中的工具引用感到困惑,也无法理解 get_current_datetime 实际的作用。

成功
当一切正常运行时,Claude 会接收到工具结果,并能够提供完整、有依据的响应。在我们的示例中,Claude 成功获取了当前时间,并以自然的方式将其格式化为响应:"当前日期和时间是 2025-04-03,12:54:00。"
这表明我们的工具集成正常运行。尽管 Claude 知道当前日期,但它无法访问像精确当前时间这样的实时信息——而这正是我们的工具所提供的。
完整的工具使用循环现在正常运行:Claude 请求一个工具,我们执行它,返回结果,Claude 将该信息整合到其对用户的最终响应中。