diff options
Diffstat (limited to 'g4f/Provider/retry_provider.py')
-rw-r--r-- | g4f/Provider/retry_provider.py | 118 |
1 files changed, 0 insertions, 118 deletions
diff --git a/g4f/Provider/retry_provider.py b/g4f/Provider/retry_provider.py deleted file mode 100644 index 9cc026fc..00000000 --- a/g4f/Provider/retry_provider.py +++ /dev/null @@ -1,118 +0,0 @@ -from __future__ import annotations - -import asyncio -import random -from ..typing import CreateResult, Messages -from ..base_provider import BaseRetryProvider -from .. import debug -from ..errors import RetryProviderError, RetryNoProviderError - -class RetryProvider(BaseRetryProvider): - """ - A provider class to handle retries for creating completions with different providers. - - Attributes: - providers (list): A list of provider instances. - shuffle (bool): A flag indicating whether to shuffle providers before use. - exceptions (dict): A dictionary to store exceptions encountered during retries. - last_provider (BaseProvider): The last provider that was used. - """ - - def create_completion( - self, - model: str, - messages: Messages, - stream: bool = False, - **kwargs - ) -> CreateResult: - """ - Create a completion using available providers, with an option to stream the response. - - Args: - model (str): The model to be used for completion. - messages (Messages): The messages to be used for generating completion. - stream (bool, optional): Flag to indicate if the response should be streamed. Defaults to False. - - Yields: - CreateResult: Tokens or results from the completion. - - Raises: - Exception: Any exception encountered during the completion process. - """ - providers = [p for p in self.providers if stream and p.supports_stream] if stream else self.providers - if self.shuffle: - random.shuffle(providers) - - self.exceptions = {} - started: bool = False - for provider in providers: - self.last_provider = provider - try: - if debug.logging: - print(f"Using {provider.__name__} provider") - for token in provider.create_completion(model, messages, stream, **kwargs): - yield token - started = True - if started: - return - except Exception as e: - self.exceptions[provider.__name__] = e - if debug.logging: - print(f"{provider.__name__}: {e.__class__.__name__}: {e}") - if started: - raise e - - self.raise_exceptions() - - async def create_async( - self, - model: str, - messages: Messages, - **kwargs - ) -> str: - """ - Asynchronously create a completion using available providers. - - Args: - model (str): The model to be used for completion. - messages (Messages): The messages to be used for generating completion. - - Returns: - str: The result of the asynchronous completion. - - Raises: - Exception: Any exception encountered during the asynchronous completion process. - """ - providers = self.providers - if self.shuffle: - random.shuffle(providers) - - self.exceptions = {} - for provider in providers: - self.last_provider = provider - try: - return await asyncio.wait_for( - provider.create_async(model, messages, **kwargs), - timeout=kwargs.get("timeout", 60) - ) - except Exception as e: - self.exceptions[provider.__name__] = e - if debug.logging: - print(f"{provider.__name__}: {e.__class__.__name__}: {e}") - - self.raise_exceptions() - - def raise_exceptions(self) -> None: - """ - Raise a combined exception if any occurred during retries. - - Raises: - RetryProviderError: If any provider encountered an exception. - RetryNoProviderError: If no provider is found. - """ - if self.exceptions: - raise RetryProviderError("RetryProvider failed:\n" + "\n".join([ - f"{p}: {exception.__class__.__name__}: {exception}" for p, exception in self.exceptions.items() - ])) - - raise RetryNoProviderError("No provider found")
\ No newline at end of file |