""" Base LLM Provider interface with hard async timeout enforcement. """ import asyncio from abc import ABC, abstractmethod from typing import Optional class LLMProvider(ABC): """ Abstract LLM Provider interface. Enforces a strict hard timeout (default 4 seconds). """ def __init__(self, timeout_seconds: float = 4.0): self.timeout_seconds = timeout_seconds async def generate_response_with_timeout(self, system_prompt: str, user_message: str) -> Optional[str]: try: return await asyncio.wait_for( self._generate_internal(system_prompt, user_message), timeout=self.timeout_seconds ) except (asyncio.TimeoutError, Exception) as e: print(f"[{self.__class__.__name__} Failed / Timed out]: {e}") return None @abstractmethod async def _generate_internal(self, system_prompt: str, user_message: str) -> Optional[str]: pass