01. 高德城市与天气预报接口

高德 Web 服务 API 向开发者提供了大量的 HTTP 接口,涵盖了:地理/逆地理编码、路径规划、行政区域查询、IP定位、天气查询、坐标转换、轨迹纠偏等接口,并且向开发者提供了足量的调用额度,用于开发/调试各类地图类型的应用(商用需付费)。

在 LLMOps 项目中,我们会集成一个 根据城市查询天气预报的自定义工具,所以可以考虑使用高德提供的服务,在使用之前,必须实名认证高德开放平台,并且创建 应用,获取好对应的 秘钥,并将其配置到环境变量中,例如

# 高德工具

GAODE_API_KEY=00b0****e6e7

在高德提供的服务中,天气预报 查询接口必须传递 城市编码 才可以获取对应城市的信息(天气预报),接口如下

https://restapi.amap.com/v3/weather/weatherInfo?city=<城市编码>&key=<用户key>

例如 110101 代表北京,所以需要一个额外的接口来根据传入的 城市名 获取到相应的 城市编码(行政区域查询),接口如下

https://restapi.amap.com/v3/config/district?keywords=<城市名>&subdistrict=0&key=<用户的key>

所以要完成一个输入 城市名 查询天气预报的函数/工具,必须先调用 行政区域查询 将城市转换为城市编码,然后在利用城市编码调用 天气预报 接口,从而完成整个流程,如下

02. 天气预报查询工具实现

由于该接口并没有已经实现好的任何代码,所以可以考虑使用 BaseTool子类 的形式来实现,即工具接收一个参数 city 表示需要查询天气预报的城市名,然后调用 行政区域查询 接口获取该城市对应的 行政编码,接下来将 行政编码 传递给 天气预报 接口,获取最终天气信息。

示例代码如下

import json

import os

from typing import Type, Any

import dotenv

import requests

from langchain_core.pydantic_v1 import Field, BaseModel

from langchain_core.tools import BaseTool

dotenv.load_dotenv()

class GaodeWeatherArgsSchema(BaseModel):

    city: str = Field(description="需要查询天气预报的目标城市,例如:广州")

class GaodeWeatherTool(BaseTool):

    """根据传入的城市名查询天气"""

    name = "gaode_weather"

    description = "当你想询问天气或与天气相关的问题时的工具。"

    args_schema: Type[BaseModel] = GaodeWeatherArgsSchema

    def _run(self, *args: Any, **kwargs: Any) -> str:

        """运行工具获取对应城市的天气预报"""

        try:

            # 1.获取高德API秘钥,如果没有则抛出错误

            gaode_api_key = os.getenv("GAODE_API_KEY")

            if not gaode_api_key:

                return f"高德开放平台API秘钥未配置"

            # 2.提取传递的城市名字并查询行政编码

            city = kwargs.get("city", "")

            session = requests.session()

            api_domain = "https://restapi.amap.com/v3"

            city_response = session.request(

                method="GET",

                url=f"{api_domain}/config/district?keywords={city}&subdistrict=0&extensions=all&key={gaode_api_key}",

                headers={"Content-Type": "application/json; charset=utf-8"},

            )

            city_response.raise_for_status()

            city_data = city_response.json()

            # 3.提取行政编码调用天气预报查询接口

            if city_data.get("info") == "OK":

                if len(city_data.get("districts")) > 0:

                    ad_code = city_data["districts"][0]["adcode"]

                    weather_response = session.request(

                        method="GET",

                        url=f"{api_domain}/weather/weatherInfo?city={ad_code}&extensions=all&key={gaode_api_key}&output=json",

                        headers={"Content-Type": "application/json; charset=utf-8"},

                    )

                    weather_response.raise_for_status()

                    weather_data = weather_response.json()

                    if weather_data.get("info") == "OK":

                        return json.dumps(weather_data)

            session.close()

            return f"获取{kwargs.get('city')}天气预报信息失败"

            # 4.整合天气预报信息并返回

        except Exception as e:

            return f"获取{kwargs.get('city')}天气预报信息失败"

gaode_weather = GaodeWeatherTool()

print(gaode_weather.invoke({"city": "广州"}))

输出内容:

{"status": "1", "count": "1", "info": "OK", "infocode": "10000", "forecasts": [{"city": "广州市", "adcode": "440100", "province": "广东", "reporttime": "2024-08-12 15:30:27", "casts": [{"date": "2024-08-12", "week": "1", "dayweather": "中雨", "nightweather": "中雨", "daytemp": "34", "nighttemp": "25", "daywind": "北", "nightwind": "北", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "34.0", "nighttemp_float": "25.0"}, {"date": "2024-08-13", "week": "2", "dayweather": "中雨", "nightweather": "中雨", "daytemp": "33", "nighttemp": "25", "daywind": "北", "nightwind": "北", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "33.0", "nighttemp_float": "25.0"}, {"date": "2024-08-14", "week": "3", "dayweather": "中雨", "nightweather": "中雨-大雨", "daytemp": "33", "nighttemp": "25", "daywind": "北", "nightwind": "北", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "33.0", "nighttemp_float": "25.0"}, {"date": "2024-08-15", "week": "4", "dayweather": "中雨-大雨", "nightweather": "中雨-大雨", "daytemp": "33", "nighttemp": "25", "daywind": "北", "nightwind": "北", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "33.0", "nighttemp_float": "25.0"}]}]}

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐