From a7f19ea588134dc32d7370dfcf313491502afe52 Mon Sep 17 00:00:00 2001 From: kqlio67 <> Date: Mon, 10 Feb 2025 13:35:20 +0200 Subject: refactor(g4f/Provider/CablyAI.py > g4f/Provider/needs_auth/CablyAI.py): restructure provider and simplify model handling --- docs/providers-and-models.md | 16 +++---- g4f/Provider/CablyAI.py | 87 ------------------------------------- g4f/Provider/__init__.py | 1 - g4f/Provider/needs_auth/CablyAI.py | 42 ++++++++++++++++++ g4f/Provider/needs_auth/__init__.py | 1 + g4f/models.py | 31 +++---------- 6 files changed, 57 insertions(+), 121 deletions(-) delete mode 100644 g4f/Provider/CablyAI.py create mode 100644 g4f/Provider/needs_auth/CablyAI.py diff --git a/docs/providers-and-models.md b/docs/providers-and-models.md index 3e89f50a..cc4e724e 100644 --- a/docs/providers-and-models.md +++ b/docs/providers-and-models.md @@ -40,7 +40,6 @@ This document provides an overview of various AI providers and models, including |[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)| |[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)| -|[cablyai.com](https://cablyai.com)|Optional API key|`g4f.Provider.CablyAI`|`gpt-4o-mini, llama-3.1-8b, deepseek-v3, deepseek-r1, hermes-3, o3-mini-low, o3-mini, sonar-reasoning` _**(2+)**_|❌|❌|✔|![](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)| |[chatgpt.es](https://chatgpt.es)|No auth required|`g4f.Provider.ChatGptEs`|`gpt-4, gpt-4o, gpt-4o-mini`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)| @@ -90,6 +89,7 @@ This document provides an overview of various AI providers and models, including |----------|-------------|--------------|---------------|--------|--------|------|------| |[console.anthropic.com](https://console.anthropic.com)|[Get API key](https://console.anthropic.com/settings/keys)|`g4f.Provider.Anthropic`|✔ _**(8+)**_|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)| |[bing.com/images/create](https://www.bing.com/images/create)|[Manual cookies](https://www.bing.com)|`g4f.Provider.BingCreateImages`|❌|`dall-e-3`|❌|❌|![](https://img.shields.io/badge/Active-brightgreen)| +|[cablyai.com/chat](https://cablyai.com/chat)|[Get API key](https://cablyai.com)|`g4f.Provider.CablyAI`|✔|✔|✔|✔|![](https://img.shields.io/badge/Active-brightgreen)| |[inference.cerebras.ai](https://inference.cerebras.ai/)|[Get API key](https://cloud.cerebras.ai)|`g4f.Provider.Cerebras`|✔ _**(3+)**_|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)| |[copilot.microsoft.com](https://copilot.microsoft.com)|[Manual cookies](https://copilot.microsoft.com)|`g4f.Provider.CopilotAccount`|✔ _**(1+)**_|✔ _**(1+)**_|✔ _**(1+)**_|✔|![](https://img.shields.io/badge/Active-brightgreen)| |[deepinfra.com](https://deepinfra.com)|[Get API key](https://deepinfra.com/dash/api_keys)|`g4f.Provider.DeepInfra`|✔ _**(17+)**_|✔ _**(6+)**_|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)| @@ -124,18 +124,17 @@ This document provides an overview of various AI providers and models, including |-------|---------------|-----------|---------| |gpt-4|OpenAI|9+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-4-turbo-and-gpt-4)| |gpt-4o|OpenAI|7+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-4o)| -|gpt-4o-mini|OpenAI|8+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-4o-mini)| +|gpt-4o-mini|OpenAI|7+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-4o-mini)| |o1|OpenAI|1+ Providers|[openai.com](https://openai.com/index/introducing-openai-o1-preview/)| |o1-preview|OpenAI|1+ Providers|[openai.com](https://openai.com/index/introducing-openai-o1-preview/)| |o1-mini|OpenAI|1+ Providers|[openai.com](https://openai.com/index/openai-o1-mini-advancing-cost-efficient-reasoning/)| -|o3-mini|OpenAI|2+ Providers|[openai.com](https://openai.com/index/openai-o3-mini/)| -|o3-mini-low|OpenAI|1+ Providers|[openai.com](https://openai.com/index/openai-o3-mini/)| +|o3-mini|OpenAI|1+ Providers|[openai.com](https://openai.com/index/openai-o3-mini/)| |gigachat|GigaChat|1+ Providers|[developers.sber.ru/gigachat](https://developers.sber.ru/gigachat)| |meta-ai|Meta|1+ Providers|[ai.meta.com](https://ai.meta.com/)| |llama-2-7b|Meta Llama|1+ Providers|[huggingface.co](https://huggingface.co/meta-llama/Llama-2-7b)| |llama-3-8b|Meta Llama|2+ Providers|[ai.meta.com](https://ai.meta.com/blog/meta-llama-3/)| |llama-3-70b|Meta Llama|1+ Providers|[huggingface.co](https://huggingface.co/meta-llama/Meta-Llama-3-70B)| -|llama-3.1-8b|Meta Llama|7+ Providers|[ai.meta.com](https://ai.meta.com/blog/meta-llama-3-1/)| +|llama-3.1-8b|Meta Llama|6+ Providers|[ai.meta.com](https://ai.meta.com/blog/meta-llama-3-1/)| |llama-3.1-70b|Meta Llama|5+ Providers|[ai.meta.com](https://ai.meta.com/blog/meta-llama-3-1/)| |llama-3.1-405b|Meta Llama|2+ Providers|[huggingface.co](https://huggingface.co/meta-llama/Llama-3.1-405B)| |llama-3.2-1b|Meta Llama|1+ Providers|[huggingface.co](https://huggingface.co/meta-llama/Llama-3.2-1B)| @@ -148,7 +147,6 @@ This document provides an overview of various AI providers and models, including |mistral-nemo|Mistral|3+ Providers|[huggingface.co](https://huggingface.co/mistralai/Mistral-Nemo-Instruct-2407)| |mixtral-small-28b|Mistral|3+ Providers|[mistral.ai](https://mistral.ai/news/mixtral-small-28b/)| |hermes-2-dpo|NousResearch|2+ Providers|[huggingface.co](https://huggingface.co/NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO)| -|hermes-3|NousResearch|1+ Providers|[huggingface.co](https://huggingface.co/NousResearch/Hermes-3-Llama-3.2-3B)| |phi-3.5-mini|Microsoft|1+ Providers|[huggingface.co](https://huggingface.co/microsoft/Phi-3.5-mini-instruct)| |phi-4|Microsoft|1+ Providers|[techcommunity.microsoft.com](https://techcommunity.microsoft.com/blog/aiplatformblog/introducing-phi-4-microsoft%E2%80%99s-newest-small-language-model-specializing-in-comple/4357090)| |wizardlm-2-7b|Microsoft|1+ Providers|[wizardlm.github.io](https://wizardlm.github.io/WizardLM2/)| @@ -179,12 +177,12 @@ This document provides an overview of various AI providers and models, including |qvq-72b|Qwen|1+ Providers|[huggingface.co](https://huggingface.co/Qwen/QVQ-72B-Preview)| |pi|Inflection|1+ Providers|[inflection.ai](https://inflection.ai/blog/inflection-2-5)| |deepseek-chat|DeepSeek|4+ Providers|[huggingface.co](https://huggingface.co/deepseek-ai/deepseek-llm-67b-chat)| -|deepseek-v3|DeepSeek|5+ Providers|[api-docs.deepseek.com](https://api-docs.deepseek.com/news/news250120)| -|deepseek-r1|DeepSeek|10+ Providers|[api-docs.deepseek.com](https://api-docs.deepseek.com/news/news250120)| +|deepseek-v3|DeepSeek|4+ Providers|[api-docs.deepseek.com](https://api-docs.deepseek.com/news/news250120)| +|deepseek-r1|DeepSeek|9+ Providers|[api-docs.deepseek.com](https://api-docs.deepseek.com/news/news250120)| |grok-2|x.ai|1+|[x.ai](https://x.ai/blog/grok-2)| |sonar|Perplexity AI|1+ Providers|[sonar.perplexity.ai](https://sonar.perplexity.ai/)| |sonar-pro|Perplexity AI|1+ Providers|[sonar.perplexity.ai](https://sonar.perplexity.ai/)| -|sonar-reasoning|Perplexity AI|2+ Providers|[sonar.perplexity.ai](https://sonar.perplexity.ai/)| +|sonar-reasoning|Perplexity AI|1+ Providers|[sonar.perplexity.ai](https://sonar.perplexity.ai/)| |sonar-reasoning-pro|Perplexity AI|1+ Providers|[sonar.perplexity.ai](https://sonar.perplexity.ai/)| |nemotron-70b|Nvidia|2+ Providers|[build.nvidia.com](https://build.nvidia.com/nvidia/llama-3_1-nemotron-70b-instruct)| |dbrx-instruct|Databricks|3+ Providers|[huggingface.co](https://huggingface.co/databricks/dbrx-instruct)| diff --git a/g4f/Provider/CablyAI.py b/g4f/Provider/CablyAI.py deleted file mode 100644 index 2dc17da6..00000000 --- a/g4f/Provider/CablyAI.py +++ /dev/null @@ -1,87 +0,0 @@ -from __future__ import annotations - -from ..errors import ModelNotSupportedError -from .template import OpenaiTemplate - -class CablyAI(OpenaiTemplate): - url = "https://cablyai.com/chat" - login_url = "https://cablyai.com" - api_base = "https://cablyai.com/v1" - api_key = "sk-your-openai-api-key" - - working = True - needs_auth = False - supports_stream = True - supports_system_message = True - supports_message_history = True - - default_model = 'gpt-4o-mini' - fallback_models = [ - default_model, - 'searchgpt', - 'deepseek-r1-uncensored', - 'deepseek-r1', - 'deepseek-reasoner', - 'deepseek-v3', - 'andy-3.5', - 'hermes-3-llama-3.2-3b', - 'llama-3.1-8b-instruct', - 'o3-mini', - 'o3-mini-low', - 'sonar-reasoning', - 'tinyswallow1.5b', - ] - - model_aliases = { - "gpt-4o-mini": "searchgpt (free)", - "deepseek-r1": "deepseek-r1-uncensored (free)", - "deepseek-r1": "deepseek-reasoner (free)", - "hermes-3": "hermes-3-llama-3.2-3b (free)", - "llama-3.1-8b": "llama-3.1-8b-instruct (free)", - "o3-mini-low": "o3-mini-low (free)", - "o3-mini": "o3-mini-low (free)", - "o3-mini": "o3-mini (free)", - } - - @classmethod - def get_models(cls, api_key: str = None, api_base: str = None) -> list[str]: - models = super().get_models(api_key, api_base); - return [f"{m} (free)" for m in models if m in cls.fallback_models] + models - - @classmethod - def get_model(cls, model: str, **kwargs) -> str: - try: - model = super().get_model(model, **kwargs) - return model.split(" (free)")[0] - except ModelNotSupportedError: - if f"f{model} (free)" in cls.models: - return model - raise - - @classmethod - def create_async_generator( - cls, - model: str, - messages: Messages, - api_key: str = None, - stream: bool = True, - **kwargs - ) -> AsyncResult: - api_key = api_key or cls.api_key - headers = { - "Accept": "*/*", - "Accept-Language": "en-US,en;q=0.9", - "Authorization": f"Bearer {api_key}", - "Content-Type": "application/json", - "Origin": cls.url, - "Referer": f"{cls.url}/chat", - "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" - } - return super().create_async_generator( - model=model, - messages=messages, - api_key=api_key, - stream=stream, - headers=headers, - **kwargs - ) diff --git a/g4f/Provider/__init__.py b/g4f/Provider/__init__.py index 923d86e4..11cf12c0 100644 --- a/g4f/Provider/__init__.py +++ b/g4f/Provider/__init__.py @@ -16,7 +16,6 @@ from .template import OpenaiTemplate, BackendApi from .Blackbox import Blackbox from .BlackboxAPI import BlackboxAPI -from .CablyAI import CablyAI from .ChatGLM import ChatGLM from .ChatGpt import ChatGpt from .ChatGptEs import ChatGptEs diff --git a/g4f/Provider/needs_auth/CablyAI.py b/g4f/Provider/needs_auth/CablyAI.py new file mode 100644 index 00000000..bc81f8d4 --- /dev/null +++ b/g4f/Provider/needs_auth/CablyAI.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from ...errors import ModelNotSupportedError +from ..template import OpenaiTemplate + +class CablyAI(OpenaiTemplate): + url = "https://cablyai.com/chat" + login_url = "https://cablyai.com" + api_base = "https://cablyai.com/v1" + + working = True + needs_auth = False + supports_stream = True + supports_system_message = True + supports_message_history = True + + @classmethod + def create_async_generator( + cls, + model: str, + messages: Messages, + api_key: str = None, + stream: bool = False, + **kwargs + ) -> AsyncResult: + headers = { + "Accept": "*/*", + "Accept-Language": "en-US,en;q=0.9", + "Authorization": f"Bearer {api_key}", + "Content-Type": "application/json", + "Origin": cls.url, + "Referer": f"{cls.url}/chat", + "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" + } + return super().create_async_generator( + model=model, + messages=messages, + api_key=api_key, + stream=stream, + headers=headers, + **kwargs + ) diff --git a/g4f/Provider/needs_auth/__init__.py b/g4f/Provider/needs_auth/__init__.py index e00e3b1f..d3d67ff9 100644 --- a/g4f/Provider/needs_auth/__init__.py +++ b/g4f/Provider/needs_auth/__init__.py @@ -1,5 +1,6 @@ from .Anthropic import Anthropic from .BingCreateImages import BingCreateImages +from .CablyAI import CablyAI from .Cerebras import Cerebras from .CopilotAccount import CopilotAccount from .Custom import Custom diff --git a/g4f/models.py b/g4f/models.py index 8772b9bd..5d9b138d 100644 --- a/g4f/models.py +++ b/g4f/models.py @@ -7,7 +7,6 @@ from .Provider import ( ### no auth required ### Blackbox, BlackboxAPI, - CablyAI, ChatGLM, ChatGptEs, Cloudflare, @@ -81,10 +80,9 @@ default = Model( DeepInfraChat, ChatGptEs, PollinationsAI, - Jmuz, - CablyAI, OIVSCode, OpenaiChat, + Jmuz, Cloudflare, ]) ) @@ -128,7 +126,7 @@ gpt_4o = VisionModel( gpt_4o_mini = Model( name = 'gpt-4o-mini', base_provider = 'OpenAI', - best_provider = IterListProvider([DDG, ChatGptEs, Jmuz, PollinationsAI, OIVSCode, CablyAI, Liaobots, OpenaiChat]) + best_provider = IterListProvider([DDG, ChatGptEs, Jmuz, PollinationsAI, OIVSCode, Liaobots, OpenaiChat]) ) # o1 @@ -154,13 +152,7 @@ o1_mini = Model( o3_mini = Model( name = 'o3-mini', base_provider = 'OpenAI', - best_provider = IterListProvider([Blackbox, CablyAI]) -) - -o3_mini_low = Model( - name = 'o3-mini-low', - base_provider = 'OpenAI', - best_provider = CablyAI + best_provider = Blackbox ) ### GigaChat ### @@ -200,7 +192,7 @@ llama_3_70b = Model( llama_3_1_8b = Model( name = "llama-3.1-8b", base_provider = "Meta Llama", - best_provider = IterListProvider([Blackbox, DeepInfraChat, Glider, Jmuz, PollinationsAI, CablyAI, Cloudflare]) + best_provider = IterListProvider([Blackbox, DeepInfraChat, Glider, Jmuz, PollinationsAI, Cloudflare]) ) llama_3_1_70b = Model( @@ -278,13 +270,6 @@ hermes_2_dpo = Model( best_provider = IterListProvider([Blackbox, BlackboxAPI]) ) -hermes_3 = Model( - name = "hermes-3", - base_provider = "NousResearch", - best_provider = CablyAI -) - - ### Microsoft ### # phi phi_3_5_mini = Model( @@ -481,13 +466,13 @@ deepseek_chat = Model( deepseek_v3 = Model( name = 'deepseek-v3', base_provider = 'DeepSeek', - best_provider = IterListProvider([Blackbox, BlackboxAPI, DeepInfraChat, CablyAI, Liaobots]) + best_provider = IterListProvider([Blackbox, BlackboxAPI, DeepInfraChat, Liaobots]) ) deepseek_r1 = Model( name = 'deepseek-r1', base_provider = 'DeepSeek', - best_provider = IterListProvider([Blackbox, BlackboxAPI, DeepInfraChat, Glider, PollinationsAI, Jmuz, CablyAI, Liaobots, HuggingChat, HuggingFace]) + best_provider = IterListProvider([Blackbox, BlackboxAPI, DeepInfraChat, Glider, PollinationsAI, Jmuz, Liaobots, HuggingChat, HuggingFace]) ) ### x.ai ### @@ -513,7 +498,7 @@ sonar_pro = Model( sonar_reasoning = Model( name = 'sonar-reasoning', base_provider = 'Perplexity AI', - best_provider = IterListProvider([PerplexityLabs, CablyAI]) + best_provider = PerplexityLabs ) sonar_reasoning_pro = Model( @@ -683,7 +668,6 @@ class ModelUtils: # o3 o3_mini.name: o3_mini, - o3_mini_low.name: o3_mini_low, ### Meta ### meta.name: meta, @@ -717,7 +701,6 @@ class ModelUtils: ### NousResearch ### hermes_2_dpo.name: hermes_2_dpo, - hermes_3.name: hermes_3, ### Microsoft ### # phi -- cgit v1.2.3