返回提交历史
Modified
g4f/Provider/needs_auth/LMArena.py
+5
-1
Modified
g4f/Provider/needs_auth/PuterJS.py
+4
-56
Modified
g4f/Provider/qwen/sharedTokenManager.py
+12
-1
XFEstudio/gpt4free
Enhance LMArena and PuterJS providers with error handling and model filtering improvements
7e34009f
代码差异
3 个文件
+21
-58
@@ -653,6 +653,10 @@ class LMArena(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin):
653
653
yield FinishReason(finish["finishReason"])
654
654
if "usage" in finish:
655
655
yield Usage(**finish["usage"])
656
elif line.startswith("a3:"):
657
raise RuntimeError(f"LMArena: {json.loads(line[3:])}")
658
else:
659
debug.log(f"LMArena: Unknown line prefix: {line}")
656
660
break
657
661
except (CloudflareError, MissingAuthError):
658
662
args = None
@@ -660,7 +664,7 @@ class LMArena(AsyncGeneratorProvider, ProviderModelMixin, AuthFileMixin):
660
664
continue
661
665
except:
662
666
raise
663
if args and os.getenv("G4F_SHARE_AUTH"):
667
if args and os.getenv("G4F_SHARE_AUTH") and not kwargs.get("action"):
664
668
yield "\n" * 10
665
669
yield "<!--"
666
670
yield json.dumps(args)
@@ -26,12 +26,12 @@ class PuterJS(AsyncGeneratorProvider, ProviderModelMixin):
26
26
default_model = 'gpt-4o'
27
27
default_vision_model = default_model
28
28
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
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"]
30
31
31
model_aliases = {
32
32
### mistral_models ###
33
"mixtral-8x22b": ["open-mixtral-8x22b", "open-mixtral-8x22b-2404"],
34
"pixtral-large": ["pixtral-large-2411","pixtral-large-latest", "mistral-large-pixtral-2411"],
33
"mixtral-8x22b": "open-mixtral-8x22b",
34
"pixtral-large": "pixtral-large-latest",
35
35
36
36
### openrouter_models ###
37
37
# llama
@@ -67,56 +67,6 @@ class PuterJS(AsyncGeneratorProvider, ProviderModelMixin):
67
67
"gemma-3-12b": ["openrouter:google/gemma-3-12b-it:free", "openrouter:google/gemma-3-12b-it"],
68
68
"gemma-3-27b": ["openrouter:google/gemma-3-27b-it:free", "openrouter:google/gemma-3-27b-it"],
69
69
70
# openai (gpt-3.5)
71
"gpt-3.5-turbo": ["openrouter:openai/gpt-3.5-turbo-0613", "openrouter:openai/gpt-3.5-turbo-1106", "openrouter:openai/gpt-3.5-turbo-0125", "openrouter:openai/gpt-3.5-turbo", "openrouter:openai/gpt-3.5-turbo-instruct", "openrouter:openai/gpt-3.5-turbo-16k"],
72
73
# openai (gpt-4)
74
"gpt-4": ["openrouter:openai/gpt-4-1106-preview", "openrouter:openai/gpt-4-32k", "openrouter:openai/gpt-4-32k-0314", "openrouter:openai/gpt-4", "openrouter:openai/gpt-4-0314",],
75
"gpt-4-turbo": ["openrouter:openai/gpt-4-turbo", "openrouter:openai/gpt-4-turbo-preview"],
76
77
# openai (gpt-4o)
78
"gpt-4o": ["gpt-4o", "openrouter:openai/gpt-4o-2024-08-06", "openrouter:openai/gpt-4o-2024-11-20", "openrouter:openai/chatgpt-4o-latest", "openrouter:openai/gpt-4o", "openrouter:openai/gpt-4o:extended", "openrouter:openai/gpt-4o-2024-05-13",],
79
"gpt-4o-search": "openrouter:openai/gpt-4o-search-preview",
80
"gpt-4o-mini": ["gpt-4o-mini", "openrouter:openai/gpt-4o-mini", "openrouter:openai/gpt-4o-mini-2024-07-18"],
81
"gpt-4o-mini-search": "openrouter:openai/gpt-4o-mini-search-preview",
82
83
# openai (o1)
84
"o1": ["o1", "openrouter:openai/o1", "openrouter:openai/o1-preview", "openrouter:openai/o1-preview-2024-09-12"],
85
"o1-mini": ["o1-mini", "openrouter:openai/o1-mini", "openrouter:openai/o1-mini-2024-09-12"],
86
"o1-pro": ["o1-pro", "openrouter:openai/o1-pro"],
87
88
# openai (o3)
89
"o3": ["o3", "openrouter:openai/o3"],
90
"o3-mini": ["o3-mini", "openrouter:openai/o3-mini", "openrouter:openai/o3-mini-high"],
91
"o3-mini-high": "openrouter:openai/o3-mini-high",
92
93
# openai (o4)
94
"o4-mini": ["o4-mini", "openrouter:openai/o4-mini"],
95
"o4-mini-high": "openrouter:openai/o4-mini-high",
96
97
# openai (gpt-4.1)
98
"gpt-4.1": ["gpt-4.1", "openrouter:openai/gpt-4.1"],
99
"gpt-4.1-mini": ["gpt-4.1-mini", "openrouter:openai/gpt-4.1-mini"],
100
"gpt-4.1-nano": ["gpt-4.1-nano", "openrouter:openai/gpt-4.1-nano"],
101
102
# openai (gpt-4.5)
103
"gpt-4.5": ["gpt-4.5-preview", "openrouter:openai/gpt-4.5-preview"],
104
105
# mistralai
106
"mistral-large": ["openrouter:mistralai/mistral-large", "openrouter:mistralai/mistral-large-2411", "openrouter:mistralai/mistral-large-2407", "openrouter:mistralai/pixtral-large-2411"],
107
"mistral-medium": ["openrouter:mistralai/mistral-medium", "openrouter:mistralai/mistral-medium-3"],
108
"mistral-small": ["mistral-small", "mistral-small-2312", "mistral-small-2503","mistral-small-latest", "openrouter:mistralai/mistral-small", "openrouter:mistralai/mistral-small-3.1-24b-instruct:free", "openrouter:mistralai/mistral-small-3.1-24b-instruct", "openrouter:mistralai/mistral-small-24b-instruct-2501:free", "openrouter:mistralai/mistral-small-24b-instruct-2501"],
109
"mistral-tiny": ["mistral-tiny", "mistral-tiny-2312", "openrouter:mistralai/mistral-tiny"],
110
"mistral-7b": ["open-mistral-7b", "openrouter:mistralai/mistral-7b-instruct", "openrouter:mistralai/mistral-7b-instruct:free", "openrouter:mistralai/mistral-7b-instruct-v0.1", "openrouter:mistralai/mistral-7b-instruct-v0.2", "openrouter:mistralai/mistral-7b-instruct-v0.3",],
111
"mixtral-8x7b": ["open-mixtral-8x7b", "openrouter:mistralai/mixtral-8x7b-instruct"],
112
"mixtral-8x22b": ["open-mixtral-8x22b", "open-mixtral-8x22b-2404", "openrouter:mistralai/mixtral-8x7b-instruct", "openrouter:mistralai/mixtral-8x22b-instruct"],
113
"ministral-8b": ["ministral-8b-2410", "ministral-8b-latest", "openrouter:mistral/ministral-8b", "openrouter:mistralai/ministral-8b"],
114
"mistral-nemo": ["openrouter:mistralai/mistral-nemo:free", "openrouter:mistralai/mistral-nemo"],
115
"ministral-3b": ["ministral-3b-2410", "ministral-3b-latest", "openrouter:mistralai/ministral-3b"],
116
"mistral-saba": "openrouter:mistralai/mistral-saba",
117
"codestral": ["codestral-2501","codestral-latest","codestral-2412","codestral-2411-rc5", "openrouter:mistralai/codestral-2501", "openrouter:mistralai/codestral-mamba"],
118
"pixtral-12b": ["pixtral-12b-2409","pixtral-12b","pixtral-12b-latest", "openrouter:mistralai/pixtral-12b"],
119
120
70
# nousresearch
121
71
"hermes-2-dpo": "openrouter:nousresearch/nous-hermes-2-mixtral-8x7b-dpo",
122
72
"hermes-2-pro": "openrouter:nousresearch/hermes-2-pro-llama-3-8b",
@@ -133,9 +83,7 @@ class PuterJS(AsyncGeneratorProvider, ProviderModelMixin):
133
83
"phi-4-multimodal": "openrouter:microsoft/phi-4-multimodal-instruct",
134
84
"phi-4-reasoning": "openrouter:microsoft/phi-4-reasoning:free",
135
85
"phi-4-reasoning-plus": ["openrouter:microsoft/phi-4-reasoning-plus:free", "openrouter:microsoft/phi-4-reasoning-plus"],
136
137
86
"wizardlm-2-8x22b": "openrouter:microsoft/wizardlm-2-8x22b",
138
139
87
"mai-ds-r1": "openrouter:microsoft/mai-ds-r1:free",
140
88
141
89
# anthropic
@@ -263,7 +211,7 @@ class PuterJS(AsyncGeneratorProvider, ProviderModelMixin):
263
211
try:
264
212
url = "https://api.puter.com/puterai/chat/models/"
265
213
cls.models = requests.get(url).json().get("models", [])
266
cls.models = [model for model in cls.models if "/" not in model and model not in ["abuse", "costly", "fake", "model-fallback-test-1"]]
214
cls.models = [model for model in cls.models if model.startswith("openrouter:") or "/" not in model and model not in ["abuse", "costly", "fake", "model-fallback-test-1"]]
267
215
cls.live += 1
268
216
except Exception as e:
269
217
debug.log(f"PuterJS: Failed to fetch models from API: {e}")
@@ -9,6 +9,7 @@ from pathlib import Path
9
9
import threading
10
10
11
11
from ..base_provider import AuthFileMixin
12
from ... import debug
12
13
13
14
QWEN_DIR = ".qwen"
14
15
QWEN_CREDENTIAL_FILENAME = "oauth_creds.json"
@@ -105,7 +106,7 @@ class SharedTokenManager(AuthFileMixin):
105
106
except Exception as e:
106
107
if isinstance(e, TokenManagerError):
107
108
raise
108
raise TokenManagerError(TokenError.REFRESH_FAILED, str(e), e)
109
raise TokenManagerError(TokenError.REFRESH_FAILED, str(e), e) from e
109
110
110
111
def checkAndReloadIfNeeded(self):
111
112
now = int(time.time() * 1000)
@@ -128,13 +129,21 @@ class SharedTokenManager(AuthFileMixin):
128
129
129
130
def reloadCredentialsFromFile(self):
130
131
file_path = self.getCredentialFilePath()
132
debug.log(f"Reloading credentials from {file_path}")
131
133
try:
132
134
with open(file_path, "r") as fs:
133
135
data = json.load(fs)
134
136
credentials = self.validateCredentials(data)
135
137
self.memory_cache["credentials"] = credentials
138
except FileNotFoundError:
139
self.memory_cache["credentials"] = None
140
raise TokenManagerError(TokenError.FILE_ACCESS_ERROR, "Credentials file not found", e) from e
141
except json.JSONDecodeError as e:
142
self.memory_cache["credentials"] = None
143
raise TokenManagerError(TokenError.FILE_ACCESS_ERROR, "Invalid JSON format", e) from e
136
144
except Exception as e:
137
145
self.memory_cache["credentials"] = None
146
raise TokenManagerError(TokenError.FILE_ACCESS_ERROR, str(e), e) from e
138
147
139
148
def validateCredentials(self, data):
140
149
if not data or not isinstance(data, dict):
@@ -149,6 +158,8 @@ class SharedTokenManager(AuthFileMixin):
149
158
async def performTokenRefresh(self, qwen_client: IQwenOAuth2Client, force_refresh: bool):
150
159
lock_path = self.getLockFilePath()
151
160
try:
161
if self.memory_cache["credentials"] is None:
162
self.reloadCredentialsFromFile()
152
163
qwen_client.setCredentials(self.memory_cache["credentials"])
153
164
current_credentials = qwen_client.getCredentials()
154
165
if not current_credentials.get("refresh_token"):