返回提交历史
Modified
g4f/Provider/nexra/NexraBing.py
+69
-73
Modified
g4f/models.py
+2
-1
XFEstudio/gpt4free
Restored provider (g4f/Provider/nexra/NexraBing.py)
6a3684a7
代码差异
2 个文件
+71
-74
@@ -1,95 +1,91 @@
1
1
from __future__ import annotations
2
2
3
from aiohttp import ClientSession
4
from aiohttp.client_exceptions import ContentTypeError
5
6
from ...typing import AsyncResult, Messages
7
from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
8
from ..helper import format_prompt
9
3
import json
4
import requests
10
5
6
from ...typing import CreateResult, Messages
7
from ..base_provider import ProviderModelMixin, AbstractProvider
8
from ..helper import format_prompt
11
9
12
class NexraBing(AsyncGeneratorProvider, ProviderModelMixin):
10
class NexraBing(AbstractProvider, ProviderModelMixin):
13
11
label = "Nexra Bing"
14
12
url = "https://nexra.aryahcr.cc/documentation/bing/en"
15
13
api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
16
working = False
17
supports_stream = False
14
working = True
15
supports_stream = True
18
16
19
default_model = 'Bing (Balanced)'
20
models = ['Bing (Balanced)', 'Bing (Creative)', 'Bing (Precise)']
17
default_model = 'Balanced'
18
models = [default_model, 'Creative', 'Precise']
21
19
22
20
model_aliases = {
23
"gpt-4": "Bing (Balanced)",
24
"gpt-4": "Bing (Creative)",
25
"gpt-4": "Bing (Precise)",
21
"gpt-4": "Balanced",
22
"gpt-4": "Creative",
23
"gpt-4": "Precise",
26
24
}
27
25
28
26
@classmethod
29
def get_model_and_style(cls, model: str) -> tuple[str, str]:
30
# Default to the default model if not found
31
model = cls.model_aliases.get(model, model)
32
if model not in cls.models:
33
model = cls.default_model
34
35
# Extract the base model and conversation style
36
base_model, conversation_style = model.split(' (')
37
conversation_style = conversation_style.rstrip(')')
38
return base_model, conversation_style
39
27
def get_model(cls, model: str) -> str:
28
if model in cls.models:
29
return model
30
elif model in cls.model_aliases:
31
return cls.model_aliases[model]
32
else:
33
return cls.default_model
34
40
35
@classmethod
41
async def create_async_generator(
36
def create_completion(
42
37
cls,
43
38
model: str,
44
39
messages: Messages,
45
proxy: str = None,
46
stream: bool = False,
47
markdown: bool = False,
40
stream: bool,
48
41
**kwargs
49
) -> AsyncResult:
50
base_model, conversation_style = cls.get_model_and_style(model)
51
42
) -> CreateResult:
43
model = cls.get_model(model)
44
52
45
headers = {
53
"Content-Type": "application/json",
54
"origin": cls.url,
55
"referer": f"{cls.url}/chat",
46
'Content-Type': 'application/json'
56
47
}
57
async with ClientSession(headers=headers) as session:
58
prompt = format_prompt(messages)
59
data = {
60
"messages": [
61
{
62
"role": "user",
63
"content": prompt
64
}
65
],
66
"conversation_style": conversation_style,
67
"markdown": markdown,
68
"stream": stream,
69
"model": base_model
70
}
71
async with session.post(cls.api_endpoint, json=data, proxy=proxy) as response:
72
response.raise_for_status()
73
try:
74
# Read the entire response text
75
text_response = await response.text()
76
# Split the response on the separator character
77
segments = text_response.split('\x1e')
78
79
complete_message = ""
80
for segment in segments:
81
if not segment.strip():
82
continue
83
try:
84
response_data = json.loads(segment)
85
if response_data.get('message'):
86
complete_message = response_data['message']
87
if response_data.get('finish'):
88
break
89
except json.JSONDecodeError:
90
raise Exception(f"Failed to parse segment: {segment}")
48
49
data = {
50
"messages": [
51
{
52
"role": "user",
53
"content": format_prompt(messages)
54
}
55
],
56
"conversation_style": model,
57
"markdown": False,
58
"stream": stream,
59
"model": "Bing"
60
}
61
62
response = requests.post(cls.api_endpoint, headers=headers, json=data, stream=True)
63
64
return cls.process_response(response)
65
66
@classmethod
67
def process_response(cls, response):
68
if response.status_code != 200:
69
yield f"Error: {response.status_code}"
70
return
71
72
full_message = ""
73
for chunk in response.iter_content(chunk_size=None):
74
if chunk:
75
messages = chunk.decode('utf-8').split('\x1e')
76
for message in messages:
77
try:
78
json_data = json.loads(message)
79
if json_data.get('finish', False):
80
return
81
current_message = json_data.get('message', '')
82
if current_message:
83
new_content = current_message[len(full_message):]
84
if new_content:
85
yield new_content
86
full_message = current_message
87
except json.JSONDecodeError:
88
continue
91
89
92
# Yield the complete message
93
yield complete_message
94
except ContentTypeError:
95
raise Exception("Failed to parse response content type.")
90
if not full_message:
91
yield "No message received"
@@ -39,6 +39,7 @@ from .Provider import (
39
39
Liaobots,
40
40
MagickPen,
41
41
MetaAI,
42
NexraBing,
42
43
NexraBlackbox,
43
44
NexraChatGPT,
44
45
NexraChatGPT4o,
@@ -150,7 +151,7 @@ gpt_4_turbo = Model(
150
151
gpt_4 = Model(
151
152
name = 'gpt-4',
152
153
base_provider = 'OpenAI',
153
best_provider = IterListProvider([Chatgpt4Online, Ai4Chat, NexraChatGPT, NexraChatGptV2, NexraChatGptWeb, Airforce, Bing, OpenaiChat, gpt_4_turbo.best_provider, gpt_4o.best_provider, gpt_4o_mini.best_provider])
154
best_provider = IterListProvider([Chatgpt4Online, Ai4Chat, NexraBing, NexraChatGPT, NexraChatGptV2, NexraChatGptWeb, Airforce, Bing, OpenaiChat, gpt_4_turbo.best_provider, gpt_4o.best_provider, gpt_4o_mini.best_provider])
154
155
)
155
156
156
157
# o1