Agent 从小白到架构师
← 返回教程总览
第二课

为 Agent 添加真实 API 工具

从 LangChain 入门到带记忆的 Web 旅行规划助手

第一课里的工具都是本地函数。真实应用里,Agent 往往需要调用外部 API。这里用心知天气 API 做一个真实工具。

1. API 签名配置

心知天气使用 HMAC-SHA1 签名。你需要准备:

  • `SENIVERSE_UID`:公钥
  • `SENIVERSE_KEY`:私钥

```python import base64 import hashlib import hmac import time from urllib import parse

SENIVERSE_UID = "你的公钥" SENIVERSE_KEY = "你的私钥" SENIVERSE_API_URL = "https://api.seniverse.com/v3/weather/now.json" ```

2. 定义天气工具

```python import requests from langchain_core.tools import tool

@tool def get_weather(city: str) -> str: """查询指定城市的实时天气情况,支持中文城市名如北京、上海等""" try: ts = int(time.time()) params_str = f"ts={ts}&uid={SENIVERSE_UID}"

    key = bytes(SENIVERSE_KEY, "UTF-8")
    raw = bytes(params_str, "UTF-8")
    digester = hmac.new(key, raw, hashlib.sha1).digest()
    sig = parse.quote(base64.b64encode(digester).decode("utf8"))

    url = (
        f"{SENIVERSE_API_URL}?location={parse.quote(city)}"
        f"&{params_str}&sig={sig}"
    )

    response = requests.get(url, timeout=5)
    data = response.json()

    if "results" in data:
        result = data["results"][0]
        location = result["location"]["name"]
        now = result["now"]
        return f"{location}:{now['text']},温度 {now['temperature']}°C"

    return f"未找到 {city} 的天气信息"
except Exception as e:
    return f"获取天气失败: {str(e)}"

```

3. 定义时间工具

```python from datetime import datetime

@tool def get_current_time() -> str: """获取当前时间""" return datetime.now().strftime("%Y-%m-%d %H:%M:%S") ```

4. 组合成一个有真实感知能力的 Agent

```python tools = [get_weather, get_current_time] agent = create_agent(llm, tools) ```

这时你就可以问:

```text 现在几点了?北京天气怎么样? ```

Agent 会自主决定:

  1. 调用 `get_current_time`
  2. 调用 `get_weather("北京")`
  3. 汇总两个工具结果,一次性回复用户

5. 这一课的重点

  • 工具不一定是本地逻辑,也可以是外部 API
  • 只要工具描述清晰,Agent 会自己决定调用顺序
  • 旅行类应用最常见的第一批工具就是天气、时间、位置和交通信息