"""设备端MCP工具执行器""" from typing import Dict, Any, TYPE_CHECKING if TYPE_CHECKING: from core.connection import ConnectionHandler from ..base import ToolType, ToolDefinition, ToolExecutor from plugins_func.register import Action, ActionResponse from .mcp_handler import call_mcp_tool class DeviceMCPExecutor(ToolExecutor): """设备端MCP工具执行器""" def __init__(self, conn): self.conn = conn async def execute( self, conn: "ConnectionHandler", tool_name: str, arguments: Dict[str, Any] ) -> ActionResponse: """执行设备端MCP工具""" if not hasattr(conn, "mcp_client") or not conn.mcp_client: return ActionResponse( action=Action.ERROR, response="设备端MCP客户端未初始化", ) if not await conn.mcp_client.is_ready(): return ActionResponse( action=Action.ERROR, response="设备端MCP客户端未准备就绪", ) try: # 转换参数为JSON字符串 import json args_str = json.dumps(arguments) if arguments else "{}" # 调用设备端MCP工具 result = await call_mcp_tool(conn, conn.mcp_client, tool_name, args_str) resultJson = None if isinstance(result, str): try: resultJson = json.loads(result) except Exception as e: pass # 视觉大模型不经过二次LLM处理 if ( resultJson is not None and isinstance(resultJson, dict) and "action" in resultJson ): return ActionResponse( action=Action[resultJson["action"]], response=resultJson.get("response", ""), ) return ActionResponse(action=Action.REQLLM, result=str(result)) except ValueError as e: return ActionResponse(action=Action.NOTFOUND, response=str(e)) except Exception as e: return ActionResponse(action=Action.ERROR, response=str(e)) def get_tools(self) -> Dict[str, ToolDefinition]: """获取所有设备端MCP工具""" if not hasattr(self.conn, "mcp_client") or not self.conn.mcp_client: return {} tools = {} mcp_tools = self.conn.mcp_client.get_available_tools() for tool in mcp_tools: func_def = tool.get("function", {}) tool_name = func_def.get("name", "") if tool_name: tools[tool_name] = ToolDefinition( name=tool_name, description=tool, tool_type=ToolType.DEVICE_MCP ) return tools def has_tool(self, tool_name: str) -> bool: """检查是否有指定的设备端MCP工具""" if not hasattr(self.conn, "mcp_client") or not self.conn.mcp_client: return False return self.conn.mcp_client.has_tool(tool_name)