返回提交历史
Modified
g4f/Provider/Cloudflare.py
+4
-2
Modified
g4f/Provider/LambdaChat.py
+2
-0
Modified
g4f/Provider/LegacyLMArena.py
+2
-0
Modified
g4f/Provider/needs_auth/PuterJS.py
+5
-8
Modified
g4f/providers/any_provider.py
+14
-4
Modified
g4f/providers/retry_provider.py
+2
-1
XFEstudio/gpt4free
Update providers
dbef5fac
代码差异
6 个文件
+29
-15
@@ -86,10 +86,12 @@ class Cloudflare(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin):
86
86
cls.models = cls.fallback_models
87
87
get_running_loop(check_nested=True)
88
88
try:
89
asyncio.run(nodriver_read_models())
89
task = asyncio.create_task(nodriver_read_models())
90
asyncio.run(task)
90
91
except RuntimeError:
91
92
debug.log("Nodriver is not available: RuntimeError")
92
93
cls.models = cls.fallback_models
94
task.cancel()
93
95
else:
94
96
cls.models = cls.fallback_models
95
97
debug.log(f"Nodriver is not installed: {type(f).__name__}: {f}")
@@ -113,7 +115,7 @@ class Cloudflare(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin):
113
115
try:
114
116
cls._args = await get_args_from_nodriver(cls.url, proxy=proxy)
115
117
except (RuntimeError, FileNotFoundError) as e:
116
debug.log(f"Nodriver is not available: {type(e).__name__}: {e}")
118
debug.log(f"Cloudflare: Nodriver is not available:", e)
117
119
cls._args = {"headers": DEFAULT_HEADERS, "cookies": {}, "impersonate": "chrome"}
118
120
else:
119
121
cls._args = {"headers": DEFAULT_HEADERS, "cookies": {}, "impersonate": "chrome"}
@@ -192,6 +192,8 @@ class LambdaChat(AsyncGeneratorProvider, ProviderModelMixin):
192
192
data=form_data,
193
193
proxy=proxy
194
194
) as response:
195
if not response.ok:
196
debug.log(f"LambdaChat: Request Body: {form_data}")
195
197
await raise_for_status(response)
196
198
197
199
async for chunk in response.content:
@@ -519,6 +519,8 @@ class LegacyLMArena(AsyncGeneratorProvider, ProviderModelMixin):
519
519
# Skip non-JSON lines
520
520
continue
521
521
except Exception as e:
522
if max_retries == 1:
523
raise e
522
524
debug.log(f"Error parsing response: {str(e)}")
523
525
continue
524
526
@@ -16,7 +16,6 @@ from .. import debug
16
16
17
17
class PuterJS(AsyncGeneratorProvider, ProviderModelMixin):
18
18
label = "Puter.js"
19
parent = "Puter"
20
19
url = "https://docs.puter.com/playground"
21
20
login_url = "https://github.com/HeyPuter/puter-cli"
22
21
api_endpoint = "https://api.puter.com/drivers/call"
@@ -28,7 +27,6 @@ class PuterJS(AsyncGeneratorProvider, ProviderModelMixin):
28
27
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"]
29
28
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"]
30
29
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"]
31
xai_models = ["grok-beta", "grok-vision-beta"]
32
30
model_aliases = {
33
31
### mistral_models ###
34
32
"mixtral-8x22b": ["open-mixtral-8x22b", "open-mixtral-8x22b-2404"],
@@ -281,14 +279,14 @@ class PuterJS(AsyncGeneratorProvider, ProviderModelMixin):
281
279
@staticmethod
282
280
def get_driver_for_model(model: str) -> str:
283
281
"""Determine the appropriate driver based on the model name."""
284
if model in PuterJS.openai_models:
282
if "openrouter:" in model:
283
return "openrouter"
284
elif model in PuterJS.openai_models or model.startswith("gpt-"):
285
285
return "openai-completion"
286
286
elif model in PuterJS.mistral_models:
287
287
return "mistral"
288
elif model in PuterJS.xai_models:
288
elif "grok" in model:
289
289
return "xai"
290
elif "openrouter:" in model:
291
return "openrouter"
292
290
elif "claude" in model:
293
291
return "claude"
294
292
elif "deepseek" in model:
@@ -296,8 +294,7 @@ class PuterJS(AsyncGeneratorProvider, ProviderModelMixin):
296
294
elif "gemini" in model:
297
295
return "gemini"
298
296
else:
299
# Default to OpenAI for unknown models
300
return "openai-completion"
297
raise ModelNotFoundError(f"Model {model} not found in known drivers")
301
298
302
299
@classmethod
303
300
def get_model(cls, model: str) -> str:
@@ -23,7 +23,7 @@ PROVIERS_LIST_1 = [
23
23
OpenaiChat, PollinationsAI, Cloudflare, PerplexityLabs, Gemini, Grok, DeepSeekAPI, Blackbox, OpenAIFM,
24
24
OIVSCodeSer2, OIVSCodeSer0501, TeachAnything, Together, WeWordle, Yqcloud, Chatai, Free2GPT, ARTA, ImageLabs,
25
25
HarProvider, LegacyLMArena, LMArenaBeta, LambdaChat, CopilotAccount, DeepInfraChat,
26
HuggingSpace, HuggingFace, HuggingFaceMedia, PuterJS, Together
26
HuggingSpace, HuggingFace, HuggingFaceMedia, Together
27
27
]
28
28
29
29
PROVIERS_LIST_2 = [
@@ -31,7 +31,7 @@ PROVIERS_LIST_2 = [
31
31
]
32
32
33
33
PROVIERS_LIST_3 = [
34
HarProvider, LambdaChat, DeepInfraChat, HuggingFace, HuggingFaceMedia, LegacyLMArena, LMArenaBeta,
34
HarProvider, LambdaChat, DeepInfraChat, HuggingFace, HuggingFaceMedia, HarProvider, LegacyLMArena, LMArenaBeta,
35
35
PuterJS, Together, Cloudflare, HuggingSpace
36
36
]
37
37
@@ -331,6 +331,7 @@ class AnyProvider(AsyncGeneratorProvider, ProviderModelMixin):
331
331
if api_key.get(provider):
332
332
if provider in __map__ and __map__[provider] not in PROVIERS_LIST_1:
333
333
extra_providers.append(__map__[provider])
334
print(f"Using extra providers: {[p.__name__ for p in extra_providers]}")
334
335
for provider in PROVIERS_LIST_1 + extra_providers:
335
336
if provider.working:
336
337
provider_api_key = api_key
@@ -341,8 +342,15 @@ class AnyProvider(AsyncGeneratorProvider, ProviderModelMixin):
341
342
except Exception as e:
342
343
debug.error(f"Error getting models for provider {provider.__name__}:", e)
343
344
continue
344
if not model or model in provider_models or provider.model_aliases and model in provider.model_aliases:
345
if model and provider == PuterJS:
345
346
providers.append(provider)
347
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():
348
providers.append(provider)
349
elif provider.__name__ == "GeminiPro":
350
if model and "gemini" in model or "gemma" in model:
351
providers.append(provider)
352
elif len(provider_models) > 3:
353
debug.error(f"Model '{model}' not found in provider {provider.__name__}")
346
354
if model in models.__models__:
347
355
for provider in models.__models__[model][1]:
348
356
providers.append(provider)
@@ -351,7 +359,9 @@ class AnyProvider(AsyncGeneratorProvider, ProviderModelMixin):
351
359
352
360
if len(providers) == 0:
353
361
raise ModelNotFoundError(f"AnyProvider: Model {model} not found in any provider.")
354
362
363
debug.log(f"AnyProvider: Using providers: {[provider.__name__ for provider in providers]} for model '{model}'")
364
355
365
async for chunk in IterListProvider(providers).create_async_generator(
356
366
model,
357
367
messages,
@@ -50,7 +50,6 @@ class IterListProvider(BaseRetryProvider):
50
50
"""
51
51
exceptions = {}
52
52
started: bool = False
53
54
53
for provider in self.get_providers(stream and not ignore_stream, ignored):
55
54
self.last_provider = provider
56
55
alias = model
@@ -67,6 +66,7 @@ class IterListProvider(BaseRetryProvider):
67
66
api_key = api_key.get(provider.get_parent())
68
67
if api_key:
69
68
extra_body["api_key"] = api_key
69
debug.log(f"Using API key for provider: {provider.__name__}")
70
70
try:
71
71
response = provider.create_function(alias, messages, stream=stream, **extra_body)
72
72
for chunk in response:
@@ -114,6 +114,7 @@ class IterListProvider(BaseRetryProvider):
114
114
if isinstance(api_key, dict):
115
115
api_key = api_key.get(provider.get_parent())
116
116
if api_key:
117
debug.log(f"Using API key for provider: {provider.__name__}")
117
118
extra_body["api_key"] = api_key
118
119
if conversation is not None and hasattr(conversation, provider.__name__):
119
120
extra_body["conversation"] = JsonConversation(**getattr(conversation, provider.__name__))