From a9fa42524dd0444b6c47aed36de71abf869d3df1 Mon Sep 17 00:00:00 2001 From: maver Date: Sat, 12 Aug 2023 18:17:06 +0200 Subject: [PATCH] Fix prompts object reference being shared By deepcloning a copy --- public/scripts/PromptManager.js | 8 +++-- public/scripts/openai.js | 56 ++++++++++++++++++++------------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/public/scripts/PromptManager.js b/public/scripts/PromptManager.js index 405d60c4a..13ba44952 100644 --- a/public/scripts/PromptManager.js +++ b/public/scripts/PromptManager.js @@ -6,10 +6,10 @@ import {power_user} from "./power-user.js"; * Register migrations for the prompt manager when settings are loaded or an Open AI preset is loaded. */ const registerPromptManagerMigration = () => { - const migrate = (settings) => { + const migrate = (settings, savePreset = null, presetName = null) => { if (settings.main_prompt || settings.nsfw_prompt || settings.jailbreak_prompt) { console.log('Running prompt manager configuration migration'); - if (settings.prompts === undefined || settings.prompts.length === 0) settings.prompts = chatCompletionDefaultPrompts.prompts; + if (settings.prompts === undefined || settings.prompts.length === 0) settings.prompts = structuredClone(chatCompletionDefaultPrompts.prompts); const findPrompt = (identifier) => settings.prompts.find(prompt => identifier === prompt.identifier); if (settings.main_prompt) { @@ -26,11 +26,13 @@ const registerPromptManagerMigration = () => { findPrompt('jailbreak').content = settings.jailbreak_prompt delete settings.jailbreak_prompt; } + + if (savePreset && presetName) savePreset(presetName, settings, false); } }; eventSource.on(event_types.SETTINGS_LOADED_BEFORE, settings => migrate(settings)); - eventSource.on(event_types.OAI_PRESET_CHANGED, event => migrate(event.preset)); + eventSource.on(event_types.OAI_PRESET_CHANGED, event => migrate(event.preset, event.savePreset, event.presetName)); } /** diff --git a/public/scripts/openai.js b/public/scripts/openai.js index 0f3505e66..43f5d31fd 100644 --- a/public/scripts/openai.js +++ b/public/scripts/openai.js @@ -2022,6 +2022,14 @@ function trySelectPresetByName(name) { } } +/** + * Persist a settings preset with the given name + * + * @param name - Name of the preset + * @param settings The OpenAi settings object + * @param triggerUi Whether the change event of preset UI element should be emitted + * @returns {Promise} + */ async function saveOpenAIPreset(name, settings, triggerUi = true) { const presetBody = { chat_completion_source: settings.chat_completion_source, @@ -2354,16 +2362,6 @@ async function onLogitBiasPresetDeleteClick() { // Load OpenAI preset settings function onSettingsPresetChange() { - const presetName = $('#settings_perset_openai').find(":selected").text(); - oai_settings.preset_settings_openai = presetName; - const preset = openai_settings[openai_setting_names[oai_settings.preset_settings_openai]]; - - eventSource.emit(event_types.OAI_PRESET_CHANGED, {preset: preset, settings: oai_settings}) - .then(() => saveOpenAIPreset(presetName, preset, false)); - - const updateInput = (selector, value) => $(selector).val(value).trigger('input'); - const updateCheckbox = (selector, value) => $(selector).prop('checked', value).trigger('input'); - const settingsToUpdate = { chat_completion_source: ['#chat_completion_source', 'chat_completion_source', false], temperature: ['#temp_openai', 'temp_openai', false], @@ -2402,21 +2400,37 @@ function onSettingsPresetChange() { assistant_prefill: ['#claude_assistant_prefill', 'assistant_prefill', false], }; - for (const [key, [selector, setting, isCheckbox]] of Object.entries(settingsToUpdate)) { - if (preset[key] !== undefined) { - if (isCheckbox) { - updateCheckbox(selector, preset[key]); - } else { - updateInput(selector, preset[key]); + const presetName = $('#settings_perset_openai').find(":selected").text(); + oai_settings.preset_settings_openai = presetName; + const preset = openai_settings[openai_setting_names[oai_settings.preset_settings_openai]]; + + const updateInput = (selector, value) => $(selector).val(value).trigger('input'); + const updateCheckbox = (selector, value) => $(selector).prop('checked', value).trigger('input'); + + // Allow subscribers to alter the preset before applying deltas + eventSource.emit(event_types.OAI_PRESET_CHANGED, { + preset: preset, + presetName: presetName, + settingsToUpdate: settingsToUpdate, + settings: oai_settings, + savePreset: saveOpenAIPreset + }).finally(r =>{ + for (const [key, [selector, setting, isCheckbox]] of Object.entries(settingsToUpdate)) { + if (preset[key] !== undefined) { + if (isCheckbox) { + updateCheckbox(selector, preset[key]); + } else { + updateInput(selector, preset[key]); + } + oai_settings[setting] = preset[key]; } - oai_settings[setting] = preset[key]; } - } - $(`#chat_completion_source`).trigger('change'); - $(`#openai_logit_bias_preset`).trigger('change'); + $(`#chat_completion_source`).trigger('change'); + $(`#openai_logit_bias_preset`).trigger('change'); - saveSettingsDebounced(); + saveSettingsDebounced(); + }); } function getMaxContextOpenAI(value) {