返回提交历史
Modified
g4f/Provider/nexra/NexraQwen.py
+58
-59
XFEstudio/gpt4free
Restored provider g4f/Provider/nexra/NexraQwen.py
2dcfa748
代码差异
1 个文件
+58
-59
@@ -1,18 +1,17 @@
1
1
from __future__ import annotations
2
2
3
from aiohttp import ClientSession
4
3
import json
4
import requests
5
5
6
from ...typing import AsyncResult, Messages
7
from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
6
from ...typing import CreateResult, Messages
7
from ..base_provider import ProviderModelMixin, AbstractProvider
8
8
from ..helper import format_prompt
9
9
10
11
class NexraQwen(AsyncGeneratorProvider, ProviderModelMixin):
10
class NexraQwen(AbstractProvider, ProviderModelMixin):
12
11
label = "Nexra Qwen"
13
12
url = "https://nexra.aryahcr.cc/documentation/qwen/en"
14
13
api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
15
working = False
14
working = True
16
15
supports_stream = True
17
16
18
17
default_model = 'qwen'
@@ -21,66 +20,66 @@ class NexraQwen(AsyncGeneratorProvider, ProviderModelMixin):
21
20
@classmethod
22
21
def get_model(cls, model: str) -> str:
23
22
return cls.default_model
24
23
25
24
@classmethod
26
async def create_async_generator(
25
def create_completion(
27
26
cls,
28
27
model: str,
29
28
messages: Messages,
30
proxy: str = None,
31
stream: bool = False,
29
stream: bool,
32
30
markdown: bool = False,
33
31
**kwargs
34
) -> AsyncResult:
32
) -> CreateResult:
35
33
model = cls.get_model(model)
36
34
37
35
headers = {
38
"Content-Type": "application/json",
39
"accept": "application/json",
40
"origin": cls.url,
41
"referer": f"{cls.url}/chat",
36
'Content-Type': 'application/json'
37
}
38
39
data = {
40
"messages": [
41
{
42
"role": "user",
43
"content": format_prompt(messages)
44
}
45
],
46
"stream": stream,
47
"markdown": markdown,
48
"model": model
42
49
}
43
async with ClientSession(headers=headers) as session:
44
prompt = format_prompt(messages)
45
data = {
46
"messages": [
47
{
48
"role": "user",
49
"content": prompt
50
}
51
],
52
"markdown": markdown,
53
"stream": stream,
54
"model": model
55
}
56
async with session.post(cls.api_endpoint, json=data, proxy=proxy) as response:
57
response.raise_for_status()
58
59
complete_message = ""
60
61
# If streaming, process each chunk separately
62
if stream:
63
async for chunk in response.content.iter_any():
64
if chunk:
65
try:
66
# Decode the chunk and split by the delimiter
67
parts = chunk.decode('utf-8').split('\x1e')
68
for part in parts:
69
if part.strip(): # Ensure the part is not empty
70
response_data = json.loads(part)
71
message_part = response_data.get('message')
72
if message_part:
73
complete_message = message_part
74
except json.JSONDecodeError:
75
continue
50
51
response = requests.post(cls.api_endpoint, headers=headers, json=data, stream=stream)
52
53
if stream:
54
return cls.process_streaming_response(response)
55
else:
56
return cls.process_non_streaming_response(response)
76
57
77
# Yield the final complete message
78
if complete_message:
79
yield complete_message
80
else:
81
# Handle non-streaming response
82
text_response = await response.text()
83
response_data = json.loads(text_response)
84
message = response_data.get('message')
85
if message:
86
yield message
58
@classmethod
59
def process_non_streaming_response(cls, response):
60
if response.status_code == 200:
61
try:
62
content = response.text.lstrip('`')
63
data = json.loads(content)
64
return data.get('message', '')
65
except json.JSONDecodeError:
66
return "Error: Unable to decode JSON response"
67
else:
68
return f"Error: {response.status_code}"
69
70
@classmethod
71
def process_streaming_response(cls, response):
72
full_message = ""
73
for line in response.iter_lines(decode_unicode=True):
74
if line:
75
try:
76
line = line.lstrip('`')
77
data = json.loads(line)
78
if data.get('finish'):
79
break
80
message = data.get('message', '')
81
if message is not None and message != full_message:
82
yield message[len(full_message):]
83
full_message = message
84
except json.JSONDecodeError:
85
pass