| | |
| | """ |
| | Tool System for GAIA Agent Framework |
| | Provides base classes and interfaces for all agent tools |
| | """ |
| |
|
| | from abc import ABC, abstractmethod |
| | from typing import Any, Dict, Optional |
| | from dataclasses import dataclass |
| | import time |
| | import logging |
| |
|
| | |
| | from agents.state import ToolResult |
| |
|
| | logger = logging.getLogger(__name__) |
| |
|
| | class BaseTool(ABC): |
| | """ |
| | Base class for all agent tools |
| | Provides consistent interface and error handling |
| | """ |
| | |
| | def __init__(self, name: str): |
| | self.name = name |
| | self.usage_count = 0 |
| | self.total_execution_time = 0.0 |
| | |
| | @abstractmethod |
| | def _execute_impl(self, input_data: Any, **kwargs) -> Any: |
| | """ |
| | Implementation-specific execution logic |
| | Override this method in subclasses |
| | """ |
| | pass |
| | |
| | def execute(self, input_data: Any, **kwargs) -> ToolResult: |
| | """ |
| | Execute the tool with error handling and metrics tracking |
| | """ |
| | start_time = time.time() |
| | |
| | try: |
| | logger.info(f"Executing tool: {self.name}") |
| | result = self._execute_impl(input_data, **kwargs) |
| | |
| | execution_time = time.time() - start_time |
| | self.usage_count += 1 |
| | self.total_execution_time += execution_time |
| | |
| | logger.info(f"✅ Tool {self.name} completed in {execution_time:.2f}s") |
| | |
| | return ToolResult( |
| | tool_name=self.name, |
| | success=True, |
| | result=result, |
| | execution_time=execution_time, |
| | metadata={ |
| | "input_type": type(input_data).__name__, |
| | "usage_count": self.usage_count |
| | } |
| | ) |
| | |
| | except Exception as e: |
| | execution_time = time.time() - start_time |
| | error_msg = f"Tool {self.name} failed: {str(e)}" |
| | logger.error(f"❌ {error_msg}") |
| | |
| | return ToolResult( |
| | tool_name=self.name, |
| | success=False, |
| | result=None, |
| | error=error_msg, |
| | execution_time=execution_time |
| | ) |
| | |
| | def get_stats(self) -> Dict[str, Any]: |
| | """Get usage statistics for this tool""" |
| | return { |
| | "name": self.name, |
| | "usage_count": self.usage_count, |
| | "total_execution_time": self.total_execution_time, |
| | "average_execution_time": self.total_execution_time / max(self.usage_count, 1) |
| | } |
| |
|
| | __all__ = ['BaseTool', 'ToolResult'] |