File size: 5,573 Bytes
ae31beb
 
 
 
 
c009dd5
 
 
 
 
 
ae31beb
c009dd5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ae31beb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c009dd5
 
 
 
 
 
 
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import {
    available_models,
    AvailableModelsRequester,
} from "../networks/llm_requester.js";

class EndpointStorageItem {}

class EndpointStorage {
    constructor() {
        this.init_database();
        this.render_endpoint_and_api_key_items();
        this.fill_available_models_select();
    }
    init_database() {
        this.db = new Dexie("endpoints");
        this.db.version(1).stores({
            endpoints: "index, endpoint, api_key",
            default_model: "model",
        });
        this.db.endpoints.count((count) => {
            console.log(`${count} endpoints loaded.`);
        });
    }
    clear_database() {
        this.db.endpoints.clear();
        console.log("endpoints cleared.");
    }
    get_endpoint_and_api_key_item_html() {
        let endpoint_and_api_key_item_html = `
            <div class="row mt-2 no-gutters">
                <div class="col-auto">
                    <button class="btn px-0 remove-endpoint-and-key-button">
                        <i class="fa fa-circle-minus"></i>
                    </button>
                </div>
                <div class="col pl-0">
                    <input class="form-control endpoint-input" rows="1"
                        placeholder="Input Endpoint URL"
                    ></input>
                </div>
                <div class="col pl-0">
                    <input class="form-control api-key-input" rows="1"
                        placeholder="Input API Key, then click √"
                    ></input>
                </div>
                <div class="col-auto px-0">
                    <button class="btn endpoint-submit-button">
                        <i class="fa fa-check"></i>
                    </button>
                </div>
            </div>
        `;
        return endpoint_and_api_key_item_html;
    }
    add_endpoint_and_api_key_item() {
        let endpoint_and_api_key_items = $("#endpoint-and-api-key-items");
        endpoint_and_api_key_items.prepend(
            this.get_endpoint_and_api_key_item_html()
        );
        this.bind_endpoint_and_api_key_buttons();
    }
    create_endpoint_and_api_key_items() {
        let endpoint_and_api_key_items = $("#endpoint-and-api-key-items");
        let endpoints = this.db.endpoints;
        endpoint_and_api_key_items.empty();

        endpoints.each((row) => {
            let endpoint_and_api_key_item_html =
                this.get_endpoint_and_api_key_item_html();
            let endpoint_and_api_key_item = $(endpoint_and_api_key_item_html);
            let endpoint_input =
                endpoint_and_api_key_item.find(".endpoint-input");
            endpoint_input.val(row.endpoint);
            let api_key_input =
                endpoint_and_api_key_item.find(".api-key-input");
            api_key_input.val(row.api_key);
            endpoint_and_api_key_items.prepend(endpoint_and_api_key_item);
        });
    }
    bind_endpoint_and_api_key_buttons() {
        let endpoint_submit_buttons = $(".endpoint-submit-button");
        let self = this;
        endpoint_submit_buttons.click(function () {
            let endpoint_input = $(this)
                .parent()
                .parent()
                .find(".endpoint-input");
            let endpoint_input_value = endpoint_input.val().trim();
            let api_key_input = $(this)
                .parent()
                .parent()
                .find(".api-key-input");
            let api_key_input_value = api_key_input.val().trim();

            if (endpoint_input_value === "") {
                console.log("Endpoint is empty.");
                return;
            } else {
                self.db.endpoints.put({
                    index: endpoint_input_value,
                    endpoint: endpoint_input_value,
                    api_key: api_key_input_value,
                });
                console.log(`new_endpoint: ${endpoint_input_value}`);
            }
        });
    }
    fill_available_models_select() {
        var select = $("#available-models-select");
        select.empty();

        // for loop the endpoints in endpoint_storage.db.endpoints
        this.db.endpoints.toArray().then(async (entries) => {
            for (const entry of entries) {
                let endpoint = entry.endpoint;
                console.log("fetch available models for endpoint:", endpoint);
                let available_models_requester = new AvailableModelsRequester(
                    endpoint
                );
                await available_models_requester.get();
            }
            available_models.forEach((value, index) => {
                const option = new Option(value, value);
                select.append(option);
            });
        });

        // set default model
        let default_model = "";
        let local_default_model = endpoint_storage.db.default_model;
        if (
            local_default_model &&
            available_models.includes(local_default_model)
        ) {
            default_model = local_default_model;
        } else if (available_models) {
            default_model = available_models[0];
            endpoint_storage.db.default_model = default_model;
        } else {
            default_model = "";
        }

        select.val(default_model);
        console.log(`default_model: ${select.val()}`);
    }
    render_endpoint_and_api_key_items() {
        this.create_endpoint_and_api_key_items();
        this.bind_endpoint_and_api_key_buttons();
    }
}

export let endpoint_storage = new EndpointStorage();