在将多个工具连接到 Claude 时，我们必须对 Claude 的响应做出什么假设？	我们必须假设 Claude 可能会连续使用多个工具。
当一个查询需要多个工具调用时，我们应该采用哪种编程结构来处理？	应该使用循环（如 `while` 循环）来反复调用 Claude，直到它不再请求使用工具为止。
为什么需要重构 `addUserMessage` 和 `addAssistantMessage` 这两个辅助函数？	因为它们需要能够处理 Claude 返回的包含多个消息块（message blocks）的响应，而不仅仅是纯文本。
在使用工具时，`chat` 函数的关键变化是什么？	它不再返回 Claude 响应中的纯文本块，而是返回整个消息对象。
`text_from_message` 这个辅助函数的目的是什么？	它的作用是检查消息中的所有块，并提取所有文本块中的内容，将它们连接起来。
当 Claude 决定使用工具时，整个流程的执行顺序是怎样的？	Claude 请求工具 -> 我们执行工具 -> 将结果反馈给 Claude -> Claude 再次响应（可能请求下一个工具）-> 直到获得最终答案。
在实现多工具调用逻辑时，我们应该在代码中持续检查 Claude 的响应包含什么？	我们需要检查 Claude 的响应是否包含任何工具使用请求（tool use）。
为什么在重构 `chat` 函数时，我们不再假设 Claude 总是返回一个单一的文本块？	因为引入工具后，Claude 的响应可能包含多个不同类型的消息块（例如文本块和工具使用块）。
