File size: 1,160 Bytes
945aae0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import logging
from typing import Callable
from ..core import BaseService
logger = logging.getLogger("qkernel.executors.tool")
ToolHandler = Callable[[dict], object]
class ToolExecutor(BaseService):
name: str = "tool"
def __init__(self) -> None:
self._tools: dict[str, ToolHandler] = {}
def register(self, name: str, handler: ToolHandler) -> None:
self._tools[name] = handler
logger.info("Tool registered: %s", name)
async def process(self, event: dict) -> dict:
tool_name = event.get("tool", "")
params = event.get("params", {}) or {}
handler = self._tools.get(tool_name)
if handler is None:
available = list(self._tools.keys())
return {
"response": "",
"error": f"tool_not_found: {tool_name}",
"available": available,
}
try:
result = handler(params)
return {"response": result, "tool": tool_name}
except Exception as e:
logger.error("Tool %s failed: %s", tool_name, e)
return {"response": "", "tool": tool_name, "error": str(e)} |