Source code for agenix.tools.base

"""Base tool interface."""

from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Any, Callable, Dict, List, Optional, Union

from ..core.messages import ImageContent, TextContent


[docs] @dataclass class ToolResult: """Tool execution result.""" content: Union[str, List[Union[TextContent, ImageContent]]] details: Optional[Dict[str, Any]] = None is_error: bool = False
[docs] class Tool(ABC): """Abstract tool interface."""
[docs] def __init__(self, name: str, description: str, parameters: Dict[str, Any]): self.name = name self.description = description self.parameters = parameters
[docs] @abstractmethod async def execute( self, tool_call_id: str, arguments: Dict[str, Any], on_update: Optional[Callable[[str], None]] = None, ) -> ToolResult: """Execute the tool with given arguments. Args: tool_call_id: Unique ID for this tool call arguments: Tool arguments (must be a dict) on_update: Optional callback for progress updates Returns: ToolResult with content and optional details """ # Ensure arguments is a dict if not isinstance(arguments, dict): raise TypeError( f"Tool arguments must be a dict, got {type(arguments)}: {arguments}") pass
[docs] def to_dict(self) -> Dict[str, Any]: """Convert tool to API format.""" return { "name": self.name, "description": self.description, "parameters": self.parameters, }
[docs] def validate_arguments(self, arguments: Dict[str, Any]) -> None: """Validate tool arguments against schema.""" required = self.parameters.get("required", []) for field in required: if field not in arguments: raise ValueError(f"Missing required argument: {field}")