返回提交历史
Modified
g4f/Provider/AIUncensored.py
+76
-72
Modified
g4f/models.py
+3
-1
XFEstudio/gpt4free
Update (g4f/Provider/AIUncensored.py)
42aba60e
代码差异
2 个文件
+79
-73
@@ -2,33 +2,49 @@ from __future__ import annotations
2
2
3
3
import json
4
4
from aiohttp import ClientSession
5
from itertools import cycle
5
6
6
7
from ..typing import AsyncResult, Messages
7
8
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
8
9
from .helper import format_prompt
9
10
from ..image import ImageResponse
10
11
12
11
13
class AIUncensored(AsyncGeneratorProvider, ProviderModelMixin):
12
14
url = "https://www.aiuncensored.info"
15
api_endpoints_text = [
16
"https://twitterclone-i0wr.onrender.com/api/chat",
17
"https://twitterclone-4e8t.onrender.com/api/chat",
18
"https://twitterclone-8wd1.onrender.com/api/chat",
19
]
20
api_endpoints_image = [
21
"https://twitterclone-4e8t.onrender.com/api/image",
22
"https://twitterclone-i0wr.onrender.com/api/image",
23
"https://twitterclone-8wd1.onrender.com/api/image",
24
]
25
api_endpoints_cycle_text = cycle(api_endpoints_text)
26
api_endpoints_cycle_image = cycle(api_endpoints_image)
13
27
working = True
14
28
supports_stream = True
15
29
supports_system_message = True
16
30
supports_message_history = True
17
31
18
default_model = 'ai_uncensored'
19
chat_models = [default_model]
20
image_models = ['ImageGenerator']
21
models = [*chat_models, *image_models]
22
23
api_endpoints = {
24
'ai_uncensored': "https://twitterclone-i0wr.onrender.com/api/chat",
25
'ImageGenerator': "https://twitterclone-4e8t.onrender.com/api/image"
32
default_model = 'TextGenerations'
33
text_models = [default_model]
34
image_models = ['ImageGenerations']
35
models = [*text_models, *image_models]
36
37
model_aliases = {
38
#"": "TextGenerations",
39
"flux": "ImageGenerations",
26
40
}
27
41
28
42
@classmethod
29
43
def get_model(cls, model: str) -> str:
30
44
if model in cls.models:
31
45
return model
46
elif model in cls.model_aliases:
47
return cls.model_aliases[model]
32
48
else:
33
49
return cls.default_model
34
50
@@ -38,75 +54,63 @@ class AIUncensored(AsyncGeneratorProvider, ProviderModelMixin):
38
54
model: str,
39
55
messages: Messages,
40
56
proxy: str = None,
41
stream: bool = False,
42
57
**kwargs
43
58
) -> AsyncResult:
44
59
model = cls.get_model(model)
45
60
46
if model in cls.chat_models:
47
async with ClientSession(headers={"content-type": "application/json"}) as session:
61
headers = {
62
'accept': '*/*',
63
'accept-language': 'en-US,en;q=0.9',
64
'cache-control': 'no-cache',
65
'content-type': 'application/json',
66
'origin': 'https://www.aiuncensored.info',
67
'pragma': 'no-cache',
68
'priority': 'u=1, i',
69
'referer': 'https://www.aiuncensored.info/',
70
'sec-ch-ua': '"Not?A_Brand";v="99", "Chromium";v="130"',
71
'sec-ch-ua-mobile': '?0',
72
'sec-ch-ua-platform': '"Linux"',
73
'sec-fetch-dest': 'empty',
74
'sec-fetch-mode': 'cors',
75
'sec-fetch-site': 'cross-site',
76
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'
77
}
78
79
async with ClientSession(headers=headers) as session:
80
if model in cls.image_models:
81
prompt = messages[-1]['content']
48
82
data = {
49
"messages": [
50
{"role": "user", "content": format_prompt(messages)}
51
],
52
"stream": stream
83
"prompt": prompt,
53
84
}
54
async with session.post(cls.api_endpoints[model], json=data, proxy=proxy) as response:
85
api_endpoint = next(cls.api_endpoints_cycle_image)
86
async with session.post(api_endpoint, json=data, proxy=proxy) as response:
55
87
response.raise_for_status()
56
if stream:
57
async for chunk in cls._handle_streaming_response(response):
58
yield chunk
59
else:
60
yield await cls._handle_non_streaming_response(response)
61
elif model in cls.image_models:
62
headers = {
63
"accept": "*/*",
64
"accept-language": "en-US,en;q=0.9",
65
"cache-control": "no-cache",
66
"content-type": "application/json",
67
"origin": cls.url,
68
"pragma": "no-cache",
69
"priority": "u=1, i",
70
"referer": f"{cls.url}/",
71
"sec-ch-ua": '"Chromium";v="129", "Not=A?Brand";v="8"',
72
"sec-ch-ua-mobile": "?0",
73
"sec-ch-ua-platform": '"Linux"',
74
"sec-fetch-dest": "empty",
75
"sec-fetch-mode": "cors",
76
"sec-fetch-site": "cross-site",
77
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
78
}
79
async with ClientSession(headers=headers) as session:
80
prompt = messages[0]['content']
81
data = {"prompt": prompt}
82
async with session.post(cls.api_endpoints[model], json=data, proxy=proxy) as response:
88
response_data = await response.json()
89
image_url = response_data['image_url']
90
image_response = ImageResponse(images=image_url, alt=prompt)
91
yield image_response
92
elif model in cls.text_models:
93
data = {
94
"messages": [
95
{
96
"role": "user",
97
"content": format_prompt(messages)
98
}
99
]
100
}
101
api_endpoint = next(cls.api_endpoints_cycle_text)
102
async with session.post(api_endpoint, json=data, proxy=proxy) as response:
83
103
response.raise_for_status()
84
result = await response.json()
85
image_url = result.get('image_url', '')
86
if image_url:
87
yield ImageResponse(image_url, alt=prompt)
88
else:
89
yield "Failed to generate image. Please try again."
90
91
@classmethod
92
async def _handle_streaming_response(cls, response):
93
async for line in response.content:
94
line = line.decode('utf-8').strip()
95
if line.startswith("data: "):
96
if line == "data: [DONE]":
97
break
98
try:
99
json_data = json.loads(line[6:])
100
if 'data' in json_data:
101
yield json_data['data']
102
except json.JSONDecodeError:
103
pass
104
105
@classmethod
106
async def _handle_non_streaming_response(cls, response):
107
response_json = await response.json()
108
return response_json.get('content', "Sorry, I couldn't generate a response.")
109
110
@classmethod
111
def validate_response(cls, response: str) -> str:
112
return response
104
full_response = ""
105
async for line in response.content:
106
line = line.decode('utf-8')
107
if line.startswith("data: "):
108
try:
109
json_str = line[6:]
110
if json_str != "[DONE]":
111
data = json.loads(json_str)
112
if "data" in data:
113
full_response += data["data"]
114
yield data["data"]
115
except json.JSONDecodeError:
116
continue
@@ -8,6 +8,7 @@ from .Provider import (
8
8
AIChatFree,
9
9
AiMathGPT,
10
10
Airforce,
11
AIUncensored,
11
12
Allyfy,
12
13
AmigoChat,
13
14
Bing,
@@ -109,6 +110,7 @@ default = Model(
109
110
Cloudflare,
110
111
Editee,
111
112
AiMathGPT,
113
AIUncensored,
112
114
])
113
115
)
114
116
@@ -808,7 +810,7 @@ playground_v2_5 = Model(
808
810
flux = Model(
809
811
name = 'flux',
810
812
base_provider = 'Flux AI',
811
best_provider = IterListProvider([Blackbox, Airforce])
813
best_provider = IterListProvider([Blackbox, AIUncensored, Airforce])
812
814
813
815
)
814
816