返回提交历史
Modified
docs/providers-and-models.md
+0
-14
Modified
g4f/Provider/__init__.py
+0
-2
Deleted
g4f/Provider/nexra/NexraBing.py
+0
-93
Deleted
g4f/Provider/nexra/NexraBlackbox.py
+0
-100
Deleted
g4f/Provider/nexra/NexraChatGPT.py
+0
-285
Deleted
g4f/Provider/nexra/NexraDallE.py
+0
-63
Deleted
g4f/Provider/nexra/NexraDallE2.py
+0
-63
Deleted
g4f/Provider/nexra/NexraEmi.py
+0
-63
Deleted
g4f/Provider/nexra/NexraFluxPro.py
+0
-70
Deleted
g4f/Provider/nexra/NexraGeminiPro.py
+0
-86
Deleted
g4f/Provider/nexra/NexraMidjourney.py
+0
-63
Deleted
g4f/Provider/nexra/NexraProdiaAI.py
+0
-151
Deleted
g4f/Provider/nexra/NexraQwen.py
+0
-86
Deleted
g4f/Provider/nexra/NexraSD15.py
+0
-72
Deleted
g4f/Provider/nexra/NexraSDLora.py
+0
-69
Deleted
g4f/Provider/nexra/NexraSDTurbo.py
+0
-69
Deleted
g4f/Provider/nexra/__init__.py
+0
-14
Modified
g4f/models.py
+5
-107
XFEstudio/gpt4free
Update (g4f/models.py g4f/Provider/ docs/providers-and-models.md)
18b30925
代码差异
18 个文件
+5
-1470
@@ -49,20 +49,6 @@ This document provides an overview of various AI providers and models, including
49
49
|[liaobots.work](https://liaobots.work)|`g4f.Provider.Liaobots`|`gpt-3.5-turbo, gpt-4o-mini, gpt-4o, gpt-4-turbo, grok-2, grok-2-mini, claude-3-opus, claude-3-sonnet, claude-3-5-sonnet, claude-3-haiku, claude-2.1, gemini-flash, gemini-pro`|❌|❌|✔||❌|
50
50
|[magickpen.com](https://magickpen.com)|`g4f.Provider.MagickPen`|`gpt-4o-mini`|❌|❌|✔||❌|
51
51
|[meta.ai](https://www.meta.ai)|`g4f.Provider.MetaAI`|✔|✔|?|?||✔|
52
|[nexra.aryahcr.cc/bing](https://nexra.aryahcr.cc/documentation/bing/en)|`g4f.Provider.NexraBing`|✔|❌|❌|✔||❌|
53
|[nexra.aryahcr.cc/blackbox](https://nexra.aryahcr.cc/documentation/blackbox/en)|`g4f.Provider.NexraBlackbox`|`blackboxai` |❌|❌|✔||❌|
54
|[nexra.aryahcr.cc/chatgpt](https://nexra.aryahcr.cc/documentation/chatgpt/en)|`g4f.Provider.NexraChatGPT`|`gpt-4, gpt-3.5-turbo, gpt-3, gpt-4o` |❌|❌|✔||❌|
55
|[nexra.aryahcr.cc/dall-e](https://nexra.aryahcr.cc/documentation/dall-e/en)|`g4f.Provider.NexraDallE`|❌|`dalle`|❌|❌||❌|
56
|[nexra.aryahcr.cc/dall-e](https://nexra.aryahcr.cc/documentation/dall-e/en)|`g4f.Provider.NexraDallE2`|❌|`dalle-2`|❌|❌||❌|
57
|[nexra.aryahcr.cc/emi](https://nexra.aryahcr.cc/documentation/emi/en)|`g4f.Provider.NexraEmi`|❌|`emi`|❌|❌||❌|
58
|[nexra.aryahcr.cc/flux-pro](https://nexra.aryahcr.cc/documentation/flux-pro/en)|`g4f.Provider.NexraFluxPro`|❌|`flux-pro`|❌|❌||❌|
59
|[nexra.aryahcr.cc/gemini-pro](https://nexra.aryahcr.cc/documentation/gemini-pro/en)|`g4f.Provider.NexraGeminiPro`|`gemini-pro`|❌|❌|❌||❌|
60
|[nexra.aryahcr.cc/midjourney](https://nexra.aryahcr.cc/documentation/midjourney/en)|`g4f.Provider.NexraMidjourney`|❌|`midjourney`|❌|❌||❌|
61
|[nexra.aryahcr.cc/prodia](https://nexra.aryahcr.cc/documentation/prodia/en)|`g4f.Provider.NexraProdiaAI`|❌|✔|❌|❌||❌|
62
|[nexra.aryahcr.cc/qwen](https://nexra.aryahcr.cc/documentation/qwen/en)|`g4f.Provider.NexraQwen`|`qwen`|❌|❌|✔||❌|
63
|[nexra.aryahcr.cc/stable-diffusion](https://nexra.aryahcr.cc/documentation/stable-diffusion/en)|`g4f.Provider.NexraSD15`|❌|`sd-1.5`|❌|❌||❌
64
|[nexra.aryahcr.cc/stable-diffusion](https://nexra.aryahcr.cc/documentation/stable-diffusion/en)|`g4f.Provider.NexraSDLora`|❌|`sdxl-lora`|❌|❌||❌
65
|[nexra.aryahcr.cc/stable-diffusion](https://nexra.aryahcr.cc/documentation/stable-diffusion/en)|`g4f.Provider.NexraSDTurbo`|❌|`sdxl-turbo`|❌|❌||❌
66
52
|[platform.openai.com](https://platform.openai.com/)|`g4f.Provider.Openai`|✔|❌|✔|||✔|
67
53
|[chatgpt.com](https://chatgpt.com/)|`g4f.Provider.OpenaiChat`|`gpt-4o, gpt-4o-mini, gpt-4`|❌|✔|||✔|
68
54
|[www.perplexity.ai)](https://www.perplexity.ai)|`g4f.Provider.PerplexityAi`|✔|❌|❌|?||❌|
@@ -11,8 +11,6 @@ from .needs_auth import *
11
11
from .not_working import *
12
12
from .local import *
13
13
14
from .nexra import *
15
16
14
from .AI365VIP import AI365VIP
17
15
from .AIChatFree import AIChatFree
18
16
from .AIUncensored import AIUncensored
@@ -1,93 +0,0 @@
1
from __future__ import annotations
2
3
import json
4
import requests
5
6
from ...typing import CreateResult, Messages
7
from ..base_provider import ProviderModelMixin, AbstractProvider
8
from ..helper import format_prompt
9
10
class NexraBing(AbstractProvider, ProviderModelMixin):
11
label = "Nexra Bing"
12
url = "https://nexra.aryahcr.cc/documentation/bing/en"
13
api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
14
working = True
15
supports_stream = True
16
17
default_model = 'Balanced'
18
models = [default_model, 'Creative', 'Precise']
19
20
model_aliases = {
21
"gpt-4": "Balanced",
22
"gpt-4": "Creative",
23
"gpt-4": "Precise",
24
}
25
26
@classmethod
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
35
@classmethod
36
def create_completion(
37
cls,
38
model: str,
39
messages: Messages,
40
stream: bool = False,
41
proxy: str = None,
42
markdown: bool = False,
43
**kwargs
44
) -> CreateResult:
45
model = cls.get_model(model)
46
47
headers = {
48
'Content-Type': 'application/json'
49
}
50
51
data = {
52
"messages": [
53
{
54
"role": "user",
55
"content": format_prompt(messages)
56
}
57
],
58
"conversation_style": model,
59
"markdown": markdown,
60
"stream": stream,
61
"model": "Bing"
62
}
63
64
response = requests.post(cls.api_endpoint, headers=headers, json=data, stream=True)
65
66
return cls.process_response(response)
67
68
@classmethod
69
def process_response(cls, response):
70
if response.status_code != 200:
71
yield f"Error: {response.status_code}"
72
return
73
74
full_message = ""
75
for chunk in response.iter_content(chunk_size=None):
76
if chunk:
77
messages = chunk.decode('utf-8').split('\x1e')
78
for message in messages:
79
try:
80
json_data = json.loads(message)
81
if json_data.get('finish', False):
82
return
83
current_message = json_data.get('message', '')
84
if current_message:
85
new_content = current_message[len(full_message):]
86
if new_content:
87
yield new_content
88
full_message = current_message
89
except json.JSONDecodeError:
90
continue
91
92
if not full_message:
93
yield "No message received"
@@ -1,100 +0,0 @@
1
from __future__ import annotations
2
3
import json
4
import requests
5
6
from ...typing import CreateResult, Messages
7
from ..base_provider import ProviderModelMixin, AbstractProvider
8
from ..helper import format_prompt
9
10
class NexraBlackbox(AbstractProvider, ProviderModelMixin):
11
label = "Nexra Blackbox"
12
url = "https://nexra.aryahcr.cc/documentation/blackbox/en"
13
api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
14
working = True
15
supports_stream = True
16
17
default_model = "blackbox"
18
models = [default_model]
19
model_aliases = {"blackboxai": "blackbox",}
20
21
@classmethod
22
def get_model(cls, model: str) -> str:
23
if model in cls.models:
24
return model
25
elif model in cls.model_aliases:
26
return cls.model_aliases[model]
27
else:
28
return cls.default_model
29
30
@classmethod
31
def create_completion(
32
cls,
33
model: str,
34
messages: Messages,
35
stream: bool,
36
proxy: str = None,
37
markdown: bool = False,
38
websearch: bool = False,
39
**kwargs
40
) -> CreateResult:
41
model = cls.get_model(model)
42
43
headers = {
44
'Content-Type': 'application/json'
45
}
46
47
data = {
48
"messages": [
49
{
50
"role": "user",
51
"content": format_prompt(messages)
52
}
53
],
54
"websearch": websearch,
55
"stream": stream,
56
"markdown": markdown,
57
"model": model
58
}
59
60
response = requests.post(cls.api_endpoint, headers=headers, json=data, stream=stream)
61
62
if stream:
63
return cls.process_streaming_response(response)
64
else:
65
return cls.process_non_streaming_response(response)
66
67
@classmethod
68
def process_non_streaming_response(cls, response):
69
if response.status_code == 200:
70
try:
71
full_response = ""
72
for line in response.iter_lines(decode_unicode=True):
73
if line:
74
data = json.loads(line)
75
if data.get('finish'):
76
break
77
message = data.get('message', '')
78
if message:
79
full_response = message
80
return full_response
81
except json.JSONDecodeError:
82
return "Error: Unable to decode JSON response"
83
else:
84
return f"Error: {response.status_code}"
85
86
@classmethod
87
def process_streaming_response(cls, response):
88
previous_message = ""
89
for line in response.iter_lines(decode_unicode=True):
90
if line:
91
try:
92
data = json.loads(line)
93
if data.get('finish'):
94
break
95
message = data.get('message', '')
96
if message and message != previous_message:
97
yield message[len(previous_message):]
98
previous_message = message
99
except json.JSONDecodeError:
100
pass
@@ -1,285 +0,0 @@
1
from __future__ import annotations
2
3
import asyncio
4
import json
5
import requests
6
from typing import Any, Dict
7
8
from ...typing import AsyncResult, Messages
9
from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
10
from ..helper import format_prompt
11
12
13
class NexraChatGPT(AsyncGeneratorProvider, ProviderModelMixin):
14
label = "Nexra ChatGPT"
15
url = "https://nexra.aryahcr.cc/documentation/chatgpt/en"
16
api_endpoint_nexra_chatgpt = "https://nexra.aryahcr.cc/api/chat/gpt"
17
api_endpoint_nexra_chatgpt4o = "https://nexra.aryahcr.cc/api/chat/complements"
18
api_endpoint_nexra_chatgpt_v2 = "https://nexra.aryahcr.cc/api/chat/complements"
19
api_endpoint_nexra_gptweb = "https://nexra.aryahcr.cc/api/chat/gptweb"
20
working = True
21
supports_system_message = True
22
supports_message_history = True
23
supports_stream = True
24
25
default_model = 'gpt-3.5-turbo'
26
nexra_chatgpt = [
27
'gpt-4', 'gpt-4-0613', 'gpt-4-0314', 'gpt-4-32k-0314',
28
default_model, 'gpt-3.5-turbo-16k', 'gpt-3.5-turbo-0613', 'gpt-3.5-turbo-16k-0613', 'gpt-3.5-turbo-0301',
29
'text-davinci-003', 'text-davinci-002', 'code-davinci-002', 'gpt-3', 'text-curie-001', 'text-babbage-001', 'text-ada-001', 'davinci', 'curie', 'babbage', 'ada', 'babbage-002', 'davinci-002'
30
]
31
nexra_chatgpt4o = ['gpt-4o']
32
nexra_chatgptv2 = ['chatgpt']
33
nexra_gptweb = ['gptweb']
34
models = nexra_chatgpt + nexra_chatgpt4o + nexra_chatgptv2 + nexra_gptweb
35
36
model_aliases = {
37
"gpt-4": "gpt-4-0613",
38
"gpt-4-32k": "gpt-4-32k-0314",
39
"gpt-3.5-turbo": "gpt-3.5-turbo-16k",
40
"gpt-3.5-turbo-0613": "gpt-3.5-turbo-16k-0613",
41
"gpt-3": "text-davinci-003",
42
"text-davinci-002": "code-davinci-002",
43
"text-curie-001": "text-babbage-001",
44
"text-ada-001": "davinci",
45
"curie": "babbage",
46
"ada": "babbage-002",
47
"davinci-002": "davinci-002",
48
"chatgpt": "chatgpt",
49
"gptweb": "gptweb"
50
}
51
52
@classmethod
53
def get_model(cls, model: str) -> str:
54
if model in cls.models:
55
return model
56
elif model in cls.model_aliases:
57
return cls.model_aliases[model]
58
else:
59
return cls.default_model
60
61
@classmethod
62
async def create_async_generator(
63
cls,
64
model: str,
65
messages: Messages,
66
stream: bool = False,
67
proxy: str = None,
68
markdown: bool = False,
69
**kwargs
70
) -> AsyncResult:
71
if model in cls.nexra_chatgpt:
72
async for chunk in cls._create_async_generator_nexra_chatgpt(model, messages, proxy, **kwargs):
73
yield chunk
74
elif model in cls.nexra_chatgpt4o:
75
async for chunk in cls._create_async_generator_nexra_chatgpt4o(model, messages, stream, proxy, markdown, **kwargs):
76
yield chunk
77
elif model in cls.nexra_chatgptv2:
78
async for chunk in cls._create_async_generator_nexra_chatgpt_v2(model, messages, stream, proxy, markdown, **kwargs):
79
yield chunk
80
elif model in cls.nexra_gptweb:
81
async for chunk in cls._create_async_generator_nexra_gptweb(model, messages, proxy, **kwargs):
82
yield chunk
83
84
@classmethod
85
async def _create_async_generator_nexra_chatgpt(
86
cls,
87
model: str,
88
messages: Messages,
89
proxy: str = None,
90
markdown: bool = False,
91
**kwargs
92
) -> AsyncResult:
93
model = cls.get_model(model)
94
95
headers = {
96
"Content-Type": "application/json"
97
}
98
99
prompt = format_prompt(messages)
100
data = {
101
"messages": messages,
102
"prompt": prompt,
103
"model": model,
104
"markdown": markdown
105
}
106
107
loop = asyncio.get_event_loop()
108
try:
109
response = await loop.run_in_executor(None, cls._sync_post_request, cls.api_endpoint_nexra_chatgpt, data, headers, proxy)
110
filtered_response = cls._filter_response(response)
111
112
for chunk in filtered_response:
113
yield chunk
114
except Exception as e:
115
print(f"Error during API request (nexra_chatgpt): {e}")
116
117
@classmethod
118
async def _create_async_generator_nexra_chatgpt4o(
119
cls,
120
model: str,
121
messages: Messages,
122
stream: bool = False,
123
proxy: str = None,
124
markdown: bool = False,
125
**kwargs
126
) -> AsyncResult:
127
model = cls.get_model(model)
128
129
headers = {
130
"Content-Type": "application/json"
131
}
132
133
prompt = format_prompt(messages)
134
data = {
135
"messages": [
136
{
137
"role": "user",
138
"content": prompt
139
}
140
],
141
"stream": stream,
142
"markdown": markdown,
143
"model": model
144
}
145
146
loop = asyncio.get_event_loop()
147
try:
148
response = await loop.run_in_executor(None, cls._sync_post_request, cls.api_endpoint_nexra_chatgpt4o, data, headers, proxy, stream)
149
150
if stream:
151
async for chunk in cls._process_streaming_response(response):
152
yield chunk
153
else:
154
for chunk in cls._process_non_streaming_response(response):
155
yield chunk
156
except Exception as e:
157
print(f"Error during API request (nexra_chatgpt4o): {e}")
158
159
@classmethod
160
async def _create_async_generator_nexra_chatgpt_v2(
161
cls,
162
model: str,
163
messages: Messages,
164
stream: bool = False,
165
proxy: str = None,
166
markdown: bool = False,
167
**kwargs
168
) -> AsyncResult:
169
model = cls.get_model(model)
170
171
headers = {
172
"Content-Type": "application/json"
173
}
174
175
prompt = format_prompt(messages)
176
data = {
177
"messages": [
178
{
179
"role": "user",
180
"content": prompt
181
}
182
],
183
"stream": stream,
184
"markdown": markdown,
185
"model": model
186
}
187
188
loop = asyncio.get_event_loop()
189
try:
190
response = await loop.run_in_executor(None, cls._sync_post_request, cls.api_endpoint_nexra_chatgpt_v2, data, headers, proxy, stream)
191
192
if stream:
193
async for chunk in cls._process_streaming_response(response):
194
yield chunk
195
else:
196
for chunk in cls._process_non_streaming_response(response):
197
yield chunk
198
except Exception as e:
199
print(f"Error during API request (nexra_chatgpt_v2): {e}")
200
201
@classmethod
202
async def _create_async_generator_nexra_gptweb(
203
cls,
204
model: str,
205
messages: Messages,
206
proxy: str = None,
207
markdown: bool = False,
208
**kwargs
209
) -> AsyncResult:
210
model = cls.get_model(model)
211
212
headers = {
213
"Content-Type": "application/json"
214
}
215
216
prompt = format_prompt(messages)
217
data = {
218
"prompt": prompt,
219
"markdown": markdown,
220
}
221
222
loop = asyncio.get_event_loop()
223
try:
224
response = await loop.run_in_executor(None, cls._sync_post_request, cls.api_endpoint_nexra_gptweb, data, headers, proxy)
225
226
for chunk in response.iter_content(1024):
227
if chunk:
228
decoded_chunk = chunk.decode().lstrip('_')
229
try:
230
response_json = json.loads(decoded_chunk)
231
if response_json.get("status"):
232
yield response_json.get("gpt", "")
233
except json.JSONDecodeError:
234
continue
235
except Exception as e:
236
print(f"Error during API request (nexra_gptweb): {e}")
237
238
@staticmethod
239
def _sync_post_request(url: str, data: Dict[str, Any], headers: Dict[str, str], proxy: str = None, stream: bool = False) -> requests.Response:
240
proxies = {
241
"http": proxy,
242
"https": proxy,
243
} if proxy else None
244
245
try:
246
response = requests.post(url, json=data, headers=headers, proxies=proxies, stream=stream)
247
response.raise_for_status()
248
return response
249
except requests.RequestException as e:
250
print(f"Request failed: {e}")
251
raise
252
253
@staticmethod
254
def _process_non_streaming_response(response: requests.Response) -> str:
255
if response.status_code == 200:
256
try:
257
content = response.text.lstrip('')
258
data = json.loads(content)
259
return data.get('message', '')
260
except json.JSONDecodeError:
261
return "Error: Unable to decode JSON response"
262
else:
263
return f"Error: {response.status_code}"
264
265
@staticmethod
266
async def _process_streaming_response(response: requests.Response):
267
full_message = ""
268
for line in response.iter_lines(decode_unicode=True):
269
if line:
270
try:
271
line = line.lstrip('')
272
data = json.loads(line)
273
if data.get('finish'):
274
break
275
message = data.get('message', '')
276
if message:
277
yield message[len(full_message):]
278
full_message = message
279
except json.JSONDecodeError:
280
pass
281
282
@staticmethod
283
def _filter_response(response: requests.Response) -> str:
284
response_json = response.json()
285
return response_json.get("gpt", "")
@@ -1,63 +0,0 @@
1
from __future__ import annotations
2
3
import json
4
import requests
5
from ...typing import CreateResult, Messages
6
from ..base_provider import ProviderModelMixin, AbstractProvider
7
from ...image import ImageResponse
8
9
class NexraDallE(AbstractProvider, ProviderModelMixin):
10
label = "Nexra DALL-E"
11
url = "https://nexra.aryahcr.cc/documentation/dall-e/en"
12
api_endpoint = "https://nexra.aryahcr.cc/api/image/complements"
13
working = True
14
15
default_model = "dalle"
16
models = [default_model]
17
18
@classmethod
19
def get_model(cls, model: str) -> str:
20
return cls.default_model
21
22
@classmethod
23
def create_completion(
24
cls,
25
model: str,
26
messages: Messages,
27
proxy: str = None,
28
response: str = "url", # base64 or url
29
**kwargs
30
) -> CreateResult:
31
model = cls.get_model(model)
32
33
headers = {
34
'Content-Type': 'application/json'
35
}
36
37
data = {
38
"prompt": messages[-1]["content"],
39
"model": model,
40
"response": response
41
}
42
43
response = requests.post(cls.api_endpoint, headers=headers, json=data)
44
45
result = cls.process_response(response)
46
yield result
47
48
@classmethod
49
def process_response(cls, response):
50
if response.status_code == 200:
51
try:
52
content = response.text.strip()
53
content = content.lstrip('_')
54
data = json.loads(content)
55
if data.get('status') and data.get('images'):
56
image_url = data['images'][0]
57
return ImageResponse(images=[image_url], alt="Generated Image")
58
else:
59
return "Error: No image URL found in the response"
60
except json.JSONDecodeError as e:
61
return f"Error: Unable to decode JSON response. Details: {str(e)}"
62
else:
63
return f"Error: {response.status_code}, Response: {response.text}"
@@ -1,63 +0,0 @@
1
from __future__ import annotations
2
3
import json
4
import requests
5
from ...typing import CreateResult, Messages
6
from ..base_provider import ProviderModelMixin, AbstractProvider
7
from ...image import ImageResponse
8
9
class NexraDallE2(AbstractProvider, ProviderModelMixin):
10
label = "Nexra DALL-E 2"
11
url = "https://nexra.aryahcr.cc/documentation/dall-e/en"
12
api_endpoint = "https://nexra.aryahcr.cc/api/image/complements"
13
working = True
14
15
default_model = "dalle2"
16
models = [default_model]
17
18
@classmethod
19
def get_model(cls, model: str) -> str:
20
return cls.default_model
21
22
@classmethod
23
def create_completion(
24
cls,
25
model: str,
26
messages: Messages,
27
proxy: str = None,
28
response: str = "url", # base64 or url
29
**kwargs
30
) -> CreateResult:
31
model = cls.get_model(model)
32
33
headers = {
34
'Content-Type': 'application/json'
35
}
36
37
data = {
38
"prompt": messages[-1]["content"],
39
"model": model,
40
"response": response
41
}
42
43
response = requests.post(cls.api_endpoint, headers=headers, json=data)
44
45
result = cls.process_response(response)
46
yield result
47
48
@classmethod
49
def process_response(cls, response):
50
if response.status_code == 200:
51
try:
52
content = response.text.strip()
53
content = content.lstrip('_')
54
data = json.loads(content)
55
if data.get('status') and data.get('images'):
56
image_url = data['images'][0]
57
return ImageResponse(images=[image_url], alt="Generated Image")
58
else:
59
return "Error: No image URL found in the response"
60
except json.JSONDecodeError as e:
61
return f"Error: Unable to decode JSON response. Details: {str(e)}"
62
else:
63
return f"Error: {response.status_code}, Response: {response.text}"
@@ -1,63 +0,0 @@
1
from __future__ import annotations
2
3
import json
4
import requests
5
from ...typing import CreateResult, Messages
6
from ..base_provider import ProviderModelMixin, AbstractProvider
7
from ...image import ImageResponse
8
9
class NexraEmi(AbstractProvider, ProviderModelMixin):
10
label = "Nexra Emi"
11
url = "https://nexra.aryahcr.cc/documentation/emi/en"
12
api_endpoint = "https://nexra.aryahcr.cc/api/image/complements"
13
working = True
14
15
default_model = "emi"
16
models = [default_model]
17
18
@classmethod
19
def get_model(cls, model: str) -> str:
20
return cls.default_model
21
22
@classmethod
23
def create_completion(
24
cls,
25
model: str,
26
messages: Messages,
27
proxy: str = None,
28
response: str = "url", # base64 or url
29
**kwargs
30
) -> CreateResult:
31
model = cls.get_model(model)
32
33
headers = {
34
'Content-Type': 'application/json'
35
}
36
37
data = {
38
"prompt": messages[-1]["content"],
39
"model": model,
40
"response": response
41
}
42
43
response = requests.post(cls.api_endpoint, headers=headers, json=data)
44
45
result = cls.process_response(response)
46
yield result
47
48
@classmethod
49
def process_response(cls, response):
50
if response.status_code == 200:
51
try:
52
content = response.text.strip()
53
content = content.lstrip('_')
54
data = json.loads(content)
55
if data.get('status') and data.get('images'):
56
image_url = data['images'][0]
57
return ImageResponse(images=[image_url], alt="Generated Image")
58
else:
59
return "Error: No image URL found in the response"
60
except json.JSONDecodeError as e:
61
return f"Error: Unable to decode JSON response. Details: {str(e)}"
62
else:
63
return f"Error: {response.status_code}, Response: {response.text}"
@@ -1,70 +0,0 @@
1
from __future__ import annotations
2
3
import json
4
import requests
5
from ...typing import CreateResult, Messages
6
from ..base_provider import ProviderModelMixin, AbstractProvider
7
from ...image import ImageResponse
8
9
class NexraFluxPro(AbstractProvider, ProviderModelMixin):
10
url = "https://nexra.aryahcr.cc/documentation/flux-pro/en"
11
api_endpoint = "https://nexra.aryahcr.cc/api/image/complements"
12
working = True
13
14
default_model = 'flux'
15
models = [default_model]
16
model_aliases = {
17
"flux-pro": "flux",
18
}
19
20
@classmethod
21
def get_model(cls, model: str) -> str:
22
if model in cls.models:
23
return model
24
elif model in cls.model_aliases:
25
return cls.model_aliases[model]
26
else:
27
return cls.default_model
28
29
@classmethod
30
def create_completion(
31
cls,
32
model: str,
33
messages: Messages,
34
proxy: str = None,
35
response: str = "url", # base64 or url
36
**kwargs
37
) -> CreateResult:
38
model = cls.get_model(model)
39
40
headers = {
41
'Content-Type': 'application/json'
42
}
43
44
data = {
45
"prompt": messages[-1]["content"],
46
"model": model,
47
"response": response
48
}
49
50
response = requests.post(cls.api_endpoint, headers=headers, json=data)
51
52
result = cls.process_response(response)
53
yield result
54
55
@classmethod
56
def process_response(cls, response):
57
if response.status_code == 200:
58
try:
59
content = response.text.strip()
60
content = content.lstrip('_')
61
data = json.loads(content)
62
if data.get('status') and data.get('images'):
63
image_url = data['images'][0]
64
return ImageResponse(images=[image_url], alt="Generated Image")
65
else:
66
return "Error: No image URL found in the response"
67
except json.JSONDecodeError as e:
68
return f"Error: Unable to decode JSON response. Details: {str(e)}"
69
else:
70
return f"Error: {response.status_code}, Response: {response.text}"
@@ -1,86 +0,0 @@
1
from __future__ import annotations
2
3
import json
4
import requests
5
6
from ...typing import CreateResult, Messages
7
from ..base_provider import ProviderModelMixin, AbstractProvider
8
from ..helper import format_prompt
9
10
class NexraGeminiPro(AbstractProvider, ProviderModelMixin):
11
label = "Nexra Gemini PRO"
12
url = "https://nexra.aryahcr.cc/documentation/gemini-pro/en"
13
api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
14
working = True
15
supports_stream = True
16
17
default_model = 'gemini-pro'
18
models = [default_model]
19
20
@classmethod
21
def get_model(cls, model: str) -> str:
22
return cls.default_model
23
24
@classmethod
25
def create_completion(
26
cls,
27
model: str,
28
messages: Messages,
29
stream: bool,
30
proxy: str = None,
31
markdown: bool = False,
32
**kwargs
33
) -> CreateResult:
34
model = cls.get_model(model)
35
36
headers = {
37
'Content-Type': 'application/json'
38
}
39
40
data = {
41
"messages": [
42
{
43
"role": "user",
44
"content": format_prompt(messages)
45
}
46
],
47
"stream": stream,
48
"markdown": markdown,
49
"model": model
50
}
51
52
response = requests.post(cls.api_endpoint, headers=headers, json=data, stream=stream)
53
54
if stream:
55
return cls.process_streaming_response(response)
56
else:
57
return cls.process_non_streaming_response(response)
58
59
@classmethod
60
def process_non_streaming_response(cls, response):
61
if response.status_code == 200:
62
try:
63
content = response.text.lstrip('')
64
data = json.loads(content)
65
return data.get('message', '')
66
except json.JSONDecodeError:
67
return "Error: Unable to decode JSON response"
68
else:
69
return f"Error: {response.status_code}"
70
71
@classmethod
72
def process_streaming_response(cls, response):
73
full_message = ""
74
for line in response.iter_lines(decode_unicode=True):
75
if line:
76
try:
77
line = line.lstrip('')
78
data = json.loads(line)
79
if data.get('finish'):
80
break
81
message = data.get('message', '')
82
if message:
83
yield message[len(full_message):]
84
full_message = message
85
except json.JSONDecodeError:
86
pass
@@ -1,63 +0,0 @@
1
from __future__ import annotations
2
3
import json
4
import requests
5
from ...typing import CreateResult, Messages
6
from ..base_provider import ProviderModelMixin, AbstractProvider
7
from ...image import ImageResponse
8
9
class NexraMidjourney(AbstractProvider, ProviderModelMixin):
10
label = "Nexra Midjourney"
11
url = "https://nexra.aryahcr.cc/documentation/midjourney/en"
12
api_endpoint = "https://nexra.aryahcr.cc/api/image/complements"
13
working = True
14
15
default_model = "midjourney"
16
models = [default_model]
17
18
@classmethod
19
def get_model(cls, model: str) -> str:
20
return cls.default_model
21
22
@classmethod
23
def create_completion(
24
cls,
25
model: str,
26
messages: Messages,
27
proxy: str = None,
28
response: str = "url", # base64 or url
29
**kwargs
30
) -> CreateResult:
31
model = cls.get_model(model)
32
33
headers = {
34
'Content-Type': 'application/json'
35
}
36
37
data = {
38
"prompt": messages[-1]["content"],
39
"model": model,
40
"response": response
41
}
42
43
response = requests.post(cls.api_endpoint, headers=headers, json=data)
44
45
result = cls.process_response(response)
46
yield result
47
48
@classmethod
49
def process_response(cls, response):
50
if response.status_code == 200:
51
try:
52
content = response.text.strip()
53
content = content.lstrip('_')
54
data = json.loads(content)
55
if data.get('status') and data.get('images'):
56
image_url = data['images'][0]
57
return ImageResponse(images=[image_url], alt="Generated Image")
58
else:
59
return "Error: No image URL found in the response"
60
except json.JSONDecodeError as e:
61
return f"Error: Unable to decode JSON response. Details: {str(e)}"
62
else:
63
return f"Error: {response.status_code}, Response: {response.text}"
@@ -1,86 +0,0 @@
1
from __future__ import annotations
2
3
import json
4
import requests
5
6
from ...typing import CreateResult, Messages
7
from ..base_provider import ProviderModelMixin, AbstractProvider
8
from ..helper import format_prompt
9
10
class NexraQwen(AbstractProvider, ProviderModelMixin):
11
label = "Nexra Qwen"
12
url = "https://nexra.aryahcr.cc/documentation/qwen/en"
13
api_endpoint = "https://nexra.aryahcr.cc/api/chat/complements"
14
working = True
15
supports_stream = True
16
17
default_model = 'qwen'
18
models = [default_model]
19
20
@classmethod
21
def get_model(cls, model: str) -> str:
22
return cls.default_model
23
24
@classmethod
25
def create_completion(
26
cls,
27
model: str,
28
messages: Messages,
29
stream: bool,
30
proxy: str = None,
31
markdown: bool = False,
32
**kwargs
33
) -> CreateResult:
34
model = cls.get_model(model)
35
36
headers = {
37
'Content-Type': 'application/json'
38
}
39
40
data = {
41
"messages": [
42
{
43
"role": "user",
44
"content": format_prompt(messages)
45
}
46
],
47
"stream": stream,
48
"markdown": markdown,
49
"model": model
50
}
51
52
response = requests.post(cls.api_endpoint, headers=headers, json=data, stream=stream)
53
54
if stream:
55
return cls.process_streaming_response(response)
56
else:
57
return cls.process_non_streaming_response(response)
58
59
@classmethod
60
def process_non_streaming_response(cls, response):
61
if response.status_code == 200:
62
try:
63
content = response.text.lstrip('')
64
data = json.loads(content)
65
return data.get('message', '')
66
except json.JSONDecodeError:
67
return "Error: Unable to decode JSON response"
68
else:
69
return f"Error: {response.status_code}"
70
71
@classmethod
72
def process_streaming_response(cls, response):
73
full_message = ""
74
for line in response.iter_lines(decode_unicode=True):
75
if line:
76
try:
77
line = line.lstrip('')
78
data = json.loads(line)
79
if data.get('finish'):
80
break
81
message = data.get('message', '')
82
if message is not None and message != full_message:
83
yield message[len(full_message):]
84
full_message = message
85
except json.JSONDecodeError:
86
pass