加载中

在使用Claude的工具功能时,您会遇到一种与之前看到的简单文本响应不同的新型响应结构。Claude现在不再只返回单个文本块,而是可以返回包含文本和工具使用信息的多块消息。

进行启用工具的API调用

要让Claude能够使用工具,您需要在API调用中包含一个tools参数。以下是请求的结构方式:

python
messages = []
messages.append({
    "role": "user",
    "content": "What is the exact time, formatted as HH:MM:SS?"
})

response = client.messages.create(
    model=model,
    max_tokens=1000,
    messages=messages,
    tools=[get_current_datetime_schema],
)

tools参数接受一个JSON模式(schema)列表,用于描述Claude可以调用的可用函数。

理解多块消息

当Claude决定使用工具时,它会返回一条助手消息,其内容列表中包含多个块。这与您之前使用的简单纯文本响应相比是一个重大变化。

一条多块消息通常包含:

  • 文本块 - 解释Claude正在做什么的人类可读文本(例如"我可以帮您查找当前时间。让我为您查找该信息")
  • ToolUse块 - 告知您的代码应调用哪个工具以及使用什么参数的指令

ToolUse块包括:

  • 用于跟踪工具调用的ID
  • 要调用的函数名称(例如"get_current_datetime")
  • 根据您的JSON模式格式化的输入参数
  • 类型标识"tool_use"

处理包含多块内容的消息历史

这是关键部分:Claude不会存储对话历史,因此您必须手动管理它。在处理工具响应时,您需要保留整个内容结构,包括所有块。

您不能只提取文本,而需要附加完整的响应内容:

python
messages.append({
    "role": "assistant",
    "content": response.content
})

这样可以同时保留文本块和工具使用块,为未来的API调用维护完整的对话上下文。

完整流程

工具使用过程遵循以下模式:

  1. 将带有工具模式的用户消息发送给Claude
  2. 接收多块助手消息(文本+工具使用)
  3. 提取工具调用信息并执行该函数
  4. 将工具结果连同完整的消息历史一起发送回Claude
  5. 接收Claude的最终响应

每一步都需要仔细处理消息结构,以保持对话的连续性。关键点在于,启用工具的对话涉及更复杂的消息格式,但维护完整消息历史的基本原则保持不变。

更新辅助函数

如果您一直在使用像add_user_message和add_assistant_message这样的辅助函数,您需要更新它们以处理多块内容。当前版本可能只支持单个文本块,但现在它们需要适应包含工具使用块的更复杂内容结构。