| """ |
| Base Agent class for all agents in the workflow |
| This provides a common interface and structure for extensibility |
| """ |
|
|
| from abc import ABC, abstractmethod |
| from typing import Dict, Any, Optional |
| import json |
| import logging |
|
|
| logger = logging.getLogger(__name__) |
|
|
|
|
| class BaseAgent(ABC): |
| """ |
| Abstract base class for all agents in the agentic workflow. |
| Provides common functionality and enforces consistent interface. |
| """ |
|
|
| def __init__(self, name: str, config: Dict[str, Any]): |
| """ |
| Initialize the base agent. |
| |
| Args: |
| name: Name of the agent |
| config: Configuration dictionary for the agent |
| """ |
| self.name = name |
| self.config = config |
| self.model = config.get("model", "gpt-4o-mini") |
| self.temperature = config.get("temperature", 0.7) |
| self.max_retries = config.get("max_retries", 3) |
| logger.info(f"Initialized {self.name} with model {self.model}") |
|
|
| @abstractmethod |
| def process(self, input_data: Dict[str, Any]) -> Dict[str, Any]: |
| """ |
| Process input data and return results. |
| This method must be implemented by all concrete agent classes. |
| |
| Args: |
| input_data: Dictionary containing input data for processing |
| |
| Returns: |
| Dictionary containing processing results |
| """ |
| pass |
|
|
| @abstractmethod |
| def validate_input(self, input_data: Dict[str, Any]) -> bool: |
| """ |
| Validate input data before processing. |
| |
| Args: |
| input_data: Dictionary containing input data |
| |
| Returns: |
| True if input is valid, False otherwise |
| """ |
| pass |
|
|
| def get_name(self) -> str: |
| """Get the agent name.""" |
| return self.name |
|
|
| def get_config(self) -> Dict[str, Any]: |
| """Get the agent configuration.""" |
| return self.config |
|
|
| def log_processing(self, message: str, level: str = "info"): |
| """ |
| Log processing information. |
| |
| Args: |
| message: Log message |
| level: Log level (info, warning, error, debug) |
| """ |
| log_method = getattr(logger, level, logger.info) |
| log_method(f"[{self.name}] {message}") |
|
|
| def handle_error(self, error: Exception, context: str = "") -> Dict[str, Any]: |
| """ |
| Handle errors consistently across all agents. |
| |
| Args: |
| error: The exception that occurred |
| context: Additional context about the error |
| |
| Returns: |
| Error dictionary with details |
| """ |
| error_msg = f"Error in {self.name}" |
| if context: |
| error_msg += f" ({context})" |
| error_msg += f": {str(error)}" |
|
|
| logger.error(error_msg) |
|
|
| return { |
| "success": False, |
| "error": str(error), |
| "agent": self.name, |
| "context": context |
| } |