返回提交历史
Modified
g4f/Provider/nexra/NexraMidjourney.py
+34
-38
Modified
g4f/models.py
+12
-0
XFEstudio/gpt4free
Updated (g4f/models.py)
3e7bee67
代码差异
2 个文件
+46
-38
@@ -1,66 +1,62 @@
1
1
from __future__ import annotations
2
2
3
from aiohttp import ClientSession
4
3
import json
5
6
from ...typing import AsyncResult, Messages
7
from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
4
import requests
5
from ...typing import CreateResult, Messages
6
from ..base_provider import ProviderModelMixin, AbstractProvider
8
7
from ...image import ImageResponse
9
8
10
11
class NexraMidjourney(AsyncGeneratorProvider, ProviderModelMixin):
9
class NexraMidjourney(AbstractProvider, ProviderModelMixin):
12
10
label = "Nexra Midjourney"
13
11
url = "https://nexra.aryahcr.cc/documentation/midjourney/en"
14
12
api_endpoint = "https://nexra.aryahcr.cc/api/image/complements"
15
working = False
16
17
default_model = 'midjourney'
13
working = True
14
15
default_model = "midjourney"
18
16
models = [default_model]
19
17
20
18
@classmethod
21
19
def get_model(cls, model: str) -> str:
22
20
return cls.default_model
23
21
24
22
@classmethod
25
async def create_async_generator(
23
def create_completion(
26
24
cls,
27
25
model: str,
28
26
messages: Messages,
29
proxy: str = None,
30
27
response: str = "url", # base64 or url
31
28
**kwargs
32
) -> AsyncResult:
33
# Retrieve the correct model to use
29
) -> CreateResult:
34
30
model = cls.get_model(model)
35
31
36
# Format the prompt from the messages
37
prompt = messages[0]['content']
38
39
32
headers = {
40
"Content-Type": "application/json"
33
'Content-Type': 'application/json'
41
34
}
42
payload = {
43
"prompt": prompt,
35
36
data = {
37
"prompt": messages[-1]["content"],
44
38
"model": model,
45
39
"response": response
46
40
}
41
42
response = requests.post(cls.api_endpoint, headers=headers, json=data)
47
43
48
async with ClientSession(headers=headers) as session:
49
async with session.post(cls.api_endpoint, json=payload, proxy=proxy) as response:
50
response.raise_for_status()
51
text_data = await response.text()
44
result = cls.process_response(response)
45
yield result
52
46
53
try:
54
# Parse the JSON response
55
json_start = text_data.find('{')
56
json_data = text_data[json_start:]
57
data = json.loads(json_data)
58
59
# Check if the response contains images
60
if 'images' in data and len(data['images']) > 0:
61
image_url = data['images'][0]
62
yield ImageResponse(image_url, prompt)
63
else:
64
yield ImageResponse("No images found in the response.", prompt)
65
except json.JSONDecodeError:
66
yield ImageResponse("Failed to parse JSON. Response might not be in JSON format.", prompt)
47
@classmethod
48
def process_response(cls, response):
49
if response.status_code == 200:
50
try:
51
content = response.text.strip()
52
content = content.lstrip('_')
53
data = json.loads(content)
54
if data.get('status') and data.get('images'):
55
image_url = data['images'][0]
56
return ImageResponse(images=[image_url], alt="Generated Image")
57
else:
58
return "Error: No image URL found in the response"
59
except json.JSONDecodeError as e:
60
return f"Error: Unable to decode JSON response. Details: {str(e)}"
61
else:
62
return f"Error: {response.status_code}, Response: {response.text}"
@@ -50,6 +50,7 @@ from .Provider import (
50
50
NexraEmi,
51
51
NexraFluxPro,
52
52
NexraGeminiPro,
53
NexraMidjourney,
53
54
NexraQwen,
54
55
OpenaiChat,
55
56
PerplexityLabs,
@@ -835,6 +836,14 @@ dalle = Model(
835
836
836
837
)
837
838
839
### Midjourney ###
840
midjourney = Model(
841
name = 'midjourney',
842
base_provider = 'Midjourney',
843
best_provider = NexraMidjourney
844
845
)
846
838
847
### Other ###
839
848
emi = Model(
840
849
name = 'emi',
@@ -1109,6 +1118,9 @@ class ModelUtils:
1109
1118
'dalle': dalle,
1110
1119
'dalle-2': dalle_2,
1111
1120
1121
### Midjourney ###
1122
'midjourney': midjourney,
1123
1112
1124
1113
1125
### Other ###
1114
1126
'emi': emi,