返回提交历史
Modified
g4f/Provider/nexra/NexraChatGPT4o.py
+64
-52
XFEstudio/gpt4free
Restored provider (g4f/Provider/nexra/NexraChatGPT4o.py)
e54e8755
代码差异
1 个文件
+64
-52
@@ -1,73 +1,85 @@
1
1
from __future__ import annotations
2
2
3
from aiohttp import ClientSession
3
import json
4
import requests
4
5
5
from ...typing import AsyncResult, Messages
6
from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
6
from ...typing import CreateResult, Messages
7
from ..base_provider import ProviderModelMixin, AbstractProvider
7
8
from ..helper import format_prompt
8
import json
9
9
10
class NexraChatGPT4o(AsyncGeneratorProvider, ProviderModelMixin):
10
class NexraChatGPT4o(AbstractProvider, ProviderModelMixin):
11
11
label = "Nexra ChatGPT4o"
12
12
url = "https://nexra.aryahcr.cc/documentation/chatgpt/en"
13
13
api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
14
working = False
15
supports_stream = False
14
working = True
15
supports_stream = True
16
16
17
default_model = 'gpt-4o'
17
default_model = "gpt-4o"
18
18
models = [default_model]
19
19
20
20
@classmethod
21
21
def get_model(cls, model: str) -> str:
22
22
return cls.default_model
23
23
24
24
@classmethod
25
async def create_async_generator(
25
def create_completion(
26
26
cls,
27
27
model: str,
28
28
messages: Messages,
29
proxy: str = None,
29
stream: bool,
30
markdown: bool = False,
30
31
**kwargs
31
) -> AsyncResult:
32
) -> CreateResult:
32
33
model = cls.get_model(model)
33
34
34
35
headers = {
35
"Content-Type": "application/json",
36
'Content-Type': 'application/json'
36
37
}
37
async with ClientSession(headers=headers) as session:
38
data = {
39
"messages": [
40
{
41
"role": "user",
42
"content": format_prompt(messages)
43
}
44
],
45
"stream": False,
46
"markdown": False,
47
"model": model
48
}
49
async with session.post(cls.api_endpoint, json=data, proxy=proxy) as response:
50
response.raise_for_status()
51
buffer = ""
52
last_message = ""
53
async for chunk in response.content.iter_any():
54
chunk_str = chunk.decode()
55
buffer += chunk_str
56
while '{' in buffer and '}' in buffer:
57
start = buffer.index('{')
58
end = buffer.index('}', start) + 1
59
json_str = buffer[start:end]
60
buffer = buffer[end:]
61
try:
62
json_obj = json.loads(json_str)
63
if json_obj.get("finish"):
64
if last_message:
65
yield last_message
66
return
67
elif json_obj.get("message"):
68
last_message = json_obj["message"]
69
except json.JSONDecodeError:
70
pass
71
72
if last_message:
73
yield last_message
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
49
}
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)
57
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 and message != full_message:
82
yield message[len(full_message):]
83
full_message = message
84
except json.JSONDecodeError:
85
pass