| |
| """ |
| 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'] |