XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/gpt4free

Added new models and providers, improved interface components, improved providers (#2646)

* Fix conflict g4f/gui/client/static/css/style.css g4f/gui/client/static/js/chat.v1.js g4f/models.py g4f/Provider/. * Update g4f/Provider/Blackbox.py * Update g4f/Provider/PollinationsAI.py * Update docs/providers-and-models.md * Disabled provider 'AIUncensored' * Two providers 'AIChatFree, AutonomousAI' are disabled --------- Co-authored-by: kqlio67 <>

3b091647
kqlio67 <166700875+kqlio67@users.noreply.github.com>
提交于

代码差异

14 个文件 +390 -196
Modified docs/providers-and-models.md +42 -34
@@ -38,7 +38,6 @@ This document provides an overview of various AI providers and models, including
38 38 | Website | API Credentials | Provider | Text Models | Image Models | Vision (Image Upload) | Stream | Status |
39 39 |----------|-------------|--------------|---------------|--------|--------|------|------|
40 40 |[aichatfree.info](https://aichatfree.info)|No auth required|`g4f.Provider.AIChatFree`|`gemini-1.5-pro` _**(1+)**_|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
41 |[aiuncensored.info/ai_uncensored](https://www.aiuncensored.info/ai_uncensored)|Optional API key|`g4f.Provider.AIUncensored`|`hermes-3`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
42 41 |[autonomous.ai](https://www.autonomous.ai/anon/)|No auth required|`g4f.Provider.AutonomousAI`|`llama-3.3-70b, qwen-2.5-coder-32b, hermes-3, llama-3.2-90b, llama-3.3-70b, llama-3-2-70b`|✔|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
43 42 |[blackbox.ai](https://www.blackbox.ai)|No auth required|`g4f.Provider.Blackbox`|`blackboxai, gpt-4, gpt-4o, gemini-1.5-flash, gemini-1.5-pro, claude-3.5-sonnet, blackboxai-pro, llama-3.1-8b, llama-3.1-70b, llama-3-1-405b, llama-3.3-70b, mixtral-7b, deepseek-chat, dbrx-instruct, qwq-32b, hermes-2-dpo, deepseek-r1` _**(+31)**_|`flux`|`blackboxai, gpt-4o, gemini-1.5-pro, gemini-1.5-flash, llama-3.1-8b, llama-3.1-70b, llama-3.1-405b`|✔|![](https://img.shields.io/badge/Active-brightgreen)|
44 43 |[cablyai.com](https://cablyai.com)|No auth required|`g4f.Provider.CablyAI`|`cably-80b`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
@@ -54,7 +53,9 @@ This document provides an overview of various AI providers and models, including
54 53 |[chat10.free2gpt.xyz](https://chat10.free2gpt.xyz)|No auth required|`g4f.Provider.Free2GPT`|`mistral-7b`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
55 54 |[freegptsnav.aifree.site](https://freegptsnav.aifree.site)|No auth required|`g4f.Provider.FreeGpt`|`gemini-1.5-pro`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
56 55 |[app.giz.ai/assistant](https://app.giz.ai/assistant)|No auth required|`g4f.Provider.GizAI`|`gemini-1.5-flash`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
56 |[glider.so](https://glider.so)|No auth required|`g4f.Provider.Glider`|`llama-3.1-70b, llama-3.1-8b, llama-3.2-3b, deepseek-r1`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
57 57 |[gprochat.com](https://gprochat.com)|No auth required|`g4f.Provider.GPROChat`|`gemini-1.5-pro`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
58 |[hailuo.ai](https://www.hailuo.ai)|No auth required|`g4f.Provider.HailuoAI`|`MiniMax` _**(1)**_|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
58 59 |[editor.imagelabs.net](https://editor.imagelabs.net)|No auth required|`g4f.Provider.ImageLabs`|`gemini-1.5-pro`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
59 60 |[editor.imagelabs.net](editor.imagelabs.net)|No auth required|`g4f.Provider.ImageLabs`|❌|`sdxl-turbo`|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
60 61 |[huggingface.co/spaces](https://huggingface.co/spaces)|Optional API key|`g4f.Provider.HuggingSpace`|`qvq-72b, qwen-2-72b, command-r, command-r-plus, command-r7b`|`flux-dev, flux-schnell, sd-3.5`|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
@@ -78,7 +79,9 @@ This document provides an overview of various AI providers and models, including
78 79 |[black-forest-labs-flux-1-dev.hf.space](https://black-forest-labs-flux-1-dev.hf.space)|[Get API key](https://huggingface.co/settings/tokens)|`g4f.Provider.BlackForestLabsFlux1Dev`|❌|`flux-dev`|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
79 80 |[black-forest-labs-flux-1-schnell.hf.space](https://black-forest-labs-flux-1-schnell.hf.space)|[Get API key](https://huggingface.co/settings/tokens)|`g4f.Provider.BlackForestLabsFlux1Schnell`|❌|`flux-schnell`|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
80 81 |[cohereforai-c4ai-command.hf.space](https://cohereforai-c4ai-command.hf.space)|[Get API key](https://huggingface.co/settings/tokens)|`g4f.Provider.CohereForAI`|`command-r, command-r-plus, command-r7b`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
82 |[huggingface.co/spaces/deepseek-ai/Janus-Pro-7B](https://huggingface.co/spaces/deepseek-ai/Janus-Pro-7B)|[Get API key](https://huggingface.co/settings/tokens)|`g4f.Provider.Janus_Pro_7B`|✔|✔|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
81 83 |[qwen-qvq-72b-preview.hf.space](https://qwen-qvq-72b-preview.hf.space)|[Get API key](https://huggingface.co/settings/tokens)|`g4f.Provider.Qwen_QVQ_72B`|`qvq-72b`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
84 |[qwen-qwen2-5-1m-demo.hf.space](https://qwen-qwen2-5-1m-demo.hf.space)|[Get API key](https://huggingface.co/settings/tokens)|`g4f.Provider.Qwen_Qwen_2_5M_Demo`|`qwen-2.5-1m-demo`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
82 85 |[qwen-qwen2-72b-instruct.hf.space](https://qwen-qwen2-72b-instruct.hf.space)|[Get API key](https://huggingface.co/settings/tokens)|`g4f.Provider.Qwen_Qwen_2_72B_Instruct`|`qwen-2-72b`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
83 86 |[stabilityai-stable-diffusion-3-5-large.hf.space](https://stabilityai-stable-diffusion-3-5-large.hf.space)|[Get API key](https://huggingface.co/settings/tokens)|`g4f.Provider.StableDiffusion35Large`|❌|`sd-3.5`|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
84 87 |[voodoohop-flux-1-schnell.hf.space](https://voodoohop-flux-1-schnell.hf.space)|[Get API key](https://huggingface.co/settings/tokens)|`g4f.Provider.VoodoohopFlux1Schnell`|❌|`flux-schnell`|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
@@ -105,6 +108,7 @@ This document provides an overview of various AI providers and models, including
105 108 |[meta.ai](https://www.meta.ai)|[Manual cookies](https://www.meta.ai)|`g4f.Provider.MetaAI`|`meta-ai`|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|✔|
106 109 |[meta.ai](https://www.meta.ai)|[Manual cookies](https://www.meta.ai)|`g4f.Provider.MetaAIAccount`|❌|`meta-ai`|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
107 110 |[designer.microsoft.com](https://designer.microsoft.com)|[Manual cookies](https://designer.microsoft.com)|`g4f.Provider.MicrosoftDesigner`|❌|`dall-e-3`|❌|❌|![](https://img.shields.io/badge/Active-brightgreen)|
111 |[hailuo.ai/chat](https://www.hailuo.ai/chat)|[Get API key](https://intl.minimaxi.com/user-center/basic-information/interface-key)|`g4f.Provider.MiniMax`|`MiniMax` _**(1)**_|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
108 112 |[platform.openai.com](https://platform.openai.com)|[Get API key](https://platform.openai.com/settings/organization/api-keys)|`g4f.Provider.OpenaiAPI`|✔|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
109 113 |[chatgpt.com](https://chatgpt.com)|[Manual cookies](https://chatgpt.com)|`g4f.Provider.OpenaiChat`|`gpt-4o, gpt-4o-mini, gpt-4` _**(8+)**_|✔_**(1)**_|✔_**(8+)**_|✔|![](https://img.shields.io/badge/Active-brightgreen)|
110 114 |[perplexity.ai](https://www.perplexity.ai)|[Get API key](https://www.perplexity.ai/settings/api)|`g4f.Provider.PerplexityApi`|✔ _**(6+)**_|❌|❌|✔|![](https://img.shields.io/badge/Active-brightgreen)|
@@ -120,41 +124,40 @@ This document provides an overview of various AI providers and models, including
120 124 ### Text Models
121 125 | Model | Base Provider | Providers | Website |
122 126 |-------|---------------|-----------|---------|
123 |gpt-3|OpenAI|2+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-3-5-turbo)|
124 |gpt-3.5-turbo|OpenAI|2+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-3-5-turbo)|
125 |gpt-4|OpenAI|10+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-4-turbo-and-gpt-4)|
126 |gpt-4o|OpenAI|10+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-4o)|
127 |gpt-4o-mini|OpenAI|9+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-4o-mini)|
128 |o1|OpenAI|1+ Providers|[platform.openai.com](https://openai.com/index/introducing-openai-o1-preview/)|
129 |o1-preview|OpenAI|1+ Providers|[platform.openai.com](https://openai.com/index/introducing-openai-o1-preview/)|
130 |o1-mini|OpenAI|1+ Providers|[platform.openai.com](https://openai.com/index/openai-o1-mini-advancing-cost-efficient-reasoning/)|
131 |gigachat|1+ Providers|[developers.sber.ru/gigachat](https://developers.sber.ru/gigachat)|
127 |gpt-3|OpenAI|1+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-3-5-turbo)|
128 |gpt-3.5-turbo|OpenAI|1+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-3-5-turbo)|
129 |gpt-4|OpenAI|11+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-4-turbo-and-gpt-4)|
130 |gpt-4o|OpenAI|9+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-4o)|
131 |gpt-4o-mini|OpenAI|8+ Providers|[platform.openai.com](https://platform.openai.com/docs/models/gpt-4o-mini)|
132 |o1|OpenAI|1+ Providers|[openai.com](https://openai.com/index/introducing-openai-o1-preview/)|
133 |o1-preview|OpenAI|1+ Providers|[openai.com](https://openai.com/index/introducing-openai-o1-preview/)|
134 |o1-mini|OpenAI|1+ Providers|[openai.com](https://openai.com/index/openai-o1-mini-advancing-cost-efficient-reasoning/)|
135 |gigachat|GigaChat|1+ Providers|[developers.sber.ru/gigachat](https://developers.sber.ru/gigachat)|
132 136 |meta-ai|Meta|1+ Providers|[ai.meta.com](https://ai.meta.com/)|
133 |llama-2-7b|Meta Llama|2+ Providers|[huggingface.co](https://huggingface.co/meta-llama/Llama-2-7b)|
137 |llama-2-7b|Meta Llama|1+ Providers|[huggingface.co](https://huggingface.co/meta-llama/Llama-2-7b)|
134 138 |llama-3-8b|Meta Llama|2+ Providers|[ai.meta.com](https://ai.meta.com/blog/meta-llama-3/)|
135 139 |llama-3-70b|Meta Llama|1+ Providers|[huggingface.co](https://huggingface.co/meta-llama/Meta-Llama-3-70B)|
136 140 |llama-3.1-8b|Meta Llama|6+ Providers|[ai.meta.com](https://ai.meta.com/blog/meta-llama-3-1/)|
137 141 |llama-3.1-70b|Meta Llama|6+ Providers|[ai.meta.com](https://ai.meta.com/blog/meta-llama-3-1/)|
138 142 |llama-3.1-405b|Meta Llama|2+ Providers|[huggingface.co](https://huggingface.co/meta-llama/Llama-3.1-405B)|
139 143 |llama-3.2-1b|Meta Llama|1+ Providers|[huggingface.co](https://huggingface.co/meta-llama/Llama-3.2-1B)|
144 |llama-3.2-3b|Meta Llama|1+ Providers|[huggingface.co](https://huggingface.co/meta-llama/Llama-3.2-3B)|
140 145 |llama-3.2-11b|Meta Llama|3+ Providers|[ai.meta.com](https://ai.meta.com/blog/llama-3-2-connect-2024-vision-edge-mobile-devices/)|
141 |llama-3.2-70b|Meta Llama|1+ Providers|[ai.meta.com](https://ai.meta.com/blog/llama-3-2-connect-2024-vision-edge-mobile-devices/)|
142 |llama-3.2-90b|Meta Llama|2+ Providers|[huggingface.co](https://huggingface.co/meta-llama/Llama-3.2-90B-Vision)|
143 |llama-3.3-70b|Meta Llama|8+ Providers|[]( )|
144 |mixtral-7b|Mistral AI|1+ Providers|[mistral.ai](https://mistral.ai/news/mixtral-of-experts/)|
145 |mixtral-8x7b|Mistral AI|2+ Providers|[mistral.ai](https://mistral.ai/news/mixtral-of-experts/)|
146 |mistral-nemo|Mistral AI|3+ Providers|[huggingface.co](https://huggingface.co/mistralai/Mistral-Nemo-Instruct-2407)|
147 |hermes-2-dpo|NousResearch|2+ Providers|[huggingface.co](https://huggingface.co/NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO)|
148 |hermes-3|NousResearch|2+ Providers|[nousresearch.com](https://nousresearch.com/hermes3/)|
146 |llama-3.2-90b|Meta Llama|1+ Providers|[huggingface.co](https://huggingface.co/meta-llama/Llama-3.2-90B-Vision)|
147 |llama-3.3-70b|Meta Llama|6+ Providers|[ai.meta.com](https://ai.meta.com/blog/llama-3-3/)|
148 |mixtral-7b|Mistral|1+|[mistral.ai](https://mistral.ai/news/mixtral-of-experts/)|
149 |mixtral-8x7b|Mistral|2+ Providers|[mistral.ai](https://mistral.ai/news/mixtral-of-experts/)|
150 |mistral-nemo|Mistral|3+ Providers|[huggingface.co](https://huggingface.co/mistralai/Mistral-Nemo-Instruct-2407)|
151 |hermes-2-dpo|NousResearch|1+ Providers|[huggingface.co](https://huggingface.co/NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO)|
149 152 |phi-3.5-mini|Microsoft|1+ Providers|[huggingface.co](https://huggingface.co/microsoft/Phi-3.5-mini-instruct)|
150 153 |wizardlm-2-7b|Microsoft|1+ Providers|[wizardlm.github.io](https://wizardlm.github.io/WizardLM2/)|
151 154 |wizardlm-2-8x22b|Microsoft|2+ Providers|[wizardlm.github.io](https://wizardlm.github.io/WizardLM2/)|
152 |gemini|Google DeepMind|1+ Providers|[deepmind.google](http://deepmind.google/technologies/gemini/)|
155 |gemini|Google DeepMind|1+|[deepmind.google](http://deepmind.google/technologies/gemini/)|
153 156 |gemini-exp|Google DeepMind|1+ Providers|[blog.google](https://blog.google/feed/gemini-exp-1206/)|
154 157 |gemini-1.5-flash|Google DeepMind|5+ Providers|[deepmind.google](https://deepmind.google/technologies/gemini/flash/)|
155 |gemini-1.5-pro|Google DeepMind|7+ Providers|[deepmind.google](https://deepmind.google/technologies/gemini/pro/)|
158 |gemini-1.5-pro|Google DeepMind|6+ Providers|[deepmind.google](https://deepmind.google/technologies/gemini/pro/)|
156 159 |gemini-2.0-flash|Google DeepMind|2+ Providers|[deepmind.google](https://deepmind.google/technologies/gemini/flash/)|
157 |gemini-2.0-flash-thinking|Google DeepMind|1+ Providers|[deepmind.google](https://ai.google.dev/gemini-api/docs/thinking-mode)|
160 |gemini-2.0-flash-thinking|Google DeepMind|1+ Providers|[ai.google.dev](https://ai.google.dev/gemini-api/docs/thinking-mode)|
158 161 |claude-3-haiku|Anthropic|2+ Providers|[anthropic.com](https://www.anthropic.com/news/claude-3-haiku)|
159 162 |claude-3-sonnet|Anthropic|1+ Providers|[anthropic.com](https://www.anthropic.com/news/claude-3-family)|
160 163 |claude-3-opus|Anthropic|2+ Providers|[anthropic.com](https://www.anthropic.com/news/claude-3-family)|
@@ -162,36 +165,41 @@ This document provides an overview of various AI providers and models, including
162 165 |reka-core|Reka AI|1+ Providers|[reka.ai](https://www.reka.ai/ourmodels)|
163 166 |blackboxai|Blackbox AI|1+ Providers|[docs.blackbox.chat](https://docs.blackbox.chat/blackbox-ai-1)|
164 167 |blackboxai-pro|Blackbox AI|1+ Providers|[docs.blackbox.chat](https://docs.blackbox.chat/blackbox-ai-1)|
165 |command-r|CohereForAI|1+ Providers|[docs.cohere.com](https://docs.cohere.com/docs/command-r-plus)
166 |command-r-plus|CohereForAI|2+ Providers|[docs.cohere.com](https://docs.cohere.com/docs/command-r-plus)
168 |command-r|CohereForAI|1+ Providers|[docs.cohere.com](https://docs.cohere.com/docs/command-r-plus)|
169 |command-r-plus|CohereForAI|2+ Providers|[docs.cohere.com](https://docs.cohere.com/docs/command-r-plus)|
167 170 |command-r7b|CohereForAI|1+ Providers|[huggingface.co](https://huggingface.co/CohereForAI/c4ai-command-r7b-12-2024)|
168 171 |qwen-1.5-7b|Qwen|1+ Providers|[huggingface.co](https://huggingface.co/Qwen/Qwen1.5-7B)|
169 172 |qwen-2-72b|Qwen|1+ Providers|[huggingface.co](https://huggingface.co/Qwen/Qwen2-72B)|
173 |qwen-2-vl-7b|Qwen|1+ Providers|[huggingface.co](https://huggingface.co/Qwen/Qwen2-VL-7B)|
170 174 |qwen-2.5-72b|Qwen|3+ Providers|[huggingface.co](https://huggingface.co/Qwen/Qwen2.5-72B-Instruct)|
171 |qwen-2.5-coder-32b|Qwen|5+ Providers|[huggingface.co](https://huggingface.co/Qwen/Qwen2.5-Coder-32B)|
175 |qwen-2.5-coder-32b|Qwen|4+ Providers|[huggingface.co](https://huggingface.co/Qwen/Qwen2.5-Coder-32B)|
176 |qwen-2.5-1m-demo|Qwen|1+ Providers|[huggingface.co](https://huggingface.co/Qwen/Qwen2.5-1M-Demo)|
172 177 |qwq-32b|Qwen|4+ Providers|[huggingface.co](https://huggingface.co/Qwen/QwQ-32B-Preview)|
173 178 |qvq-72b|Qwen|1+ Providers|[huggingface.co](https://huggingface.co/Qwen/QVQ-72B-Preview)|
174 179 |pi|Inflection|1+ Providers|[inflection.ai](https://inflection.ai/blog/inflection-2-5)|
175 |deepseek-chat|DeepSeek|4+ Providers|[huggingface.co](https://huggingface.co/deepseek-ai/deepseek-llm-67b-chat)|
176 |deepseek-r1|DeepSeek|5+ Providers|[api-docs.deepseek.com](https://api-docs.deepseek.com/news/news250120)|
177 |grok-2|x.ai|1+ Providers|[x.ai](https://x.ai/blog/grok-2)|
178 |sonar-online|Perplexity AI|1+ Providers|[docs.perplexity.ai](https://docs.perplexity.ai/)|
179 |sonar-chat|Perplexity AI|1+ Providers|[docs.perplexity.ai](https://docs.perplexity.ai/)|
180 |deepseek-chat|DeepSeek|3+ Providers|[huggingface.co](https://huggingface.co/deepseek-ai/deepseek-llm-67b-chat)|
181 |deepseek-v3|DeepSeek|2+ Providers|[api-docs.deepseek.com](https://api-docs.deepseek.com/news/news250120)|
182 |deepseek-r1|DeepSeek|6+ Providers|[api-docs.deepseek.com](https://api-docs.deepseek.com/news/news250120)|
183 |grok-2|x.ai|1+|[x.ai](https://x.ai/blog/grok-2)|
184 |sonar|Perplexity AI|1+ Providers|[docs.perplexity.ai](https://docs.perplexity.ai/)|
185 |sonar-pro|Perplexity AI|1+ Providers|[docs.perplexity.ai](https://docs.perplexity.ai/)|
186 |sonar-reasoning|Perplexity AI|1+ Providers|[docs.perplexity.ai](https://docs.perplexity.ai/)|
180 187 |nemotron-70b|Nvidia|3+ Providers|[build.nvidia.com](https://build.nvidia.com/nvidia/llama-3_1-nemotron-70b-instruct)|
181 |lfm-40b|Liquid|1+ Providers|[liquid.ai](https://www.liquid.ai/liquid-foundation-models)|
182 188 |dbrx-instruct|Databricks|1+ Providers|[huggingface.co](https://huggingface.co/databricks/dbrx-instruct)|
189 |p1|PollinationsAI|1+ Providers|[pollinations.ai](https://pollinations.ai/)|
183 190 |cably-80b|CablyAI|1+ Providers|[cablyai.com](https://cablyai.com)|
184 191 |glm-4|THUDM|1+ Providers|[github.com/THUDM](https://github.com/THUDM/GLM-4)|
185 |evil|Evil Mode - Experimental|1+ Providers|[]( )|
186
192 |mini_max|MiniMax|1+ Providers|[hailuo.ai](https://www.hailuo.ai/)|
193 |evil|Evil Mode - Experimental|1+ Providers||
187 194
188 195 ---
196
189 197 ### Image Models
190 198 | Model | Base Provider | Providers | Website |
191 199 |-------|---------------|-----------|---------|
192 200 |sdxl-turbo|Stability AI|2+ Providers|[huggingface.co](https://huggingface.co/stabilityai/sdxl-turbo)|
193 201 |sd-3.5|Stability AI|1+ Providers|[huggingface.co](https://huggingface.co/stabilityai/stable-diffusion-3.5-large)|
194 |flux|Black Forest Labs|2+ Providers|[github.com/black-forest-labs/flux](https://github.com/black-forest-labs/flux)|
202 |flux|Black Forest Labs|3+ Providers|[github.com/black-forest-labs/flux](https://github.com/black-forest-labs/flux)|
195 203 |flux-pro|Black Forest Labs|1+ Providers|[huggingface.co](https://huggingface.co/enhanceaiteam/FLUX.1-Pro)|
196 204 |flux-dev|Black Forest Labs|3+ Providers|[huggingface.co](https://huggingface.co/black-forest-labs/FLUX.1-dev)|
197 205 |flux-schnell|Black Forest Labs|3+ Providers|[huggingface.co](https://huggingface.co/black-forest-labs/FLUX.1-schnell)|
Modified g4f/Provider/Blackbox.py +55 -57
@@ -1,12 +1,13 @@
1 1 from __future__ import annotations
2 2
3 3 from aiohttp import ClientSession
4
5 4 import re
6 5 import json
7 6 import random
8 7 import string
9 8 from pathlib import Path
9 from typing import Optional
10 from datetime import datetime, timezone
10 11
11 12 from ..typing import AsyncResult, Messages, ImagesType
12 13 from ..requests.raise_for_status import raise_for_status
@@ -14,7 +15,7 @@ from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
14 15 from ..image import ImageResponse, to_data_uri
15 16 from ..cookies import get_cookies_dir
16 17 from .helper import format_prompt, format_image_prompt
17 from ..providers.response import FinishReason, JsonConversation, Reasoning
18 from ..providers.response import JsonConversation, Reasoning
18 19
19 20 class Conversation(JsonConversation):
20 21 validated_value: str = None
@@ -38,13 +39,13 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
38 39 default_vision_model = default_model
39 40 default_image_model = 'ImageGeneration'
40 41 image_models = [default_image_model, "ImageGeneration2"]
41 vision_models = [default_vision_model, 'gpt-4o', 'gemini-pro', 'gemini-1.5-flash', 'llama-3.1-8b', 'llama-3.1-70b', 'llama-3.1-405b']
42 vision_models = [default_vision_model, 'gpt-4o', 'gemini-pro', 'deepseek-v3', 'gemini-1.5-flash', 'llama-3.1-8b', 'llama-3.1-70b', 'llama-3.1-405b']
43 reasoning_models = ['deepseek-r1']
42 44
43 45 userSelectedModel = ['gpt-4o', 'gemini-pro', 'claude-sonnet-3.5', 'deepseek-r1', 'deepseek-v3', 'blackboxai-pro']
44 46
45 47 agentMode = {
46 48 'ImageGeneration': {'mode': True, 'id': "ImageGenerationLV45LJp", 'name': "Image Generation"},
47 #
48 49 'Meta-Llama-3.3-70B-Instruct-Turbo': {'mode': True, 'id': "meta-llama/Llama-3.3-70B-Instruct-Turbo", 'name': "Meta-Llama-3.3-70B-Instruct-Turbo"},
49 50 'Mistral-(7B)-Instruct-v0.2': {'mode': True, 'id': "mistralai/Mistral-7B-Instruct-v0.2", 'name': "Mistral-(7B)-Instruct-v0.2"},
50 51 'DeepSeek-LLM-Chat-(67B)': {'mode': True, 'id': "deepseek-ai/deepseek-llm-67b-chat", 'name': "DeepSeek-LLM-Chat-(67B)"},
@@ -58,7 +59,6 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
58 59 "llama-3.1-8b": {'mode': True, 'id': "llama-3.1-8b"},
59 60 'llama-3.1-70b': {'mode': True, 'id': "llama-3.1-70b"},
60 61 'llama-3.1-405b': {'mode': True, 'id': "llama-3.1-405"},
61 #
62 62 'Python Agent': {'mode': True, 'id': "Python Agent"},
63 63 'Java Agent': {'mode': True, 'id': "Java Agent"},
64 64 'JavaScript Agent': {'mode': True, 'id': "JavaScript Agent"},
@@ -72,11 +72,8 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
72 72 'React Agent': {'mode': True, 'id': "React Agent"},
73 73 'Xcode Agent': {'mode': True, 'id': "Xcode Agent"},
74 74 'AngularJS Agent': {'mode': True, 'id': "AngularJS Agent"},
75 #
76 75 'blackboxai-pro': {'mode': True, 'id': "BLACKBOXAI-PRO"},
77 #
78 76 'repomap': {'mode': True, 'id': "repomap"},
79 #
80 77 'Heroku Agent': {'mode': True, 'id': "Heroku Agent"},
81 78 'Godot Agent': {'mode': True, 'id': "Godot Agent"},
82 79 'Go Agent': {'mode': True, 'id': "Go Agent"},
@@ -96,10 +93,9 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
96 93 'builder Agent': {'mode': True, 'id': "builder Agent"},
97 94 }
98 95
99 models = list(dict.fromkeys([default_model, *userSelectedModel, *image_models, *list(agentMode.keys()), *list(trendingAgentMode.keys())]))
96 models = list(dict.fromkeys([default_model, *userSelectedModel, *reasoning_models, *image_models, *list(agentMode.keys()), *list(trendingAgentMode.keys())]))
100 97
101 98 model_aliases = {
102 ### chat ###
103 99 "gpt-4": "gpt-4o",
104 100 "gemini-1.5-flash": "gemini-1.5-flash",
105 101 "gemini-1.5-pro": "gemini-pro",
@@ -110,22 +106,11 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
110 106 "dbrx-instruct": "DBRX-Instruct",
111 107 "qwq-32b": "Qwen-QwQ-32B-Preview",
112 108 "hermes-2-dpo": "Nous-Hermes-2-Mixtral-8x7B-DPO",
113 "deepseek-chat": "deepseek-v3",
114
115 ### image ###
116 109 "flux": "ImageGeneration",
117 "flux": "ImageGeneration2",
118 110 }
119 111
120 112 @classmethod
121 async def fetch_validated(
122 cls,
123 url: str = "https://www.blackbox.ai",
124 force_refresh: bool = False
125 ) -> Optional[str]:
126 """
127 Asynchronously retrieves the validated_value from the specified URL.
128 """
113 async def fetch_validated(cls, url: str = "https://www.blackbox.ai", force_refresh: bool = False) -> Optional[str]:
129 114 cache_file = Path(get_cookies_dir()) / 'blackbox.json'
130 115
131 116 if not force_refresh and cache_file.exists():
@@ -141,14 +126,12 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
141 126 uuid_pattern = r'["\']([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})["\']'
142 127
143 128 def is_valid_context(text: str) -> bool:
144 """Checks if the context is valid."""
145 129 return any(char + '=' in text for char in 'abcdefghijklmnopqrstuvwxyz')
146 130
147 131 async with ClientSession() as session:
148 132 try:
149 133 async with session.get(url) as response:
150 134 if response.status != 200:
151 print("Failed to load the page.")
152 135 return None
153 136
154 137 page_content = await response.text()
@@ -167,7 +150,6 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
167 150 if is_valid_context(context):
168 151 validated_value = match.group(1)
169 152
170 # Save to cache
171 153 cache_file.parent.mkdir(exist_ok=True)
172 154 try:
173 155 with open(cache_file, 'w') as f:
@@ -183,10 +165,9 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
183 165 return None
184 166
185 167 @classmethod
186 def generate_chat_id(cls) -> str:
187 """Generate a random chat ID"""
168 def generate_id(cls, length: int = 7) -> str:
188 169 chars = string.ascii_letters + string.digits
189 return ''.join(random.choice(chars) for _ in range(7))
170 return ''.join(random.choice(chars) for _ in range(length))
190 171
191 172 @classmethod
192 173 async def create_async_generator(
@@ -216,6 +197,7 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
216 197
217 198 async with ClientSession(headers=headers) as session:
218 199 if model == "ImageGeneration2":
200 prompt = format_image_prompt(messages, prompt)
219 201 data = {
220 202 "query": format_image_prompt(messages, prompt),
221 203 "agentMode": True
@@ -235,18 +217,28 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
235 217 image_url_match = re.search(r'!\[.*?\]\((.*?)\)', response_json["markdown"])
236 218 if image_url_match:
237 219 image_url = image_url_match.group(1)
238 yield ImageResponse(images=[image_url], alt=prompt)
220 yield ImageResponse(images=[image_url], alt=format_image_prompt(messages, prompt))
239 221 return
240 222
241 223 if conversation is None or not hasattr(conversation, "chat_id"):
242 224 conversation = Conversation(model)
243 225 conversation.validated_value = await cls.fetch_validated()
244 conversation.chat_id = cls.generate_chat_id()
226 conversation.chat_id = cls.generate_id()
245 227 conversation.message_history = []
246
247 current_messages = [{"id": conversation.chat_id, "content": format_prompt(messages), "role": "user"}]
248 conversation.message_history.extend(messages)
249 228
229 current_messages = []
230 for i, msg in enumerate(messages):
231 msg_id = conversation.chat_id if i == 0 and msg["role"] == "user" else cls.generate_id()
232 current_msg = {
233 "id": msg_id,
234 "content": msg["content"],
235 "role": msg["role"]
236 }
237 if msg["role"] == "assistant" and i == len(messages)-1:
238 current_time = datetime.now(timezone.utc).isoformat(timespec='milliseconds').replace('+00:00', 'Z')
239 current_msg["createdAt"] = current_time
240 current_messages.append(current_msg)
241
250 242 if images is not None:
251 243 current_messages[-1]['data'] = {
252 244 "imagesData": [
@@ -279,6 +271,7 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
279 271 "clickedAnswer3": False,
280 272 "clickedForceWebSearch": False,
281 273 "visitFromDelta": False,
274 "isMemoryEnabled": False,
282 275 "mobileClient": False,
283 276 "userSelectedModel": model if model in cls.userSelectedModel else None,
284 277 "validated": conversation.validated_value,
@@ -288,6 +281,7 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
288 281 "domains": None,
289 282 "vscodeClient": False,
290 283 "codeInterpreterMode": False,
284 "customProfile": {"name": "", "occupation": "", "traits": [], "additionalInfo": "", "enableNewChats": False},
291 285 "webSearchMode": web_search
292 286 }
293 287
@@ -300,21 +294,36 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
300 294 if not text_to_yield or text_to_yield.isspace():
301 295 return
302 296
303 full_response = ""
304
305 297 if model in cls.image_models:
306 298 image_url_match = re.search(r'!\[.*?\]\((.*?)\)', text_to_yield)
307 299 if image_url_match:
308 300 image_url = image_url_match.group(1)
309 yield ImageResponse(image_url, format_image_prompt(messages, prompt))
301 prompt = format_image_prompt(messages, prompt)
302 yield ImageResponse(images=[image_url], alt=prompt)
310 303 else:
311 if "<think>" in text_to_yield and "</think>" in text_to_yield:
312 parts = text_to_yield.split('<think>', 1)
313 yield parts[0]
314 reasoning_parts = parts[1].split('</think>', 1)
315 yield Reasoning(f"<think>{reasoning_parts[0]}</think>")
316 yield reasoning_parts[1]
317 full_response = text_to_yield
304 if model in cls.reasoning_models and "\n\n\n" in text_to_yield:
305 think_split = text_to_yield.split("\n\n\n", 1)
306 if len(think_split) > 1:
307 think_content, answer = think_split[0].strip(), think_split[1].strip()
308 yield Reasoning(status=think_content)
309 yield answer
310 else:
311 yield text_to_yield
312 elif "<think>" in text_to_yield:
313 pre_think, rest = text_to_yield.split('<think>', 1)
314 think_content, post_think = rest.split('</think>', 1)
315
316 pre_think = pre_think.strip()
317 think_content = think_content.strip()
318 post_think = post_think.strip()
319
320 if pre_think:
321 yield pre_think
322 if think_content:
323 yield Reasoning(status=think_content)
324 if post_think:
325 yield post_think
326
318 327 elif "Generated by BLACKBOX.AI" in text_to_yield:
319 328 conversation.validated_value = await cls.fetch_validated(force_refresh=True)
320 329 if conversation.validated_value:
@@ -327,24 +336,13 @@ class Blackbox(AsyncGeneratorProvider, ProviderModelMixin):
327 336
328 337 if new_text and not new_text.isspace():
329 338 yield new_text
330 full_response = new_text
331 339 else:
332 340 if text_to_yield and not text_to_yield.isspace():
333 341 yield text_to_yield
334 full_response = text_to_yield
335 342 else:
336 343 if text_to_yield and not text_to_yield.isspace():
337 344 yield text_to_yield
338 full_response = text_to_yield
339 345
340 if full_response:
341 if max_tokens and len(full_response) >= max_tokens:
342 reason = "length"
343 else:
344 reason = "stop"
345
346 if return_conversation:
347 conversation.message_history.append({"role": "assistant", "content": full_response})
348 yield conversation
349
350 yield FinishReason(reason)
346 if return_conversation:
347 conversation.message_history.append({"role": "assistant", "content": text_to_yield})
348 yield conversation
Modified g4f/Provider/DeepInfraChat.py +1 -1
@@ -27,7 +27,7 @@ class DeepInfraChat(OpenaiTemplate):
27 27 "llama-3.1-8b": "meta-llama/Meta-Llama-3.1-8B-Instruct",
28 28 "llama-3.3-70b": "meta-llama/Llama-3.3-70B-Instruct-Turbo",
29 29 "llama-3.1-70b": "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
30 "deepseek-chat": "deepseek-ai/DeepSeek-V3",
30 "deepseek-v3": "deepseek-ai/DeepSeek-V3",
31 31 "qwq-32b": "Qwen/QwQ-32B-Preview",
32 32 "wizardlm-2-8x22b": "microsoft/WizardLM-2-8x22B",
33 33 "wizardlm-2-7b": "microsoft/WizardLM-2-7B",
Added g4f/Provider/Glider.py +120 -0
@@ -0,0 +1,120 @@
1 from __future__ import annotations
2 import json
3 from aiohttp import ClientSession
4
5 from ..typing import AsyncResult, Messages
6 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
7 from ..requests.raise_for_status import raise_for_status
8 from ..providers.response import FinishReason, Reasoning
9 from .helper import format_prompt
10
11 class Glider(AsyncGeneratorProvider, ProviderModelMixin):
12 label = "Glider"
13 url = "https://glider.so"
14 api_endpoint = "https://glider.so/api/chat"
15
16 working = True
17 needs_auth = False
18 supports_stream = True
19 supports_system_message = True
20 supports_message_history = True
21
22 default_model = 'chat-llama-3-1-70b'
23 reasoning_models = ['deepseek-ai/DeepSeek-R1']
24 models = [
25 'chat-llama-3-1-70b',
26 'chat-llama-3-1-8b',
27 'chat-llama-3-2-3b',
28 ] + reasoning_models
29
30 model_aliases = {
31 "llama-3.1-70b": "chat-llama-3-1-70b",
32 "llama-3.1-8b": "chat-llama-3-1-8b",
33 "llama-3.2-3b": "chat-llama-3-2-3b",
34 "deepseek-r1": "deepseek-ai/DeepSeek-R1",
35 }
36
37 @classmethod
38 async def create_async_generator(
39 cls,
40 model: str,
41 messages: Messages,
42 proxy: str = None,
43 **kwargs
44 ) -> AsyncResult:
45 model = cls.get_model(model)
46
47 headers = {
48 "accept": "*/*",
49 "accept-language": "en-US,en;q=0.9",
50 "content-type": "application/json",
51 "origin": cls.url,
52 "referer": f"{cls.url}/",
53 "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
54 }
55
56 async with ClientSession(headers=headers) as session:
57 data = {
58 "messages": [{
59 "role": "user",
60 "content": format_prompt(messages),
61 "id": "",
62 "chatId": "",
63 "createdOn": "",
64 "model": None
65 }],
66 "model": model
67 }
68
69 async with session.post(cls.api_endpoint, json=data, proxy=proxy) as response:
70 await raise_for_status(response)
71
72 is_reasoning = False
73 current_reasoning = ""
74
75 async for chunk in response.content:
76 if not chunk:
77 continue
78
79 text = chunk.decode(errors="ignore")
80
81 if not text.startswith("data: "):
82 continue
83
84 if "[DONE]" in text:
85 if is_reasoning and current_reasoning:
86 yield Reasoning(status=current_reasoning.strip())
87 yield FinishReason("stop")
88 return
89
90 try:
91 json_data = json.loads(text[6:])
92 content = json_data["choices"][0].get("delta", {}).get("content", "")
93
94 if model in cls.reasoning_models:
95 if "<think>" in content:
96 content = content.replace("<think>", "")
97 is_reasoning = True
98 current_reasoning = content
99 continue
100
101 if "</think>" in content:
102 content = content.replace("</think>", "")
103 is_reasoning = False
104 current_reasoning += content
105 yield Reasoning(status=current_reasoning.strip())
106 current_reasoning = ""
107 continue
108
109 if is_reasoning:
110 current_reasoning += content
111 continue
112
113 if content:
114 yield content
115
116 except json.JSONDecodeError:
117 continue
118 except Exception:
119 yield FinishReason("error")
120 return
Modified g4f/Provider/PerplexityLabs.py +0 -4
@@ -21,10 +21,6 @@ class PerplexityLabs(AsyncGeneratorProvider, ProviderModelMixin):
21 21 "sonar",
22 22 "sonar-reasoning",
23 23 ]
24 model_aliases = {
25 "sonar-online": default_model,
26 "sonar-chat": default_model,
27 }
28 24
29 25 @classmethod
30 26 async def create_async_generator(
Modified g4f/Provider/PollinationsAI.py +28 -29
@@ -13,7 +13,7 @@ from ..typing import AsyncResult, Messages, ImagesType
13 13 from ..image import to_data_uri
14 14 from ..requests.raise_for_status import raise_for_status
15 15 from ..requests.aiohttp import get_connector
16 from ..providers.response import ImageResponse, FinishReason, Usage
16 from ..providers.response import ImageResponse, FinishReason, Usage, Reasoning
17 17
18 18 DEFAULT_HEADERS = {
19 19 'Accept': '*/*',
@@ -40,7 +40,8 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
40 40 default_vision_model = "gpt-4o"
41 41 extra_image_models = ["midjourney", "dall-e-3", "flux-pro"]
42 42 vision_models = [default_vision_model, "gpt-4o-mini"]
43 extra_text_models = ["claude", "claude-email", "deepseek-reasoner", "p1"] + vision_models
43 reasoning_models = ['deepseek-reasoner', 'deepseek-r1']
44 extra_text_models = ["claude", "claude-email", "p1"] + vision_models + reasoning_models
44 45 model_aliases = {
45 46 ### Text Models ###
46 47 "gpt-4o-mini": "openai",
@@ -50,11 +51,8 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
50 51 "qwen-2.5-coder-32b": "qwen-coder",
51 52 "llama-3.3-70b": "llama",
52 53 "mistral-nemo": "mistral",
53 #"mistral-nemo": "unity", # bug with image url response
54 #"gpt-4o-mini": "midijourney", # bug with the answer
55 54 "gpt-4o-mini": "rtist",
56 55 "gpt-4o": "searchgpt",
57 #"mistral-nemo": "evil",
58 56 "gpt-4o-mini": "p1",
59 57 "deepseek-chat": "deepseek",
60 58 "deepseek-chat": "claude-hybridspace",
@@ -72,24 +70,25 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
72 70
73 71 @classmethod
74 72 def get_models(cls, **kwargs):
75 # Fetch image models if not cached
76 73 if not cls.image_models:
77 74 url = "https://image.pollinations.ai/models"
78 75 response = requests.get(url)
79 76 raise_for_status(response)
80 77 cls.image_models = response.json()
81 cls.image_models.extend(cls.extra_image_models)
82
83 # Fetch text models if not cached
78 cls.image_models = list(dict.fromkeys([*cls.image_models, *cls.extra_image_models]))
79
84 80 if not cls.text_models:
85 81 url = "https://text.pollinations.ai/models"
86 82 response = requests.get(url)
87 83 raise_for_status(response)
88 cls.text_models = [model.get("name") for model in response.json()]
89 cls.text_models.extend(cls.extra_text_models)
90
91 # Return combined models
92 return cls.text_models + cls.image_models
84 original_text_models = [model.get("name") for model in response.json()]
85 combined_text = cls.extra_text_models + [
86 model for model in original_text_models
87 if model not in cls.extra_text_models
88 ]
89 cls.text_models = list(dict.fromkeys(combined_text))
90
91 return list(dict.fromkeys([*cls.text_models, *cls.image_models]))
93 92
94 93 @classmethod
95 94 async def create_async_generator(
@@ -97,7 +96,6 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
97 96 model: str,
98 97 messages: Messages,
99 98 proxy: str = None,
100 # Image specific parameters
101 99 prompt: str = None,
102 100 width: int = 1024,
103 101 height: int = 1024,
@@ -106,7 +104,6 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
106 104 private: bool = False,
107 105 enhance: bool = False,
108 106 safe: bool = False,
109 # Text specific parameters
110 107 images: ImagesType = None,
111 108 temperature: float = None,
112 109 presence_penalty: float = None,
@@ -122,8 +119,6 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
122 119 if not cache and seed is None:
123 120 seed = random.randint(0, 100000)
124 121
125 # Check if models
126 # Image generation
127 122 if model in cls.image_models:
128 123 yield await cls._generate_image(
129 124 model=model,
@@ -138,7 +133,6 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
138 133 safe=safe
139 134 )
140 135 else:
141 # Text generation
142 136 async for result in cls._generate_text(
143 137 model=model,
144 138 messages=messages,
@@ -227,7 +221,7 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
227 221 "top_p": top_p,
228 222 "frequency_penalty": frequency_penalty,
229 223 "jsonMode": jsonMode,
230 "stream": False, # To get more informations like Usage and FinishReason
224 "stream": False,
231 225 "seed": seed,
232 226 "cache": cache
233 227 }
@@ -235,24 +229,29 @@ class PollinationsAI(AsyncGeneratorProvider, ProviderModelMixin):
235 229 await raise_for_status(response)
236 230 async for line in response.content:
237 231 decoded_chunk = line.decode(errors="replace")
238 # If [DONE].
239 232 if "data: [DONE]" in decoded_chunk:
240 233 break
241 # Processing JSON format
242 234 try:
243 # Remove the prefix “data: “ and parse JSON
244 235 json_str = decoded_chunk.replace("data:", "").strip()
245 236 data = json.loads(json_str)
246 237 choice = data["choices"][0]
238 message = choice.get("message") or choice.get("delta", {})
239
240 # Handle reasoning content
241 if model in cls.reasoning_models:
242 if "reasoning_content" in message:
243 yield Reasoning(status=message["reasoning_content"].strip())
244
247 245 if "usage" in data:
248 246 yield Usage(**data["usage"])
249 if "message" in choice and "content" in choice["message"] and choice["message"]["content"]:
250 yield choice["message"]["content"].replace("\\(", "(").replace("\\)", ")")
251 elif "delta" in choice and "content" in choice["delta"] and choice["delta"]["content"]:
252 yield choice["delta"]["content"].replace("\\(", "(").replace("\\)", ")")
253 if "finish_reason" in choice and choice["finish_reason"] is not None:
247 content = message.get("content", "")
248 if content:
249 yield content.replace("\\(", "(").replace("\\)", ")")
250 if "finish_reason" in choice and choice["finish_reason"]:
254 251 yield FinishReason(choice["finish_reason"])
255 252 break
256 253 except json.JSONDecodeError:
257 254 yield decoded_chunk.strip()
258 continue
255 except Exception as e:
256 yield FinishReason("error")
257 break
Modified g4f/Provider/__init__.py +1 -3
@@ -14,9 +14,6 @@ from .hf_space import HuggingSpace
14 14 from .mini_max import HailuoAI, MiniMax
15 15 from .template import OpenaiTemplate, BackendApi
16 16
17 from .AIChatFree import AIChatFree
18 from .AIUncensored import AIUncensored
19 from .AutonomousAI import AutonomousAI
20 17 from .Blackbox import Blackbox
21 18 from .CablyAI import CablyAI
22 19 from .ChatGLM import ChatGLM
@@ -31,6 +28,7 @@ from .DeepInfraChat import DeepInfraChat
31 28 from .Free2GPT import Free2GPT
32 29 from .FreeGpt import FreeGpt
33 30 from .GizAI import GizAI
31 from .Glider import Glider
34 32 from .GPROChat import GPROChat
35 33 from .ImageLabs import ImageLabs
36 34 from .Jmuz import Jmuz
Renamed g4f/Provider/not_working/AIChatFree.py +6 -6
@@ -5,17 +5,17 @@ from hashlib import sha256
5 5
6 6 from aiohttp import BaseConnector, ClientSession
7 7
8 from ..errors import RateLimitError
9 from ..requests import raise_for_status
10 from ..requests.aiohttp import get_connector
11 from ..typing import AsyncResult, Messages
12 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
8 from ...errors import RateLimitError
9 from ...requests import raise_for_status
10 from ...requests.aiohttp import get_connector
11 from ...typing import AsyncResult, Messages
12 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
13 13
14 14
15 15 class AIChatFree(AsyncGeneratorProvider, ProviderModelMixin):
16 16 url = "https://aichatfree.info"
17 17
18 working = True
18 working = False
19 19 supports_stream = True
20 20 supports_message_history = True
21 21
Renamed g4f/Provider/not_working/AIUncensored.py +6 -6
@@ -7,17 +7,17 @@ import hashlib
7 7 import json
8 8 import random
9 9
10 from ..typing import AsyncResult, Messages
11 from ..requests.raise_for_status import raise_for_status
12 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
13 from .helper import format_prompt
14 from ..providers.response import FinishReason
10 from ...typing import AsyncResult, Messages
11 from ...requests.raise_for_status import raise_for_status
12 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
13 from ..helper import format_prompt
14 from ...providers.response import FinishReason
15 15
16 16 class AIUncensored(AsyncGeneratorProvider, ProviderModelMixin):
17 17 url = "https://www.aiuncensored.info/ai_uncensored"
18 18 api_key = "62852b00cb9e44bca86f0ec7e7455dc6"
19 19
20 working = True
20 working = False
21 21 supports_stream = True
22 22 supports_system_message = True
23 23 supports_message_history = True
Renamed g4f/Provider/not_working/AutonomousAI.py +5 -5
@@ -4,10 +4,10 @@ from aiohttp import ClientSession
4 4 import base64
5 5 import json
6 6
7 from ..typing import AsyncResult, Messages
8 from ..requests.raise_for_status import raise_for_status
9 from ..providers.response import FinishReason
10 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
7 from ...typing import AsyncResult, Messages
8 from ...requests.raise_for_status import raise_for_status
9 from ...providers.response import FinishReason
10 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
11 11
12 12 class AutonomousAI(AsyncGeneratorProvider, ProviderModelMixin):
13 13 url = "https://www.autonomous.ai/anon/"
@@ -19,7 +19,7 @@ class AutonomousAI(AsyncGeneratorProvider, ProviderModelMixin):
19 19 "summary": "https://chatgpt.autonomous.ai/api/v1/ai/summary"
20 20 }
21 21
22 working = True
22 working = False
23 23 supports_stream = True
24 24 supports_system_message = True
25 25 supports_message_history = True
Modified g4f/Provider/not_working/__init__.py +3 -0
@@ -1,7 +1,10 @@
1 1 from .AI365VIP import AI365VIP
2 from .AIChatFree import AIChatFree
2 3 from .AiChatOnline import AiChatOnline
3 4 from .AiChats import AiChats
4 5 from .Airforce import Airforce
6 from .AutonomousAI import AutonomousAI
7 from .AIUncensored import AIUncensored
5 8 from .AmigoChat import AmigoChat
6 9 from .Aura import Aura
7 10 from .Chatgpt4o import Chatgpt4o
Modified g4f/gui/client/static/css/style.css +43 -0
@@ -1413,6 +1413,49 @@ form .field.saved .fa-xmark {
1413 1413 line-height: 30px;
1414 1414 }
1415 1415
1416 .collapsible {
1417 border: 1px solid var(--blur-border);
1418 border-radius: var(--border-radius-1);
1419 overflow: hidden;
1420 margin-bottom: 10px;
1421 }
1422
1423 .collapsible-header {
1424 padding: 10px;
1425 cursor: pointer;
1426 display: flex;
1427 justify-content: space-between;
1428 align-items: center;
1429 background-color: var(--blur-bg);
1430 }
1431
1432 .collapsible-header:hover {
1433 background-color: var(--button-hover);
1434 }
1435
1436 .collapsible-content {
1437 padding: 10px;
1438 }
1439
1440 .collapsible-content.hidden {
1441 display: none;
1442 }
1443
1444 .provider-item {
1445 padding: 5px 0;
1446 display: flex;
1447 justify-content: space-between;
1448 align-items: center;
1449 }
1450
1451 .fa-chevron-down {
1452 transition: transform 0.3s ease;
1453 }
1454
1455 .collapsible-header.active .fa-chevron-down {
1456 transform: rotate(180deg);
1457 }
1458
1416 1459 ::-webkit-scrollbar-track {
1417 1460 background: var(--scrollbar);
1418 1461 }
Modified g4f/gui/client/static/js/chat.v1.js +44 -12
Modified g4f/models.py +36 -39