summaryrefslogtreecommitdiffstats
path: root/openaihosted/__init__.py
blob: 4f25a2be48540114830e503d6deac61fe32f6228 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import json
import re
import requests


class Completion:
    @staticmethod
    def create(messages):
        headers = {
            "authority": "openai.a2hosted.com",
            "accept": "text/event-stream",
            "accept-language": "en-US,en;q=0.9,id;q=0.8,ja;q=0.7",
            "cache-control": "no-cache",
            "sec-fetch-dest": "empty",
            "sec-fetch-mode": "cors",
            "sec-fetch-site": "cross-site",
            "user-agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/112.0",
        }

        query_param = Completion.__create_query_param(messages)
        url = f"https://openai.a2hosted.com/chat?q={query_param}"
        request = requests.get(url, headers=headers, stream=True)
        if request.status_code != 200:
            return Completion.__get_failure_response()

        content = request.content
        response = Completion.__join_response(content)

        return {"responses": response}

    @classmethod
    def __get_failure_response(cls) -> dict:
        return dict(
            response="Unable to fetch the response, Please try again.",
            links=[],
            extra={},
        )

    @classmethod
    def __multiple_replace(cls, string, reps) -> str:
        for original, replacement in reps.items():
            string = string.replace(original, replacement)
        return string

    @classmethod
    def __create_query_param(cls, conversation) -> str:
        encoded_conversation = json.dumps(conversation)
        replacement = {" ": "%20", '"': "%22", "'": "%27"}
        return Completion.__multiple_replace(encoded_conversation, replacement)

    @classmethod
    def __convert_escape_codes(cls, text) -> str:
        replacement = {'\\\\"': '"', '\\"': '"', "\\n": "\n", "\\'": "'"}
        return Completion.__multiple_replace(text, replacement)

    @classmethod
    def __join_response(cls, data) -> str:
        data = data.decode("utf-8")
        find_ans = re.findall(r'(?<={"msg":)[^}]*', str(data))
        ans = [Completion.__convert_escape_codes(x[1:-1]) for x in find_ans]
        response = "".join(ans)
        return response