From 8afd983d980415e721fbb45fe6c538e79d199faa Mon Sep 17 00:00:00 2001 From: MisluNotFound <108245592+MisluNotFound@users.noreply.github.com> Date: Sat, 8 Mar 2025 15:25:31 +0800 Subject: [PATCH] feat: Tools from metrics 0-14 (#3) --- .../apo_select/tools/cluster_cpu_total.py | 44 ++++++++ .../apo_select/tools/cluster_cpu_total.yaml | 53 +++++++++ .../apo_select/tools/cluster_cpu_usage.py | 44 ++++++++ .../apo_select/tools/cluster_cpu_usage.yaml | 53 +++++++++ .../tools/cluster_cpu_usage_real_linux.py | 44 ++++++++ .../tools/cluster_cpu_usage_real_linux.yaml | 53 +++++++++ .../apo_select/tools/cluster_memory_total.py | 44 ++++++++ .../tools/cluster_memory_total.yaml | 53 +++++++++ .../apo_select/tools/cluster_memory_usage.py | 44 ++++++++ .../tools/cluster_memory_usage.yaml | 53 +++++++++ .../tools/cluster_memory_usage_real_linux.py | 44 ++++++++ .../cluster_memory_usage_real_linux.yaml | 53 +++++++++ .../tools/cluster_namespace_count.py | 44 ++++++++ .../tools/cluster_namespace_count.yaml | 53 +++++++++ ...r_network_linux_receive_dropped_packets.py | 44 ++++++++ ...network_linux_receive_dropped_packets.yaml | 53 +++++++++ ..._network_linux_transmit_dropped_packets.py | 44 ++++++++ ...etwork_linux_transmit_dropped_packets.yaml | 53 +++++++++ .../cluster_network_receive_bandwidth.py | 44 ++++++++ .../cluster_network_receive_bandwidth.yaml | 53 +++++++++ .../tools/cluster_network_send_bandwidth.py | 44 ++++++++ .../tools/cluster_network_send_bandwidth.yaml | 53 +++++++++ .../apo_select/tools/cluster_node_count.py | 44 ++++++++ .../apo_select/tools/cluster_node_count.yaml | 53 +++++++++ .../tools/cluster_node_cpu_usage_linux.py | 44 ++++++++ .../tools/cluster_node_cpu_usage_linux.yaml | 53 +++++++++ .../tools/cluster_node_memory_usage_linux.py | 44 ++++++++ .../cluster_node_memory_usage_linux.yaml | 53 +++++++++ .../tools/cluster_running_pod_count.py | 44 ++++++++ .../tools/cluster_running_pod_count.yaml | 53 +++++++++ api/tools_generator/generator.py | 91 ++++++++++++++++ api/tools_generator/templates.py | 101 ++++++++++++++++++ api/tools_generator/tools_generator.py | 10 ++ 33 files changed, 1657 insertions(+) create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_total.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_total.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage_real_linux.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage_real_linux.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_total.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_total.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage_real_linux.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage_real_linux.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_namespace_count.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_namespace_count.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_receive_dropped_packets.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_receive_dropped_packets.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_transmit_dropped_packets.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_transmit_dropped_packets.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_receive_bandwidth.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_receive_bandwidth.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_send_bandwidth.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_send_bandwidth.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_count.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_count.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_cpu_usage_linux.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_cpu_usage_linux.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_memory_usage_linux.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_memory_usage_linux.yaml create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_running_pod_count.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/cluster_running_pod_count.yaml create mode 100644 api/tools_generator/generator.py create mode 100644 api/tools_generator/templates.py create mode 100644 api/tools_generator/tools_generator.py diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_total.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_total.py new file mode 100644 index 0000000000..286b26c060 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_total.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterCpuTotalTool(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]: + cluster = tool_parameters.get('cluster') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - CPU使用量 - Total', + 'params': { + **({'cluster': cluster} if cluster else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_total.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_total.yaml new file mode 100644 index 0000000000..4a970f8411 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_total.yaml @@ -0,0 +1,53 @@ +identity: + name: 集群总可用CPU核数 + author: APO + label: + en_US: The total number of available CPU cores in the cluster + zh_Hans: 集群总可用CPU核数 +description: + human: + en_US: The total number of available CPU cores in the cluster + zh_Hans: 集群总可用CPU核数 + llm: The total number of available CPU cores in the cluster +display: + type: metric + title: 集群总览 - 总览 - CPU使用量 - Total + unit: "core" +parameters: + - name: cluster + type: string + required: False + label: + en_US: Cluster name + zh_Hans: 集群名称 + human_description: + en_US: Cluster name + zh_Hans: 集群名称 + llm_description: Cluster name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage.py new file mode 100644 index 0000000000..76b709bc1d --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterCpuUsageTool(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]: + cluster = tool_parameters.get('cluster') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - 集群总CPU使用率 - Real Linux', + 'params': { + **({'cluster': cluster} if cluster else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage.yaml new file mode 100644 index 0000000000..df6b9129c4 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage.yaml @@ -0,0 +1,53 @@ +identity: + name: 实时集群CPU使用率 + author: APO + label: + en_US: Real-time cluster CPU usage + zh_Hans: 实时集群CPU使用率 +description: + human: + en_US: Real-time cluster CPU usage + zh_Hans: 实时集群CPU使用率 + llm: Real-time cluster CPU usage +display: + type: metric + title: 集群总览 - 总览 - 集群总CPU使用率 - Real Linux + unit: "percentunit" +parameters: + - name: cluster + type: string + required: False + label: + en_US: Cluster name + zh_Hans: 集群名称 + human_description: + en_US: Cluster name + zh_Hans: 集群名称 + llm_description: Cluster name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage_real_linux.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage_real_linux.py new file mode 100644 index 0000000000..c4f6068d9a --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage_real_linux.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterCpuUsageRealLinuxTool(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]: + cluster = tool_parameters.get('cluster') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - CPU使用量 - Real Linux', + 'params': { + **({'cluster': cluster} if cluster else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage_real_linux.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage_real_linux.yaml new file mode 100644 index 0000000000..78f618938e --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_cpu_usage_real_linux.yaml @@ -0,0 +1,53 @@ +identity: + name: 实时集群CPU使用核数 + author: APO + label: + en_US: The number of CPU cores in real-time use in the cluster + zh_Hans: 实时集群CPU使用核数 +description: + human: + en_US: The number of CPU cores in real-time use in the cluster + zh_Hans: 实时集群CPU使用核数 + llm: The number of CPU cores in real-time use in the cluster +display: + type: metric + title: 集群总览 - 总览 - CPU使用量 - Real Linux + unit: "core" +parameters: + - name: cluster + type: string + required: False + label: + en_US: Cluster name + zh_Hans: 集群名称 + human_description: + en_US: Cluster name + zh_Hans: 集群名称 + llm_description: Cluster name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_total.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_total.py new file mode 100644 index 0000000000..ef1c497ea2 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_total.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterMemoryTotalTool(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]: + cluster = tool_parameters.get('cluster') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - 内存使用量 - Total', + 'params': { + **({'cluster': cluster} if cluster else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_total.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_total.yaml new file mode 100644 index 0000000000..d82bbe471e --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_total.yaml @@ -0,0 +1,53 @@ +identity: + name: 集群总可用内存字节数 + author: APO + label: + en_US: The total number of available bytes of memory in the cluster + zh_Hans: 集群总可用内存字节数 +description: + human: + en_US: The total number of available bytes of memory in the cluster + zh_Hans: 集群总可用内存字节数 + llm: The total number of available bytes of memory in the cluster +display: + type: metric + title: 集群总览 - 总览 - 内存使用量 - Total + unit: "bytes" +parameters: + - name: cluster + type: string + required: False + label: + en_US: Cluster name + zh_Hans: 集群名称 + human_description: + en_US: Cluster name + zh_Hans: 集群名称 + llm_description: Cluster name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage.py new file mode 100644 index 0000000000..3b93d70c2d --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterMemoryUsageTool(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]: + cluster = tool_parameters.get('cluster') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - 集群总内存使用率 - Real Linux', + 'params': { + **({'cluster': cluster} if cluster else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage.yaml new file mode 100644 index 0000000000..ba8f3eb24f --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage.yaml @@ -0,0 +1,53 @@ +identity: + name: 实时集群内存使用率 + author: APO + label: + en_US: Real-time cluster memory usage + zh_Hans: 实时集群内存使用率 +description: + human: + en_US: Real-time cluster memory usage + zh_Hans: 实时集群内存使用率 + llm: Real-time cluster memory usage +display: + type: metric + title: 集群总览 - 总览 - 集群总内存使用率 - Real Linux + unit: "percentunit" +parameters: + - name: cluster + type: string + required: False + label: + en_US: Cluster name + zh_Hans: 集群名称 + human_description: + en_US: Cluster name + zh_Hans: 集群名称 + llm_description: Cluster name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage_real_linux.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage_real_linux.py new file mode 100644 index 0000000000..24145788b5 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage_real_linux.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterMemoryUsageRealLinuxTool(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]: + cluster = tool_parameters.get('cluster') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - 内存使用量 - Real Linux', + 'params': { + **({'cluster': cluster} if cluster else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage_real_linux.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage_real_linux.yaml new file mode 100644 index 0000000000..8d3f2ac5d0 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_memory_usage_real_linux.yaml @@ -0,0 +1,53 @@ +identity: + name: 实时集群内存使用字节数 + author: APO + label: + en_US: The number of bytes of memory in real-time use in the cluster + zh_Hans: 实时集群内存使用字节数 +description: + human: + en_US: The number of bytes of memory in real-time use in the cluster + zh_Hans: 实时集群内存使用字节数 + llm: The number of bytes of memory in real-time use in the cluster +display: + type: metric + title: 集群总览 - 总览 - 内存使用量 - Real Linux + unit: "bytes" +parameters: + - name: cluster + type: string + required: False + label: + en_US: Cluster name + zh_Hans: 集群名称 + human_description: + en_US: Cluster name + zh_Hans: 集群名称 + llm_description: Cluster name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_namespace_count.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_namespace_count.py new file mode 100644 index 0000000000..985c1eefc8 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_namespace_count.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterNamespaceCountTool(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]: + cadvisor_job_name = tool_parameters.get('cadvisor_job_name') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - 命名空间数量', + 'params': { + **({'cadvisor_job_name': cadvisor_job_name} if cadvisor_job_name else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_namespace_count.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_namespace_count.yaml new file mode 100644 index 0000000000..de700c2a74 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_namespace_count.yaml @@ -0,0 +1,53 @@ +identity: + name: K8s集群中命名空间的数量 + author: APO + label: + en_US: Number of namespaces in the K8s cluster + zh_Hans: K8s集群中命名空间的数量 +description: + human: + en_US: Number of namespaces in the K8s cluster + zh_Hans: K8s集群中命名空间的数量 + llm: Number of namespaces in the K8s cluster +display: + type: metric + title: 集群总览 - 总览 - 命名空间数量 + unit: "" +parameters: + - name: cadvisor_job_name + type: string + required: False + label: + en_US: cAdvisor job name + zh_Hans: cAdvisor任务名称 + human_description: + en_US: cAdvisor job name + zh_Hans: cAdvisor任务名称 + llm_description: cAdvisor job name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_receive_dropped_packets.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_receive_dropped_packets.py new file mode 100644 index 0000000000..7c9124e4e7 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_receive_dropped_packets.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterNetworkLinuxReceiveDroppedPacketsTool(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]: + cluster = tool_parameters.get('cluster') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - 网络饱和 - 丢包数 - Linux Packets dropped (receive)', + 'params': { + **({'cluster': cluster} if cluster else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_receive_dropped_packets.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_receive_dropped_packets.yaml new file mode 100644 index 0000000000..800075b42f --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_receive_dropped_packets.yaml @@ -0,0 +1,53 @@ +identity: + name: Linux集群网络接收丢包数 + author: APO + label: + en_US: The number of dropped packets received by the Linux cluster network + zh_Hans: Linux集群网络接收丢包数 +description: + human: + en_US: The number of dropped packets received by the Linux cluster network + zh_Hans: Linux集群网络接收丢包数 + llm: The number of dropped packets received by the Linux cluster network +display: + type: metric + title: 集群总览 - 总览 - 网络饱和 - 丢包数 - Linux Packets dropped (receive) + unit: "short" +parameters: + - name: cluster + type: string + required: False + label: + en_US: Cluster name + zh_Hans: 集群名称 + human_description: + en_US: Cluster name + zh_Hans: 集群名称 + llm_description: Cluster name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_transmit_dropped_packets.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_transmit_dropped_packets.py new file mode 100644 index 0000000000..432ba14dfe --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_transmit_dropped_packets.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterNetworkLinuxTransmitDroppedPacketsTool(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]: + cluster = tool_parameters.get('cluster') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - 网络饱和 - 丢包数 - Linux Packets dropped (transmit)', + 'params': { + **({'cluster': cluster} if cluster else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_transmit_dropped_packets.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_transmit_dropped_packets.yaml new file mode 100644 index 0000000000..dd292ea954 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_linux_transmit_dropped_packets.yaml @@ -0,0 +1,53 @@ +identity: + name: Linux集群网络发送丢包数 + author: APO + label: + en_US: The number of dropped packets sent by the Linux cluster network + zh_Hans: Linux集群网络发送丢包数 +description: + human: + en_US: The number of dropped packets sent by the Linux cluster network + zh_Hans: Linux集群网络发送丢包数 + llm: The number of dropped packets sent by the Linux cluster network +display: + type: metric + title: 集群总览 - 总览 - 网络饱和 - 丢包数 - Linux Packets dropped (transmit) + unit: "short" +parameters: + - name: cluster + type: string + required: False + label: + en_US: Cluster name + zh_Hans: 集群名称 + human_description: + en_US: Cluster name + zh_Hans: 集群名称 + llm_description: Cluster name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_receive_bandwidth.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_receive_bandwidth.py new file mode 100644 index 0000000000..1f86fc6a5f --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_receive_bandwidth.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterNetworkReceiveBandwidthTool(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]: + cluster = tool_parameters.get('cluster') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - 集群整体网络带宽(按设备统计) - 接收', + 'params': { + **({'cluster': cluster} if cluster else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_receive_bandwidth.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_receive_bandwidth.yaml new file mode 100644 index 0000000000..d207905546 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_receive_bandwidth.yaml @@ -0,0 +1,53 @@ +identity: + name: 集群网络接收带宽(按设备统计,排除虚拟设备) + author: APO + label: + en_US: Cluster network receiving bandwidth (statistically by device, excluding virtual devices) + zh_Hans: 集群网络接收带宽(按设备统计,排除虚拟设备) +description: + human: + en_US: Cluster network receiving bandwidth (statistically by device, excluding virtual devices) + zh_Hans: 集群网络接收带宽(按设备统计,排除虚拟设备) + llm: Cluster network receiving bandwidth (statistically by device, excluding virtual devices) +display: + type: metric + title: 集群总览 - 总览 - 集群整体网络带宽(按设备统计) - 接收 + unit: "bytes" +parameters: + - name: cluster + type: string + required: False + label: + en_US: Cluster name + zh_Hans: 集群名称 + human_description: + en_US: Cluster name + zh_Hans: 集群名称 + llm_description: Cluster name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_send_bandwidth.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_send_bandwidth.py new file mode 100644 index 0000000000..5127ca9313 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_send_bandwidth.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterNetworkSendBandwidthTool(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]: + cluster = tool_parameters.get('cluster') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - 集群整体网络带宽(按设备统计) - 发送', + 'params': { + **({'cluster': cluster} if cluster else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_send_bandwidth.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_send_bandwidth.yaml new file mode 100644 index 0000000000..fdaa1e4f06 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_network_send_bandwidth.yaml @@ -0,0 +1,53 @@ +identity: + name: 集群网络发送带宽(按设备统计,排除虚拟设备) + author: APO + label: + en_US: Cluster network sending bandwidth (statistically by device, excluding virtual devices) + zh_Hans: 集群网络发送带宽(按设备统计,排除虚拟设备) +description: + human: + en_US: Cluster network sending bandwidth (statistically by device, excluding virtual devices) + zh_Hans: 集群网络发送带宽(按设备统计,排除虚拟设备) + llm: Cluster network sending bandwidth (statistically by device, excluding virtual devices) +display: + type: metric + title: 集群总览 - 总览 - 集群整体网络带宽(按设备统计) - 发送 + unit: "bytes" +parameters: + - name: cluster + type: string + required: False + label: + en_US: Cluster name + zh_Hans: 集群名称 + human_description: + en_US: Cluster name + zh_Hans: 集群名称 + llm_description: Cluster name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_count.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_count.py new file mode 100644 index 0000000000..f5b880e841 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_count.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterNodeCountTool(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]: + cadvisor_job_name = tool_parameters.get('cadvisor_job_name') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - 节点数', + 'params': { + **({'cadvisor_job_name': cadvisor_job_name} if cadvisor_job_name else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_count.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_count.yaml new file mode 100644 index 0000000000..dc77a27c2e --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_count.yaml @@ -0,0 +1,53 @@ +identity: + name: K8s集群中节点的数量 + author: APO + label: + en_US: The number of nodes in the K8s cluster + zh_Hans: K8s集群中节点的数量 +description: + human: + en_US: The number of nodes in the K8s cluster + zh_Hans: K8s集群中节点的数量 + llm: The number of nodes in the K8s cluster +display: + type: metric + title: 集群总览 - 总览 - 节点数 + unit: "" +parameters: + - name: cadvisor_job_name + type: string + required: False + label: + en_US: cAdvisor job name + zh_Hans: cAdvisor任务名称 + human_description: + en_US: cAdvisor job name + zh_Hans: cAdvisor任务名称 + llm_description: cAdvisor job name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_cpu_usage_linux.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_cpu_usage_linux.py new file mode 100644 index 0000000000..f07a9484e6 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_cpu_usage_linux.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterNodeCpuUsageLinuxTool(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]: + cluster = tool_parameters.get('cluster') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 节点资源使用 - 节点CPU使用率 - Linux', + 'params': { + **({'cluster': cluster} if cluster else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_cpu_usage_linux.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_cpu_usage_linux.yaml new file mode 100644 index 0000000000..50fa48137e --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_cpu_usage_linux.yaml @@ -0,0 +1,53 @@ +identity: + name: Linux节点CPU使用率 + author: APO + label: + en_US: The CPU usage rate of Linux nodes + zh_Hans: Linux节点CPU使用率 +description: + human: + en_US: The CPU usage rate of Linux nodes + zh_Hans: Linux节点CPU使用率 + llm: The CPU usage rate of Linux nodes +display: + type: metric + title: 集群总览 - 节点资源使用 - 节点CPU使用率 - Linux + unit: "percentunit" +parameters: + - name: cluster + type: string + required: False + label: + en_US: Cluster name + zh_Hans: 集群名称 + human_description: + en_US: Cluster name + zh_Hans: 集群名称 + llm_description: Cluster name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_memory_usage_linux.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_memory_usage_linux.py new file mode 100644 index 0000000000..19cfee4a18 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_memory_usage_linux.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterNodeMemoryUsageLinuxTool(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]: + cluster = tool_parameters.get('cluster') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 节点资源使用 - 节点内存使用量 - Linux', + 'params': { + **({'cluster': cluster} if cluster else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_memory_usage_linux.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_memory_usage_linux.yaml new file mode 100644 index 0000000000..61209b5853 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_node_memory_usage_linux.yaml @@ -0,0 +1,53 @@ +identity: + name: Linux节点内存使用字节数 + author: APO + label: + en_US: The number of bytes of memory used by Linux nodes + zh_Hans: Linux节点内存使用字节数 +description: + human: + en_US: The number of bytes of memory used by Linux nodes + zh_Hans: Linux节点内存使用字节数 + llm: The number of bytes of memory used by Linux nodes +display: + type: metric + title: 集群总览 - 节点资源使用 - 节点内存使用量 - Linux + unit: "bytes" +parameters: + - name: cluster + type: string + required: False + label: + en_US: Cluster name + zh_Hans: 集群名称 + human_description: + en_US: Cluster name + zh_Hans: 集群名称 + llm_description: Cluster name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_running_pod_count.py b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_running_pod_count.py new file mode 100644 index 0000000000..c6297f26ff --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_running_pod_count.py @@ -0,0 +1,44 @@ +import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class ClusterRunningPodCountTool(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]: + cadvisor_job_name = tool_parameters.get('cadvisor_job_name') + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': '集群总览 - 总览 - 运行的Pod数', + 'params': { + **({'cadvisor_job_name': cadvisor_job_name} if cadvisor_job_name else {}) + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + } + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': { + 'timeseries': list['timeseries'] + } + }) + yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_running_pod_count.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_running_pod_count.yaml new file mode 100644 index 0000000000..b2a28af850 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/cluster_running_pod_count.yaml @@ -0,0 +1,53 @@ +identity: + name: K8s集群中运行中的Pod数量 + author: APO + label: + en_US: The number of running Pods in the K8s cluster + zh_Hans: K8s集群中运行中的Pod数量 +description: + human: + en_US: The number of running Pods in the K8s cluster + zh_Hans: K8s集群中运行中的Pod数量 + llm: The number of running Pods in the K8s cluster +display: + type: metric + title: 集群总览 - 总览 - 运行的Pod数 + unit: "" +parameters: + - name: cadvisor_job_name + type: string + required: False + label: + en_US: cAdvisor job name + zh_Hans: cAdvisor任务名称 + human_description: + en_US: cAdvisor job name + zh_Hans: cAdvisor任务名称 + llm_description: cAdvisor job name + form: llm + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm diff --git a/api/tools_generator/generator.py b/api/tools_generator/generator.py new file mode 100644 index 0000000000..ac16193b7d --- /dev/null +++ b/api/tools_generator/generator.py @@ -0,0 +1,91 @@ +import json +from pathlib import Path + +import json +from pathlib import Path +from typing import List, Dict + +from templates import YAML_TEMPLATE, PARAM_TEMPLATE, PYTHON_TEMPLATE + +class ToolGenerator: + def __init__(self, config_path: str): + self.config = self.load_config(config_path) + + def load_config(self, path: str) -> List[Dict]: + with open(path, 'r', encoding='utf-8') as f: + return json.load(f) + + def generate_all(self, output_path: str): + base_path = Path(output_path) + for tool in self.config: + self._generate_tool(tool, base_path) + + def _generate_tool(self, tool: Dict, base_path: Path): + tool_dir = base_path + tool_dir.mkdir(parents=True, exist_ok=True) + + yaml_content = self._build_yaml(tool) + with open(tool_dir / f"{tool['metric_name']}.yaml", 'w', encoding='utf-8') as f: + f.write(yaml_content) + + python_content = self._build_python(tool) + with open(tool_dir / f"{tool['metric_name']}.py", 'w', encoding='utf-8') as f: + f.write(python_content) + + def _build_yaml(self, tool: Dict) -> str: + params_block = "\n".join( + PARAM_TEMPLATE.format( + name=param["name"], + type=param["type"], + required=param["required"], + label_en=param["describe_en"], + label_zh=param["describe"], + desc_en=param["describe_en"], + desc_zh=param["describe"], + llm_desc=param["describe_en"], + form="llm" + ) for param in tool["params"] + ) + + return YAML_TEMPLATE.format( + tool_id=tool["describe"], + en_label=tool["describe_en"], + zh_label=tool["describe"], + en_desc=tool["describe_en"], + zh_desc=tool["describe"], + llm_desc=tool["describe_en"], + disp_type="metric", + disp_title=tool["title"], + disp_unit=tool["unit"], + params_block=params_block + ) + + def _build_python(self, tool: Dict) -> str: + param_lines = "\n".join( + f" {param['name']} = tool_parameters.get('{param['name']}')" + for param in tool["params"] + ) + + param_dict = [] + for param in tool["params"]: + name = param.get("name", "").strip() + if not name: + continue + + if param.get("required", False): + param_dict.append(f" '{name}': {name}") + else: + param_dict.append(f" **({{'{name}': {name}}} if {name} else {{}})") + + params_content = ",\n".join(param_dict) + + return PYTHON_TEMPLATE.format( + class_name=self._generate_class_name(tool["metric_name"]), + param_lines=param_lines, + param_dict=params_content, + metric_name=tool["title"] + ) + + def _generate_class_name(self, metric_name: str) -> str: + cleaned = ''.join(c for c in metric_name.title() if c.isalnum()) + return f"{cleaned}Tool" diff --git a/api/tools_generator/templates.py b/api/tools_generator/templates.py new file mode 100644 index 0000000000..2a9786916e --- /dev/null +++ b/api/tools_generator/templates.py @@ -0,0 +1,101 @@ +YAML_TEMPLATE = """identity: + name: {tool_id} + author: APO + label: + en_US: {en_label} + zh_Hans: {zh_label} +description: + human: + en_US: {en_desc} + zh_Hans: {zh_desc} + llm: {llm_desc} +display: + type: {disp_type} + title: {disp_title} + unit: "{disp_unit}" +parameters: +{params_block} + - name: startTime + type: number + required: true + label: + en_US: startTime + zh_Hans: startTime + pt_BR: startTime + human_description: + en_US: Data query start time + zh_Hans: 开始时间 (微秒) + pt_BR: Data query start time + llm_description: Data query start time + form: llm + - name: endTime + type: number + required: true + label: + en_US: endTime + zh_Hans: endTime + pt_BR: endTime + human_description: + en_US: Data query end time + zh_Hans: 结束时间 (微秒) + pt_BR: Data query end time + llm_description: Data query start time + form: llm +""" + +PARAM_TEMPLATE = """ - name: {name} + type: {type} + required: {required} + label: + en_US: {label_en} + zh_Hans: {label_zh} + human_description: + en_US: {desc_en} + zh_Hans: {desc_zh} + llm_description: {llm_desc} + form: {form}""" + +PYTHON_TEMPLATE = """import json +from collections.abc import Generator +from typing import Any, Optional + +import requests + +from configs import dify_config +from core.tools.builtin_tool.tool import BuiltinTool +from core.tools.entities.tool_entities import ToolInvokeMessage +from libs.apo_utils import APOUtils + + +class {class_name}(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]: +{param_lines} + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = {{ + 'metricName': {metric_name!r}, + 'params': {{ +{param_dict} + }}, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), + }} + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] + list = json.dumps({{ + 'type': 'metric', + 'display': True, + 'unit': list['unit'], + 'data': {{ + 'timeseries': list['timeseries'] + }} + }}) + yield self.create_text_message(list)""" \ No newline at end of file diff --git a/api/tools_generator/tools_generator.py b/api/tools_generator/tools_generator.py new file mode 100644 index 0000000000..0280cf79a4 --- /dev/null +++ b/api/tools_generator/tools_generator.py @@ -0,0 +1,10 @@ +from generator import ToolGenerator + +import os + +def main(): + generator = ToolGenerator('./metrics_conf.json') + generator.generate_all("../core/tools/builtin_tool/providers/apo_select/tools") + +if __name__ == "__main__": + main() \ No newline at end of file