109 lines
2.7 KiB
Python
109 lines
2.7 KiB
Python
|
|
"""Tool manager for loading and managing tools."""
|
||
|
|
|
||
|
|
import logging
|
||
|
|
from pathlib import Path
|
||
|
|
from typing import Any
|
||
|
|
|
||
|
|
from nanobot.agent.tools.registry import ToolRegistry
|
||
|
|
|
||
|
|
from agents.tools.builtin import get_builtin_tools
|
||
|
|
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
|
||
|
|
class ToolManager:
|
||
|
|
"""Manages tools for the agent."""
|
||
|
|
|
||
|
|
def __init__(self, workspace: Path | None = None):
|
||
|
|
"""Initialize tool manager.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
workspace: Optional workspace path
|
||
|
|
"""
|
||
|
|
self.workspace = workspace
|
||
|
|
self.registry = ToolRegistry()
|
||
|
|
self._load_builtin_tools()
|
||
|
|
|
||
|
|
def _load_builtin_tools(self) -> None:
|
||
|
|
"""Load all built-in tools."""
|
||
|
|
tools = get_builtin_tools(self.workspace)
|
||
|
|
for tool in tools:
|
||
|
|
self.registry.register(tool)
|
||
|
|
logger.info(f"Loaded {len(tools)} built-in tools")
|
||
|
|
|
||
|
|
def register_tool(self, tool: Any) -> None:
|
||
|
|
"""Register a custom tool.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
tool: Tool instance to register
|
||
|
|
"""
|
||
|
|
self.registry.register(tool)
|
||
|
|
logger.info(f"Registered tool: {tool.name}")
|
||
|
|
|
||
|
|
def unregister_tool(self, name: str) -> None:
|
||
|
|
"""Unregister a tool.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
name: Tool name to unregister
|
||
|
|
"""
|
||
|
|
self.registry.unregister(name)
|
||
|
|
logger.info(f"Unregistered tool: {name}")
|
||
|
|
|
||
|
|
def get_tool(self, name: str) -> Any:
|
||
|
|
"""Get a tool by name.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
name: Tool name
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
Tool instance or None
|
||
|
|
"""
|
||
|
|
return self.registry.get(name)
|
||
|
|
|
||
|
|
def has_tool(self, name: str) -> bool:
|
||
|
|
"""Check if a tool is registered.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
name: Tool name
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
True if tool exists
|
||
|
|
"""
|
||
|
|
return self.registry.has(name)
|
||
|
|
|
||
|
|
def list_tools(self) -> list[str]:
|
||
|
|
"""List all registered tool names.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
List of tool names
|
||
|
|
"""
|
||
|
|
return self.registry.tool_names
|
||
|
|
|
||
|
|
def get_tool_definitions(self) -> list[dict[str, Any]]:
|
||
|
|
"""Get all tool definitions in OpenAI format.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
List of tool schemas
|
||
|
|
"""
|
||
|
|
return self.registry.get_definitions()
|
||
|
|
|
||
|
|
async def execute_tool(self, name: str, params: dict[str, Any]) -> str:
|
||
|
|
"""Execute a tool by name.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
name: Tool name
|
||
|
|
params: Tool parameters
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
Tool execution result
|
||
|
|
"""
|
||
|
|
return await self.registry.execute(name, params)
|
||
|
|
|
||
|
|
def __len__(self) -> int:
|
||
|
|
"""Get number of registered tools."""
|
||
|
|
return len(self.registry)
|
||
|
|
|
||
|
|
def __contains__(self, name: str) -> bool:
|
||
|
|
"""Check if tool is registered."""
|
||
|
|
return name in self.registry
|