"""Abstract base class for LLM providers.""" from abc import ABC, abstractmethod from typing import List, Dict, Any class LLMProvider(ABC): """Abstract base class for AI language model providers. All provider implementations (Gemini, OpenRouter, Cohere) must inherit from this class and implement the generate_response method. """ def __init__(self, api_key: str, model_name: str): """Initialize the LLM provider. Args: api_key: API key for the provider model_name: Name of the model to use """ self.api_key = api_key self.model_name = model_name @abstractmethod async def generate_response( self, messages: List[Dict[str, str]], system_prompt: str | None = None, max_tokens: int | None = None, temperature: float = 0.7 ) -> Dict[str, Any]: """Generate a response from the AI model. Args: messages: List of message dicts with 'role' and 'content' keys system_prompt: Optional system prompt to guide the AI's behavior max_tokens: Maximum tokens to generate in the response temperature: Sampling temperature (0.0 to 1.0) Returns: Dict containing: - content: The generated response text - token_count: Number of tokens used (if available) - model: Model name used Raises: Exception: If the API call fails """ pass @abstractmethod def count_tokens(self, text: str) -> int: """Count the number of tokens in a text string. Args: text: The text to count tokens for Returns: Number of tokens in the text """ pass