mirror of
https://github.com/KoboldAI/KoboldAI-Client.git
synced 2025-06-05 21:59:24 +02:00
Redid presets to have a better method for organizing them
Add convert script for making official.presets files from excel files maintained by LightSaveUs
This commit is contained in:
54
aiserver.py
54
aiserver.py
@@ -38,6 +38,7 @@ import bisect
|
||||
import functools
|
||||
import traceback
|
||||
from collections.abc import Iterable
|
||||
from collections import OrderedDict
|
||||
from typing import Any, Callable, TypeVar, Tuple, Union, Dict, Set, List
|
||||
|
||||
import requests
|
||||
@@ -2167,21 +2168,44 @@ def load_model(use_gpu=True, gpu_layers=None, disk_layers=None, initial_load=Fal
|
||||
#Let's load the presets
|
||||
with open('settings/preset/official.presets') as f:
|
||||
presets = json.load(f)
|
||||
to_use = {"Recommended": {"Default": koboldai_vars.default_preset}}
|
||||
#Check for 6B in title
|
||||
if '6B' in koboldai_vars.model or '6.7B' in koboldai_vars.model or '1.3B' in koboldai_vars.model:
|
||||
to_use['Recommended'].update(presets['6B'])
|
||||
for key in presets:
|
||||
if key != '6B':
|
||||
to_use[key] = presets[key]
|
||||
elif '13B' in koboldai_vars.model:
|
||||
to_use['Recommended'].update(presets['13B'])
|
||||
for key in presets:
|
||||
if key != '13B':
|
||||
to_use[key] = presets[key]
|
||||
koboldai_vars.uid_presets = {x['uid']: x for x in presets}
|
||||
#We want our data to be a 2 deep dict. Top level is "Recommended", "Same Class", "Model 1", "Model 2", etc
|
||||
#Next layer is "Official", "Custom"
|
||||
#Then the preset name
|
||||
|
||||
to_use = OrderedDict()
|
||||
|
||||
to_use["Recommended"] = {"Official": [], "Custom": []}
|
||||
to_use["Same Class"] = {"Official": [], "Custom": []}
|
||||
used_ids = []
|
||||
#Build recommended first:
|
||||
for preset in presets:
|
||||
if preset['Model Type'] == koboldai_vars.model and preset['uid'] not in used_ids:
|
||||
if preset['Model Category'] == 'Custom':
|
||||
to_use['Recommended']['Custom'].append(preset)
|
||||
else:
|
||||
for key in presets:
|
||||
to_use[key] = presets[key]
|
||||
to_use['Recommended']['Official'].append(preset)
|
||||
used_ids.append(preset['uid'])
|
||||
#Build Same Class
|
||||
for preset in presets:
|
||||
if preset['Model Size'] == koboldai_vars.model and preset['uid'] not in used_ids:
|
||||
if preset['Model Category'] == 'Custom':
|
||||
to_use['Recommended']['Custom'].append(preset)
|
||||
else:
|
||||
to_use['Recommended']['Official'].append(preset)
|
||||
used_ids.append(preset['uid'])
|
||||
#Build the rest of the stuff
|
||||
for preset in presets:
|
||||
if preset['uid'] not in used_ids:
|
||||
used_ids.append(preset['uid'])
|
||||
if preset['Model Type'] not in to_use:
|
||||
to_use[preset['Model Type']] = {"Official": [], "Custom": []}
|
||||
|
||||
if preset['Model Category'] == 'Custom':
|
||||
to_use[preset['Model Type']]['Custom'].append(preset)
|
||||
else:
|
||||
to_use[preset['Model Type']]['Official'].append(preset)
|
||||
|
||||
koboldai_vars.presets = to_use
|
||||
|
||||
# Set up Flask routes
|
||||
@@ -6150,6 +6174,8 @@ def get_files_folders(starting_folder):
|
||||
#==================================================================#
|
||||
@socketio.on('var_change')
|
||||
def UI_2_var_change(data):
|
||||
if 'value' not in data:
|
||||
return
|
||||
classname = data['ID'].split("_")[0]
|
||||
name = data['ID'][len(classname)+1:]
|
||||
classname += "_settings"
|
||||
|
60
convert_xls_to_json_presets.py
Normal file
60
convert_xls_to_json_presets.py
Normal file
@@ -0,0 +1,60 @@
|
||||
import pandas as pd
|
||||
import sys
|
||||
|
||||
output = []
|
||||
sheet_mapper = {"KAI-ADAPTED 13B": "13B", "KAI-ADAPTED 6B": "6B", 'KAI-CUSTOM': 'Custom'}
|
||||
|
||||
for file in ['KoboldAI Settings (6B).xlsx', 'KoboldAI Settings (13B).xlsx', 'KoboldAI Settings (Custom).xlsx', 'KoboldAI Settings (Original).xlsx']:
|
||||
presets = pd.read_excel("preset Files/{}".format(file), None)
|
||||
for sheet in presets:
|
||||
df = presets[sheet]
|
||||
if sheet in sheet_mapper:
|
||||
sheet = sheet_mapper[sheet]
|
||||
df = df.dropna(axis=1, how='all')
|
||||
df = df.rename(columns={"Unnamed: 0": "setting"})
|
||||
df = pd.melt(df, id_vars=['setting'])
|
||||
df = df.rename(columns={"variable": "preset"})
|
||||
df['fix'] = df['value'].str.replace(" (KAI)", "", regex=False)
|
||||
df.loc[~df['fix'].isnull(), 'value'] = df['fix']
|
||||
df = df.drop(columns=['fix'])
|
||||
df.loc[df['setting']=='Samplers Order', 'value'] = df['value'].str.replace("Temp", "5", regex=False)
|
||||
df.loc[df['setting']=='Samplers Order', 'value'] = df['value'].str.replace("K", "0", regex=False)
|
||||
df.loc[df['setting']=='Samplers Order', 'value'] = df['value'].str.replace("TFS", "3", regex=False)
|
||||
df.loc[df['setting']=='Samplers Order', 'value'] = df['value'].str.replace("A", "1", regex=False)
|
||||
df.loc[df['setting']=='Samplers Order', 'value'] = df['value'].str.replace("Typ", "4", regex=False)
|
||||
df.loc[df['setting']=='Samplers Order', 'value'] = df['value'].str.replace("P", "2", regex=False)
|
||||
|
||||
|
||||
settings_mapper = {'Temperature': 'temp', 'Output Length': 'genamt', 'Repetition Penalty': 'rep_pen',
|
||||
'Top P': 'top_p', 'Top K': 'top_k', 'Tail-Free': 'tfs', 'Repetition Penalty Range': 'rep_pen_range',
|
||||
'Repetition Penalty Slope': 'rep_pen_slope', 'Typical': 'typical', 'Top A': 'top_a',
|
||||
'Samplers Order': 'sampler_order', 'Description of settings from the author': 'description',
|
||||
'Author': 'Author', 'Model Type': 'Model Type',
|
||||
'Description of settings from NovelAI': 'description', 'Model Size': "Model Size"
|
||||
}
|
||||
df['setting'] = df['setting'].map(settings_mapper)
|
||||
|
||||
try:
|
||||
df = df.pivot(index='preset', columns='setting', values='value')
|
||||
except:
|
||||
print(file)
|
||||
display(df)
|
||||
raise
|
||||
|
||||
df['Model Type'] = df['Model Type'].str.replace(", ", ",").str.split(",")
|
||||
|
||||
df.loc[:, 'Model Category'] = sheet
|
||||
|
||||
output.append(df)
|
||||
|
||||
#output[sheet] = df.to_json(orient="index")
|
||||
|
||||
df = pd.concat(output)
|
||||
df = df.reset_index(drop=False)
|
||||
df['uid'] = df.index
|
||||
df = df.explode("Model Type")
|
||||
df['description'] = df['description'].str.strip()
|
||||
|
||||
|
||||
with open("official.presets", "w") as f:
|
||||
f.write(df.reset_index(drop=True).to_json(orient='records'))
|
@@ -109,6 +109,7 @@ class koboldai_vars(object):
|
||||
if name[0] == "_":
|
||||
super().__setattr__(name, value)
|
||||
if name[0] != "_":
|
||||
#Send it to the corrent _setting class
|
||||
if name in self._model_settings.__dict__:
|
||||
setattr(self._model_settings, name, value)
|
||||
elif name in self._user_settings.__dict__:
|
||||
@@ -241,6 +242,7 @@ class model_settings(settings):
|
||||
self.revision = None
|
||||
self.presets = [] # Holder for presets
|
||||
self.selected_preset = ""
|
||||
self.uid_presets = []
|
||||
self.default_preset = {}
|
||||
|
||||
#dummy class to eat the tqdm output
|
||||
@@ -254,8 +256,22 @@ class model_settings(settings):
|
||||
super().__setattr__(name, value)
|
||||
#Put variable change actions here
|
||||
|
||||
#set preset values
|
||||
if name == 'selected_preset' and value != "":
|
||||
if int(value) in self.uid_presets:
|
||||
for preset_key, preset_value in self.uid_presets[int(value)].items():
|
||||
if preset_key in self.__dict__:
|
||||
if type(getattr(self, preset_key)) == int:
|
||||
preset_value = int(preset_value)
|
||||
elif type(getattr(self, preset_key)) == float:
|
||||
preset_value = float(preset_value)
|
||||
elif type(getattr(self, preset_key)) == bool:
|
||||
preset_value = bool(preset_value)
|
||||
elif type(getattr(self, preset_key)) == str:
|
||||
preset_value = str(preset_value)
|
||||
setattr(self, preset_key, preset_value)
|
||||
#Setup TQDP for token generation
|
||||
if name == "generated_tkns" and 'tqdm' in self.__dict__:
|
||||
elif name == "generated_tkns" and 'tqdm' in self.__dict__:
|
||||
if value == 0:
|
||||
self.tqdm.reset(total=self.genamt)
|
||||
self.tqdm_progress = 0
|
||||
|
File diff suppressed because one or more lines are too long
@@ -325,6 +325,10 @@
|
||||
margin-right: 25px;
|
||||
}
|
||||
|
||||
.preset_item {
|
||||
color: white; /*#2b2a33;*/
|
||||
}
|
||||
|
||||
.menubar1, .menubar2, .menubar3 {
|
||||
width: 21px;
|
||||
height: 3px;
|
||||
|
@@ -291,45 +291,29 @@ function do_presets(data) {
|
||||
option.text="presets";
|
||||
select.append(option);
|
||||
presets = data.value;
|
||||
|
||||
|
||||
for (const [key, value] of Object.entries(data.value)) {
|
||||
var option_group = document.createElement("optgroup");
|
||||
option_group.label = key;
|
||||
for (const [preset, preset_value] of Object.entries(value)) {
|
||||
for (const [group, group_value] of Object.entries(value)) {
|
||||
var option = document.createElement("option");
|
||||
option.value=key+"|"+preset;
|
||||
option.text=preset;
|
||||
option.text=group;
|
||||
option.disabled = true;
|
||||
option.classList.add("preset_group");
|
||||
option_group.append(option);
|
||||
for (const [preset, preset_value] of Object.entries(group_value)) {
|
||||
var option = document.createElement("option");
|
||||
option.value=preset;
|
||||
option.text=preset_value.preset;
|
||||
option.title = preset_value.description;
|
||||
option_group.append(option);
|
||||
}
|
||||
}
|
||||
select.append(option_group);
|
||||
}
|
||||
}
|
||||
|
||||
function selected_preset(data) {
|
||||
|
||||
preset_key = data.value.split("|")[0];
|
||||
preset = data.value.split("|")[1];
|
||||
if ((data.value == undefined) || (presets[preset_key] == undefined)) {
|
||||
return;
|
||||
}
|
||||
if (presets[preset_key][preset] == undefined) {
|
||||
return;
|
||||
}
|
||||
for (const [key, value] of Object.entries(presets[preset_key][preset])) {
|
||||
if (key.charAt(0) != '_') {
|
||||
var elements_to_change = document.getElementsByClassName("var_sync_model_"+key);
|
||||
for (item of elements_to_change) {
|
||||
if (item.tagName.toLowerCase() === 'input') {
|
||||
item.value = value;
|
||||
} else {
|
||||
item.textContent = fix_text(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
socket.emit("var_change", {"ID": "model_selected_preset", "value": data.value});
|
||||
}
|
||||
|
||||
function update_status_bar(data) {
|
||||
var percent_complete = data.value;
|
||||
var percent_bar = document.getElementsByClassName("statusbar_inner");
|
||||
@@ -378,8 +362,6 @@ function var_changed(data) {
|
||||
//Special Case for Presets
|
||||
} else if ((data.classname == 'model') && (data.name == 'presets')) {
|
||||
do_presets(data);
|
||||
} else if ((data.classname == "model") && (data.name == "selected_preset")) {
|
||||
selected_preset(data);
|
||||
} else if ((data.classname == 'story') && (data.name == 'prompt')) {
|
||||
do_prompt(data);
|
||||
//Basic Data Syncing
|
||||
@@ -1259,7 +1241,7 @@ function sync_to_server(item) {
|
||||
//get value
|
||||
value = null;
|
||||
name = null;
|
||||
if ((item.tagName.toLowerCase() === 'input') || (item.tagName.toLowerCase() === 'select') || (item.tagName.toLowerCase() == 'textarea')) {
|
||||
if ((item.tagName.toLowerCase() === 'checkbox') || (item.tagName.toLowerCase() === 'input') || (item.tagName.toLowerCase() === 'select') || (item.tagName.toLowerCase() == 'textarea')) {
|
||||
if (item.getAttribute("type") == "checkbox") {
|
||||
value = item.checked;
|
||||
} else {
|
||||
|
@@ -37,7 +37,7 @@
|
||||
<div id="Model_Info">
|
||||
<div>
|
||||
Running Model: <span class="var_sync_model_model">ReadOnly</span>
|
||||
<select id=presets class="var_sync_model_selected_preset settings_select" onchange='selected_preset(this)'><option>Preset</option></select>
|
||||
<select id=presets class="var_sync_model_selected_preset settings_select" onchange='sync_to_server(this)'><option>Preset</option></select>
|
||||
</div>
|
||||
<div><button class="btn action_button" onclick="socket.emit('load_model_button', {});">Load Model</button></div>
|
||||
</div>
|
||||
|
Reference in New Issue
Block a user