Spaces:
Sleeping
Sleeping
import os | |
import pandas as pd | |
import requests | |
from ..tools.tool import Tool, ToolSchema | |
from pydantic import ValidationError | |
class AMAPWeather(Tool): | |
description = '获取对应城市的天气数据' | |
name = 'amap_weather' | |
parameters: list = [{ | |
'name': 'location', | |
'description': 'get temperature for a specific location', | |
'required': True | |
}] | |
def __init__(self, cfg={}): | |
self.cfg = cfg.get(self.name, {}) | |
# remote call | |
self.url = 'https://restapi.amap.com/v3/weather/weatherInfo?city={city}&key={key}' | |
self.token = self.cfg.get('token', os.environ.get('AMAP_TOKEN', '')) | |
self.city_df = pd.read_excel( | |
'https://modelscope.oss-cn-beijing.aliyuncs.com/resource/agent/AMap_adcode_citycode.xlsx' | |
) | |
assert self.token != '', 'weather api token must be acquired through ' \ | |
'https://lbs.amap.com/api/webservice/guide/create-project/get-key and set by AMAP_TOKEN' | |
try: | |
all_param = { | |
'name': self.name, | |
'description': self.description, | |
'parameters': self.parameters | |
} | |
self.tool_schema = ToolSchema(**all_param) | |
except ValidationError: | |
raise ValueError(f'Error when parsing parameters of {self.name}') | |
self._str = self.tool_schema.model_dump_json() | |
self._function = self.parse_pydantic_model_to_openai_function( | |
all_param) | |
def get_city_adcode(self, city_name): | |
filtered_df = self.city_df[self.city_df['中文名'] == city_name] | |
if len(filtered_df['adcode'].values) == 0: | |
raise ValueError( | |
f'location {city_name} not found, availables are {self.city_df["中文名"]}' | |
) | |
else: | |
return filtered_df['adcode'].values[0] | |
def __call__(self, *args, **kwargs): | |
location = kwargs['location'] | |
response = requests.get( | |
self.url.format( | |
city=self.get_city_adcode(location), key=self.token)) | |
data = response.json() | |
if data['status'] == '0': | |
raise RuntimeError(data) | |
else: | |
weather = data['lives'][0]['weather'] | |
temperature = data['lives'][0]['temperature'] | |
return {'result': f'{location}的天气是{weather}温度是{temperature}度。'} | |