From d6782553979ad814f0ae5336e029b3e60a09f33d Mon Sep 17 00:00:00 2001 From: kqlio67 <> Date: Mon, 10 Feb 2025 15:44:37 +0200 Subject: feat(g4f/Provider/Blackbox.py): add premium model support and validation --- docs/providers-and-models.md | 4 ++-- g4f/Provider/Blackbox.py | 26 ++++++++++++++++++++++++-- g4f/models.py | 2 +- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/docs/providers-and-models.md b/docs/providers-and-models.md index cc4e724e..b9519f73 100644 --- a/docs/providers-and-models.md +++ b/docs/providers-and-models.md @@ -38,7 +38,7 @@ This document provides an overview of various AI providers and models, including | Website | API Credentials | Provider | Text Models | Image Models | Vision (Image Upload) | Stream | Status | |----------|-------------|--------------|---------------|--------|--------|------|------| |[aichatfree.info](https://aichatfree.info)|No auth required|`g4f.Provider.AIChatFree`|`gemini-1.5-pro` _**(1+)**_|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)| -|[blackbox.ai](https://www.blackbox.ai)|No auth required|`g4f.Provider.Blackbox`|`blackboxai, gpt-4, gpt-4o, o3-mini, claude-3.5-sonnet, gemini-1.5-flash, gemini-1.5-pro, blackboxai-pro, llama-3.1-8b, llama-3.1-70b, llama-3-1-405b, llama-3.3-70b, mixtral-small-28b, deepseek-chat, dbrx-instruct, qwq-32b, hermes-2-dpo, deepseek-r1, gemini-2.0-flash` _**(+34)**_|`flux`|`blackboxai, gpt-4o, o3-mini, gemini-1.5-pro, gemini-1.5-flash, llama-3.1-8b, llama-3.1-70b, llama-3.1-405b, gemini-2.0-flash`|✔|![](https://img.shields.io/badge/Active-brightgreen)| +|[blackbox.ai](https://www.blackbox.ai)|No auth required|`g4f.Provider.Blackbox`|`blackboxai, gpt-4, gpt-4o, o3-mini, gemini-1.5-flash, gemini-1.5-pro, blackboxai-pro, llama-3.1-8b, llama-3.1-70b, llama-3-1-405b, llama-3.3-70b, mixtral-small-28b, deepseek-chat, dbrx-instruct, qwq-32b, hermes-2-dpo, deepseek-r1, gemini-2.0-flash` _**(+32)**_|`flux`|`blackboxai, gpt-4o, o3-mini, gemini-1.5-pro, gemini-1.5-flash, llama-3.1-8b, llama-3.1-70b, llama-3.1-405b, gemini-2.0-flash`|✔|![](https://img.shields.io/badge/Active-brightgreen)| |[api.blackbox.ai](https://api.blackbox.ai)|No auth required|`g4f.Provider.BlackboxAPI`|`deepseek-v3, deepseek-r1, deepseek-chat, mixtral-small-28b, dbrx-instruct, qwq-32b, hermes-2-dpo`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)| |[chatglm.cn](https://chatglm.cn)|No auth required|`g4f.Provider.ChatGLM`|`glm-4`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)| |[chatgpt.com](https://chatgpt.com)|No auth required|`g4f.Provider.ChatGpt`|✔ _**(+7)**_|❌|❌|✔|![Error](https://img.shields.io/badge/HTTPError-f48d37)| @@ -160,7 +160,7 @@ This document provides an overview of various AI providers and models, including |claude-3-haiku|Anthropic|2+ Providers|[anthropic.com](https://www.anthropic.com/news/claude-3-haiku)| |claude-3-sonnet|Anthropic|1+ Providers|[anthropic.com](https://www.anthropic.com/news/claude-3-family)| |claude-3-opus|Anthropic|2+ Providers|[anthropic.com](https://www.anthropic.com/news/claude-3-family)| -|claude-3.5-sonnet|Anthropic|3+ Providers|[anthropic.com](https://www.anthropic.com/news/claude-3-5-sonnet)| +|claude-3.5-sonnet|Anthropic|2+ Providers|[anthropic.com](https://www.anthropic.com/news/claude-3-5-sonnet)| |reka-core|Reka AI|1+ Providers|[reka.ai](https://www.reka.ai/ourmodels)| |blackboxai|Blackbox AI|1+ Providers|[docs.blackbox.chat](https://docs.blackbox.chat/blackbox-ai-1)| |blackboxai-pro|Blackbox AI|1+ Providers|[docs.blackbox.chat](https://docs.blackbox.chat/blackbox-ai-1)| diff --git a/g4f/Provider/Blackbox.py b/g4f/Provider/Blackbox.py index 55905ecc..823ffe80 100644 --- a/g4f/Provider/Blackbox.py +++ b/g4f/Provider/Blackbox.py @@ -16,6 +16,7 @@ from ..image import to_data_uri from ..cookies import get_cookies_dir from .helper import format_prompt, format_image_prompt from ..providers.response import JsonConversation, ImageResponse +from ..errors import ModelNotSupportedError class Conversation(JsonConversation): validated_value: str = None @@ -39,9 +40,12 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin): default_vision_model = default_model default_image_model = 'ImageGeneration' image_models = [default_image_model] + + premium_models = ['claude-sonnet-3.5'] + vision_models = [default_vision_model, 'gpt-4o', 'o3-mini', 'gemini-pro', 'gemini-1.5-flash', 'llama-3.1-8b', 'llama-3.1-70b', 'llama-3.1-405b', 'Gemini-Flash-2.0'] - userSelectedModel = ['gpt-4o', 'o3-mini', 'gemini-pro', 'claude-sonnet-3.5', 'DeepSeek-V3', 'DeepSeek-R1', 'blackboxai-pro', 'Meta-Llama-3.3-70B-Instruct-Turbo', 'Mistral-Small-24B-Instruct-2501', 'DeepSeek-LLM-Chat-(67B)', 'DBRX-Instruct', 'Qwen-QwQ-32B-Preview', 'Nous-Hermes-2-Mixtral-8x7B-DPO', 'Gemini-Flash-2.0'] + userSelectedModel = ['gpt-4o', 'o3-mini', 'gemini-pro', 'DeepSeek-V3', 'DeepSeek-R1', 'blackboxai-pro', 'Meta-Llama-3.3-70B-Instruct-Turbo', 'Mistral-Small-24B-Instruct-2501', 'DeepSeek-LLM-Chat-(67B)', 'DBRX-Instruct', 'Qwen-QwQ-32B-Preview', 'Nous-Hermes-2-Mixtral-8x7B-DPO', 'Gemini-Flash-2.0'] + premium_models agentMode = { 'DeepSeek-V3': {'mode': True, 'id': "deepseek-chat", 'name': "DeepSeek-V3"}, @@ -99,7 +103,7 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin): model_aliases = { "gpt-4": "gpt-4o", - "claude-3.5-sonnet": "claude-sonnet-3.5", + "claude-3.5-sonnet": "claude-sonnet-3.5", # Premium "gemini-1.5-flash": "gemini-1.5-flash", "gemini-1.5-pro": "gemini-pro", "deepseek-v3": "DeepSeek-V3", @@ -114,6 +118,24 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin): "flux": "ImageGeneration", } + @classmethod + def get_models(cls) -> list[str]: + models = super().get_models() + return [f"{m} (Premium)" for m in models if m in cls.premium_models] + models + + @classmethod + def get_model(cls, model: str, **kwargs) -> str: + if model.endswith(" (Premium)"): + raise ModelNotSupportedError(f"Model {model} is not supported") + try: + base_model = model.split(" (Premium)")[0] + if base_model in cls.premium_models: + return base_model + return super().get_model(base_model, **kwargs) + + except ModelNotSupportedError: + raise + @classmethod async def fetch_validated(cls, url: str = "https://www.blackbox.ai", force_refresh: bool = False) -> Optional[str]: cache_file = Path(get_cookies_dir()) / 'blackbox.json' diff --git a/g4f/models.py b/g4f/models.py index 5d9b138d..eb5c8a79 100644 --- a/g4f/models.py +++ b/g4f/models.py @@ -363,7 +363,7 @@ claude_3_opus = Model( claude_3_5_sonnet = Model( name = 'claude-3.5-sonnet', base_provider = 'Anthropic', - best_provider = IterListProvider([Blackbox, Jmuz, Liaobots]) + best_provider = IterListProvider([Jmuz, Liaobots]) ) ### Reka AI ### -- cgit v1.2.3