Commit d7261e1c by tinywell

在线率工具兼容新接口;增加月度统计数据

parent 5f4098e7
......@@ -66,12 +66,12 @@ class BaseRateTool(BaseTool):
class RegionRateArgs(BaseModel):
"""地区在线率查询参数"""
region_name: str = Field(..., description="地区名称,如果要查询全国数据,请输入空字符串")
start_time: str = Field(..., description="开始时间 (YYYY-MM-DD)")
end_time: str = Field(..., description="结束时间 (YYYY-MM-DD)")
region_name: str = Field("", description="地区名称,如果要查询全国数据,请输入空字符串")
start_time: str = Field("", description="开始时间 (YYYY-MM-DD)")
end_time: str = Field("", description="结束时间 (YYYY-MM-DD)")
month_statistics: bool = Field(False, description="是否按月度查看一年内的在线率统计结果,默认不需要")
device_items: str = Field(None, description="监测项集合,多个逗号隔开,支持:滑坡仪、设备、传感器、雨量、地表位移、裂缝、倾角、加速度、土壤含水率、泥水位,默认为空")
manufacturer_name: str = Field(None, description="设备厂商,默认为空")
device_items: str = Field("", description="监测项集合,多个逗号隔开,支持:滑坡仪、设备、传感器、雨量、地表位移、裂缝、倾角、加速度、土壤含水率、泥水位,默认为空")
manufacturer_name: str = Field("", description="设备厂商,默认为空")
class RegionRateTool(BaseRateTool):
"""查询全国或者特定地区设备在线率的工具"""
......@@ -85,13 +85,7 @@ class RegionRateTool(BaseRateTool):
self.client = RateClient(base_url=base_url)
self.logger.info(f"初始化 RegionRateTool,base_url: {base_url}")
def _run(self, start_time: str, end_time: str, region_name: str="", month_statistics: bool=False, device_items: str=None, manufacturer_name: str=None) -> Dict[str, Any]:
return self.get_region_online_rate(start_time, end_time, region_name, month_statistics, device_items, manufacturer_name)
def get_region_online_rate(self, start_time: str, end_time: str, region_name: str="", month_statistics: bool=False, device_items: str=None, manufacturer_name: str=None) -> Dict[str, Any]:
agent_start = time.time()
self.logger.info(f"查询地区在线率: {region_name}, 时间范围: {start_time} 至 {end_time}, 厂商: {manufacturer_name}, 监测项: {device_items}, 按月度查询统计: {month_statistics}")
def _run(self, start_time: str, end_time: str, region_name: str="", month_statistics: bool=False, device_items: str="", manufacturer_name: str="") -> Dict[str, Any]:
code = ""
if region_name != "":
self.logger.debug(f"查找区域代码: {region_name}")
......@@ -103,43 +97,196 @@ class RegionRateTool(BaseRateTool):
code = codes[0][1]
self.logger.debug(f"找到区域代码: {code}")
if month_statistics: # 按月度查询一年内的统计结果
year = start_time.split('-')[0]
self.logger.debug(f"按月度查询,年份: {year}")
if month_statistics:
return self.get_region_online_rate_of_month(region_name, code, start_time, end_time)
else:
try:
start = time.time()
df = self.client.query_rates_sync(code, start_time, end_time)
query_time = time.time() - start
self.logger.debug(f"API调用耗时: {query_time:.2f}秒")
return self.get_region_online_rate(start_time, end_time, region_name, code, month_statistics, device_items, manufacturer_name)
def get_region_online_rate(self, start_time: str, end_time: str, region_name: str="",code: str="", month_statistics: bool=False, device_items: str=None, manufacturer_name: str=None) -> Dict[str, Any]:
agent_start = time.time()
self.logger.info(f"查询地区在线率: {region_name}, 时间范围: {start_time} 至 {end_time}, 厂商: {manufacturer_name}, 监测项: {device_items}, 按月度查询统计: {month_statistics}")
try:
start = time.time()
df = self.client.query_rates_sync(code, start_time, end_time, manufacturer_name, device_items)
query_time = time.time() - start
self.logger.debug(f"API调用耗时: {query_time:.2f}秒")
if df.type != 1 or df.resultdata is None or len(df.resultdata) == 0:
error_msg = f'未找到{region_name}在{start_time}至{end_time}期间的数据,请检查是否有相关数据权限'
self.logger.warning(error_msg)
if df.type != 1 or df.resultdata is None or len(df.resultdata) == 0:
error_msg = f'未找到{region_name}在{start_time}至{end_time}期间的数据,请检查是否有相关数据权限'
self.logger.warning(error_msg)
return {'code': 400, 'message': error_msg}
self.logger.debug(f"查询结果: {df.resultdata}")
markdown = self.to_markdown(df.resultdata)
self.logger.debug(f"查询结果: {df.resultdata}")
# markdown = self.to_markdown(df.resultdata)
result_data = []
for item in df.resultdata:
rate_date = self._extract_rate_data(item)
result_data.append(rate_date)
data = {
data = {
'region': region_name,
'region_code': code,
'rate_data': df.resultdata,
'markdown': markdown,
'date_range': {
'start': start_time,
'end': end_time
}
}
'rate_data': result_data,
}
total_time = time.time() - agent_start
self.logger.info(f"查询完成 {region_name}(code: {code}) 在线率,总耗时: {total_time:.2f}秒")
return data
total_time = time.time() - agent_start
self.logger.info(f"查询完成 {region_name}(code: {code}) 在线率,总耗时: {total_time:.2f}秒")
return data
except Exception as e:
self.logger.error(f"查询失败: {str(e)}", exc_info=True)
raise
except Exception as e:
self.logger.error(f"查询失败: {str(e)}", exc_info=True)
raise
def get_region_online_rate_of_month(self, region_name: str, code: str, start_time: str, end_time: str,device_items: str=None) -> Dict[str, Any]:
"""查询指定地区在指定时间段内的月度在线率"""
year = start_time.split('-')[0]
self.logger.debug(f"按月度查询,年份: {year}")
try:
df = self.client.query_rates_month_sync(year, code, device_items)
if df.type != 1 or df.resultdata is None or len(df.resultdata) == 0:
error_msg = f'未找到{region_name}(code: {code})在{year}年内的数据,请检查是否有相关数据权限'
self.logger.warning(error_msg)
return {'code': 400, 'message': error_msg}
result_data = {}
for index, item in enumerate(df.resultdata):
month_data = self._extract_rate_data(item)
result_data[item['month']] = month_data
# 排序
self.logger.debug(f"查询结果: {df.resultdata}")
# markdown = self.to_markdown(df.resultdata)
data = {
'region': region_name,
'region_code': code,
'rate_data': result_data
}
return data
except Exception as e:
self.logger.error(f"查询失败: {str(e)}", exc_info=True)
raise
def _extract_rate_data(self, item: Dict[str, Any]) -> Dict[str, Any]:
"""提取月度数据"""
rate_date = {}
if item.get("name") is not None:
rate_date['名称'] = item.get("name")
if item.get("rate") is not None:
rate_date['在线率'] = item.get("rate")
if item.get("rtuCount") is not None:
rate_date['在线数量'] = item.get("rtuCount")
if item.get("monitorRate") is not None:
rate_date['滑坡仪在线率'] = item.get("monitorRate")
if item.get("sensorRate") is not None:
rate_date['传感器在线率'] = item.get("sensorRate")
if item.get("monitorCount") is not None:
rate_date['滑坡仪数量'] = item.get("monitorCount")
if item.get("sensorCount") is not None:
rate_date['传感器数量'] = item.get("sensorCount")
if item.get("lfRate") is not None:
rate_date['裂缝在线率'] = item.get("lfRate")
if item.get("lfCount") is not None:
rate_date['裂缝数量'] = item.get("lfCount")
if item.get("gpRate") is not None:
rate_date['地表位移在线率'] = item.get("gpRate")
if item.get("gpCount") is not None:
rate_date['地表位移数量'] = item.get("gpCount")
if item.get("swRate") is not None:
rate_date['深部位移在线率'] = item.get("swRate")
if item.get("swCount") is not None:
rate_date['深部位移数量'] = item.get("swCount")
if item.get("jsRate") is not None:
rate_date['加速度在线率'] = item.get("jsRate")
if item.get("jsCount") is not None:
rate_date['加速度数量'] = item.get("jsCount")
if item.get("qjRate") is not None:
rate_date['倾角在线率'] = item.get("qjRate")
if item.get("qjCount") is not None:
rate_date['倾角数量'] = item.get("qjCount")
if item.get("zdRate") is not None:
rate_date['振动在线率'] = item.get("zdRate")
if item.get("zdCount") is not None:
rate_date['振动数量'] = item.get("zdCount")
if item.get("ylRate") is not None:
rate_date['应力在线率'] = item.get("ylRate")
if item.get("ylCount") is not None:
rate_date['应力数量'] = item.get("ylCount")
if item.get("tyRate") is not None:
rate_date['土压力在线率'] = item.get("tyRate")
if item.get("tyCount") is not None:
rate_date['土压力数量'] = item.get("tyCount")
if item.get("csRate") is not None:
rate_date['次声在线率'] = item.get("csRate")
if item.get("csCount") is not None:
rate_date['次声数量'] = item.get("csCount")
if item.get("dsRate") is not None:
rate_date['地声在线率'] = item.get("dsRate")
if item.get("dsCount") is not None:
rate_date['地声数量'] = item.get("dsCount")
if item.get("ylRate") is not None:
rate_date['雨量在线率'] = item.get("ylRate")
if item.get("ylCount") is not None:
rate_date['雨量数量'] = item.get("ylCount")
if item.get("qwRate") is not None:
rate_date['气温在线率'] = item.get("qwRate")
if item.get("qwCount") is not None:
rate_date['气温数量'] = item.get("qwCount")
if item.get("twRate") is not None:
rate_date['土壤湿度在线率'] = item.get("twRate")
if item.get("twCount") is not None:
rate_date['土壤湿度数量'] = item.get("twCount")
if item.get("hsRate") is not None:
rate_date['土壤含水率在线率'] = item.get("hsRate")
if item.get("hsCount") is not None:
rate_date['土壤含水率数量'] = item.get("hsCount")
if item.get("dbRate") is not None:
rate_date['地表水温/水位在线率'] = item.get("dbRate")
if item.get("dbCount") is not None:
rate_date['地表水温/水位数量'] = item.get("dbCount")
if item.get("syRate") is not None:
rate_date['孔隙水温/水压在线率'] = item.get("syRate")
if item.get("syCount") is not None:
rate_date['孔隙水温/水压数量'] = item.get("syCount")
if item.get("stRate") is not None:
rate_date['渗透压力在线率'] = item.get("stRate")
if item.get("stCount") is not None:
rate_date['渗透压力数量'] = item.get("stCount")
if item.get("lsRate") is not None:
rate_date['流速在线率'] = item.get("lsRate")
if item.get("lsCount") is not None:
rate_date['流速数量'] = item.get("lsCount")
if item.get("cjRate") is not None:
rate_date['沉降在线率'] = item.get("cjRate")
if item.get("cjCount") is not None:
rate_date['沉降数量'] = item.get("cjCount")
if item.get("qyRate") is not None:
rate_date['气压在线率'] = item.get("qyRate")
if item.get("qyCount") is not None:
rate_date['气压数量'] = item.get("qyCount")
if item.get("spRate") is not None:
rate_date['视频在线率'] = item.get("spRate")
if item.get("spCount") is not None:
rate_date['视频数量'] = item.get("spCount")
if item.get("nwRate") is not None:
rate_date['泥水位在线率'] = item.get("nwRate")
if item.get("nwCount") is not None:
rate_date['泥水位数量'] = item.get("nwCount")
if item.get("ldRate") is not None:
rate_date['雷达在线率'] = item.get("ldRate")
if item.get("ldCount") is not None:
rate_date['雷达数量'] = item.get("ldCount")
if item.get("lbRate") is not None:
rate_date['预警喇叭在线率'] = item.get("lbRate")
if item.get("lbCount") is not None:
rate_date['预警喇叭数量'] = item.get("lbCount")
return rate_date
def to_llm(self, region_name: str,start_time: str, end_time: str, data: Dict[str, Any]) -> str:
"""将数据转换为 LLM 可理解的格式"""
self.logger.debug("开始将数据转换为 LLM 可理解的格式")
......
......@@ -75,7 +75,15 @@ def run_examples():
"disaster_type": "滑坡",
}
}
}
},{
"query": "甘肃省监控点的状态如何?",
"expected": {
"tool": "monitor_points_query",
"params": {
"key": "甘肃省陇南市"
}
}
},
]
# 为每个测试案例创建一个表格
......
......@@ -21,14 +21,15 @@ def run_examples():
model_name="Qwen2-7B",
verbose=True
)
base_url = "http://172.30.0.37:30007"
# 初始化工具
tools = [
RegionRateTool(),
RankingRateTool(),
MonitorPointTool(),
RegionRateTool(base_url=base_url),
RankingRateTool(base_url=base_url),
MonitorPointTool(base_url=base_url),
]
tool_dict = {tool.name: tool for tool in tools}
# 初始化 ToolPicker
picker = ToolPicker(llm, tools)
......@@ -42,7 +43,7 @@ def run_examples():
"start_time": "2024-11-19",
"end_time": "2024-11-19",
"region_name": "",
"month_required": False
"month_statistics": False
}
}
},
......@@ -54,7 +55,7 @@ def run_examples():
"start_time": "2024-11-19",
"end_time": "2024-11-19",
"region_name": "甘肃省",
"month_required": False
"month_statistics": False
}
}
},
......@@ -77,15 +78,6 @@ def run_examples():
}
},
{
"query": "甘肃省监控点的状态如何?",
"expected": {
"tool": "monitor_points_query",
"params": {
"key": "甘肃省"
}
}
},
{
"query": "2023年甘肃省每月的设备在线率分别是多少?",
"expected": {
"tool": "region_online_rate",
......@@ -93,7 +85,7 @@ def run_examples():
"start_time": "2023-01-01",
"end_time": "2023-12-31",
"region_name": "甘肃省",
"month_required": True
"month_statistics": True
}
}
},
......@@ -105,28 +97,28 @@ def run_examples():
"start_time": "2024-01-01",
"end_time": "2024-12-31",
"region_name": "甘肃省",
"month_required": True
"month_statistics": True
}
}
},
{
"query": "2024年10月15日,成都市武侯区的设备在线率是多少?",
"query": "2024年10月15日,兰州市的设备在线率是多少?",
"expected": {
"tool": "region_online_rate",
"params": {
"start_time": "2024-10-15",
"end_time": "2024-10-15",
"region_name": "成都市武侯区",
"month_required": False
"region_name": "兰州市",
"month_statistics": False
}
}
},
{
"query": "2024年,成都市武侯区的设备在线率是多少?",
"query": "2024年,兰州市榆中县的设备在线率是多少?",
"expected": {
"tool": "region_online_rate",
"params": {
"start_time": "2024-01-01", "region_name": "成都市武侯区", "month_required": False
"start_time": "2024-11-26", "region_name": "兰州市榆中县", "month_statistics": False
}
}
},
......@@ -135,7 +127,7 @@ def run_examples():
"expected": {
"tool": "region_online_rate",
"params": {
"start_time": "2023-01-01", "end_time": "2023-12-31", "region_name": "甘肃省", "month_required": True
"start_time": "2023-01-01", "end_time": "2023-12-31", "region_name": "甘肃省", "month_statistics": True
}
}
},
......@@ -144,7 +136,7 @@ def run_examples():
"expected": {
"tool": "region_online_rate",
"params": {
"start_time": "2023-01-01", "region_name": "甘肃省", "month_required": True
"start_time": "2023-01-01", "region_name": "甘肃省", "month_statistics": True
}
}
},
......@@ -153,25 +145,25 @@ def run_examples():
"expected": {
"tool": "region_online_rate",
"params": {
"start_time": "2023-01-01", "region_name": "", "month_required": True
"start_time": "2023-01-01", "region_name": "", "month_statistics": True
}
}
},
{
"query": "2023年1月-2023年12月期间西藏实验点在线率是多少?",
"query": "2023年1月-2023年12月期间青海实验点在线率是多少?",
"expected": {
"tool": "region_online_rate",
"params": {
"start_time": "2023-01-01", "end_time": "2023-12-31", "region_name": "西藏", "month_required": False
"start_time": "2023-01-01", "end_time": "2023-12-31", "region_name": "青海", "month_statistics": False
}
}
},
{
"query": "2023年1月-2023年12月期间西藏实验点各月在线率是多少?",
"query": "2023年1月-2023年12月期间青海实验点各月在线率是多少?",
"expected": {
"tool": "region_online_rate",
"params": {
"start_time": "2023-01-01", "end_time": "2023-12-31", "region_name": "西藏", "month_required": True
"start_time": "2023-01-01", "end_time": "2023-12-31", "region_name": "青海", "month_statistics": True
}
}
},
......@@ -180,7 +172,7 @@ def run_examples():
"expected": {
"tool": "region_online_rate",
"params": {
"start_time": "2022-01-01", "end_time": "2022-12-31", "region_name": "", "month_required": True
"start_time": "2022-01-01", "end_time": "2022-12-31", "region_name": "", "month_statistics": True
}
}
},
......@@ -189,7 +181,7 @@ def run_examples():
"expected": {
"tool": "region_online_rate",
"params": {
"start_time": "2023-01-01", "end_time": "2023-12-31", "region_name": "西藏", "month_required": True
"start_time": "2023-01-01", "end_time": "2023-12-31", "region_name": "西藏", "month_statistics": True
}
}
},
......@@ -198,7 +190,7 @@ def run_examples():
"expected": {
"tool": "region_online_rate",
"params": {
"start_time": "2023-01-01", "end_time": "2023-12-31", "region_name": "西藏", "month_required": True
"start_time": "2023-01-01", "end_time": "2023-12-31", "region_name": "西藏", "month_statistics": True
}
}
}
......@@ -237,7 +229,13 @@ def run_examples():
actual_value,
"✓" if expected_value == actual_value else "✗"
)
tool = tool_dict[result["tool"]]
params = result["params"]
result = tool.invoke(params)
print(result)
except Exception as e:
table.add_row("错误", "", str(e), "✗")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment