Presets: Add power user setting support

Settings such as adding character name, stopping strings, etc can be
preset specific. This change is mainly inspired because people (like myself)
often forget to change these settings after switching a preset, which
can cause weird responses from the model.

Signed-off-by: kingbri <bdashore3@proton.me>
This commit is contained in:
kingbri 2023-10-20 01:56:17 -04:00
parent 5c6343e85e
commit 6e4236d5ee
2 changed files with 59 additions and 12 deletions

View File

@ -41,6 +41,7 @@ export {
fixMarkdown,
power_user,
send_on_enter_options,
getContextSettings,
};
export const MAX_CONTEXT_DEFAULT = 4096;
@ -249,6 +250,24 @@ const storage_keys = {
expand_message_actions: 'ExpandMessageActions',
};
const contextControls = [
// Power user context scoped settings
{ id: "context_story_string", property: "story_string", isCheckbox: false, isGlobalSetting: false },
{ id: "context_example_separator", property: "example_separator", isCheckbox: false, isGlobalSetting: false },
{ id: "context_chat_start", property: "chat_start", isCheckbox: false, isGlobalSetting: false },
// Existing power user settings
{ id: "always-force-name2-checkbox", property: "always_force_name2", isCheckbox: true, isGlobalSetting: true },
{ id: "pin-examples-checkbox", property: "pin_examples", isCheckbox: true, isGlobalSetting: true },
{ id: "remove-examples-checkbox", property: "strip_examples", isCheckbox: true, isGlobalSetting: true },
{ id: "collapse-newlines-checkbox", property: "collapse_newlines", isCheckbox: true, isGlobalSetting: true },
{ id: "trim_spaces", property: "trim_spaces", isCheckbox: true, isGlobalSetting: true },
{ id: "trim_sentences_checkbox", property: "trim_sentences", isCheckbox: true, isGlobalSetting: true },
{ id: "include_newline_checkbox", property: "include_newline", isCheckbox: true, isGlobalSetting: true },
{ id: "custom_stopping_strings", property: "custom_stopping_strings", isCheckbox: false, isGlobalSetting: true },
{ id: "custom_stopping_strings_macro", property: "custom_stopping_strings_macro", isCheckbox: true, isGlobalSetting: true }
];
let browser_has_focus = true;
const debug_functions = [];
@ -1070,14 +1089,28 @@ function switchMaxContextSize() {
}
}
function loadContextSettings() {
const controls = [
{ id: "context_story_string", property: "story_string", isCheckbox: false },
{ id: "context_example_separator", property: "example_separator", isCheckbox: false },
{ id: "context_chat_start", property: "chat_start", isCheckbox: false },
];
// Fetch a compiled object of all preset settings
function getContextSettings() {
let compiledSettings = {};
controls.forEach(control => {
contextControls.forEach((control) => {
let value = control.isGlobalSetting ? power_user[control.property] : power_user.context[control.property];
// Force to a boolean if the setting is a checkbox
if (control.isCheckbox) {
value = !!value;
}
compiledSettings[control.property] = value;
});
return compiledSettings;
}
// TODO: Maybe add a refresh button to reset settings to preset
// TODO: Add "global state" if a preset doesn't set the power_user checkboxes
function loadContextSettings() {
contextControls.forEach(control => {
const $element = $(`#${control.id}`);
if (control.isCheckbox) {
@ -1086,8 +1119,16 @@ function loadContextSettings() {
$element.val(power_user.context[control.property]);
}
// If the setting already exists, no need to duplicate it
// TODO: Maybe check the power_user object for the setting instead of a flag?
$element.on('input', function () {
power_user.context[control.property] = control.isCheckbox ? !!$(this).prop('checked') : $(this).val();
const value = control.isCheckbox ? !!$(this).prop('checked') : $(this).val();
if (control.isGlobalSetting) {
power_user[control.property] = value;
} else {
power_user.context[control.property] = value;
}
saveSettingsDebounced();
if (!control.isCheckbox) {
resetScrollHeight($element);
@ -1113,9 +1154,14 @@ function loadContextSettings() {
}
power_user.context.preset = name;
controls.forEach(control => {
contextControls.forEach(control => {
if (preset[control.property] !== undefined) {
power_user.context[control.property] = preset[control.property];
if (control.isGlobalSetting) {
power_user[control.property] = preset[control.property];
} else {
power_user.context[control.property] = preset[control.property];
}
const $element = $(`#${control.id}`);
if (control.isCheckbox) {

View File

@ -18,7 +18,7 @@ import {
import { groups, selected_group } from "./group-chats.js";
import { instruct_presets } from "./instruct-mode.js";
import { kai_settings } from "./kai-settings.js";
import { context_presets, power_user } from "./power-user.js";
import { context_presets, getContextSettings, power_user } from "./power-user.js";
import {
textgenerationwebui_preset_names,
textgenerationwebui_presets,
@ -104,6 +104,7 @@ class PresetManager {
async updatePreset() {
const selected = $(this.select).find("option:selected");
console.log(selected)
if (selected.val() == 'gui') {
toastr.info('Cannot update GUI preset');
@ -236,7 +237,7 @@ class PresetManager {
case "textgenerationwebui":
return textgenerationwebui_settings;
case "context":
const context_preset = structuredClone(power_user.context);
const context_preset = getContextSettings();
context_preset['name'] = name || power_user.context.preset;
return context_preset;
case "instruct":