第一课里的工具都是本地函数。真实应用里,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 会自主决定:
- 调用 `get_current_time`
- 调用 `get_weather("北京")`
- 汇总两个工具结果,一次性回复用户
5. 这一课的重点
- 工具不一定是本地逻辑,也可以是外部 API
- 只要工具描述清晰,Agent 会自己决定调用顺序
- 旅行类应用最常见的第一批工具就是天气、时间、位置和交通信息