返回提交历史
Modified
g4f/Provider/Qwen.py
+28
-23
XFEstudio/gpt4free
Update Qwen provider models and thinking mode
Refresh static model lists and improve dynamic model discovery/parsing. get_models now accepts an optional token, sends headers, and uses safe dict access (model.get(...)) to build text/image/vision/models lists and set default_model. Adjust generation logic so thinking_mode defaults to "Auto" when reasoning is enabled (otherwise "Fast"), introduce an auto_thinking variable, and propagate token headers into the StreamSession.
ccb5c070
代码差异
1 个文件
+28
-23
@@ -88,28 +88,26 @@ def get_oss_headers(method: str, date_str: str, sts_data: dict, content_type: st
88
88
89
89
90
90
text_models = [
91
'qwen3-max-preview', 'qwen-plus-2025-09-11', 'qwen3-235b-a22b', 'qwen3-coder-plus', 'qwen3-30b-a3b',
92
'qwen3-coder-30b-a3b-instruct', 'qwen-max-latest', 'qwen-plus-2025-01-25', 'qwq-32b', 'qwen-turbo-2025-02-11',
93
'qwen2.5-omni-7b', 'qvq-72b-preview-0310', 'qwen2.5-vl-32b-instruct', 'qwen2.5-14b-instruct-1m',
94
'qwen2.5-coder-32b-instruct', 'qwen2.5-72b-instruct']
91
'qwen3.6-plus', 'qwen3.6-max-preview', 'qwen3.5-plus', 'qwen3.5-omni-plus', 'qwen3.6-35b-a3b', 'qwen3.5-flash',
92
'qwen3.5-max-2026-03-08', 'qwen3.6-plus-preview', 'qwen3.5-397b-a17b', 'qwen3.5-122b-a10b', 'qwen3.5-omni-flash',
93
'qwen3.5-27b', 'qwen3.5-35b-a3b', 'qwen3-max-2026-01-23', 'qwen-plus-2025-07-28', 'qwen3-coder-plus',
94
'qwen3-vl-plus', 'qwen3-omni-flash-2025-12-01', 'qwen-max-latest']
95
95
96
96
image_models = [
97
'qwen3-max-preview', 'qwen-plus-2025-09-11', 'qwen3-235b-a22b', 'qwen3-coder-plus', 'qwen3-30b-a3b',
98
'qwen3-coder-30b-a3b-instruct', 'qwen-max-latest', 'qwen-plus-2025-01-25', 'qwen-turbo-2025-02-11',
99
'qwen2.5-omni-7b', 'qwen2.5-vl-32b-instruct', 'qwen2.5-14b-instruct-1m', 'qwen2.5-coder-32b-instruct',
100
'qwen2.5-72b-instruct']
97
'qwen3.6-plus', 'qwen3.5-plus', 'qwen3.5-omni-plus', 'qwen3.6-35b-a3b', 'qwen3.5-flash', 'qwen3.5-397b-a17b',
98
'qwen3.5-122b-a10b', 'qwen3.5-omni-flash', 'qwen3.5-27b', 'qwen3.5-35b-a3b', 'qwen3-max-2026-01-23',
99
'qwen-plus-2025-07-28', 'qwen3-coder-plus', 'qwen3-vl-plus', 'qwen3-omni-flash-2025-12-01', 'qwen-max-latest']
101
100
102
101
vision_models = [
103
'qwen3-max-preview', 'qwen-plus-2025-09-11', 'qwen3-235b-a22b', 'qwen3-coder-plus', 'qwen3-30b-a3b',
104
'qwen3-coder-30b-a3b-instruct', 'qwen-max-latest', 'qwen-plus-2025-01-25', 'qwen-turbo-2025-02-11',
105
'qwen2.5-omni-7b', 'qvq-72b-preview-0310', 'qwen2.5-vl-32b-instruct', 'qwen2.5-14b-instruct-1m',
106
'qwen2.5-coder-32b-instruct', 'qwen2.5-72b-instruct']
102
'qwen3.6-plus', 'qwen3.5-plus', 'qwen3.5-omni-plus', 'qwen3.6-35b-a3b', 'qwen3.5-flash', 'qwen3.5-397b-a17b',
103
'qwen3.5-122b-a10b', 'qwen3.5-omni-flash', 'qwen3.5-27b', 'qwen3.5-35b-a3b', 'qwen3-max-2026-01-23',
104
'qwen-plus-2025-07-28', 'qwen3-coder-plus', 'qwen3-vl-plus', 'qwen3-omni-flash-2025-12-01', 'qwen-max-latest']
107
105
108
106
models = [
109
'qwen3-max-preview', 'qwen-plus-2025-09-11', 'qwen3-235b-a22b', 'qwen3-coder-plus', 'qwen3-30b-a3b',
110
'qwen3-coder-30b-a3b-instruct', 'qwen-max-latest', 'qwen-plus-2025-01-25', 'qwq-32b', 'qwen-turbo-2025-02-11',
111
'qwen2.5-omni-7b', 'qvq-72b-preview-0310', 'qwen2.5-vl-32b-instruct', 'qwen2.5-14b-instruct-1m',
112
'qwen2.5-coder-32b-instruct', 'qwen2.5-72b-instruct']
107
'qwen3.6-plus', 'qwen3.6-max-preview', 'qwen3.5-plus', 'qwen3.5-omni-plus', 'qwen3.6-35b-a3b', 'qwen3.5-flash',
108
'qwen3.5-max-2026-03-08', 'qwen3.6-plus-preview', 'qwen3.5-397b-a17b', 'qwen3.5-122b-a10b', 'qwen3.5-omni-flash',
109
'qwen3.5-27b', 'qwen3.5-35b-a3b', 'qwen3-max-2026-01-23', 'qwen-plus-2025-07-28', 'qwen3-coder-plus',
110
'qwen3-vl-plus', 'qwen3-omni-flash-2025-12-01', 'qwen-max-latest']
113
111
114
112
115
113
class Qwen(AsyncGeneratorProvider, ProviderModelMixin):
@@ -136,17 +134,22 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin):
136
134
@classmethod
137
135
def get_models(cls, **kwargs) -> list[str]:
138
136
if not cls._models_loaded and has_curl_cffi:
139
response = curl_cffi.get(f"{cls.url}/api/models")
137
_token = kwargs.get("token")
138
headers = cls._get_headers(_token) if _token else {}
139
response = curl_cffi.get(f"{cls.url}/api/models", headers=headers)
140
140
if response.ok:
141
141
models = response.json().get("data", [])
142
cls.text_models = [model["id"] for model in models if "t2t" in model["info"]["meta"]["chat_type"]]
142
cls.text_models = [model["id"] for model in models
143
if "t2t" in model.get("info", {}).get("meta", {}).get("chat_type")]
143
144
144
145
cls.image_models = [
145
model["id"] for model in models if
146
"image_edit" in model["info"]["meta"]["chat_type"] or "t2i" in model["info"]["meta"]["chat_type"]
146
model["id"] for model in models
147
if "image_edit" in model.get("info", {}).get("meta", {}).get("chat_type") or
148
"t2i" in model.get("info", {}).get("meta", {}).get("chat_type")
147
149
]
148
150
149
cls.vision_models = [model["id"] for model in models if model["info"]["meta"]["capabilities"]["vision"]]
151
cls.vision_models = [model["id"] for model in models
152
if model.get("info", {}).get("meta", {}).get("capabilities", {}).get("vision")]
150
153
151
154
cls.models = [model["id"] for model in models]
152
155
cls.default_model = cls.models[0]
@@ -384,7 +387,9 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin):
384
387
model_name = cls.get_model(model)
385
388
prompt = get_last_user_message(messages)
386
389
enable_thinking = reasoning_effort in ("medium", "high")
387
thinking_mode: Literal["Auto", "Thinking", "Fast"] = kwargs.get("thinking_mode", "Auto")
390
thinking_mode: Literal["Auto", "Thinking", "Fast"] = kwargs.get("thinking_mode",
391
"Auto" if enable_thinking else "Fast")
392
auto_thinking = thinking_mode == "Auto"
388
393
timeout = kwargs.get("timeout") or 5 * 60
389
394
token = kwargs.get("token")
390
395
async with StreamSession(headers=cls._get_headers(token)) as session:
@@ -427,7 +432,7 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin):
427
432
headers=req_headers)
428
433
429
434
feature_config = {
430
"auto_thinking": "Auto" == thinking_mode,
435
"auto_thinking": auto_thinking,
431
436
"thinking_mode": thinking_mode,
432
437
# "thinking_format": "summary",
433
438
"thinking_enabled": enable_thinking,