Spaces:
Sleeping
Sleeping
sunxiaokang
commited on
Commit
·
e813406
1
Parent(s):
ab0de82
提交天气助手
Browse files- app.py +2 -1
- weather_query.py +71 -0
app.py
CHANGED
|
@@ -2,7 +2,7 @@ import copy
|
|
| 2 |
import os
|
| 3 |
from typing import List
|
| 4 |
import streamlit as st
|
| 5 |
-
from lagent.actions import ArxivSearch
|
| 6 |
from lagent.prompts.parsers import PluginParser
|
| 7 |
from lagent.agents.stream import INTERPRETER_CN, META_CN, PLUGIN_CN, AgentForInternLM, get_plugin_prompt
|
| 8 |
from lagent.llms import GPTAPI
|
|
@@ -17,6 +17,7 @@ class SessionState:
|
|
| 17 |
# 初始化插件列表
|
| 18 |
action_list = [
|
| 19 |
ArxivSearch(),
|
|
|
|
| 20 |
]
|
| 21 |
st.session_state['plugin_map'] = {action.name: action for action in action_list}
|
| 22 |
st.session_state['model_map'] = {} # 存储模型实例
|
|
|
|
| 2 |
import os
|
| 3 |
from typing import List
|
| 4 |
import streamlit as st
|
| 5 |
+
from lagent.actions import ArxivSearch, WeatherQuery
|
| 6 |
from lagent.prompts.parsers import PluginParser
|
| 7 |
from lagent.agents.stream import INTERPRETER_CN, META_CN, PLUGIN_CN, AgentForInternLM, get_plugin_prompt
|
| 8 |
from lagent.llms import GPTAPI
|
|
|
|
| 17 |
# 初始化插件列表
|
| 18 |
action_list = [
|
| 19 |
ArxivSearch(),
|
| 20 |
+
WeatherQuery(),
|
| 21 |
]
|
| 22 |
st.session_state['plugin_map'] = {action.name: action for action in action_list}
|
| 23 |
st.session_state['model_map'] = {} # 存储模型实例
|
weather_query.py
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import requests
|
| 3 |
+
from lagent.actions.base_action import BaseAction, tool_api
|
| 4 |
+
from lagent.schema import ActionReturn, ActionStatusCode
|
| 5 |
+
|
| 6 |
+
class WeatherQuery(BaseAction):
|
| 7 |
+
def __init__(self):
|
| 8 |
+
super().__init__()
|
| 9 |
+
self.api_key = os.getenv("weather_token")
|
| 10 |
+
print(self.api_key)
|
| 11 |
+
if not self.api_key:
|
| 12 |
+
raise EnvironmentError("未找到环境变量 'token'。请设置你的和风天气 API Key 到 'weather_token' 环境变量中,比如export weather_token='xxx' ")
|
| 13 |
+
|
| 14 |
+
@tool_api
|
| 15 |
+
def run(self, location: str) -> dict:
|
| 16 |
+
"""
|
| 17 |
+
查询实时天气信息。
|
| 18 |
+
|
| 19 |
+
Args:
|
| 20 |
+
location (str): 要查询的地点名称、LocationID 或经纬度坐标(如 "101010100" 或 "116.41,39.92")。
|
| 21 |
+
|
| 22 |
+
Returns:
|
| 23 |
+
dict: 包含天气信息的字典
|
| 24 |
+
* location: 地点名称
|
| 25 |
+
* weather: 天气状况
|
| 26 |
+
* temperature: 当前温度
|
| 27 |
+
* wind_direction: 风向
|
| 28 |
+
* wind_speed: 风速(公里/小时)
|
| 29 |
+
* humidity: 相对湿度(%)
|
| 30 |
+
* report_time: 数据报告时间
|
| 31 |
+
"""
|
| 32 |
+
try:
|
| 33 |
+
# 如果 location 不是坐标格式(例如 "116.41,39.92"),则调用 GeoAPI 获取 LocationID
|
| 34 |
+
if not ("," in location and location.replace(",", "").replace(".", "").isdigit()):
|
| 35 |
+
# 使用 GeoAPI 获取 LocationID
|
| 36 |
+
geo_url = f"https://geoapi.qweather.com/v2/city/lookup?location={location}&key={self.api_key}"
|
| 37 |
+
geo_response = requests.get(geo_url)
|
| 38 |
+
geo_data = geo_response.json()
|
| 39 |
+
|
| 40 |
+
if geo_data.get("code") != "200" or not geo_data.get("location"):
|
| 41 |
+
raise Exception(f"GeoAPI 返回错误码:{geo_data.get('code')} 或未找到位置")
|
| 42 |
+
|
| 43 |
+
location = geo_data["location"][0]["id"]
|
| 44 |
+
|
| 45 |
+
# 构建天气查询的 API 请求 URL
|
| 46 |
+
weather_url = f"https://devapi.qweather.com/v7/weather/now?location={location}&key={self.api_key}"
|
| 47 |
+
response = requests.get(weather_url)
|
| 48 |
+
data = response.json()
|
| 49 |
+
|
| 50 |
+
# 检查 API 响应码
|
| 51 |
+
if data.get("code") != "200":
|
| 52 |
+
raise Exception(f"Weather API 返回错误码:{data.get('code')}")
|
| 53 |
+
|
| 54 |
+
# 解析和组织天气信息
|
| 55 |
+
weather_info = {
|
| 56 |
+
"location": location,
|
| 57 |
+
"weather": data["now"]["text"],
|
| 58 |
+
"temperature": data["now"]["temp"] + "°C",
|
| 59 |
+
"wind_direction": data["now"]["windDir"],
|
| 60 |
+
"wind_speed": data["now"]["windSpeed"] + " km/h",
|
| 61 |
+
"humidity": data["now"]["humidity"] + "%",
|
| 62 |
+
"report_time": data["updateTime"]
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
return {"result": weather_info}
|
| 66 |
+
|
| 67 |
+
except Exception as exc:
|
| 68 |
+
return ActionReturn(
|
| 69 |
+
errmsg=f"WeatherQuery 异常:{exc}",
|
| 70 |
+
state=ActionStatusCode.HTTP_ERROR
|
| 71 |
+
)
|