返回提交历史
Modified
g4f/Provider/nexra/NexraBlackbox.py
+66
-66
Modified
g4f/models.py
+3
-2
XFEstudio/gpt4free
Restore the provider (g4f/Provider/nexra/NexraBlackbox.py)
ac783e50
代码差异
2 个文件
+69
-68
@@ -1,20 +1,22 @@
1
1
from __future__ import annotations
2
2
3
3
import json
4
from aiohttp import ClientSession, ClientTimeout, ClientError
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
from ..helper import format_prompt
8
9
9
class NexraBlackbox(AsyncGeneratorProvider, ProviderModelMixin):
10
label = "Nexra Blackbox"
11
url = "https://nexra.aryahcr.cc/documentation/blackbox/en"
12
api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
13
working = False
10
class NexraBlackbox(AbstractProvider, ProviderModelMixin):
11
url = "https://nexra.aryahcr.cc/api/chat/complements"
12
working = True
14
13
supports_stream = True
15
14
16
default_model = 'blackbox'
17
models = [default_model]
15
default_model = "blackbox"
16
17
models = [
18
'blackbox',
19
]
18
20
19
21
model_aliases = {
20
22
"blackboxai": "blackbox",
@@ -28,74 +30,72 @@ class NexraBlackbox(AsyncGeneratorProvider, ProviderModelMixin):
28
30
return cls.model_aliases[model]
29
31
else:
30
32
return cls.default_model
31
33
32
34
@classmethod
33
async def create_async_generator(
35
def create_completion(
34
36
cls,
35
37
model: str,
36
38
messages: Messages,
37
proxy: str = None,
38
stream: bool = False,
39
markdown: bool = False,
40
websearch: bool = False,
39
stream: bool,
41
40
**kwargs
42
) -> AsyncResult:
43
model = cls.get_model(model)
41
) -> CreateResult:
42
model = model or cls.default_model
44
43
45
44
headers = {
46
"Content-Type": "application/json"
45
'Content-Type': 'application/json'
47
46
}
48
47
49
payload = {
50
"messages": [{"role": msg["role"], "content": msg["content"]} for msg in messages],
51
"websearch": websearch,
48
data = {
49
"messages": [
50
{
51
"role": "user",
52
"content": format_prompt(messages)
53
}
54
],
55
"websearch": False,
52
56
"stream": stream,
53
"markdown": markdown,
57
"markdown": False,
54
58
"model": model
55
59
}
56
57
timeout = ClientTimeout(total=600) # 10 minutes timeout
58
60
59
try:
60
async with ClientSession(headers=headers, timeout=timeout) as session:
61
async with session.post(cls.api_endpoint, json=payload, proxy=proxy) as response:
62
if response.status != 200:
63
error_text = await response.text()
64
raise Exception(f"Error: {response.status} - {error_text}")
65
66
content = await response.text()
67
68
# Split content by Record Separator character
69
parts = content.split('\x1e')
70
full_message = ""
71
links = []
72
73
for part in parts:
74
if part:
75
try:
76
json_response = json.loads(part)
77
78
if json_response.get("message"):
79
full_message = json_response["message"] # Overwrite instead of append
80
81
if isinstance(json_response.get("search"), list):
82
links = json_response["search"] # Overwrite instead of extend
83
84
if json_response.get("finish", False):
85
break
86
87
except json.JSONDecodeError:
88
pass
89
90
if full_message:
91
yield full_message.strip()
61
response = requests.post(cls.url, headers=headers, json=data, stream=stream)
62
63
if stream:
64
return cls.process_streaming_response(response)
65
else:
66
return cls.process_non_streaming_response(response)
92
67
93
if payload["websearch"] and links:
94
yield "\n\n**Source:**"
95
for i, link in enumerate(links, start=1):
96
yield f"\n{i}. {link['title']}: {link['link']}"
68
@classmethod
69
def process_non_streaming_response(cls, response):
70
if response.status_code == 200:
71
try:
72
full_response = ""
73
for line in response.iter_lines(decode_unicode=True):
74
if line:
75
data = json.loads(line)
76
if data.get('finish'):
77
break
78
message = data.get('message', '')
79
if message:
80
full_response = message
81
return full_response
82
except json.JSONDecodeError:
83
return "Error: Unable to decode JSON response"
84
else:
85
return f"Error: {response.status_code}"
97
86
98
except ClientError:
99
raise
100
except Exception:
101
raise
87
@classmethod
88
def process_streaming_response(cls, response):
89
previous_message = ""
90
for line in response.iter_lines(decode_unicode=True):
91
if line:
92
try:
93
data = json.loads(line)
94
if data.get('finish'):
95
break
96
message = data.get('message', '')
97
if message and message != previous_message:
98
yield message[len(previous_message):]
99
previous_message = message
100
except json.JSONDecodeError:
101
pass
@@ -443,7 +443,8 @@ reka_core = Model(
443
443
blackboxai = Model(
444
444
name = 'blackboxai',
445
445
base_provider = 'Blackbox AI',
446
best_provider = IterListProvider([Blackbox, NexraBlackbox])
446
#best_provider = IterListProvider([Blackbox, NexraBlackbox])
447
best_provider = IterListProvider([NexraBlackbox])
447
448
)
448
449
449
450
blackboxai_pro = Model(
@@ -766,7 +767,7 @@ flux = Model(
766
767
flux_pro = Model(
767
768
name = 'flux-pro',
768
769
base_provider = 'Flux AI',
769
best_provider = IterListProvider([NexraFluxPro, AmigoChat])
770
best_provider = IterListProvider([AmigoChat, NexraFluxPro])
770
771
771
772
)
772
773