From 53d1700d29611e7de6089fb3c5fc2621cdd37c0d Mon Sep 17 00:00:00 2001 From: weiweiw <14335254+weiweiw22@user.noreply.gitee.com> Date: Wed, 26 Feb 2025 19:41:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A9=E6=B0=94=E6=8E=A5=E5=8F=A3=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent/tools_factory/weather_check.py | 109 +++++++++++++++--- .../knowledge_base/knowledge_base.py | 2 +- 2 files changed, 95 insertions(+), 16 deletions(-) diff --git a/libs/chatchat-server/chatchat/server/agent/tools_factory/weather_check.py b/libs/chatchat-server/chatchat/server/agent/tools_factory/weather_check.py index e6ee181..739e9db 100644 --- a/libs/chatchat-server/chatchat/server/agent/tools_factory/weather_check.py +++ b/libs/chatchat-server/chatchat/server/agent/tools_factory/weather_check.py @@ -13,24 +13,103 @@ from .tools_registry import BaseToolOutput, regist_tool @regist_tool(title="天气查询") def weather_check( city: str = Field(description="City name,include city and county,like '厦门'"), + date: str = Field(description="日期参数,支持以下格式:\n" + "- '今天':获取当前实时天气\n" + "- '明天'/'后天':获取未来24/48小时预报\n" + "- '未来X天':获取最多7天预报(如'未来3天')\n" + # "- 具体日期:格式为YYYY-MM-DD(如'2024-07-05')" + ) ): """用这个工具获取指定地点和指定时间的天气""" - print(f"weather_check tool内部调用,city{city}") + # 参数校验 + missing_params = [] + if not city: + missing_params.append("城市名称") + if not date: + missing_params.append("日期参数") + + if missing_params: + return BaseToolOutput( + error_message=f"缺少必要参数:{', '.join(missing_params)},请补充完整查询信息", + require_additional_input=True + ) + + print(f"city:{city}, date:{date}") + try: + weatherType, number = parse_date_parameter(date) + except ValueError as e: + print(f"错误: {str(e)}") # 输出: 错误: 未来预报仅支持1-3天 + return BaseToolOutput(str(e)) + + print(f"weather_check tool内部调用,city{city},date:{date}") tool_config = get_tool_config("weather_check") api_key = tool_config.get("api_key") - url = f"http://api.seniverse.com/v3/weather/now.json?key={api_key}&location={city}&language=zh-Hans&unit=c" - logging.info(f"url:{url}") - response = requests.get(url) - if response.status_code == 200: - data = response.json() - logging.info(f"response.json():{data}") - weather = { - "temperature": data["results"][0]["now"]["temperature"], - "description": data["results"][0]["now"]["text"], - } - return BaseToolOutput(weather) - else: - logging.error(f"Failed to retrieve weather: {response.status_code}") - raise Exception(f"Failed to retrieve weather: {response.status_code}") + print(f"weatherType:{weatherType}, number:{number}") + url = '' + if weatherType == "daily": + url = f"http://api.seniverse.com/v3/weather/now.json?key={api_key}&location={city}&language=zh-Hans&unit=c" + logging.info(f"url:{url}") + response = requests.get(url) + if response.status_code == 200: + data = response.json() + logging.info(f"response.json():{data}") + weather = { + "temperature": data["results"][0]["now"]["temperature"], + "description": data["results"][0]["now"]["text"], + } + return BaseToolOutput(weather) + else: + logging.error(f"Failed to retrieve weather: {response.status_code}") + raise Exception(f"Failed to retrieve weather: {response.status_code}") + elif weatherType == "future": + url = f"http://api.seniverse.com/v3/weather/daily.json?key={api_key}&location={city}&language=zh-Hans&unit=c" + logging.info(f"url:{url}") + response = requests.get(url) + if response.status_code == 200: + data = response.json() + logging.info(f"response.json():{data}") + if number == "1": + weather = { + "date":"明天", + "low_temperature": data["results"][0]["daily"][1]["low"], + "high_temperature": data["results"][0]["daily"][1]["high"], + "description": data["results"][0]["daily"][1]["text_day"], + } + elif number == 2: + weather = { + "date":"后天", + "low_temperature": data["results"][0]["daily"][2]["low"], + "high_temperature": data["results"][0]["daily"][2]["high"], + "description": data["results"][0]["daily"][2]["text_day"], + } + elif number == 3: + weather = { + "明天天气": data["results"][0]["daily"][1]["text_day"], + "明天最低温度": data["results"][0]["daily"][1]["low"], + "明天最高温度": data["results"][0]["daily"][1]["high"], + "后天天气": data["results"][0]["daily"][2]["text_day"], + "后天最低温度": data["results"][0]["daily"][2]["low"], + "后天最高温度": data["results"][0]["daily"][2]["high"], + } + return BaseToolOutput(weather) + else: + logging.error(f"Failed to retrieve weather: {response.status_code}") + raise Exception(f"Failed to retrieve weather: {response.status_code}") + + +def parse_date_parameter(date_str: str) -> tuple: + """解析日期参数返回API参数""" + # 处理自然语言 + if date_str == "今天": + return "daily", 0 + elif date_str == "明天": + return "future", 1 + elif date_str == "后天": + return "future", 2 + elif date_str.startswith("未来"): + days = int(date_str[2:-1]) + if days < 1 or days > 3: + raise ValueError("未来预报仅支持1-3天") + return "future", days \ No newline at end of file diff --git a/libs/chatchat-server/chatchat/webui_pages/knowledge_base/knowledge_base.py b/libs/chatchat-server/chatchat/webui_pages/knowledge_base/knowledge_base.py index 1442243..f46867a 100644 --- a/libs/chatchat-server/chatchat/webui_pages/knowledge_base/knowledge_base.py +++ b/libs/chatchat-server/chatchat/webui_pages/knowledge_base/knowledge_base.py @@ -398,7 +398,7 @@ def knowledge_base_page(api: ApiRequest, is_lite: bool = None): cellEditor="agLargeTextCellEditor", cellEditorPopup=True, autoWidth=True, - cellEditorParams= { "maxLength": 1000} + cellEditorParams= { "maxLength": 1500} ) gb.configure_column( "to_del",