XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 1
返回提交历史

XFEstudio/gpt4free

Update (g4f/Provider/AIUncensored.py)

42aba60e
kqlio67 <kqlio67@users.noreply.github.com>
提交于

代码差异

2 个文件 +79 -73
Modified g4f/Provider/AIUncensored.py +76 -72
@@ -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
Modified g4f/models.py +3 -1
@@ -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