|
import os |
|
import requests |
|
from lagent.actions.base_action import BaseAction, tool_api |
|
from lagent.schema import ActionReturn, ActionStatusCode |
|
|
|
class WeatherQuery(BaseAction): |
|
def __init__(self): |
|
super().__init__() |
|
self.api_key = os.getenv("weather_token") |
|
print(self.api_key) |
|
if not self.api_key: |
|
raise EnvironmentError("未找到环境变量 'token'。请设置你的和风天气 API Key 到 'weather_token' 环境变量中,比如export weather_token='xxx' ") |
|
|
|
@tool_api |
|
def run(self, location: str) -> dict: |
|
""" |
|
查询实时天气信息。 |
|
|
|
Args: |
|
location (str): 要查询的地点名称、LocationID 或经纬度坐标(如 "101010100" 或 "116.41,39.92")。 |
|
|
|
Returns: |
|
dict: 包含天气信息的字典 |
|
* location: 地点名称 |
|
* weather: 天气状况 |
|
* temperature: 当前温度 |
|
* wind_direction: 风向 |
|
* wind_speed: 风速(公里/小时) |
|
* humidity: 相对湿度(%) |
|
* report_time: 数据报告时间 |
|
""" |
|
try: |
|
|
|
if not ("," in location and location.replace(",", "").replace(".", "").isdigit()): |
|
|
|
geo_url = f"https://geoapi.qweather.com/v2/city/lookup?location={location}&key={self.api_key}" |
|
geo_response = requests.get(geo_url) |
|
geo_data = geo_response.json() |
|
|
|
if geo_data.get("code") != "200" or not geo_data.get("location"): |
|
raise Exception(f"GeoAPI 返回错误码:{geo_data.get('code')} 或未找到位置") |
|
|
|
location = geo_data["location"][0]["id"] |
|
|
|
|
|
weather_url = f"https://devapi.qweather.com/v7/weather/now?location={location}&key={self.api_key}" |
|
response = requests.get(weather_url) |
|
data = response.json() |
|
|
|
|
|
if data.get("code") != "200": |
|
raise Exception(f"Weather API 返回错误码:{data.get('code')}") |
|
|
|
|
|
weather_info = { |
|
"location": location, |
|
"weather": data["now"]["text"], |
|
"temperature": data["now"]["temp"] + "°C", |
|
"wind_direction": data["now"]["windDir"], |
|
"wind_speed": data["now"]["windSpeed"] + " km/h", |
|
"humidity": data["now"]["humidity"] + "%", |
|
"report_time": data["updateTime"] |
|
} |
|
|
|
return {"result": weather_info} |
|
|
|
except Exception as exc: |
|
return ActionReturn( |
|
errmsg=f"WeatherQuery 异常:{exc}", |
|
state=ActionStatusCode.HTTP_ERROR |
|
) |