diff --git a/public/index.html b/public/index.html index efda17abe..de97f1706 100644 --- a/public/index.html +++ b/public/index.html @@ -144,8 +144,8 @@ - - + + diff --git a/public/scripts/openai.js b/public/scripts/openai.js index 14e5822cf..1859953b4 100644 --- a/public/scripts/openai.js +++ b/public/scripts/openai.js @@ -35,6 +35,7 @@ import { import { delay, download, + getFileText, getStringHash, parseJsonFile, stringFormat, @@ -764,7 +765,7 @@ async function sendOpenAIRequest(type, openai_msgs_tosend, signal) { function getStreamingReply(getMessage, data) { if (oai_settings.chat_completion_source == chat_completion_sources.CLAUDE) { getMessage = data.completion || ""; - } else{ + } else { getMessage += data.choices[0]["delta"]["content"] || ""; } return getMessage; @@ -1204,6 +1205,8 @@ async function saveOpenAIPreset(name, settings) { option.innerText = data.name; $('#settings_perset_openai').append(option).trigger('change'); } + } else { + toastr.error('Failed to save preset'); } } @@ -1317,6 +1320,74 @@ function onLogitBiasPresetImportClick() { $('#openai_logit_bias_import_file').trigger('click'); } +async function onPresetImportFileChange(e) { + const file = e.target.files[0]; + + if (!file) { + return; + } + + const name = file.name.replace(/\.[^/.]+$/, ""); + const importedFile = await getFileText(file); + let presetBody; + e.target.value = ''; + + try { + presetBody = JSON.parse(importedFile); + } catch (err) { + toastr.error('Invalid file'); + return; + } + + if (name in openai_setting_names) { + const confirm = await callPopup('Preset name already exists. Overwrite?', 'confirm'); + + if (!confirm) { + return; + } + } + + const savePresetSettings = await fetch(`/savepreset_openai?name=${name}`, { + method: 'POST', + headers: getRequestHeaders(), + body: importedFile, + }); + + if (!savePresetSettings.ok) { + toastr.error('Failed to save preset'); + return; + } + + const data = await savePresetSettings.json(); + + if (Object.keys(openai_setting_names).includes(data.name)) { + oai_settings.preset_settings_openai = data.name; + const value = openai_setting_names[data.name]; + Object.assign(openai_settings[value], presetBody); + $(`#settings_perset_openai option[value="${value}"]`).attr('selected', true); + $('#settings_perset_openai').trigger('change'); + } else { + openai_settings.push(presetBody); + openai_setting_names[data.name] = openai_settings.length - 1; + const option = document.createElement('option'); + option.selected = true; + option.value = openai_settings.length - 1; + option.innerText = data.name; + $('#settings_perset_openai').append(option).trigger('change'); + } +} + +async function onExportPresetClick() { + if (!oai_settings.preset_settings_openai) { + toastr.error('No preset selected'); + return; + } + + const preset = openai_settings[openai_setting_names[oai_settings.preset_settings_openai]]; + const presetJsonString = JSON.stringify(preset, null, 4); + download(presetJsonString, oai_settings.preset_settings_openai, 'application/json'); +} + async function onLogitBiasPresetImportFileChange(e) { const file = e.target.files[0]; @@ -1361,7 +1432,7 @@ function onLogitBiasPresetExportClick() { return; } - const presetJsonString = JSON.stringify(oai_settings.bias_presets[oai_settings.bias_preset_selected]); + const presetJsonString = JSON.stringify(oai_settings.bias_presets[oai_settings.bias_preset_selected], null, 4); download(presetJsonString, oai_settings.bias_preset_selected, 'application/json'); } @@ -1479,7 +1550,7 @@ function onModelChange() { if ($(this).is('#model_claude_select')) { console.log('Claude model changed to', value); - oai_settings.claude_model = value; + oai_settings.claude_model = value; } if ($(this).is('#model_windowai_select')) { @@ -1887,6 +1958,8 @@ $(document).ready(function () { $("#openai_logit_bias_new_preset").on("click", createNewLogitBiasPreset); $("#openai_logit_bias_new_entry").on("click", createNewLogitBiasEntry); $("#openai_logit_bias_import_file").on("input", onLogitBiasPresetImportFileChange); + $("#openai_preset_import_file").on("input", onPresetImportFileChange); + $("#export_oai_preset").on("click", onExportPresetClick); $("#openai_logit_bias_import_preset").on("click", onLogitBiasPresetImportClick); $("#openai_logit_bias_export_preset").on("click", onLogitBiasPresetExportClick); $("#openai_logit_bias_delete_preset").on("click", onLogitBiasPresetDeleteClick);