import json from typing import Any, Dict, Optional from langchain_core.tools import BaseTool from tools.calculator import CalculatorTool from tools.web_search import WebSearchTool from tools.rest_api_tool import RestApiTool from tools.sr_api_tool import SrApiQueryTool class ToolRouter: """工具路由器:统一调用入口""" def __init__(self, tools: Optional[list[BaseTool]] = None): if tools is None: tools = [CalculatorTool(), WebSearchTool(), RestApiTool(), SrApiQueryTool()] self._tools: Dict[str, BaseTool] = {tool.name: tool for tool in tools} def list_tools(self) -> list[str]: """列出可用工具名称""" return list(self._tools.keys()) def call(self, tool_name: str, payload: Any) -> Dict[str, Any]: """调用工具并返回标准化结果""" tool = self._tools.get(tool_name) if not tool: return {"ok": False, "data": None, "error": f"工具不存在: {tool_name}"} try: if isinstance(payload, (dict, list)): input_value = json.dumps(payload, ensure_ascii=False) elif payload is None: input_value = "" else: input_value = str(payload) result = tool.run(input_value) return {"ok": True, "data": result, "error": None} except Exception as e: return {"ok": False, "data": None, "error": str(e)}