File size: 4,801 Bytes
e5f4bf9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
updateValue = function(id, value) {
    document.getElementById(id).innerText = value;
}

htmlToElement = function(html) {
    let template = document.createElement('template');
    html = html.trim(); // Never return a text node of whitespace as the result
    template.innerHTML = html;
    return template.content.firstChild;
}

pageSetup = function() {
    const minus = document.querySelector('.minus');
    const plus = document.querySelector('.plus');
    const value = document.querySelector('.value');
    // const users = document.querySelector('.users');
    const userInput = document.querySelector('.user-input');
    const userInputButton = document.querySelector('.user-input-button');
    const serverMessageValue = document.querySelector('.server-message-value');
    const messages = document.querySelector('.messages');
    const updatePersonality = document.getElementById("updatePersonality")
    const websocket = new WebSocket("wss://gpt2-chat.ai-research.id/");
    //const websocket = new WebSocket("ws://localhost:8502/");

    minus.onclick = function () {
        websocket.send(JSON.stringify({action: 'minus'}));
    }

    plus.onclick = function () {
        websocket.send(JSON.stringify({action: 'plus'}));
    }

    updatePersonality.onclick = function () {
        const elements = document.querySelectorAll(".bot-personality input")
        let data = {
            "action": "personality",
            "message": []
        }
        for (let i = 0; i < Math.min(elements.length, 5); i++) {
            if(elements[i].value.length >0)
                data.message.push(elements[i].value);
        }
        websocket.send(JSON.stringify(data));
    }

    let getParameters = function() {
        return {
            "do_sample": document.getElementById("doSample").checked,
            "min_length": parseInt(document.getElementById("minLength").value),
            "max_length": parseInt(document.getElementById("maxLength").value),
            "temperature": parseFloat(document.getElementById("temperature").value),
            "top_k": parseInt(document.getElementById("topK").value),
            "top_p": parseFloat(document.getElementById("topP").value),
        };
    }

    let processUserInput = function (userInput) {
        let parameters = getParameters();
        parameters["action"] = "talk";
        parameters["utterance"] = userInput.value;
        websocket.send(JSON.stringify(parameters));
        const element = htmlToElement("<div class=\"message outgoing\"><div class=\"message-inner badge bg-primary text-wrap\">"
            + userInput.value + "</div></div>");
        userInput.value = "";
        messages.appendChild(element);
        messages.scrollIntoView(false)
    }

    userInputButton.onclick = function () {
        processUserInput(userInput);
    }

    userInput.addEventListener("keyup", function(event) {
        if (event.keyCode === 13) {
            // Cancel the default action, if needed
            event.preventDefault();
            processUserInput(userInput);
        }
    });

    websocket.onmessage = function (event) {
        let data = JSON.parse(event.data);
        switch (data.type) {
            case 'connection':
                console.log(data.value)
                websocket.send(JSON.stringify({action: 'dialog', personality: []}));
                break;
            case 'state':
                value.textContent = data.value;
                break;
            case 'users':
                serverMessageValue.textContent = (
                    data.count.toString() + " user" +
                    (data.count === 1 ? "" : "s") + " online");
                break;
            case 'dialog':
                console.log(data.message)
                break;
            case 'talk':
                const element = htmlToElement("<div class=\"message incoming\"><div class=\"message-inner badge bg-success text-wrap\">"
                    + data.message+ "</div></div>");
                messages.appendChild(element);
                messages.scrollIntoView(false)
                break;
            case 'personality':
                const elements = document.querySelectorAll(".bot-personality input")
                for (let i = 0; i < Math.min(elements.length, data.message.length); i++) {
                    elements[i].value = data.message[i];
                }
                break;
            case 'personality_reply':
                serverMessageValue.textContent = data.message
                setTimeout(function() {
                    websocket.send(JSON.stringify({action: 'get_users'}));
                }, 3000);
                break;
            default:
                console.error(
                    "unsupported event", data);
        }
    };
}