From dbef5facb6df13f175da8657cf49e9f5eb97c14d Mon Sep 17 00:00:00 2001 From: hlohaus <983577+hlohaus@users.noreply.github.com> Date: Sun, 15 Jun 2025 11:03:49 +0200 Subject: [PATCH] Update providers --- g4f/Provider/Cloudflare.py | 6 ++++-- g4f/Provider/LambdaChat.py | 2 ++ g4f/Provider/LegacyLMArena.py | 2 ++ g4f/Provider/needs_auth/PuterJS.py | 13 +++++-------- g4f/providers/any_provider.py | 18 ++++++++++++++---- g4f/providers/retry_provider.py | 3 ++- 6 files changed, 29 insertions(+), 15 deletions(-) diff --git a/g4f/Provider/Cloudflare.py b/g4f/Provider/Cloudflare.py index a06aa72e..2e71d82d 100644 --- a/g4f/Provider/Cloudflare.py +++ b/g4f/Provider/Cloudflare.py @@ -86,10 +86,12 @@ class Cloudflare(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin): cls.models = cls.fallback_models get_running_loop(check_nested=True) try: - asyncio.run(nodriver_read_models()) + task = asyncio.create_task(nodriver_read_models()) + asyncio.run(task) except RuntimeError: debug.log("Nodriver is not available: RuntimeError") cls.models = cls.fallback_models + task.cancel() else: cls.models = cls.fallback_models debug.log(f"Nodriver is not installed: {type(f).__name__}: {f}") @@ -113,7 +115,7 @@ class Cloudflare(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin): try: cls._args = await get_args_from_nodriver(cls.url, proxy=proxy) except (RuntimeError, FileNotFoundError) as e: - debug.log(f"Nodriver is not available: {type(e).__name__}: {e}") + debug.log(f"Cloudflare: Nodriver is not available:", e) cls._args = {"headers": DEFAULT_HEADERS, "cookies": {}, "impersonate": "chrome"} else: cls._args = {"headers": DEFAULT_HEADERS, "cookies": {}, "impersonate": "chrome"} diff --git a/g4f/Provider/LambdaChat.py b/g4f/Provider/LambdaChat.py index 7006d968..5b47601c 100644 --- a/g4f/Provider/LambdaChat.py +++ b/g4f/Provider/LambdaChat.py @@ -192,6 +192,8 @@ class LambdaChat(AsyncGeneratorProvider, ProviderModelMixin): data=form_data, proxy=proxy ) as response: + if not response.ok: + debug.log(f"LambdaChat: Request Body: {form_data}") await raise_for_status(response) async for chunk in response.content: diff --git a/g4f/Provider/LegacyLMArena.py b/g4f/Provider/LegacyLMArena.py index 9098bcba..ffb648a4 100644 --- a/g4f/Provider/LegacyLMArena.py +++ b/g4f/Provider/LegacyLMArena.py @@ -519,6 +519,8 @@ class LegacyLMArena(AsyncGeneratorProvider, ProviderModelMixin): # Skip non-JSON lines continue except Exception as e: + if max_retries == 1: + raise e debug.log(f"Error parsing response: {str(e)}") continue diff --git a/g4f/Provider/needs_auth/PuterJS.py b/g4f/Provider/needs_auth/PuterJS.py index 158df301..2a1cfb09 100644 --- a/g4f/Provider/needs_auth/PuterJS.py +++ b/g4f/Provider/needs_auth/PuterJS.py @@ -16,7 +16,6 @@ from .. import debug class PuterJS(AsyncGeneratorProvider, ProviderModelMixin): label = "Puter.js" - parent = "Puter" url = "https://docs.puter.com/playground" login_url = "https://github.com/HeyPuter/puter-cli" api_endpoint = "https://api.puter.com/drivers/call" @@ -28,7 +27,6 @@ class PuterJS(AsyncGeneratorProvider, ProviderModelMixin): openai_models = [default_vision_model,"gpt-4o-mini", "o1", "o1-mini", "o1-pro", "o3", "o3-mini", "o4-mini", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "gpt-4.5-preview"] claude_models = ["claude-3-7-sonnet-20250219", "claude-3-7-sonnet-latest", "claude-3-5-sonnet-20241022", "claude-3-5-sonnet-latest", "claude-3-5-sonnet-20240620", "claude-3-haiku-20240307"] mistral_models = ["ministral-3b-2410","ministral-3b-latest","ministral-8b-2410","ministral-8b-latest","open-mistral-7b","mistral-tiny","mistral-tiny-2312","open-mixtral-8x7b","mistral-small","mistral-small-2312","open-mixtral-8x22b","open-mixtral-8x22b-2404","mistral-large-2411","mistral-large-latest","pixtral-large-2411","pixtral-large-latest","mistral-large-pixtral-2411","codestral-2501","codestral-latest","codestral-2412","codestral-2411-rc5","pixtral-12b-2409","pixtral-12b","pixtral-12b-latest","mistral-small-2503","mistral-small-latest"] - xai_models = ["grok-beta", "grok-vision-beta"] model_aliases = { ### mistral_models ### "mixtral-8x22b": ["open-mixtral-8x22b", "open-mixtral-8x22b-2404"], @@ -281,14 +279,14 @@ class PuterJS(AsyncGeneratorProvider, ProviderModelMixin): @staticmethod def get_driver_for_model(model: str) -> str: """Determine the appropriate driver based on the model name.""" - if model in PuterJS.openai_models: + if "openrouter:" in model: + return "openrouter" + elif model in PuterJS.openai_models or model.startswith("gpt-"): return "openai-completion" elif model in PuterJS.mistral_models: return "mistral" - elif model in PuterJS.xai_models: + elif "grok" in model: return "xai" - elif "openrouter:" in model: - return "openrouter" elif "claude" in model: return "claude" elif "deepseek" in model: @@ -296,8 +294,7 @@ class PuterJS(AsyncGeneratorProvider, ProviderModelMixin): elif "gemini" in model: return "gemini" else: - # Default to OpenAI for unknown models - return "openai-completion" + raise ModelNotFoundError(f"Model {model} not found in known drivers") @classmethod def get_model(cls, model: str) -> str: diff --git a/g4f/providers/any_provider.py b/g4f/providers/any_provider.py index a8e7684b..5d892aa3 100644 --- a/g4f/providers/any_provider.py +++ b/g4f/providers/any_provider.py @@ -23,7 +23,7 @@ PROVIERS_LIST_1 = [ OpenaiChat, PollinationsAI, Cloudflare, PerplexityLabs, Gemini, Grok, DeepSeekAPI, Blackbox, OpenAIFM, OIVSCodeSer2, OIVSCodeSer0501, TeachAnything, Together, WeWordle, Yqcloud, Chatai, Free2GPT, ARTA, ImageLabs, HarProvider, LegacyLMArena, LMArenaBeta, LambdaChat, CopilotAccount, DeepInfraChat, - HuggingSpace, HuggingFace, HuggingFaceMedia, PuterJS, Together + HuggingSpace, HuggingFace, HuggingFaceMedia, Together ] PROVIERS_LIST_2 = [ @@ -31,7 +31,7 @@ PROVIERS_LIST_2 = [ ] PROVIERS_LIST_3 = [ - HarProvider, LambdaChat, DeepInfraChat, HuggingFace, HuggingFaceMedia, LegacyLMArena, LMArenaBeta, + HarProvider, LambdaChat, DeepInfraChat, HuggingFace, HuggingFaceMedia, HarProvider, LegacyLMArena, LMArenaBeta, PuterJS, Together, Cloudflare, HuggingSpace ] @@ -331,6 +331,7 @@ class AnyProvider(AsyncGeneratorProvider, ProviderModelMixin): if api_key.get(provider): if provider in __map__ and __map__[provider] not in PROVIERS_LIST_1: extra_providers.append(__map__[provider]) + print(f"Using extra providers: {[p.__name__ for p in extra_providers]}") for provider in PROVIERS_LIST_1 + extra_providers: if provider.working: provider_api_key = api_key @@ -341,8 +342,15 @@ class AnyProvider(AsyncGeneratorProvider, ProviderModelMixin): except Exception as e: debug.error(f"Error getting models for provider {provider.__name__}:", e) continue - if not model or model in provider_models or provider.model_aliases and model in provider.model_aliases: + if model and provider == PuterJS: providers.append(provider) + elif not model or model in provider_models or provider.model_aliases and model in provider.model_aliases or model in provider.model_aliases.values(): + providers.append(provider) + elif provider.__name__ == "GeminiPro": + if model and "gemini" in model or "gemma" in model: + providers.append(provider) + elif len(provider_models) > 3: + debug.error(f"Model '{model}' not found in provider {provider.__name__}") if model in models.__models__: for provider in models.__models__[model][1]: providers.append(provider) @@ -351,7 +359,9 @@ class AnyProvider(AsyncGeneratorProvider, ProviderModelMixin): if len(providers) == 0: raise ModelNotFoundError(f"AnyProvider: Model {model} not found in any provider.") - + + debug.log(f"AnyProvider: Using providers: {[provider.__name__ for provider in providers]} for model '{model}'") + async for chunk in IterListProvider(providers).create_async_generator( model, messages, diff --git a/g4f/providers/retry_provider.py b/g4f/providers/retry_provider.py index 12ac8fdb..331ff7d4 100644 --- a/g4f/providers/retry_provider.py +++ b/g4f/providers/retry_provider.py @@ -50,7 +50,6 @@ class IterListProvider(BaseRetryProvider): """ exceptions = {} started: bool = False - for provider in self.get_providers(stream and not ignore_stream, ignored): self.last_provider = provider alias = model @@ -67,6 +66,7 @@ class IterListProvider(BaseRetryProvider): api_key = api_key.get(provider.get_parent()) if api_key: extra_body["api_key"] = api_key + debug.log(f"Using API key for provider: {provider.__name__}") try: response = provider.create_function(alias, messages, stream=stream, **extra_body) for chunk in response: @@ -114,6 +114,7 @@ class IterListProvider(BaseRetryProvider): if isinstance(api_key, dict): api_key = api_key.get(provider.get_parent()) if api_key: + debug.log(f"Using API key for provider: {provider.__name__}") extra_body["api_key"] = api_key if conversation is not None and hasattr(conversation, provider.__name__): extra_body["conversation"] = JsonConversation(**getattr(conversation, provider.__name__))