Claude 使用手册
独立第三方资料站 · 非 Anthropic / Claude 官方网站查阅条件,核对证据
API 开发

Claude Tool Use 入门:以模拟天气工具完成调用循环

定义工具、处理 tool_use、回传 tool_result,再生成回答;明确静态天气与真实外部 API 的区别。

一个工具调用包含四步

先用名称、描述和 input_schema 声明工具;再发送用户请求与工具定义;当模型返回 tool_use 时由应用校验并执行;最后把结果连同调用 ID 回传。本文的天气工具是客户端工具,不能把其流程套到所有服务端工具。

原创演示固定返回“示例城二十摄氏度”,用来检查消息协议。它不是天气查询服务,不应让用户据此安排出行。真实接入时要选获准的数据提供方,保存观测时间、位置和单位,并限制允许访问的端点。

有停止条件的 Python 示例

以下函数使用官方 SDK 方法名与工具结果结构,模型 ID 由调用者传入。已通过本地语法检查;没有安装 SDK、传入凭证或发出任何请求,因此不称为端到端实测。调用它前需要服务端配置及相应 API 预算。

python · 示例
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。涉及产品与账户条件时,请以当前官方说明为准。