From 7dd1ee369151066bec17903f1c8674ac8b1265e3 Mon Sep 17 00:00:00 2001 From: fuwx Date: Wed, 5 Mar 2025 15:00:46 +0800 Subject: [PATCH] update --- .../console/workspace/tool_providers.py | 17 ++++ .../providers/apo_select/tools/alert.yaml | 2 +- .../apo_select/tools/container_cpu.yaml | 2 +- .../apo_select/tools/container_rss.yaml | 2 +- .../apo_select/tools/container_rtt.yaml | 2 +- .../providers/apo_select/tools/fault_log.yaml | 2 +- .../tools/originx_service_red_avg_resp.py | 45 +++++++++++ .../tools/originx_service_red_avg_resp.yaml | 70 ++++++++++++++++ .../apo_select/tools/select_cpu.yaml | 2 +- .../providers/apo_select/tools/topology.yaml | 2 +- api/core/tools/entities/tool_entities.py | 2 +- .../tools/builtin_tools_manage_service.py | 79 ++++++++++++++++--- 12 files changed, 208 insertions(+), 19 deletions(-) create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/originx_service_red_avg_resp.py create mode 100644 api/core/tools/builtin_tool/providers/apo_select/tools/originx_service_red_avg_resp.yaml diff --git a/api/controllers/console/workspace/tool_providers.py b/api/controllers/console/workspace/tool_providers.py index 39072e626b..9f2b622681 100644 --- a/api/controllers/console/workspace/tool_providers.py +++ b/api/controllers/console/workspace/tool_providers.py @@ -563,6 +563,22 @@ class ToolBuiltinListApi(Resource): ] ) +class APOToolListApi(Resource): + def get(self): + user = current_user + + user_id = user.id + tenant_id = user.current_tenant_id + + return jsonable_encoder( + [ + provider.to_dict() + for provider in BuiltinToolManageService.list_all_apo_tools( + user_id, + tenant_id, + ) + ] + ) class APOToolBuiltinListApi(Resource): def get(self): @@ -785,6 +801,7 @@ api.add_resource(ToolWorkflowProviderListToolApi, "/workspaces/current/tool-prov api.add_resource(ToolBuiltinListApi, "/workspaces/current/tools/builtin") api.add_resource(APOToolBuiltinListApi, "/workspaces/current/tools/apo") +api.add_resource(APOToolListApi, "/workspaces/current/tools/apo/list") api.add_resource(APOToolPreviewApi, "/workspaces/current/tools/apo/preview") api.add_resource(ToolApiListApi, "/workspaces/current/tools/api") api.add_resource(ToolWorkflowListApi, "/workspaces/current/tools/workflow") diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/alert.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/alert.yaml index 9a9fea5bb1..68f09f70fb 100644 --- a/api/core/tools/builtin_tool/providers/apo_select/tools/alert.yaml +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/alert.yaml @@ -14,7 +14,7 @@ description: display: type: alert title: alert - uint: alert + unit: alert parameters: - name: service type: string diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/container_cpu.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/container_cpu.yaml index 8e026815b7..8f0a8dbe89 100644 --- a/api/core/tools/builtin_tool/providers/apo_select/tools/container_cpu.yaml +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/container_cpu.yaml @@ -8,7 +8,7 @@ identity: display: type: metric title: 基础设施情况 - 容器CPU - 容器CPU使用率 - Containerd - uint: percent(0-100)百分比 + unit: percent(0-100)百分比 description: human: en_US: Query the CPU utilization of the container diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/container_rss.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/container_rss.yaml index 2bfbdc539d..94b5e92567 100644 --- a/api/core/tools/builtin_tool/providers/apo_select/tools/container_rss.yaml +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/container_rss.yaml @@ -14,7 +14,7 @@ description: display: type: metric title: 基础设施情况 - 容器内存 - 容器内存使用率 - Containerd - uint: bytes 字节 + unit: bytes 字节 parameters: - name: pod type: string diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/container_rtt.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/container_rtt.yaml index 8fcc62ed3f..380de8f36e 100644 --- a/api/core/tools/builtin_tool/providers/apo_select/tools/container_rtt.yaml +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/container_rtt.yaml @@ -14,7 +14,7 @@ description: display: type: metric title: 基础设施情况 - 容器网络 - 与下游服务RTT - uint: s 秒 + unit: s 秒 parameters: - name: pod type: string diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/fault_log.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/fault_log.yaml index 7d5e6c7ebc..62c3759b01 100644 --- a/api/core/tools/builtin_tool/providers/apo_select/tools/fault_log.yaml +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/fault_log.yaml @@ -14,7 +14,7 @@ description: display: type: log title: log - uint: log + unit: log parameters: - name: service type: string diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/originx_service_red_avg_resp.py b/api/core/tools/builtin_tool/providers/apo_select/tools/originx_service_red_avg_resp.py new file mode 100644 index 0000000000..2f930a6cee --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/originx_service_red_avg_resp.py @@ -0,0 +1,45 @@ +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 OriginxServiceRedAvgRespTool(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]: + service_name = tool_parameters.get("service_name") + content_key = tool_parameters.get("content_key") + start_time = tool_parameters.get("startTime") + end_time = tool_parameters.get("endTime") + params = { + 'metricName': 'Originx 北极星指标 (服务层级) - RED指标 - 平均响应时间', + 'params': { + "service_name": service_name, + "content_key": content_key + }, + '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/originx_service_red_avg_resp.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/originx_service_red_avg_resp.yaml new file mode 100644 index 0000000000..203bb69952 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/originx_service_red_avg_resp.yaml @@ -0,0 +1,70 @@ +identity: + name: originx_service_red_avg_resp + author: APO + label: + en_US: Query the CPU utilization of the host + zh_Hans: Originx 北极星指标 (服务层级) - RED指标 - 平均响应时间 + pt_BR: Query the CPU utilization of the host +description: + human: + en_US: Query the CPU utilization of the host + zh_Hans: 服务平均响应时间(毫秒,按服务名和内容键统计,指定时间段内) + pt_BR: Query the CPU utilization of the host + llm: 服务平均响应时间(毫秒,按服务名和内容键统计,指定时间段内) +display: + type: metric + title: Originx 北极星指标 (服务层级) - RED指标 - 平均响应时间 + unit: ms +parameters: + - name: service_name + type: string + required: true + label: + en_US: service_name + zh_Hans: service_name + pt_BR: service_name + human_description: + en_US: Specified service name + zh_Hans: 指定的服务名 + pt_BR: Specified service name + llm_description: 指定的服务名 + form: llm + - name: content_key + type: string + required: true + label: + en_US: content_key + zh_Hans: content_key + pt_BR: content_key + human_description: + en_US: Specified endpoint name + zh_Hans: 指定的服务端点名 + pt_BR: Specified endpoint name + llm_description: 指定的服务端点名 + 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 \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/select_cpu.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/select_cpu.yaml index cc12ae9417..1c43a87611 100644 --- a/api/core/tools/builtin_tool/providers/apo_select/tools/select_cpu.yaml +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/select_cpu.yaml @@ -14,7 +14,7 @@ description: display: type: metric title: 宿主机监控指标 - Quick CPU / Mem / Disk - CPU Busy - uint: percent(0-100)百分比 + unit: percent(0-100)百分比 parameters: - name: node type: string diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/topology.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/topology.yaml index 57be820be8..6ac5307e40 100644 --- a/api/core/tools/builtin_tool/providers/apo_select/tools/topology.yaml +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/topology.yaml @@ -14,7 +14,7 @@ description: display: type: topology title: topology - uint: toplogy + unit: toplogy parameters: - name: service type: string diff --git a/api/core/tools/entities/tool_entities.py b/api/core/tools/entities/tool_entities.py index 4bbce418e6..8faf3abe7b 100644 --- a/api/core/tools/entities/tool_entities.py +++ b/api/core/tools/entities/tool_entities.py @@ -320,7 +320,7 @@ class ToolDescription(BaseModel): class APODisPlay(BaseModel): type: str = Field(..., description="The type of the apo data display") - uint: str = Field(..., description="The unit of the apo data display") + unit: str = Field(..., description="The unit of the apo data display") title: str = Field(..., description="The title of the apo data display") class ToolEntity(BaseModel): diff --git a/api/services/tools/builtin_tools_manage_service.py b/api/services/tools/builtin_tools_manage_service.py index 30bfebfca5..69aa447eec 100644 --- a/api/services/tools/builtin_tools_manage_service.py +++ b/api/services/tools/builtin_tools_manage_service.py @@ -293,14 +293,6 @@ class BuiltinToolManageService: """ list apo tools """ - apo_tool = "apo_select" - match tool_type: - case "analysis": - apo_tool = "apo_analysis" - case "select": - apo_tool = "apo_select" - case "rule": - apo_tool = "apo_rule" # get all builtin providers provider_controllers = ToolManager.list_builtin_providers(tenant_id) @@ -331,7 +323,7 @@ class BuiltinToolManageService: name_func=lambda x: x.identity.name, ): continue - if provider_controller.entity.identity.name != apo_tool: + if provider_controller.entity.identity.name != tool_type: continue # convert provider controller to user provider @@ -358,8 +350,8 @@ class BuiltinToolManageService: else: match_tools = process.extract( query, - [tool.entity.description.human.zh_Hans for tool in tools], - limit=5, + [tool.entity.identity.label.zh_Hans for tool in tools], + limit=10, ) for match_name, score, index in match_tools or []: tool = tools[index] @@ -377,6 +369,71 @@ class BuiltinToolManageService: raise e return BuiltinToolProviderSort.sort(result) + + @staticmethod + def list_all_apo_tools(user_id: str, tenant_id: str) -> list[ToolProviderApiEntity]: + """ + list all apo tools + """ + # get all builtin providers + provider_controllers = ToolManager.list_builtin_providers(tenant_id) + + with db.session.no_autoflush: + # get all user added providers + db_providers: list[BuiltinToolProvider] = ( + db.session.query(BuiltinToolProvider).filter(BuiltinToolProvider.tenant_id == tenant_id).all() or [] + ) + + # rewrite db_providers + for db_provider in db_providers: + db_provider.provider = str(ToolProviderID(db_provider.provider)) + + # find provider + def find_provider(provider): + return next(filter(lambda db_provider: db_provider.provider == provider, db_providers), None) + + result: list[ToolProviderApiEntity] = [] + + for provider_controller in provider_controllers: + try: + # handle include, exclude + if is_filtered( + include_set=dify_config.POSITION_TOOL_INCLUDES_SET, # type: ignore + exclude_set=dify_config.POSITION_TOOL_EXCLUDES_SET, # type: ignore + data=provider_controller, + name_func=lambda x: x.identity.name, + ): + continue + if provider_controller.entity.identity.name not in ["apo_select", "apo_analysis", "apo_rule"]: + continue + + + # convert provider controller to user provider + user_builtin_provider = ToolTransformService.builtin_provider_to_user_provider( + provider_controller=provider_controller, + db_provider=find_provider(provider_controller.entity.identity.name), + decrypt_credentials=True, + ) + + # add icon + ToolTransformService.repack_provider(tenant_id=tenant_id, provider=user_builtin_provider) + + tools = provider_controller.get_tools() + for tool in tools or []: + user_builtin_provider.tools.append( + ToolTransformService.convert_tool_entity_to_api_entity( + tenant_id=tenant_id, + tool=tool, + credentials=user_builtin_provider.original_credentials, + labels=ToolLabelManager.get_tool_labels(provider_controller), + ) + ) + + result.append(user_builtin_provider) + except Exception as e: + raise e + + return BuiltinToolProviderSort.sort(result) @staticmethod def _fetch_builtin_provider(provider_name: str, tenant_id: str) -> BuiltinToolProvider | None: