42 lines
1.4 KiB
Python
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)}
|