aboutsummaryrefslogtreecommitdiffstats
path: root/transformer/transformer.py
blob: 4c463570cafae09266bcb8c8675d7aadfd4defda (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import irssi
import json
import typing
import urllib
from urllib import request, parse

IRSSI = {
    "author": "terminaldweller",
    "contact": "https://terminaldweller.com",
    "name": "transformer",
    "description": "transforms incoming text in the channel",
    "license": "GPL3 or newer",
    "url": "https://github.com/irssi/scripts.irssi.org",
}


def do_post(url: str, content: bytes, target: bytes, nick: bytes) -> None:
    api_key = irssi.settings_get_str(b"transformer_api_key")
    api_key = api_key.decode("utf-8")
    model = irssi.settings_get_str(b"transformer_model")
    role = irssi.settings_get_str(b"transformer_role")
    temp = irssi.settings_get_int(b"transformer_temperature")
    n = irssi.settings_get_int(b"transformer_n")
    debug = irssi.settings_get_bool(b"transformer_debug")
    prompt_system = irssi.settings_get_str(b"transformer_prompt_system")
    prompt_user = irssi.settings_get_str(b"transformer_prompt_user")

    headers = {"Content-Type": "application/json", "Authorization": f"Bearer {api_key}"}

    data = {
        "model": model.decode("utf-8"),
        "temperature": temp / 1000.0,
        "n": n,
        "messages": [
            {
                "role": "system",
                "content": prompt_system.decode("utf-8") + content.decode("utf-8"),
            },
            {
                "role": "user",
                "content": prompt_user.decode("utf-8") + content.decode("utf-8"),
            },
        ],
    }

    result = ""
    post_data = json.dumps(data).encode("utf-8")
    req = request.Request(url, post_data, headers, method="POST")
    try:
        resp = request.urlopen(req)
        json_response = json.load(resp)
        window = irssi.window_find_item(target)
        window.prnt(
            bytes("%N%z005faf%k %9Transformed %N%Z005faf%0%N", encoding="utf-8")
        )
        for choice in json_response["choices"]:
            result = choice["message"]["content"]
            if result != "":
                window.prnt(
                    bytes(nick.decode("utf-8") + " >>> " + result, encoding="utf-8")
                )
    except urllib.error.HTTPError as e:
        resp = e.read().decode("utf-8")
        json_response = json.load(resp)
        print(json_response)


def transformer_sig_handler(*args, **kwargs) -> None:
    URL = "https://api.openai.com/v1/chat/completions"
    server = args[0]
    msg = args[1]
    nick = args[2]
    address = args[3]
    target = args[4]
    channels = (
        irssi.settings_get_str(b"transformer_channel_list").decode("utf-8").split(" ")
    )
    source = server.tag + b"/" + target
    if any(source.decode("utf-8") in channel for channel in channels):
        do_post(URL, msg, target, nick)


def run_on_script_load() -> None:
    irssi.settings_add_bool(
        b"misc",
        b"transformer_debug",
        False,
    )
    irssi.settings_add_str(
        b"misc",
        b"transformer_api_key",
        b"",
    )
    irssi.settings_add_str(
        b"misc",
        b"transformer_model",
        b"gpt-3.5-turbo",
    )
    irssi.settings_add_str(
        b"misc",
        b"transformer_role",
        b"user",
    )
    irssi.settings_add_int(
        b"misc",
        b"transformer_temperature",
        700,
    )
    irssi.settings_add_int(
        b"misc",
        b"transformer_n",
        1,
    )
    irssi.settings_add_str(
        b"misc",
        b"transformer_prompt_system",
        b"if you can't translate parts of the provided text use the original piece of text. the text will ocassionally inlcude URLs. if the original text is in the target language, return an empty response. Do not ask for follow up question.",
    )
    irssi.settings_add_str(
        b"misc",
        b"transformer_prompt_user",
        b"translate this into english: ",
    )
    irssi.settings_add_str(
        b"misc",
        b"transformer_channel_list",
        b"",
    )

    irssi.signal_add(b"message public", transformer_sig_handler)


run_on_script_load()