From c77e937aef9d78f72c61003667b3abd882c0f57a Mon Sep 17 00:00:00 2001 From: somebody Date: Fri, 14 Oct 2022 13:57:33 -0500 Subject: [PATCH 1/2] Fix theme stuff We now wait for CSS to load before reading it and such --- static/koboldai.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/static/koboldai.js b/static/koboldai.js index 057b2ef8..bd06acf8 100644 --- a/static/koboldai.js +++ b/static/koboldai.js @@ -2652,9 +2652,13 @@ function calc_token_usage( function Change_Theme(theme) { var css = document.getElementById("CSSTheme"); css.setAttribute("href", "/themes/"+theme+".css"); - setTimeout(() => { + + // We must wait for the style to load before we read it + css.onload = function() { + recolorTokens(); create_theming_elements(); - }, "1000") + } + setCookie("theme", theme); select = document.getElementById("selected_theme"); for (element of select.childNodes) { @@ -2664,7 +2668,6 @@ function Change_Theme(theme) { element.selected = false; } } - recolorTokens(); } function palette_color(item) { From 4567f74f0e0383ddf6b53a96fc31b8c809eae605 Mon Sep 17 00:00:00 2001 From: somebody Date: Fri, 14 Oct 2022 14:57:04 -0500 Subject: [PATCH 2/2] Download check for models in ui --- aiserver.py | 27 ++++++++++++++++++++++++--- static/koboldai.css | 4 ++-- static/koboldai.js | 43 +++++++++++++++++++++++++++++++------------ 3 files changed, 57 insertions(+), 17 deletions(-) diff --git a/aiserver.py b/aiserver.py index 05a8d247..cebc946a 100644 --- a/aiserver.py +++ b/aiserver.py @@ -737,6 +737,11 @@ def get_config_filename(model_name = None): else: logger.warning(f"Empty configfile name sent back. Defaulting to ReadOnly") return(f"settings/ReadOnly.settings") + +def is_model_downloaded(model_name: str) -> bool: + model_stub = model_name.replace("/", "_") + return os.path.isdir(os.path.join("models", model_stub)) + #==================================================================# # Function to get model selection at startup #==================================================================# @@ -755,10 +760,26 @@ def sendModelSelection(menu="mainmenu", folder="./models"): else: showdelete=False emit('from_server', {'cmd': 'show_model_menu', 'data': menu_list, 'menu': menu, 'breadcrumbs': breadcrumbs, "showdelete": showdelete}, broadcast=True, room="UI_1") - emit('show_model_menu', {'data': menu_list_ui_2, 'menu': menu, 'breadcrumbs': breadcrumbs, "showdelete": showdelete}, broadcast=False) + + p_menu = [{ + "label": m[0], + "name": m[1], + "size": m[2], + "isMenu": m[3], + "isDownloaded": True, + } for m in menu_list_ui_2] + emit('show_model_menu', {'data': p_menu, 'menu': menu, 'breadcrumbs': breadcrumbs, "showdelete": showdelete}, broadcast=False) else: emit('from_server', {'cmd': 'show_model_menu', 'data': model_menu[menu], 'menu': menu, 'breadcrumbs': [], "showdelete": False}, broadcast=True, room="UI_1") - emit('show_model_menu', {'data': model_menu[menu], 'menu': menu, 'breadcrumbs': [], "showdelete": False}, broadcast=False) + + p_menu = [{ + "label": m[0], + "name": m[1], + "size": m[2], + "isMenu": m[3], + "isDownloaded": is_model_downloaded(m[1]) if not m[3] else False, + } for m in model_menu[menu]] + emit('show_model_menu', {'data': p_menu, 'menu': menu, 'breadcrumbs': [], "showdelete": False}, broadcast=False) def get_folder_path_info(base): if base == 'This PC': @@ -1545,7 +1566,7 @@ def get_layer_count(model, directory=""): from transformers import AutoConfig if(os.path.isdir(model.replace('/', '_'))): model_config = AutoConfig.from_pretrained(model.replace('/', '_'), revision=koboldai_vars.revision, cache_dir="cache") - elif(os.path.isdir("models/{}".format(model.replace('/', '_')))): + elif(is_model_downloaded(model)): model_config = AutoConfig.from_pretrained("models/{}".format(model.replace('/', '_')), revision=koboldai_vars.revision, cache_dir="cache") elif(os.path.isdir(directory)): model_config = AutoConfig.from_pretrained(directory, revision=koboldai_vars.revision, cache_dir="cache") diff --git a/static/koboldai.css b/static/koboldai.css index 43d5f43b..7939e54c 100644 --- a/static/koboldai.css +++ b/static/koboldai.css @@ -1595,8 +1595,8 @@ body { border-radius: var(--radius_item_popup); padding: 2px; display: grid; - grid-template-areas: "folder_icon delete_icon edit_icon rename_icon file gpu_size warning_icon"; - grid-template-columns: 30px 0px 0px 0px auto 50px 30px; + grid-template-areas: "folder_icon delete_icon edit_icon rename_icon file gpu_size warning_icon downloaded_icon"; + grid-template-columns: 30px 0px 0px 0px auto 50px 30px 30px; } diff --git a/static/koboldai.js b/static/koboldai.js index bd06acf8..4ce567e5 100644 --- a/static/koboldai.js +++ b/static/koboldai.js @@ -1213,6 +1213,8 @@ function oai_engines(data) { } function getModelParameterCount(modelName) { + if (!modelName) return null; + // The "T" and "K" may be a little optimistic... let paramsString = modelName.toUpperCase().match(/[\d.]+[TBMK]/) if (!paramsString) return null; @@ -1275,37 +1277,40 @@ function show_model_menu(data) { var folder_icon = document.createElement("span"); folder_icon.classList.add("material-icons-outlined"); folder_icon.classList.add("cursor"); - if ((item[3]) || (item[0] == 'Load a model from its directory') || (item[0] == 'Load an old GPT-2 model (eg CloverEdition)')) { - folder_icon.textContent = "folder"; - } else { - folder_icon.textContent = "psychology"; - } + + let isModel = !( + item.isMenu || + item.label === "Load a model from its directory" || + item.label === "Load an old GPT-2 model (eg CloverEdition)" + ); + + folder_icon.textContent = isModel ? "psychology" : "folder"; list_item.append(folder_icon); //create the actual item var popup_item = document.createElement("span"); popup_item.classList.add("model"); - popup_item.setAttribute("display_name", item[0]); - popup_item.id = item[1]; + popup_item.setAttribute("display_name", item.label); + popup_item.id = item.name; popup_item.setAttribute("Menu", data.menu) //name text var text = document.createElement("span"); text.style="grid-area: item;"; - text.textContent = item[0]; + text.textContent = item.label; popup_item.append(text); //model size text var text = document.createElement("span"); - text.textContent = item[2]; + text.textContent = item.size; text.style="grid-area: gpu_size;padding: 2px;"; popup_item.append(text); (function() { // Anon function to avoid unreasonable indentation - if (folder_icon.innerText !== "psychology") return; + if (!isModel) return; - let parameterCount = getModelParameterCount(item[0]); + let parameterCount = getModelParameterCount(item.label); if (!parameterCount) return; let warningText = ""; @@ -1316,11 +1321,25 @@ function show_model_menu(data) { if (!warningText) return; $e("span", list_item, { - classes: ["material-icons-outlined"], + classes: ["material-icons-outlined", "model-size-warning"], innerText: "warning", "style.grid-area": "warning_icon", tooltip: warningText }); + + })(); + + (function() { + // Anon function to avoid unreasonable indentation + if (!item.isDownloaded) return; + if (!isModel) return; + + $e("span", list_item, { + classes: ["material-icons-outlined", "model-download-notification"], + innerText: "download_done", + "style.grid-area": "downloaded_icon", + tooltip: "This model is already downloaded." + }); })(); popup_item.onclick = function () {