from abc import ABC from abc import abstractmethod class Provider(ABC): """Base class for providers""" @abstractmethod def ask( self, prompt: str, stream: bool = False, raw: bool = False, optimizer: str = None, conversationally: bool = False, ) -> dict: """Chat with AI Args: prompt (str): Prompt to be sent stream (bool, optional): Flag for streaming response. Defaults to False. raw (bool, optional): Stream back raw response as received optimizer (str, optional): Prompt optimizer name - `[code, shell_command]` conversationally (bool, optional): Chat conversationally when using optimizer. Defaults to False. Returns: dict : {} ```json { "completion": "\nNext: domestic cat breeds with short hair >>", "stop_reason": null, "truncated": false, "stop": null, "model": "llama-2-13b-chat", "log_id": "cmpl-3kYiYxSNDvgMShSzFooz6t", "exception": null } ``` """ raise NotImplementedError("Method needs to be implemented in subclass") @abstractmethod def chat( self, prompt: str, stream: bool = False, optimizer: str = None, conversationally: bool = False, ) -> str: """Generate response `str` Args: prompt (str): Prompt to be sent stream (bool, optional): Flag for streaming response. Defaults to False. optimizer (str, optional): Prompt optimizer name - `[code, shell_command]` conversationally (bool, optional): Chat conversationally when using optimizer. Defaults to False. Returns: str: Response generated """ raise NotImplementedError("Method needs to be implemented in subclass") @abstractmethod def get_message(self, response: dict) -> str: """Retrieves message only from response Args: response (dict): Response generated by `self.ask` Returns: str: Message extracted """ raise NotImplementedError("Method needs to be implemented in subclass") class AsyncProvider(ABC): """Asynchronous base class for providers""" @abstractmethod async def ask( self, prompt: str, stream: bool = False, raw: bool = False, optimizer: str = None, conversationally: bool = False, ) -> dict: """Asynchronously chat with AI Args: prompt (str): Prompt to be sent stream (bool, optional): Flag for streaming response. Defaults to False. raw (bool, optional): Stream back raw response as received optimizer (str, optional): Prompt optimizer name - `[code, shell_command]` conversationally (bool, optional): Chat conversationally when using optimizer. Defaults to False. Returns: dict : {} ```json { "completion": "\nNext: domestic cat breeds with short hair >>", "stop_reason": null, "truncated": false, "stop": null, "model": "llama-2-13b-chat", "log_id": "cmpl-3kYiYxSNDvgMShSzFooz6t", "exception": null } ``` """ raise NotImplementedError("Method needs to be implemented in subclass") @abstractmethod async def chat( self, prompt: str, stream: bool = False, optimizer: str = None, conversationally: bool = False, ) -> str: """Asynchronously generate response `str` Args: prompt (str): Prompt to be sent stream (bool, optional): Flag for streaming response. Defaults to False. optimizer (str, optional): Prompt optimizer name - `[code, shell_command]` conversationally (bool, optional): Chat conversationally when using optimizer. Defaults to False. Returns: str: Response generated """ raise NotImplementedError("Method needs to be implemented in subclass") @abstractmethod async def get_message(self, response: dict) -> str: """Asynchronously retrieves message only from response Args: response (dict): Response generated by `self.ask` Returns: str: Message extracted """ raise NotImplementedError("Method needs to be implemented in subclass")