from abc import ABC, abstractmethod
from typing import List, Dict, Any, Optional

class BaseLLM(ABC):
    """Abstract base class for LLM implementations."""

    @abstractmethod
    def get_model_name(self) -> str:
        """Return the display name of the model."""
        pass

    @abstractmethod
    def generate_response(
        self, 
        message: str, 
        context: List[Dict[str, Any]], 
        tools: Optional[List[Dict[str, Any]]] = None
    ) -> str:
        """
        Generate a response for the given message and context.
        
        Args:
            message: The user's input message.
            context: Conversation history (list of dicts with 'role' and 'content').
            tools: Optional list of tool definitions.
            
        Returns:
            The text response from the LLM.
        """
        pass
