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:
56
aiserver.py
56
aiserver.py
@@ -38,6 +38,7 @@ import bisect
|
|||||||
import functools
|
import functools
|
||||||
import traceback
|
import traceback
|
||||||
from collections.abc import Iterable
|
from collections.abc import Iterable
|
||||||
|
from collections import OrderedDict
|
||||||
from typing import Any, Callable, TypeVar, Tuple, Union, Dict, Set, List
|
from typing import Any, Callable, TypeVar, Tuple, Union, Dict, Set, List
|
||||||
|
|
||||||
import requests
|
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
|
#Let's load the presets
|
||||||
with open('settings/preset/official.presets') as f:
|
with open('settings/preset/official.presets') as f:
|
||||||
presets = json.load(f)
|
presets = json.load(f)
|
||||||
to_use = {"Recommended": {"Default": koboldai_vars.default_preset}}
|
koboldai_vars.uid_presets = {x['uid']: x for x in presets}
|
||||||
#Check for 6B in title
|
#We want our data to be a 2 deep dict. Top level is "Recommended", "Same Class", "Model 1", "Model 2", etc
|
||||||
if '6B' in koboldai_vars.model or '6.7B' in koboldai_vars.model or '1.3B' in koboldai_vars.model:
|
#Next layer is "Official", "Custom"
|
||||||
to_use['Recommended'].update(presets['6B'])
|
#Then the preset name
|
||||||
for key in presets:
|
|
||||||
if key != '6B':
|
to_use = OrderedDict()
|
||||||
to_use[key] = presets[key]
|
|
||||||
elif '13B' in koboldai_vars.model:
|
to_use["Recommended"] = {"Official": [], "Custom": []}
|
||||||
to_use['Recommended'].update(presets['13B'])
|
to_use["Same Class"] = {"Official": [], "Custom": []}
|
||||||
for key in presets:
|
used_ids = []
|
||||||
if key != '13B':
|
#Build recommended first:
|
||||||
to_use[key] = presets[key]
|
for preset in presets:
|
||||||
else:
|
if preset['Model Type'] == koboldai_vars.model and preset['uid'] not in used_ids:
|
||||||
for key in presets:
|
if preset['Model Category'] == 'Custom':
|
||||||
to_use[key] = presets[key]
|
to_use['Recommended']['Custom'].append(preset)
|
||||||
|
else:
|
||||||
|
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
|
koboldai_vars.presets = to_use
|
||||||
|
|
||||||
# Set up Flask routes
|
# Set up Flask routes
|
||||||
@@ -6150,6 +6174,8 @@ def get_files_folders(starting_folder):
|
|||||||
#==================================================================#
|
#==================================================================#
|
||||||
@socketio.on('var_change')
|
@socketio.on('var_change')
|
||||||
def UI_2_var_change(data):
|
def UI_2_var_change(data):
|
||||||
|
if 'value' not in data:
|
||||||
|
return
|
||||||
classname = data['ID'].split("_")[0]
|
classname = data['ID'].split("_")[0]
|
||||||
name = data['ID'][len(classname)+1:]
|
name = data['ID'][len(classname)+1:]
|
||||||
classname += "_settings"
|
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] == "_":
|
if name[0] == "_":
|
||||||
super().__setattr__(name, value)
|
super().__setattr__(name, value)
|
||||||
if name[0] != "_":
|
if name[0] != "_":
|
||||||
|
#Send it to the corrent _setting class
|
||||||
if name in self._model_settings.__dict__:
|
if name in self._model_settings.__dict__:
|
||||||
setattr(self._model_settings, name, value)
|
setattr(self._model_settings, name, value)
|
||||||
elif name in self._user_settings.__dict__:
|
elif name in self._user_settings.__dict__:
|
||||||
@@ -241,6 +242,7 @@ class model_settings(settings):
|
|||||||
self.revision = None
|
self.revision = None
|
||||||
self.presets = [] # Holder for presets
|
self.presets = [] # Holder for presets
|
||||||
self.selected_preset = ""
|
self.selected_preset = ""
|
||||||
|
self.uid_presets = []
|
||||||
self.default_preset = {}
|
self.default_preset = {}
|
||||||
|
|
||||||
#dummy class to eat the tqdm output
|
#dummy class to eat the tqdm output
|
||||||
@@ -254,8 +256,22 @@ class model_settings(settings):
|
|||||||
super().__setattr__(name, value)
|
super().__setattr__(name, value)
|
||||||
#Put variable change actions here
|
#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
|
#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:
|
if value == 0:
|
||||||
self.tqdm.reset(total=self.genamt)
|
self.tqdm.reset(total=self.genamt)
|
||||||
self.tqdm_progress = 0
|
self.tqdm_progress = 0
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -325,6 +325,10 @@
|
|||||||
margin-right: 25px;
|
margin-right: 25px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.preset_item {
|
||||||
|
color: white; /*#2b2a33;*/
|
||||||
|
}
|
||||||
|
|
||||||
.menubar1, .menubar2, .menubar3 {
|
.menubar1, .menubar2, .menubar3 {
|
||||||
width: 21px;
|
width: 21px;
|
||||||
height: 3px;
|
height: 3px;
|
||||||
|
@@ -291,45 +291,29 @@ function do_presets(data) {
|
|||||||
option.text="presets";
|
option.text="presets";
|
||||||
select.append(option);
|
select.append(option);
|
||||||
presets = data.value;
|
presets = data.value;
|
||||||
|
|
||||||
|
|
||||||
for (const [key, value] of Object.entries(data.value)) {
|
for (const [key, value] of Object.entries(data.value)) {
|
||||||
var option_group = document.createElement("optgroup");
|
var option_group = document.createElement("optgroup");
|
||||||
option_group.label = key;
|
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");
|
var option = document.createElement("option");
|
||||||
option.value=key+"|"+preset;
|
option.text=group;
|
||||||
option.text=preset;
|
option.disabled = true;
|
||||||
option.title = preset_value.description;
|
option.classList.add("preset_group");
|
||||||
option_group.append(option);
|
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);
|
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) {
|
function update_status_bar(data) {
|
||||||
var percent_complete = data.value;
|
var percent_complete = data.value;
|
||||||
var percent_bar = document.getElementsByClassName("statusbar_inner");
|
var percent_bar = document.getElementsByClassName("statusbar_inner");
|
||||||
@@ -378,8 +362,6 @@ function var_changed(data) {
|
|||||||
//Special Case for Presets
|
//Special Case for Presets
|
||||||
} else if ((data.classname == 'model') && (data.name == 'presets')) {
|
} else if ((data.classname == 'model') && (data.name == 'presets')) {
|
||||||
do_presets(data);
|
do_presets(data);
|
||||||
} else if ((data.classname == "model") && (data.name == "selected_preset")) {
|
|
||||||
selected_preset(data);
|
|
||||||
} else if ((data.classname == 'story') && (data.name == 'prompt')) {
|
} else if ((data.classname == 'story') && (data.name == 'prompt')) {
|
||||||
do_prompt(data);
|
do_prompt(data);
|
||||||
//Basic Data Syncing
|
//Basic Data Syncing
|
||||||
@@ -1259,7 +1241,7 @@ function sync_to_server(item) {
|
|||||||
//get value
|
//get value
|
||||||
value = null;
|
value = null;
|
||||||
name = 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") {
|
if (item.getAttribute("type") == "checkbox") {
|
||||||
value = item.checked;
|
value = item.checked;
|
||||||
} else {
|
} else {
|
||||||
|
@@ -37,7 +37,7 @@
|
|||||||
<div id="Model_Info">
|
<div id="Model_Info">
|
||||||
<div>
|
<div>
|
||||||
Running Model: <span class="var_sync_model_model">ReadOnly</span>
|
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>
|
||||||
<div><button class="btn action_button" onclick="socket.emit('load_model_button', {});">Load Model</button></div>
|
<div><button class="btn action_button" onclick="socket.emit('load_model_button', {});">Load Model</button></div>
|
||||||
</div>
|
</div>
|
||||||
|
Reference in New Issue
Block a user