from abc import ABC, abstractmethod
from typing import AsyncGenerator

class LLMProvider(ABC):
    """Abstract base class for all LLM providers."""
    @abstractmethod
    async def generate_response(self, prompt: str) -> str:
        """Generates a response from the LLM."""
        pass

class TTSProvider(ABC):
    """Abstract base class for all Text-to-Speech providers."""
    @abstractmethod
    async def generate_speech(self, text: str) -> AsyncGenerator[bytes, None]:
        """Generates speech from text and streams the audio data."""
        pass

class STTProvider(ABC):
    """Abstract base class for all Speech-to-Text providers."""
    @abstractmethod
    async def transcribe_audio(self, audio_data: bytes) -> str:
        """Transcribes audio data into text."""
        pass