Files
more_dots/services/tools/tool_router.py
T
2026-03-24 18:07:22 +08:00

42 lines
1.4 KiB
Python

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)}