返回提交历史
Modified
openaihosted/__init__.py
+49
-47
XFEstudio/gpt4free
update code, handle escape sequence and others
be04fcd7
代码差异
1 个文件
+49
-47
@@ -1,60 +1,62 @@
1
1
import json
2
2
import re
3
from fake_useragent import UserAgent
4
5
3
import requests
6
4
5
7
6
class Completion:
8
7
@staticmethod
9
def create(
10
systemprompt:str,
11
text:str,
12
assistantprompt:str
13
):
14
15
data = [
16
{"role": "system", "content": systemprompt},
17
{"role": "user", "content": "hi"},
18
{"role": "assistant", "content": assistantprompt},
19
{"role": "user", "content": text},
20
]
21
url = f'https://openai.a2hosted.com/chat?q={Completion.__get_query_param(data)}'
22
23
try:
24
response = requests.get(url, headers=Completion.__get_headers(), stream=True)
25
except:
8
def create(messages):
9
headers = {
10
"authority": "openai.a2hosted.com",
11
"accept": "text/event-stream",
12
"accept-language": "en-US,en;q=0.9,id;q=0.8,ja;q=0.7",
13
"cache-control": "no-cache",
14
"sec-fetch-dest": "empty",
15
"sec-fetch-mode": "cors",
16
"sec-fetch-site": "cross-site",
17
"user-agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/112.0",
18
}
19
20
query_param = Completion.__create_query_param(messages)
21
url = f"https://openai.a2hosted.com/chat?q={query_param}"
22
request = requests.get(url, headers=headers, stream=True)
23
if request.status_code != 200:
26
24
return Completion.__get_failure_response()
27
25
28
sentence = ""
26
content = request.content
27
response = Completion.__join_response(content)
28
29
return {"responses": response}
29
30
30
for message in response.iter_content(chunk_size=1024):
31
message = message.decode('utf-8')
32
msg_match, num_match = re.search(r'"msg":"([^"]+)"', message), re.search(r'\[DONE\] (\d+)', message)
33
if msg_match:
34
# Put the captured group into a sentence
35
sentence += msg_match.group(1)
36
return {
37
'response': sentence
38
}
39
40
@classmethod
41
def __get_headers(cls) -> dict:
42
return {
43
'authority': 'openai.a2hosted.com',
44
'accept': 'text/event-stream',
45
'accept-language': 'en-US,en;q=0.9,id;q=0.8,ja;q=0.7',
46
'cache-control': 'no-cache',
47
'sec-fetch-dest': 'empty',
48
'sec-fetch-mode': 'cors',
49
'sec-fetch-site': 'cross-site',
50
'user-agent': UserAgent().random
51
}
52
53
31
@classmethod
54
32
def __get_failure_response(cls) -> dict:
55
return dict(response='Unable to fetch the response, Please try again.', links=[], extra={})
56
33
return dict(
34
response="Unable to fetch the response, Please try again.",
35
links=[],
36
extra={},
37
)
38
39
@classmethod
40
def __multiple_replace(cls, string, reps) -> str:
41
for original, replacement in reps.items():
42
string = string.replace(original, replacement)
43
return string
44
57
45
@classmethod
58
def __get_query_param(cls, conversation) -> str:
46
def __create_query_param(cls, conversation) -> str:
59
47
encoded_conversation = json.dumps(conversation)
60
return encoded_conversation.replace(" ", "%20").replace('"', '%22').replace("'", "%27")
48
replacement = {" ": "%20", '"': "%22", "'": "%27"}
49
return Completion.__multiple_replace(encoded_conversation, replacement)
50
51
@classmethod
52
def __convert_escape_codes(cls, text) -> str:
53
replacement = {'\\\\"': '"', '\\"': '"', "\\n": "\n", "\\'": "'"}
54
return Completion.__multiple_replace(text, replacement)
55
56
@classmethod
57
def __join_response(cls, data) -> str:
58
data = data.decode("utf-8")
59
find_ans = re.findall(r'(?<={"msg":)[^}]*', str(data))
60
ans = [Completion.__convert_escape_codes(x[1:-1]) for x in find_ans]
61
response = "".join(ans)
62
return response