diff --git a/public/index.html b/public/index.html index bd5782b50..41eaedc62 100644 --- a/public/index.html +++ b/public/index.html @@ -116,8 +116,9 @@ - - + + +
diff --git a/public/scripts/RossAscends-mods.js b/public/scripts/RossAscends-mods.js index 476d66e8f..5cee16499 100644 --- a/public/scripts/RossAscends-mods.js +++ b/public/scripts/RossAscends-mods.js @@ -47,7 +47,7 @@ var count_tokens; var perm_tokens; var connection_made = false; -var retry_delay = 100; +var retry_delay = 500; var RA_AC_retries = 1; const observerConfig = { childList: true, subtree: true }; diff --git a/public/scripts/openai.js b/public/scripts/openai.js index d42734319..617887654 100644 --- a/public/scripts/openai.js +++ b/public/scripts/openai.js @@ -728,7 +728,7 @@ async function getStatusOpen() { reverse_proxy: oai_settings.reverse_proxy, }; - jQuery.ajax({ + return jQuery.ajax({ type: 'POST', // url: '/getstatus_openai', // data: JSON.stringify(data), @@ -986,6 +986,39 @@ function onLogitBiasPresetExportClick() { download(presetJsonString, oai_settings.bias_preset_selected, 'application/json'); } +async function onDeletePresetClick() { + const confirm = await callPopup('Delete the preset? This action is irreversible and your current settings will be overwritten.', 'confirm'); + + if (!confirm) { + return; + } + + const nameToDelete = oai_settings.preset_settings_openai; + const value = openai_setting_names[oai_settings.preset_settings_openai]; + $(`#settings_perset_openai option[value="${value}"]`).remove(); + delete openai_setting_names[oai_settings.preset_settings_openai]; + oai_settings.preset_settings_openai = null; + + if (Object.keys(openai_setting_names).length) { + oai_settings.preset_settings_openai = Object.keys(openai_setting_names)[0]; + const newValue = openai_setting_names[oai_settings.preset_settings_openai]; + $(`#settings_perset_openai option[value="${newValue}"]`).attr('selected', true); + $('#settings_perset_openai').trigger('change'); + } + + const response = await fetch('/deletepreset_openai', { + method: 'POST', + headers: getRequestHeaders(), + body: JSON.stringify({name: nameToDelete}), + }); + + if (!response.ok) { + console.warn('Preset was not deleted from server'); + } + + saveSettingsDebounced(); +} + async function onLogitBiasPresetDeleteClick() { const value = await callPopup('Delete the preset?', 'confirm'); @@ -1007,6 +1040,101 @@ async function onLogitBiasPresetDeleteClick() { saveSettingsDebounced(); } +function onSettingsPresetChange() { + oai_settings.preset_settings_openai = $('#settings_perset_openai').find(":selected").text(); + 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'); + + const settingsToUpdate = { + temperature: ['#temp_openai', 'temp_openai', false], + frequency_penalty: ['#freq_pen_openai', 'freq_pen_openai', false], + presence_penalty: ['#pres_pen_openai', 'pres_pen_openai', false], + openai_model: ['#model_openai_select', 'openai_model', false], + openai_max_context: ['#openai_max_context', 'openai_max_context', false], + openai_max_tokens: ['#openai_max_tokens', 'openai_max_tokens', false], + nsfw_toggle: ['#nsfw_toggle', 'nsfw_toggle', true], + enhance_definitions: ['#enhance_definitions', 'enhance_definitions', true], + wrap_in_quotes: ['#wrap_in_quotes', 'wrap_in_quotes', true], + nsfw_first: ['#nsfw_first', 'nsfw_first', true], + jailbreak_system: ['#jailbreak_system', 'jailbreak_system', true], + main_prompt: ['#main_prompt_textarea', 'main_prompt', false], + nsfw_prompt: ['#nsfw_prompt_textarea', 'nsfw_prompt', false], + jailbreak_prompt: ['#jailbreak_prompt_textarea', 'jailbreak_prompt', false], + impersonation_prompt: ['#impersonation_prompt_textarea', 'impersonation_prompt', false], + bias_preset_selected: ['#openai_logit_bias_preset', 'bias_preset_selected', 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]); + } + oai_settings[setting] = preset[key]; + } + } + + $(`#model_openai_select`).trigger('change'); + $(`#openai_logit_bias_preset`).trigger('change'); + saveSettingsDebounced(); +} + +function onModelChange() { + const value = $(this).val(); + oai_settings.openai_model = value; + + if (value == 'gpt-4' || value == 'gpt-4-0314') { + $('#openai_max_context').attr('max', gpt4_max); + } + else if (value == 'gpt-4-32k') { + $('#openai_max_context').attr('max', gpt4_32k_max); + } + else { + $('#openai_max_context').attr('max', gpt3_max); + oai_settings.openai_max_context = Math.max(oai_settings.openai_max_context, gpt3_max); + $('#openai_max_context').val(oai_settings.openai_max_context).trigger('input'); + } + + saveSettingsDebounced(); +} + +async function onNewPresetClick() { + const popupText = ` +

Preset name:

+

Hint: Use a character/group name to bind preset to a specific chat.

`; + const name = await callPopup(popupText, 'input'); + + if (!name) { + return; + } + + await saveOpenAIPreset(name, oai_settings); +} + +function onReverseProxyInput() { + oai_settings.reverse_proxy = $(this).val(); + if (oai_settings.reverse_proxy == '') { + $("#ReverseProxyWarningMessage").css('display', 'none'); + } else { $("#ReverseProxyWarningMessage").css('display', 'block'); } + saveSettingsDebounced(); +} + +async function onConnectButtonClick(e) { + e.stopPropagation(); + if ($('#api_key_openai').val() != '') { + $("#api_loading_openai").css("display", 'inline-block'); + $("#api_button_openai").css("display", 'none'); + oai_settings.api_key_openai = $('#api_key_openai').val().trim(); + saveSettingsDebounced(); + is_get_status_openai = true; + is_api_button_press_openai = true; + await getStatusOpen(); + } +} + $(document).ready(function () { $(document).on('input', '#temp_openai', function () { oai_settings.temp_openai = $(this).val(); @@ -1038,105 +1166,31 @@ $(document).ready(function () { saveSettingsDebounced(); }); - $("#model_openai_select").change(function () { - const value = $(this).val(); - oai_settings.openai_model = value; - - if (value == 'gpt-4' || value == 'gpt-4-0314') { - $('#openai_max_context').attr('max', gpt4_max); - } - else if (value == 'gpt-4-32k') { - $('#openai_max_context').attr('max', gpt4_32k_max); - } - else { - $('#openai_max_context').attr('max', gpt3_max); - oai_settings.openai_max_context = Math.max(oai_settings.openai_max_context, gpt3_max); - $('#openai_max_context').val(oai_settings.openai_max_context).trigger('input'); - } - - saveSettingsDebounced(); - }); - - $('#stream_toggle').change(function () { + $('#stream_toggle').on('change', function () { oai_settings.stream_openai = !!$('#stream_toggle').prop('checked'); saveSettingsDebounced(); }); - $('#nsfw_toggle').change(function () { + $('#nsfw_toggle').on('change', function () { oai_settings.nsfw_toggle = !!$('#nsfw_toggle').prop('checked'); saveSettingsDebounced(); }); - $('#enhance_definitions').change(function () { + $('#enhance_definitions').on('change', function () { oai_settings.enhance_definitions = !!$('#enhance_definitions').prop('checked'); saveSettingsDebounced(); }); - $('#wrap_in_quotes').change(function () { + $('#wrap_in_quotes').on('change', function () { oai_settings.wrap_in_quotes = !!$('#wrap_in_quotes').prop('checked'); saveSettingsDebounced(); }); - $('#nsfw_first').change(function () { + $('#nsfw_first').on('change', function () { oai_settings.nsfw_first = !!$('#nsfw_first').prop('checked'); saveSettingsDebounced(); }); - $("#settings_perset_openai").change(function () { - oai_settings.preset_settings_openai = $('#settings_perset_openai').find(":selected").text(); - 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'); - - const settingsToUpdate = { - temperature: ['#temp_openai', 'temp_openai', false], - frequency_penalty: ['#freq_pen_openai', 'freq_pen_openai', false], - presence_penalty: ['#pres_pen_openai', 'pres_pen_openai', false], - openai_model: ['#model_openai_select', 'openai_model', false], - openai_max_context: ['#openai_max_context', 'openai_max_context', false], - openai_max_tokens: ['#openai_max_tokens', 'openai_max_tokens', false], - nsfw_toggle: ['#nsfw_toggle', 'nsfw_toggle', true], - enhance_definitions: ['#enhance_definitions', 'enhance_definitions', true], - wrap_in_quotes: ['#wrap_in_quotes', 'wrap_in_quotes', true], - nsfw_first: ['#nsfw_first', 'nsfw_first', true], - jailbreak_system: ['#jailbreak_system', 'jailbreak_system', true], - main_prompt: ['#main_prompt_textarea', 'main_prompt', false], - nsfw_prompt: ['#nsfw_prompt_textarea', 'nsfw_prompt', false], - jailbreak_prompt: ['#jailbreak_prompt_textarea', 'jailbreak_prompt', false], - impersonation_prompt: ['#impersonation_prompt_textarea', 'impersonation_prompt', false], - bias_preset_selected: ['#openai_logit_bias_preset', 'bias_preset_selected', 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]); - } - oai_settings[setting] = preset[key]; - } - } - - $(`#model_openai_select`).trigger('change'); - $(`#openai_logit_bias_preset`).trigger('change'); - saveSettingsDebounced(); - }); - - $("#api_button_openai").click(function (e) { - e.stopPropagation(); - if ($('#api_key_openai').val() != '') { - $("#api_loading_openai").css("display", 'inline-block'); - $("#api_button_openai").css("display", 'none'); - oai_settings.api_key_openai = $.trim($('#api_key_openai').val()); - saveSettingsDebounced(); - is_get_status_openai = true; - is_api_button_press_openai = true; - getStatusOpen(); - } - }); - $("#jailbreak_prompt_textarea").on('input', function () { oai_settings.jailbreak_prompt = $('#jailbreak_prompt_textarea').val(); saveSettingsDebounced(); @@ -1157,7 +1211,7 @@ $(document).ready(function () { saveSettingsDebounced(); }); - $("#jailbreak_system").change(function () { + $("#jailbreak_system").on('change', function () { oai_settings.jailbreak_system = !!$(this).prop("checked"); saveSettingsDebounced(); }); @@ -1185,58 +1239,42 @@ $(document).ready(function () { trySelectPresetByName(name); }); - $("#update_preset").click(async function () { + $("#update_oai_preset").on('click', async function () { const name = oai_settings.preset_settings_openai; await saveOpenAIPreset(name, oai_settings); callPopup('Preset updated', 'text'); }); - $("#new_preset").click(async function () { - const popupText = ` -

Preset name:

-

Hint: Use a character/group name to bind preset to a specific chat.

`; - $("#save_prompts").click(); - const name = await callPopup(popupText, 'input'); - - if (!name) { - return; - } - - await saveOpenAIPreset(name, oai_settings); - }); - - $("#main_prompt_restore").click(function () { + $("#main_prompt_restore").on('click', function () { oai_settings.main_prompt = default_main_prompt; $('#main_prompt_textarea').val(oai_settings.main_prompt); saveSettingsDebounced(); }); - $("#nsfw_prompt_restore").click(function () { + $("#nsfw_prompt_restore").on('click', function () { oai_settings.nsfw_prompt = default_nsfw_prompt; $('#nsfw_prompt_textarea').val(oai_settings.nsfw_prompt); saveSettingsDebounced(); }); - $("#jailbreak_prompt_restore").click(function () { + $("#jailbreak_prompt_restore").on('click', function () { oai_settings.jailbreak_prompt = default_jailbreak_prompt; $('#jailbreak_prompt_textarea').val(oai_settings.jailbreak_prompt); saveSettingsDebounced(); }); - $("#impersonation_prompt_restore").click(function () { + $("#impersonation_prompt_restore").on('click', function () { oai_settings.impersonation_prompt = default_impersonation_prompt; $('#impersonation_prompt_textarea').val(oai_settings.impersonation_prompt); saveSettingsDebounced(); }); - $("#openai_reverse_proxy").on('input', function () { - oai_settings.reverse_proxy = $(this).val(); - if (oai_settings.reverse_proxy == '') { - $("#ReverseProxyWarningMessage").css('display', 'none'); - } else { $("#ReverseProxyWarningMessage").css('display', 'block'); } - saveSettingsDebounced(); - }); - + $("#api_button_openai").on('click', onConnectButtonClick); + $("#openai_reverse_proxy").on('input', onReverseProxyInput); + $("#model_openai_select").on('change', onModelChange); + $("#settings_perset_openai").on('change', onSettingsPresetChange); + $("#new_oai_preset").on('click', onNewPresetClick); + $("#delete_oai_preset").on('click', onDeletePresetClick); $("#openai_api_usage").on('click', showApiKeyUsage); $('#openai_logit_bias_preset').on('change', onLogitBiasPresetChange); $('#openai_logit_bias_new_preset').on('click', createNewLogitBiasPreset); diff --git a/server.js b/server.js index f1d8dec63..cf65b9b59 100644 --- a/server.js +++ b/server.js @@ -2185,8 +2185,9 @@ app.post("/getstatus_openai", jsonParser, function (request, response_getstatus_ }; client.get(api_url + "/models", args, function (data, response) { if (response.statusCode == 200) { - console.log(data); - response_getstatus_openai.send(data);//data); + response_getstatus_openai.send(data); + const modelIds = data?.data?.map(x => x.id)?.sort(); + console.log('Available OpenAI models:', modelIds); } if (response.statusCode == 401) { console.log('Access Token is incorrect.'); @@ -2259,6 +2260,22 @@ app.post("/openai_usage", jsonParser, async function (request, response) { } }); +app.post("/deletepreset_openai", jsonParser, function (request, response) { + if (!request.body || !request.body.name) { + return response.sendStatus(400); + } + + const name = request.body.name; + const pathToFile = path.join(directories.openAI_Settings, `${name}.settings`); + + if (fs.existsSync(pathToFile)) { + fs.rmSync(pathToFile); + return response.send({ ok: true }); + } + + return response.send({ error: true }); +}); + app.post("/generate_openai", jsonParser, function (request, response_generate_openai) { if (!request.body) return response_generate_openai.sendStatus(400); const api_url = new URL(request.body.reverse_proxy || api_openai).toString();