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

XFEstudio/gpt4free

refactor: update providers list, env vars, and minor fixes

- **example.env**: - Added `G4F_API_KEY` and `G4F_PROXY` variables - Removed Azure-related API keys and routes block - Added `OLLAMA_API_KEY`, `NVIDIA_API_KEY`, and `PUTER_API_KEY` - **g4f/Provider/EasyChat.py**: - Replaced `page.js_dumps` with `page.evaluate` for retrieving `guestId` - **g4f/Provider/deprecated/LegacyLMArena.py**: - Changed `working = True` to `working = False` - **g4f/Provider/deprecated/har/__init__.py**: - Changed `working = True` to `working = False` - **g4f/providers/any_provider.py**: - Updated imports, adding `Custom`, `PollinationsImage`, `OpenaiAccount`, and reordering providers - Renamed `PROVIERS_LIST_2` → `PROVIDERS_LIST_2` and `PROVIERS_LIST_3` → `PROVIDERS_LIST_3` - Removed `PROVIERS_LIST_1` and replaced its usage with `Provider.__providers__` - Changed `cls.audio_models` initialization from `{}` to `[]` - Adjusted handling of model mapping with `clean_name` for consistency - GeminiPro check updated to `if provider == GeminiPro` - Changed final `cls.audio_models` assignment to `[ *cls.audio_models ]` instead of `list(cls.audio_models.keys())` - Adjusted provider fallback in `AnyProvider` to use `PROVIDERS_LIST_2 + PROVIDERS_LIST_3` - **g4f/requests/__init__.py**: - Changed SSE parsing condition from `line.startswith(b"data: ")` to `line.startswith(b"data:")` - Updated slice from `line[6:]` to `line[5:]` when extracting `rest

05f0f557
hlohaus <983577+hlohaus@users.noreply.github.com>
提交于

代码差异

6 个文件 +29 -49
Modified example.env +6 -16
@@ -1,6 +1,9 @@
1 1 # Rename this file to .env and copy it to your cookies directory
2 2 # Update the API_KEY and other variables as needed
3 3
4 G4F_API_KEY=
5 G4F_PROXY=
6
4 7 HUUGINGFACE_API_KEY=
5 8 POLLINATIONS_API_KEY=
6 9 GEMINI_API_KEY=
@@ -9,19 +12,6 @@ DEEPINFRA_API_KEY=
9 12 OPENAI_API_KEY=
10 13 GROQ_API_KEY=
11 14 OPENROUTER_API_KEY=
12 AZURE_API_KEYS='{
13 "default": "",
14 "flux-1.1-pro": "",
15 "flux.1-kontext-pro": ""
16 }'
17 AZURE_DEFAULT_MODEL="model-router"
18 AZURE_ROUTES='{
19 "model-router": "https://HOST.cognitiveservices.azure.com/openai/deployments/model-router/chat/completions?api-version=2025-01-01-preview",
20 "deepseek-r1": "https://HOST.services.ai.azure.com/models/chat/completions?api-version=2024-05-01-preview",
21 "gpt-4.1": "https://HOST.cognitiveservices.azure.com/openai/deployments/gpt-4.1/chat/completions?api-version=2025-01-01-preview",
22 "gpt-4o-mini-audio-preview": "https://HOST.cognitiveservices.azure.com/openai/deployments/gpt-4o-mini-audio-preview/chat/completions?api-version=2025-01-01-preview",
23 "o4-mini": "https://HOST.cognitiveservices.azure.com/openai/deployments/o4-mini/chat/completions?api-version=2025-01-01-preview",
24 "grok-3": "https://HOST.services.ai.azure.com/models/chat/completions?api-version=2024-05-01-preview",
25 "flux-1.1-pro": "https://HOST.cognitiveservices.azure.com/openai/deployments/FLUX-1.1-pro/images/generations?api-version=2025-04-01-preview",
26 "flux.1-kontext-pro": "https://HOST.services.ai.azure.com/openai/deployments/FLUX.1-Kontext-pro/images/edits?api-version=2025-04-01-preview"
27 }'
15 OLLAMA_API_KEY=
16 NVIDIA_API_KEY=
17 PUTER_API_KEY=
Modified g4f/Provider/EasyChat.py +1 -1
@@ -93,7 +93,7 @@ class EasyChat(OpenaiTemplate, AuthFileMixin):
93 93 await asyncio.sleep(1)
94 94 if cls.captchaToken:
95 95 break
96 cls.guestId = await page.js_dumps('JSON.parse(localStorage.getItem("user-info") || "{}")?.state?.guestId')
96 cls.guestId = await page.evaluate('"" + JSON.parse(localStorage.getItem("user-info") || "{}")?.state?.guestId')
97 97 await asyncio.sleep(3)
98 98 if cache_file.exists():
99 99 with cache_file.open("r") as f:
Modified g4f/Provider/deprecated/LegacyLMArena.py +1 -1
@@ -21,7 +21,7 @@ class LegacyLMArena(AsyncGeneratorProvider, ProviderModelMixin):
21 21 url = "https://legacy.lmarena.ai"
22 22 api_endpoint = "/queue/join?"
23 23
24 working = True
24 working = False
25 25
26 26 default_model = "chatgpt-4o-latest-20250326"
27 27 models = []
Modified g4f/Provider/deprecated/har/__init__.py +1 -1
@@ -23,7 +23,7 @@ class HarProvider(AsyncAuthedProvider, ProviderModelMixin):
23 23 label = "LMArena (Har)"
24 24 url = "https://legacy.lmarena.ai"
25 25 api_endpoint = "/queue/join?"
26 working = True
26 working = False
27 27 active_by_default = True
28 28 default_model = LegacyLMArena.default_model
29 29
Modified g4f/providers/any_provider.py +18 -28
@@ -9,34 +9,23 @@ from ..image import is_data_an_audio
9 9 from ..providers.retry_provider import RotatedProvider
10 10 from ..Provider.needs_auth import OpenaiChat, CopilotAccount
11 11 from ..Provider.hf_space import HuggingSpace
12 from ..Provider import Copilot, Cloudflare, Gemini, GeminiPro, Grok, DeepSeekAPI, PerplexityLabs, LambdaChat, PollinationsAI, PuterJS
13 from ..Provider import Microsoft_Phi_4_Multimodal, DeepInfraChat, Blackbox, OIVSCodeSer0501, OIVSCodeSer2, TeachAnything, OperaAria, Startnest
14 from ..Provider import WeWordle, Yqcloud, Chatai, ImageLabs, LegacyLMArena, LMArenaBeta, Free2GPT
15 from ..Provider import EdgeTTS, gTTS, MarkItDown, OpenAIFM
16 from ..Provider import HarProvider, HuggingFace, HuggingFaceMedia, Azure, Qwen, EasyChat, GLM, OpenRouterFree
12 from ..Provider import Custom, PollinationsImage, OpenaiAccount, Copilot, Cloudflare, Gemini, Grok, PerplexityLabs, LambdaChat, PollinationsAI, PuterJS
13 from ..Provider import Microsoft_Phi_4_Multimodal, DeepInfraChat, LMArenaBeta, EdgeTTS, gTTS, MarkItDown, OpenAIFM
14 from ..Provider import HuggingFace, HuggingFaceMedia, Azure, Qwen, EasyChat, GLM, OpenRouterFree, GeminiPro
17 15 from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
18 16 from .. import Provider
19 17 from .. import models
20 18 from .. import debug
21 19 from .any_model_map import audio_models, image_models, vision_models, video_models, model_map, models_count, parents, model_aliases
22 20
23 # Add all model aliases to the model map
24 PROVIERS_LIST_1 = [
25 CopilotAccount, OpenaiChat, Cloudflare, PerplexityLabs, Gemini, Grok, DeepSeekAPI, Blackbox, OpenAIFM,
26 OIVSCodeSer2, OIVSCodeSer0501, TeachAnything, WeWordle, Yqcloud, Chatai, Free2GPT, ImageLabs,
27 # Has lazy loading model lists
28 PollinationsAI, HarProvider, LegacyLMArena, LMArenaBeta, LambdaChat, DeepInfraChat,
29 HuggingSpace, HuggingFace, HuggingFaceMedia, GeminiPro, PuterJS, OperaAria, Startnest
30 ]
31
32 21 # Add providers to existing models on map
33 PROVIERS_LIST_2 = [
22 PROVIDERS_LIST_2 = [
34 23 OpenaiChat, Copilot, CopilotAccount, PollinationsAI, PerplexityLabs, Gemini, Grok, Azure, Qwen, EasyChat, GLM, OpenRouterFree
35 24 ]
36 25
37 26 # Add all models to the model map
38 PROVIERS_LIST_3 = [
39 HarProvider, LambdaChat, DeepInfraChat, HuggingFace, HuggingFaceMedia, LegacyLMArena, LMArenaBeta,
27 PROVIDERS_LIST_3 = [
28 LambdaChat, DeepInfraChat, HuggingFace, HuggingFaceMedia, LMArenaBeta,
40 29 PuterJS, Cloudflare, HuggingSpace
41 30 ]
42 31
@@ -112,7 +101,7 @@ class AnyModelProviderMixin(ProviderModelMixin):
112 101
113 102 @classmethod
114 103 def create_model_map(cls):
115 cls.audio_models = {}
104 cls.audio_models = []
116 105 cls.image_models = []
117 106 cls.vision_models = []
118 107 cls.video_models = []
@@ -132,7 +121,7 @@ class AnyModelProviderMixin(ProviderModelMixin):
132 121 cls.image_models.append(name)
133 122
134 123 # Process special providers
135 for provider in PROVIERS_LIST_2:
124 for provider in PROVIDERS_LIST_2:
136 125 if not provider.working:
137 126 continue
138 127 try:
@@ -172,7 +161,7 @@ class AnyModelProviderMixin(ProviderModelMixin):
172 161 if hasattr(provider, 'video_models'):
173 162 cls.video_models.extend(provider.video_models)
174 163
175 for provider in PROVIERS_LIST_3:
164 for provider in PROVIDERS_LIST_3:
176 165 if not provider.working:
177 166 continue
178 167 try:
@@ -205,15 +194,16 @@ class AnyModelProviderMixin(ProviderModelMixin):
205 194 cls.video_models.extend(provider.video_models)
206 195 cls.video_models.extend([clean_name(model) for model in provider.video_models])
207 196
208 for provider in PROVIERS_LIST_1:
209 if provider.working:
197 for provider in Provider.__providers__:
198 if provider.working and hasattr(provider, "get_models") and provider not in [AnyProvider, Custom, PollinationsImage, OpenaiAccount]:
210 199 for model in provider.get_models():
211 if model in cls.model_map:
212 cls.model_map[model].update({provider.__name__: model})
200 clean = clean_name(model)
201 if clean in cls.model_map:
202 cls.model_map[clean].update({provider.__name__: model})
213 203 for alias, model in provider.model_aliases.items():
214 204 if alias in cls.model_map:
215 205 cls.model_map[alias].update({provider.__name__: model})
216 if provider.__name__ == "GeminiPro":
206 if provider == GeminiPro:
217 207 for model in cls.model_map.keys():
218 208 if "gemini" in model or "gemma" in model:
219 209 cls.model_map[alias].update({provider.__name__: model})
@@ -230,11 +220,11 @@ class AnyModelProviderMixin(ProviderModelMixin):
230 220
231 221 cls.video_models.append("video")
232 222 cls.model_map["video"] = {"Video": "video"}
233 cls.audio_models = list(cls.audio_models.keys())
223 cls.audio_models = [*cls.audio_models]
234 224
235 225 # Create a mapping of parent providers to their children
236 226 cls.parents = {}
237 for provider in PROVIERS_LIST_1:
227 for provider in Provider.__providers__:
238 228 if provider.working and provider.__name__ != provider.get_parent():
239 229 if provider.get_parent() not in cls.parents:
240 230 cls.parents[provider.get_parent()] = [provider.__name__]
@@ -393,7 +383,7 @@ class AnyProvider(AsyncGeneratorProvider, AnyModelProviderMixin):
393 383 provider.model_aliases[model] = alias
394 384 providers.append(provider)
395 385 if not providers:
396 for provider in PROVIERS_LIST_1:
386 for provider in PROVIDERS_LIST_2 + PROVIDERS_LIST_3:
397 387 if model in provider.get_models():
398 388 providers.append(provider)
399 389 elif model in provider.model_aliases:
Modified g4f/requests/__init__.py +2 -2
@@ -226,8 +226,8 @@ async def sse_stream(iter_lines: Iterator[bytes]) -> AsyncIterator[dict]:
226 226 elif hasattr(iter_lines, "iter_lines"):
227 227 iter_lines = iter_lines.iter_lines()
228 228 async for line in iter_lines:
229 if line.startswith(b"data: "):
230 rest = line[6:].strip()
229 if line.startswith(b"data:"):
230 rest = line[5:].strip()
231 231 if not rest:
232 232 continue
233 233 if rest.startswith(b"[DONE]"):