summaryrefslogtreecommitdiffstats
path: root/g4f/.v1/gpt4free/hpgptai/__init__.py
blob: f5d1f0edc379b4a4bd0c18dc8665531c1e22fe91 (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# -*- coding: utf-8 -*-
"""
@Time : 2023/5/22 14:04
@Auth : Hp_mzx
@File :__init__.py.py
@IDE :PyCharm
"""
import re
import json
import base64
import random
import string
import requests
from fake_useragent import UserAgent


class ChatCompletion:
    @staticmethod
    def create(
            messages: list,
            context: str = "Converse as if you were an AI assistant. Be friendly, creative.",
            restNonce: str = None,
            proxy: str = None
    ):
        url = "https://chatgptlogin.ac/wp-json/ai-chatbot/v1/chat"
        if not restNonce:
            restNonce = ChatCompletion.get_restNonce(proxy)
        headers = {
            "Content-Type": "application/json",
            "X-Wp-Nonce": restNonce
        }
        proxies = {'http': 'http://' + proxy, 'https': 'http://' + proxy} if proxy else None
        data = {
            "env": "chatbot",
            "session": "N/A",
            "prompt": ChatCompletion.__build_prompt(context, messages),
            "context": context,
            "messages": messages,
            "newMessage": messages[-1]["content"],
            "userName": "<div class=\"mwai-name-text\">User:</div>",
            "aiName": "<div class=\"mwai-name-text\">AI:</div>",
            "model": "gpt-3.5-turbo",
            "temperature": 0.8,
            "maxTokens": 1024,
            "maxResults": 1,
            "apiKey": "",
            "service": "openai",
            "embeddingsIndex": "",
            "stop": "",
            "clientId": ChatCompletion.randomStr(),
        }
        res = requests.post(url=url, data=json.dumps(data), headers=headers, proxies=proxies)
        if res.status_code == 200:
            return res.json()
        return res.text

    @staticmethod
    def randomStr():
        return ''.join(random.choices(string.ascii_lowercase + string.digits, k=34))[:11]

    @classmethod
    def __build_prompt(cls, context: str, message: list, isCasuallyFineTuned=False, last=15):
        prompt = context + '\n\n' if context else ''
        message = message[-last:]
        if isCasuallyFineTuned:
            lastLine = message[-1]
            prompt = lastLine.content + ""
            return prompt
        conversation = [x["who"] + x["content"] for x in message]
        prompt += '\n'.join(conversation)
        prompt += '\n' + "AI: "
        return prompt

    @classmethod
    def get_restNonce(cls, proxy: str = None):
        url = "https://chatgptlogin.ac/"
        headers = {
            "Referer": "https://chatgptlogin.ac/",
            "User-Agent": UserAgent().random
        }
        proxies = {'http': 'http://' + proxy, 'https': 'http://' + proxy} if proxy else None
        res = requests.get(url, headers=headers, proxies=proxies)
        src = re.search(
            'class="mwai-chat mwai-chatgpt">.*<span>Send</span></button></div></div></div> <script defer src="(.*?)">',
            res.text).group(1)
        decoded_string = base64.b64decode(src.split(",")[-1]).decode('utf-8')
        restNonce = re.search(r"let restNonce = '(.*?)';", decoded_string).group(1)
        return restNonce


class Completion:
    @staticmethod
    def create(prompt: str, proxy: str):
        messages = [
            {
                "content": prompt,
                "html": prompt,
                "id": ChatCompletion.randomStr(),
                "role": "user",
                "who": "User: ",
            },
        ]
        return ChatCompletion.create(messages=messages, proxy=proxy)