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

XFEstudio/gpt4free

Enhance LMArena and PuterJS providers with error handling and model filtering improvements

7e34009f
hlohaus <983577+hlohaus@users.noreply.github.com>
提交于

代码差异

3 个文件 +21 -58
Modified g4f/Provider/needs_auth/LMArena.py +5 -1
@@ -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)
Modified g4f/Provider/needs_auth/PuterJS.py +4 -56
@@ -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}")
Modified g4f/Provider/qwen/sharedTokenManager.py +12 -1
@@ -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"):