feat: Analyze abnormal chart tool.
parent
bbdb821277
commit
37f5a82ce7
@ -0,0 +1,72 @@
|
||||
import json
|
||||
from collections.abc import Generator
|
||||
from typing import Any, Optional
|
||||
|
||||
from core.tools.builtin_tool.tool import BuiltinTool
|
||||
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||
|
||||
|
||||
class AbnormalChartTool(BuiltinTool):
|
||||
def _invoke(
|
||||
self,
|
||||
user_id: str,
|
||||
tool_parameters: dict[str, Any],
|
||||
conversation_id: Optional[str] = None,
|
||||
app_id: Optional[str] = None,
|
||||
message_id: Optional[str] = None,
|
||||
) -> Generator[ToolInvokeMessage, None, None]:
|
||||
result_str = tool_parameters.get('result')
|
||||
|
||||
data = json.loads(result_str)
|
||||
timeseries = data.get('data', {}).get('timeseries', [])
|
||||
unit = data.get('unit', '')
|
||||
filtered = []
|
||||
|
||||
for entry in timeseries:
|
||||
labels = entry.get('labels', {})
|
||||
|
||||
chart = entry.get('chart', {}).get('chartData', {})
|
||||
values = [v for v in chart.values() if v != 0]
|
||||
|
||||
if len(values) == 0:
|
||||
continue
|
||||
|
||||
avg = _get_avg(values)
|
||||
variance = _get_standard_deviation(avg, values)
|
||||
|
||||
threshold = avg + 1 * variance
|
||||
|
||||
count = 0
|
||||
for _, value in chart.items():
|
||||
if value > threshold:
|
||||
count += 1
|
||||
|
||||
if count / len(values) >= 0.16:
|
||||
res = {
|
||||
"chart": chart,
|
||||
"abnormalCount": count,
|
||||
"labels": labels,
|
||||
"avg": avg,
|
||||
"unit": unit
|
||||
}
|
||||
filtered.append(res)
|
||||
|
||||
yield self.create_json_message({
|
||||
'type': 'metric',
|
||||
'data': filtered
|
||||
})
|
||||
|
||||
yield self.create_text_message(json.dumps(filtered))
|
||||
|
||||
def _get_avg(values):
|
||||
if not values:
|
||||
return 0
|
||||
return sum(values) / len(values)
|
||||
|
||||
def _get_standard_deviation(avg, values):
|
||||
if len(values) == 0:
|
||||
return 0
|
||||
squared_diffs = [(x - avg)**2 for x in values]
|
||||
sum_squared_diffs = sum(squared_diffs)
|
||||
variance = sum_squared_diffs / (len(values))
|
||||
return variance**0.5
|
||||
@ -0,0 +1,25 @@
|
||||
identity:
|
||||
name: abnormal charts
|
||||
author: APO
|
||||
label:
|
||||
en_US: Analyze chart abnormal samples.
|
||||
zh_Hans: 分析图表的异常样本
|
||||
pt_BR: Analyze chart abnormal samples.
|
||||
description:
|
||||
human:
|
||||
en_US: Analyze chart abnormal samples.
|
||||
zh_Hans: 分析图表的异常样本
|
||||
pt_BR: Analyze chart abnormal samples.
|
||||
llm: Analyze chart abnormal samples.
|
||||
parameters:
|
||||
- name: result
|
||||
type: string
|
||||
required: true
|
||||
label:
|
||||
en_US: 指标查询结果
|
||||
zh_Hans: Metrics query result
|
||||
human_description:
|
||||
en_US: 指标查询结果
|
||||
zh_Hans: Metrics query result
|
||||
llm_description: Metrics query result
|
||||
form: llm
|
||||
Loading…
Reference in New Issue