跳转到正文
技术教程·

Claude Tool Use 教程:从工具定义到多轮调用

Claude Tool Use 教程:手把手教你用 Anthropic Claude API 实现工具调用,从工具定义、单轮调用到多轮对话中的工具使用,含完整 Python 代码示例。

这篇教程适合你吗

你已经用过 Claude API 做基础对话(可以看 Claude API 教程),现在想让 Claude 能调用外部工具。如果你熟悉 OpenAI 的 Function Calling,这篇帮你快速上手 Claude 的对应功能。

不适合:没写过 API 调用代码的读者。建议先看 OpenAI API 教程Claude API 教程最终产物:用 Claude API 实现工具调用的完整 Python 代码。

环境假设

  • Python 3.8+
  • anthropic Python SDK
  • Anthropic API Key

> 合规提醒:Anthropic Claude API 是海外服务,使用时请遵守所在地法律法规和服务条款。如遇网络连接问题,可参考海外 AI 工具使用指南

Claude Tool Use 的完整流程

定义 tools → 发送请求 → Claude 返回 tool_use 块 → 你执行工具 → 把结果发回 → Claude 生成最终回答

和 OpenAI Function Calling 逻辑一致,但 API 格式不同。

第一步:定义工具

Claude 的工具定义格式:

tools = [

{

"name": "get_weather",

"description": "查询指定城市的当前天气信息",

"input_schema": {

"type": "object",

"properties": {

"city": {

"type": "string",

"description": "城市名称,例如 北京"

}

},

"required": ["city"]

}

}

]

和 OpenAI 的区别:Claude 把参数 schema 放在 input_schema 字段里,OpenAI 放在 parameters 里。

第二步:发送请求

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(

model="claude-sonnet-4-20250514",

max_tokens=1024,

tools=tools,

messages=[

{"role": "user", "content": "北京今天天气怎么样?"}

]

)

print(response.stop_reason) # "tool_use" 表示模型要求调用工具

第三步:解析工具调用

Claude 的响应 content 是一个列表,可能包含文本块和工具调用块:

for block in response.content:

if block.type == "text":

print(f"文本: {block.text}")

elif block.type == "tool_use":

print(f"工具调用: {block.name}")

print(f"参数: {block.input}")

# block.id 是这次调用的唯一标识,后面要用

第四步:执行工具并返回结果

import json

# 构造包含工具结果的消息

tool_results = []

for block in response.content:

if block.type == "tool_use":

if block.name == "get_weather":

# 你自己的函数,执行实际逻辑

result = get_weather(block.input["city"])

tool_results.append({

"type": "tool_result",

"tool_use_id": block.id,

"content": json.dumps(result, ensure_ascii=False)

})

# 把工具结果发回给 Claude

messages = [

{"role": "user", "content": "北京今天天气怎么样?"},

{"role": "assistant", "content": response.content},

{"role": "user", "content": tool_results}

]

final_response = client.messages.create(

model="claude-sonnet-4-20250514",

max_tokens=1024,

tools=tools,

messages=messages

)

print(final_response.content[0].text)

# → "北京今天天气晴朗,气温 28°C,适合外出。"

关键点
  • 工具结果以 role: "user" 的消息发送,不是 role: "tool"
  • 每个结果必须包含 tool_use_id,对应之前调用的 block.id
  • 消息结构是:用户消息 → 助手响应(含 tool_use) → 用户消息(含 tool_result)

多工具并行调用

Claude 可以在一次响应中请求调用多个工具:

tools = [

{"name": "get_weather", "description": "查天气", "input_schema": {...}},

{"name": "get_time", "description": "查时间", "input_schema": {...}}

]

# Claude 可能同时返回两个 tool_use 块

# 你需要分别执行,然后一起返回结果

多轮工具调用

Claude 可能在回答过程中需要多次调用工具:

def chat_with_tools(user_message: str, tools: list) -> str:

messages = [{"role": "user", "content": user_message}]

while True:

response = client.messages.create(

model="claude-sonnet-4-20250514",

max_tokens=1024,

tools=tools,

messages=messages

)

# 如果没有工具调用,返回最终文本

if response.stop_reason == "end_turn":

return "".join([b.text for b in response.content if b.type == "text"])

# 有工具调用,执行并继续

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

tool_results = []

for block in response.content:

if block.type == "tool_use":

result = execute_tool(block.name, block.input)

tool_results.append({

"type": "tool_result",

"tool_use_id": block.id,

"content": json.dumps(result, ensure_ascii=False)

})

messages.append({"role": "user", "content": tool_results})

常见问题与排错

Claude 不调用工具

原因:工具描述不清晰,或模型认为不需要工具。 解决:在系统消息中明确「当用户问到 XX 类问题时,使用 XX 工具」。工具的 description 要写清楚「什么时候用」。

工具结果格式错误

原因tool_resultcontent 必须是字符串。 解决:用 json.dumps() 把结果序列化为字符串。如果是错误信息,用 is_error: True 标记。

进阶学习

总结

  • Claude Tool Use 和 OpenAI Function Calling 逻辑一致,API 格式不同
  • 工具定义用 input_schema,工具调用在 content 块中
  • 支持并行调用和多轮调用
  • 工具结果通过 role: "user" 的消息返回

---

本文最后更新于 2026-07-27。代码示例基于当前常见版本,请根据最新 API 文档调整。

保障 API 调用稳定性

调用 OpenAI、Anthropic 等海外 API 时,网络波动可能导致请求超时或失败。稳定的网络环境有助于提升开发效率。

⚠️ 请遵守所在地的法律法规和服务条款。使用 AI API 时请遵守各平台的使用政策。

了解安全上网方案 →

常见问题

相关推荐

获取更多 AI 内容

订阅更新,第一时间获取新教程和工具推荐。