from abc import ABC, abstractmethod from dataclasses import dataclass class ToolError(Exception): pass @dataclass class ToolResult: content: str class Tool(ABC): @property @abstractmethod def name(self) -> str: ... @property @abstractmethod def description(self) -> str: ... @property @abstractmethod def schema(self) -> dict[str, object]: ... @abstractmethod def execute(self, arguments: dict[str, object]) -> ToolResult: ... class ToolRegistry: def __init__(self) -> None: self.tools: dict[str, Tool] = {} def register(self, tool: Tool) -> None: self.tools[tool.name] = tool def get(self, name: str) -> Tool | None: return self.tools.get(name) def all(self) -> list[Tool]: return list(self.tools.values()) def schemas(self) -> list[dict[str, object]]: return [ { "type": "function", "function": { "name": tool.name, "description": tool.description, "parameters": tool.schema, }, } for tool in self.tools.values() ]