diff --git a/public/scripts/power-user.js b/public/scripts/power-user.js index 045c9960e..72fb8c856 100644 --- a/public/scripts/power-user.js +++ b/public/scripts/power-user.js @@ -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) { diff --git a/public/scripts/preset-manager.js b/public/scripts/preset-manager.js index 231e5ee07..e8a012bab 100644 --- a/public/scripts/preset-manager.js +++ b/public/scripts/preset-manager.js @@ -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":