Claude Tool Use 入门:以模拟天气工具完成调用循环
定义工具、处理 tool_use、回传 tool_result,再生成回答;明确静态天气与真实外部 API 的区别。
一个工具调用包含四步
先用名称、描述和 input_schema 声明工具;再发送用户请求与工具定义;当模型返回 tool_use 时由应用校验并执行;最后把结果连同调用 ID 回传。本文的天气工具是客户端工具,不能把其流程套到所有服务端工具。
原创演示固定返回“示例城二十摄氏度”,用来检查消息协议。它不是天气查询服务,不应让用户据此安排出行。真实接入时要选获准的数据提供方,保存观测时间、位置和单位,并限制允许访问的端点。
有停止条件的 Python 示例
以下函数使用官方 SDK 方法名与工具结果结构,模型 ID 由调用者传入。已通过本地语法检查;没有安装 SDK、传入凭证或发出任何请求,因此不称为端到端实测。调用它前需要服务端配置及相应 API 预算。
import json
def weather_agent(client, model, question):
tools = [{"name": "demo_weather",
"description": "只返回示例城的模拟天气,绝非实时数据",
"input_schema": {"type": "object", "properties": {
"city": {"type": "string", "enum": ["示例城"]}},
"required": ["city"], "additionalProperties": False}}]
messages = [{"role": "user", "content": question}]
for _ in range(4):
response = client.messages.create(
model=model, max_tokens=600, tools=tools, messages=messages,
system="所有天气数据均为模拟;不得称为实时天气。")
if response.stop_reason == "end_turn":
return "".join(b.text for b in response.content if b.type == "text")
if response.stop_reason != "tool_use":
raise RuntimeError("本示例不继续处理:" + str(response.stop_reason))
messages.append({"role": "assistant", "content": response.content})
results = []
for block in response.content:
if block.type != "tool_use":
continue
valid = block.name == "demo_weather" and block.input == {"city": "示例城"}
results.append({"type": "tool_result", "tool_use_id": block.id,
"is_error": not valid,
"content": json.dumps({"demo": True, "celsius": 20}, ensure_ascii=False)
if valid else "未知工具或参数;只接受示例城"})
if not results:
raise RuntimeError("没有可处理的工具调用")
messages.append({"role": "user", "content": results})
raise RuntimeError("达到工具循环轮数上限")从模拟升级为外部 API
把模拟函数替换为受控服务请求前,先验证输入类型和取值,设置连接及读取超时,限制响应大小,并给数据加上来源与观测时间。不要让模型传入任意 URL,否则可能访问不应暴露的内部服务。
多个独立城市可按预算并行查询,但必须把每个调用结果都送回,并对失败分别标记。上例为了清晰按顺序分发,不展示并发;错误路径不应该返回看起来正常的假天气。
安全和测试边界
建议先构造两轮假响应做协议测试:第一轮提出示例城天气调用,第二轮返回正常结束;另加一个未知城市输入,检查结果标记为错误。这样先排除消息拼接问题,再处理真实天气服务的认证与网络问题,能让调试原因更清晰。
先用假 client 测试无需工具、单工具、多工具、未知工具、截断和轮数耗尽,再在批准的环境做真实联调。密钥留在服务端,不写进网页、仓库或错误日志。模型回答中的数值与工具结果也要核对。
工具描述和结构化参数有助于正确调用,但不能保证业务授权或事实正确。程序化工具调用、Tool Runner 等是不同扩展路径,是否适用需看当前文档,不能借新功能名称承诺固定性能提升。
参考来源
资料核对日期:2026-10-04。涉及产品与账户条件时,请以当前官方说明为准。