返回提交历史
Modified
g4f/Provider/Blackbox.py
+0
-1
Modified
g4f/Provider/Qwen.py
+24
-23
Modified
g4f/requests/__init__.py
+1
-2
XFEstudio/gpt4free
Remove unused import and update sse_stream function signature for consistency
4e5c26fd
代码差异
3 个文件
+25
-26
@@ -8,7 +8,6 @@ import random
8
8
import string
9
9
from pathlib import Path
10
10
from typing import Optional
11
from datetime import datetime, timedelta
12
11
13
12
from ..typing import AsyncResult, Messages, MediaListType
14
13
from ..requests.raise_for_status import raise_for_status
@@ -12,6 +12,7 @@ from ..errors import RateLimitError
12
12
from ..typing import AsyncResult, Messages, MediaListType
13
13
from ..providers.response import JsonConversation, Reasoning, Usage, ImageResponse, FinishReason
14
14
from ..requests import sse_stream
15
from ..tools.media import merge_media
15
16
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
16
17
from .helper import get_last_user_message
17
18
from .. import debug
@@ -60,7 +61,6 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin):
60
61
supports_message_history = False
61
62
62
63
_models_loaded = True
63
# Complete list of models, extracted from the API
64
64
image_models = image_models
65
65
text_models = text_models
66
66
vision_models = vision_models
@@ -88,6 +88,8 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin):
88
88
cls.models = [model["id"] for model in models]
89
89
cls.default_model = cls.models[0]
90
90
cls._models_loaded = True
91
cls.live += 1
92
debug.log(f"Loaded {len(cls.models)} models from {cls.url}")
91
93
92
94
else:
93
95
debug.log(f"Failed to load models from {cls.url}: {response.status_code} {response.reason}")
@@ -95,20 +97,20 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin):
95
97
96
98
@classmethod
97
99
async def create_async_generator(
98
cls,
99
model: str,
100
messages: Messages,
101
media: MediaListType = None,
102
conversation: JsonConversation = None,
103
proxy: str = None,
104
timeout: int = 120,
105
stream: bool = True,
106
enable_thinking: bool = True,
107
chat_type: Literal[
108
"t2t", "search", "artifacts", "web_dev", "deep_research", "t2i", "image_edit", "t2v"
109
] = "t2t",
110
image_size: Optional[Literal["1:1", "4:3", "3:4", "16:9", "9:16"]] = None,
111
**kwargs
100
cls,
101
model: str,
102
messages: Messages,
103
media: MediaListType = None,
104
conversation: JsonConversation = None,
105
proxy: str = None,
106
timeout: int = 120,
107
stream: bool = True,
108
enable_thinking: bool = True,
109
chat_type: Literal[
110
"t2t", "search", "artifacts", "web_dev", "deep_research", "t2i", "image_edit", "t2v"
111
] = "t2t",
112
aspect_ratio: Optional[Literal["1:1", "4:3", "3:4", "16:9", "9:16"]] = None,
113
**kwargs
112
114
) -> AsyncResult:
113
115
"""
114
116
chat_type:
@@ -164,7 +166,6 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin):
164
166
req_headers['bx-umidtoken'] = cls._midtoken
165
167
req_headers['bx-v'] = '2.5.31'
166
168
message_id = str(uuid.uuid4())
167
parent_id = None
168
169
if conversation is None:
169
170
chat_payload = {
170
171
"title": "New Chat",
@@ -186,8 +187,9 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin):
186
187
parent_id=None
187
188
)
188
189
files = []
190
media = list(merge_media(media))
189
191
if media:
190
for index, (_file, file_name) in enumerate(media):
192
for _file, file_name in media:
191
193
file_class: Literal["default", "vision", "video", "audio", "document"] = "vision"
192
194
_type: Literal["file", "image", "video", "audio"] = "image"
193
195
file_type = "image/jpeg"
@@ -206,7 +208,7 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin):
206
208
"name": file_name,
207
209
"file_type": file_type,
208
210
"showType": showType,
209
"file_class": file_class, # "document"
211
"file_class": file_class,
210
212
"url": _file
211
213
}
212
214
)
@@ -243,8 +245,8 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin):
243
245
}
244
246
]
245
247
}
246
if image_size:
247
msg_payload["size"] = image_size
248
if aspect_ratio:
249
msg_payload["size"] = aspect_ratio
248
250
249
251
async with session.post(
250
252
f'{cls.url}/api/v2/chat/completions?chat_id={conversation.chat_id}', json=msg_payload,
@@ -276,11 +278,10 @@ class Qwen(AsyncGeneratorProvider, ProviderModelMixin):
276
278
elif phase == "answer" and thinking_started:
277
279
thinking_started = False
278
280
elif phase == "image_gen" and status == "typing":
279
yield ImageResponse([content], "", extra)
281
yield ImageResponse(content, prompt, extra)
280
282
continue
281
283
elif phase == "image_gen" and status == "finished":
282
yield FinishReason(status)
283
284
yield FinishReason("stop")
284
285
if content:
285
286
yield Reasoning(content) if thinking_started else content
286
287
except (json.JSONDecodeError, KeyError, IndexError):
@@ -113,7 +113,6 @@ async def get_args_from_nodriver(
113
113
await callback(page)
114
114
for c in await page.send(nodriver.cdp.network.get_cookies([url])):
115
115
cookies[c.name] = c.value
116
await page.close()
117
116
stop_browser()
118
117
return {
119
118
"impersonate": "chrome",
@@ -219,7 +218,7 @@ async def get_nodriver(
219
218
BrowserConfig.stop_browser = on_stop
220
219
return browser, on_stop
221
220
222
async def sse_stream(iter_lines: Iterator[bytes]) -> AsyncIterator[dict]:
221
async def sse_stream(iter_lines: AsyncIterator[bytes]) -> AsyncIterator[dict]:
223
222
if hasattr(iter_lines, "content"):
224
223
iter_lines = iter_lines.content
225
224
elif hasattr(iter_lines, "iter_lines"):