Refactor loadOpenAISettings (#4815) * Refactor loadOpenAISettings * Fix migration logic * Show external category on load * Restore jamba migration * Refactor saveOpenAIPreset to use dynamic settings mapping

999ab489729e67888896460b0033f908129f42e0

Cohee <18619528+Cohee1207@users.noreply.github.com>

Signed
1 files changed, +72 -358Showing whitespace changes
public/scripts/openai.js+72 -358
@@ -3655,267 +3655,85 @@ export class ChatCompletion {
36553655 }
36563656}
36573657
3658+/**
3659+ * Load OpenAI settings from backend data
3660+ * @param {any} data Settings data from backend
3661+ * @param {ChatCompletionSettings} settings Saved settings from backend
3662+ */
36583663function loadOpenAISettings(data, settings) {
36593664 openai_setting_names = data.openai_setting_names;
36603665 openai_settings = data.openai_settings;
36613666 openai_settings.forEach(function (item, i, arr) {
36623667 openai_settings[i] = JSON.parse(item);
36633668 });
36643669
36653670 $('#settings_preset_openai').empty();
36663671 letconst arr_holdersettingNames = {};
36673672 openai_setting_names.forEach(function (item, i, arr) {
36683673 arr_holdersettingNames[item] = i;
3669- $('#settings_preset_openai').append(`<option value=${i}>${item}</option>`);
3674+ const option = document.createElement('option');
3670-
3675+ option.value = i;
3671- });
3676+ option.text = item;
3672- openai_setting_names = arr_holder;
3677+ $('#settings_preset_openai').append(option);
36733678
3674- oai_settings.preset_settings_openai = settings.preset_settings_openai;
3679+ });
3675- $(`#settings_preset_openai option[value=${openai_setting_names[oai_settings.preset_settings_openai]}]`).prop('selected', true);
3680+ openai_setting_names = settingNames;
3676-
3677- oai_settings.temp_openai = settings.temp_openai ?? default_settings.temp_openai;
3678- oai_settings.freq_pen_openai = settings.freq_pen_openai ?? default_settings.freq_pen_openai;
3679- oai_settings.pres_pen_openai = settings.pres_pen_openai ?? default_settings.pres_pen_openai;
3680- oai_settings.top_p_openai = settings.top_p_openai ?? default_settings.top_p_openai;
3681- oai_settings.top_k_openai = settings.top_k_openai ?? default_settings.top_k_openai;
3682- oai_settings.top_a_openai = settings.top_a_openai ?? default_settings.top_a_openai;
3683- oai_settings.min_p_openai = settings.min_p_openai ?? default_settings.min_p_openai;
3684- oai_settings.repetition_penalty_openai = settings.repetition_penalty_openai ?? default_settings.repetition_penalty_openai;
3685- oai_settings.stream_openai = settings.stream_openai ?? default_settings.stream_openai;
3686- oai_settings.openai_max_context = settings.openai_max_context ?? default_settings.openai_max_context;
3687- oai_settings.openai_max_tokens = settings.openai_max_tokens ?? default_settings.openai_max_tokens;
3688- oai_settings.bias_preset_selected = settings.bias_preset_selected ?? default_settings.bias_preset_selected;
3689- oai_settings.bias_presets = settings.bias_presets ?? default_settings.bias_presets;
3690- oai_settings.max_context_unlocked = settings.max_context_unlocked ?? default_settings.max_context_unlocked;
3691- oai_settings.send_if_empty = settings.send_if_empty ?? default_settings.send_if_empty;
3692- oai_settings.wi_format = settings.wi_format ?? default_settings.wi_format;
3693- oai_settings.scenario_format = settings.scenario_format ?? default_settings.scenario_format;
3694- oai_settings.personality_format = settings.personality_format ?? default_settings.personality_format;
3695- oai_settings.group_nudge_prompt = settings.group_nudge_prompt ?? default_settings.group_nudge_prompt;
3696- oai_settings.claude_model = settings.claude_model ?? default_settings.claude_model;
3697- oai_settings.openrouter_model = settings.openrouter_model ?? default_settings.openrouter_model;
3698- oai_settings.openrouter_group_models = settings.openrouter_group_models ?? default_settings.openrouter_group_models;
3699- oai_settings.openrouter_sort_models = settings.openrouter_sort_models ?? default_settings.openrouter_sort_models;
3700- oai_settings.openrouter_use_fallback = settings.openrouter_use_fallback ?? default_settings.openrouter_use_fallback;
3701- oai_settings.openrouter_allow_fallbacks = settings.openrouter_allow_fallbacks ?? default_settings.openrouter_allow_fallbacks;
3702- oai_settings.openrouter_middleout = settings.openrouter_middleout ?? default_settings.openrouter_middleout;
3703- oai_settings.ai21_model = settings.ai21_model ?? default_settings.ai21_model;
3704- oai_settings.mistralai_model = settings.mistralai_model ?? default_settings.mistralai_model;
3705- oai_settings.cohere_model = settings.cohere_model ?? default_settings.cohere_model;
3706- oai_settings.perplexity_model = settings.perplexity_model ?? default_settings.perplexity_model;
3707- oai_settings.groq_model = settings.groq_model ?? default_settings.groq_model;
3708- oai_settings.siliconflow_model = settings.siliconflow_model ?? default_settings.siliconflow_model;
3709- oai_settings.electronhub_model = settings.electronhub_model ?? default_settings.electronhub_model;
3710- oai_settings.electronhub_sort_models = settings.electronhub_sort_models ?? default_settings.electronhub_sort_models;
3711- oai_settings.electronhub_group_models = settings.electronhub_group_models ?? default_settings.electronhub_group_models;
3712- oai_settings.nanogpt_model = settings.nanogpt_model ?? default_settings.nanogpt_model;
3713- oai_settings.deepseek_model = settings.deepseek_model ?? default_settings.deepseek_model;
3714- oai_settings.aimlapi_model = settings.aimlapi_model ?? default_settings.aimlapi_model;
3715- oai_settings.xai_model = settings.xai_model ?? default_settings.xai_model;
3716- oai_settings.pollinations_model = settings.pollinations_model ?? default_settings.pollinations_model;
3717- oai_settings.cometapi_model = settings.cometapi_model ?? default_settings.cometapi_model;
3718- oai_settings.moonshot_model = settings.moonshot_model ?? default_settings.moonshot_model;
3719- oai_settings.fireworks_model = settings.fireworks_model ?? default_settings.fireworks_model;
3720- oai_settings.zai_model = settings.zai_model ?? default_settings.zai_model;
3721- oai_settings.zai_endpoint = settings.zai_endpoint ?? default_settings.zai_endpoint;
3722- oai_settings.custom_model = settings.custom_model ?? default_settings.custom_model;
3723- oai_settings.custom_url = settings.custom_url ?? default_settings.custom_url;
3724- oai_settings.custom_include_body = settings.custom_include_body ?? default_settings.custom_include_body;
3725- oai_settings.custom_exclude_body = settings.custom_exclude_body ?? default_settings.custom_exclude_body;
3726- oai_settings.custom_include_headers = settings.custom_include_headers ?? default_settings.custom_include_headers;
3727- oai_settings.custom_prompt_post_processing = settings.custom_prompt_post_processing ?? default_settings.custom_prompt_post_processing;
3728- oai_settings.google_model = settings.google_model ?? default_settings.google_model;
3729- oai_settings.azure_base_url = settings.azure_base_url ?? default_settings.azure_base_url;
3730- oai_settings.azure_deployment_name = settings.azure_deployment_name ?? default_settings.azure_deployment_name;
3731- oai_settings.azure_api_version = settings.azure_api_version ?? default_settings.azure_api_version;
3732- oai_settings.azure_openai_model = settings.azure_openai_model ?? default_settings.azure_openai_model;
3733- oai_settings.vertexai_model = settings.vertexai_model ?? default_settings.vertexai_model;
3734- oai_settings.chat_completion_source = settings.chat_completion_source ?? default_settings.chat_completion_source;
3735- oai_settings.show_external_models = settings.show_external_models ?? default_settings.show_external_models;
3736- oai_settings.proxy_password = settings.proxy_password ?? default_settings.proxy_password;
3737- oai_settings.assistant_prefill = settings.assistant_prefill ?? default_settings.assistant_prefill;
3738- oai_settings.assistant_impersonation = settings.assistant_impersonation ?? default_settings.assistant_impersonation;
3739- oai_settings.image_inlining = settings.image_inlining ?? default_settings.image_inlining;
3740- oai_settings.inline_image_quality = settings.inline_image_quality ?? default_settings.inline_image_quality;
3741- oai_settings.video_inlining = settings.video_inlining ?? default_settings.video_inlining;
3742- oai_settings.audio_inlining = settings.audio_inlining ?? default_settings.audio_inlining;
3743- oai_settings.bypass_status_check = settings.bypass_status_check ?? default_settings.bypass_status_check;
3744- oai_settings.vertexai_express_project_id = settings.vertexai_express_project_id ?? default_settings.vertexai_express_project_id;
3745- oai_settings.show_thoughts = settings.show_thoughts ?? default_settings.show_thoughts;
3746- oai_settings.reasoning_effort = settings.reasoning_effort ?? default_settings.reasoning_effort;
3747- oai_settings.enable_web_search = settings.enable_web_search ?? default_settings.enable_web_search;
3748- oai_settings.request_images = settings.request_images ?? default_settings.request_images;
3749- oai_settings.seed = settings.seed ?? default_settings.seed;
3750- oai_settings.n = settings.n ?? default_settings.n;
3751-
3752- oai_settings.prompts = settings.prompts ?? default_settings.prompts;
3753- oai_settings.prompt_order = settings.prompt_order ?? default_settings.prompt_order;
3754-
3755- oai_settings.new_chat_prompt = settings.new_chat_prompt ?? default_settings.new_chat_prompt;
3756- oai_settings.new_group_chat_prompt = settings.new_group_chat_prompt ?? default_settings.new_group_chat_prompt;
3757- oai_settings.new_example_chat_prompt = settings.new_example_chat_prompt ?? default_settings.new_example_chat_prompt;
3758- oai_settings.continue_nudge_prompt = settings.continue_nudge_prompt ?? default_settings.continue_nudge_prompt;
3759- oai_settings.squash_system_messages = settings.squash_system_messages ?? default_settings.squash_system_messages;
3760- oai_settings.continue_prefill = settings.continue_prefill ?? default_settings.continue_prefill;
3761- oai_settings.names_behavior = settings.names_behavior ?? default_settings.names_behavior;
3762- oai_settings.continue_postfix = settings.continue_postfix ?? default_settings.continue_postfix;
3763- oai_settings.function_calling = settings.function_calling ?? default_settings.function_calling;
3764- oai_settings.openrouter_providers = settings.openrouter_providers ?? default_settings.openrouter_providers;
3765- oai_settings.bind_preset_to_connection = settings.bind_preset_to_connection ?? default_settings.bind_preset_to_connection;
3766- oai_settings.extensions = settings.extensions ?? default_settings.extensions;
3767-
3768- // Migrate from old settings
3769- if (settings.names_in_completion === true) {
3770- oai_settings.names_behavior = character_names_behavior.COMPLETION;
3771- }
37723681
3773- if (oai_settings.ai21_model.startsWith('j2-')) {
3682+ const migrateMap = [
3774- oai_settings.ai21_model = 'jamba-large';
3683+ { oldKey: 'names_in_completion', oldValue: true, newKey: 'names_behavior', newValue: character_names_behavior.COMPLETION },
3684+ { oldKey: 'chat_completion_source', oldValue: 'palm', newKey: 'chat_completion_source', newValue: chat_completion_sources.MAKERSUITE },
3685+ { oldKey: 'custom_prompt_post_processing', oldValue: custom_prompt_post_processing_types.CLAUDE, newKey: 'custom_prompt_post_processing', newValue: custom_prompt_post_processing_types.MERGE },
3686+ { oldKey: 'ai21_model', oldValue: /^j2-/, newKey: 'ai21_model', newValue: 'jamba-large' },
3687+ ];
3688+
3689+ for (const migration of migrateMap) {
3690+ if (Object.hasOwn(settings, migration.oldKey)) {
3691+ const shouldMigrate = migration.oldValue instanceof RegExp
3692+ ? migration.oldValue.test(settings[migration.oldKey])
3693+ : settings[migration.oldKey] === migration.oldValue;
3694+ if (shouldMigrate) {
3695+ settings[migration.newKey] = migration.newValue;
3696+ }
3697+ }
37753698 }
37763699
3777- if (settings.wrap_in_quotes !== undefined) oai_settings.wrap_in_quotes = !!settings.wrap_in_quotes;
3700+ for (const key of Object.keys(default_settings)) {
3778- if (settings.openai_model !== undefined) oai_settings.openai_model = settings.openai_model;
3701+ oai_settings[key] = settings[key] ?? default_settings[key];
3779- if (settings.claude_use_sysprompt !== undefined) oai_settings.claude_use_sysprompt = !!settings.claude_use_sysprompt;
3702+ const settingToUpdate = Object.values(settingsToUpdate).find(([_, k]) => k === key);
3780- if (settings.use_makersuite_sysprompt !== undefined) oai_settings.use_makersuite_sysprompt = !!settings.use_makersuite_sysprompt;
3703+ if (settingToUpdate) {
3781- if (settings.vertexai_auth_mode !== undefined) oai_settings.vertexai_auth_mode = settings.vertexai_auth_mode;
3704+ const [selector] = settingToUpdate;
3782- if (settings.vertexai_region !== undefined) oai_settings.vertexai_region = settings.vertexai_region;
3705+ const $element = $(selector);
3783- if (settings.vertexai_express_project_id !== undefined) oai_settings.vertexai_express_project_id = settings.vertexai_express_project_id;
3784- $('#stream_toggle').prop('checked', oai_settings.stream_openai);
3785- $('#openai_proxy_password').val(oai_settings.proxy_password);
3786- $('#claude_assistant_prefill').val(oai_settings.assistant_prefill);
3787- $('#claude_assistant_impersonation').val(oai_settings.assistant_impersonation);
3788- $('#openai_image_inlining').prop('checked', oai_settings.image_inlining);
3789- $('#openai_bypass_status_check').prop('checked', oai_settings.bypass_status_check);
37903706
3791- $('#openai_inline_image_quality').val(oai_settings.inline_image_quality);
3707+ if ($element.length === 0) {
3792- $(`#openai_inline_image_quality option[value="${oai_settings.inline_image_quality}"]`).prop('selected', true);
3708+ continue;
3709+ }
37933710
3794- $('#openai_video_inlining').prop('checked', oai_settings.video_inlining);
3711+ if ($element.is('input[type="checkbox"]')) {
37953712 $('#openai_audio_inlining')element.prop('checked', oai_settings.audio_inlining[key]);
3713+ } else if ($element.is('select')) {
3714+ $element.val(oai_settings[key]);
3715+ $element.find(`option[value="${CSS.escape(oai_settings[key])}"]`).prop('selected', true);
3716+ } else {
3717+ $element.val(oai_settings[key]);
3718+ if ($element.is('input[type="range"]')) {
3719+ const id = $element.attr('id');
3720+ const $counter = $(`input[type="number"][data-for="${id}"]`);
3721+ if ($counter.length > 0) {
3722+ $counter.val(Number(oai_settings[key]));
3723+ }
3724+ }
3725+ }
3726+ }
3727+ }
37963728
3797- $('#model_openai_select').val(oai_settings.openai_model);
3729+ $(`#settings_preset_openai option[value="${openai_setting_names[oai_settings.preset_settings_openai]}"]`).prop('selected', true);
37983730 $(`'#model_openai_select option[value="${oai_settings.openai_model}"`bind_preset_to_connection').prop('selectedchecked', trueoai_settings.bind_preset_to_connection);
3799- $('#model_claude_select').val(oai_settings.claude_model);
3800- $(`#model_claude_select option[value="${oai_settings.claude_model}"`).prop('selected', true);
3801- $('#model_google_select').val(oai_settings.google_model);
3802- $(`#model_google_select option[value="${oai_settings.google_model}"`).prop('selected', true);
3803- $('#model_vertexai_select').val(oai_settings.vertexai_model);
3804- $(`#model_vertexai_select option[value="${oai_settings.vertexai_model}"`).prop('selected', true);
3805- $('#model_ai21_select').val(oai_settings.ai21_model);
3806- $(`#model_ai21_select option[value="${oai_settings.ai21_model}"`).prop('selected', true);
3807- $('#model_mistralai_select').val(oai_settings.mistralai_model);
3808- $(`#model_mistralai_select option[value="${oai_settings.mistralai_model}"`).prop('selected', true);
3809- $('#model_cohere_select').val(oai_settings.cohere_model);
3810- $(`#model_cohere_select option[value="${oai_settings.cohere_model}"`).prop('selected', true);
3811- $('#model_perplexity_select').val(oai_settings.perplexity_model);
3812- $(`#model_perplexity_select option[value="${oai_settings.perplexity_model}"`).prop('selected', true);
3813- $('#model_groq_select').val(oai_settings.groq_model);
3814- $(`#model_groq_select option[value="${oai_settings.groq_model}"`).prop('selected', true);
3815- $('#model_siliconflow_select').val(oai_settings.siliconflow_model);
3816- $(`#model_siliconflow_select option[value="${oai_settings.siliconflow_model}"`).prop('selected', true);
3817- $('#model_electronhub_select').val(oai_settings.electronhub_model);
3818- $(`#model_electronhub_select option[value="${oai_settings.electronhub_model}"`).prop('selected', true);
3819- $('#model_nanogpt_select').val(oai_settings.nanogpt_model);
3820- $(`#model_nanogpt_select option[value="${oai_settings.nanogpt_model}"`).prop('selected', true);
3821- $('#model_deepseek_select').val(oai_settings.deepseek_model);
3822- $(`#model_deepseek_select option[value="${oai_settings.deepseek_model}"`).prop('selected', true);
3823- $('#model_aimlapi_select').val(oai_settings.aimlapi_model);
3824- $(`#model_aimlapi_select option[value="${oai_settings.aimlapi_model}"`).prop('selected', true);
3825- $('#model_xai_select').val(oai_settings.xai_model);
3826- $(`#model_xai_select option[value="${oai_settings.xai_model}"`).prop('selected', true);
3827- $('#model_pollinations_select').val(oai_settings.pollinations_model);
3828- $(`#model_pollinations_select option[value="${oai_settings.pollinations_model}"`).prop('selected', true);
3829- $('#model_moonshot_select').val(oai_settings.moonshot_model);
3830- $(`#model_moonshot_select option[value="${oai_settings.moonshot_model}"`).prop('selected', true);
3831- $('#model_zai_select').val(oai_settings.zai_model);
3832- $(`#model_zai_select option[value="${oai_settings.zai_model}"`).prop('selected', true);
3833- $('#zai_endpoint').val(oai_settings.zai_endpoint);
3834- $(`#zai_endpoint option[value="${oai_settings.zai_endpoint}"`).prop('selected', true);
3835- $('#custom_model_id').val(oai_settings.custom_model);
3836- $('#custom_api_url_text').val(oai_settings.custom_url);
3837- $('#azure_base_url').val(oai_settings.azure_base_url);
3838- $('#azure_deployment_name').val(oai_settings.azure_deployment_name);
3839- $('#azure_api_version').val(oai_settings.azure_api_version);
3840- $('#azure_openai_model').val(oai_settings.azure_openai_model);
3841-
3842- $('#openai_max_context').val(oai_settings.openai_max_context);
3843- $('#openai_max_context_counter').val(`${oai_settings.openai_max_context}`);
3844- $('#model_openrouter_select').val(oai_settings.openrouter_model);
3845- $('#openrouter_sort_models').val(oai_settings.openrouter_sort_models);
3846-
3847- $('#openai_max_tokens').val(oai_settings.openai_max_tokens);
3848-
3849- $('#wrap_in_quotes').prop('checked', oai_settings.wrap_in_quotes);
3850- $('#openai_show_external_models').prop('checked', oai_settings.show_external_models);
38513731 $('#openai_external_category').toggle(oai_settings.show_external_models);
38523732 $('#claude_use_sysprompt.reverse_proxy_warning').proptoggle('checked', oai_settings.claude_use_syspromptreverse_proxy !== '');
3853- $('#use_makersuite_sysprompt').prop('checked', oai_settings.use_makersuite_sysprompt);
3733+
3854- $('#vertexai_auth_mode').val(oai_settings.vertexai_auth_mode);
3855- $('#vertexai_region').val(oai_settings.vertexai_region);
3856- $('#vertexai_express_project_id').val(oai_settings.vertexai_express_project_id);
38573734 // Don't display Service Account JSON in textarea - it's stored in backend secrets
38583735 $('#vertexai_service_account_json').val('');
38593736 updateVertexAIServiceAccountStatus();
3860- $('#openrouter_use_fallback').prop('checked', oai_settings.openrouter_use_fallback);
3861- $('#openrouter_group_models').prop('checked', oai_settings.openrouter_group_models);
3862- $('#openrouter_allow_fallbacks').prop('checked', oai_settings.openrouter_allow_fallbacks);
3863- $('#openrouter_providers_chat').val(oai_settings.openrouter_providers).trigger('change');
3864- $('#openrouter_middleout').val(oai_settings.openrouter_middleout);
3865- $('#electronhub_sort_models').val(oai_settings.electronhub_sort_models);
3866- $('#electronhub_group_models').prop('checked', oai_settings.electronhub_group_models);
3867- $('#squash_system_messages').prop('checked', oai_settings.squash_system_messages);
3868- $('#continue_prefill').prop('checked', oai_settings.continue_prefill);
3869- $('#openai_function_calling').prop('checked', oai_settings.function_calling);
3870- if (settings.impersonation_prompt !== undefined) oai_settings.impersonation_prompt = settings.impersonation_prompt;
3871-
3872- $('#impersonation_prompt_textarea').val(oai_settings.impersonation_prompt);
3873-
3874- $('#newchat_prompt_textarea').val(oai_settings.new_chat_prompt);
3875- $('#newgroupchat_prompt_textarea').val(oai_settings.new_group_chat_prompt);
3876- $('#newexamplechat_prompt_textarea').val(oai_settings.new_example_chat_prompt);
3877- $('#continue_nudge_prompt_textarea').val(oai_settings.continue_nudge_prompt);
3878-
3879- $('#wi_format_textarea').val(oai_settings.wi_format);
3880- $('#scenario_format_textarea').val(oai_settings.scenario_format);
3881- $('#personality_format_textarea').val(oai_settings.personality_format);
3882- $('#group_nudge_prompt_textarea').val(oai_settings.group_nudge_prompt);
3883- $('#send_if_empty_textarea').val(oai_settings.send_if_empty);
3884-
3885- $('#temp_openai').val(oai_settings.temp_openai);
3886- $('#temp_counter_openai').val(Number(oai_settings.temp_openai).toFixed(2));
3887-
3888- $('#freq_pen_openai').val(oai_settings.freq_pen_openai);
3889- $('#freq_pen_counter_openai').val(Number(oai_settings.freq_pen_openai).toFixed(2));
3890-
3891- $('#pres_pen_openai').val(oai_settings.pres_pen_openai);
3892- $('#pres_pen_counter_openai').val(Number(oai_settings.pres_pen_openai).toFixed(2));
3893-
3894- $('#top_p_openai').val(oai_settings.top_p_openai);
3895- $('#top_p_counter_openai').val(Number(oai_settings.top_p_openai).toFixed(2));
3896-
3897- $('#top_k_openai').val(oai_settings.top_k_openai);
3898- $('#top_k_counter_openai').val(Number(oai_settings.top_k_openai).toFixed(0));
3899- $('#top_a_openai').val(oai_settings.top_a_openai);
3900- $('#top_a_counter_openai').val(Number(oai_settings.top_a_openai));
3901- $('#min_p_openai').val(oai_settings.min_p_openai);
3902- $('#min_p_counter_openai').val(Number(oai_settings.min_p_openai));
3903- $('#repetition_penalty_openai').val(oai_settings.repetition_penalty_openai);
3904- $('#repetition_penalty_counter_openai').val(Number(oai_settings.repetition_penalty_openai));
3905- $('#seed_openai').val(oai_settings.seed);
3906- $('#n_openai').val(oai_settings.n);
3907- $('#openai_show_thoughts').prop('checked', oai_settings.show_thoughts);
3908- $('#openai_enable_web_search').prop('checked', oai_settings.enable_web_search);
3909- $('#openai_request_images').prop('checked', oai_settings.request_images);
3910- $('#bind_preset_to_connection').prop('checked', oai_settings.bind_preset_to_connection);
3911-
3912- $('#openai_reasoning_effort').val(oai_settings.reasoning_effort);
3913- $(`#openai_reasoning_effort option[value="${oai_settings.reasoning_effort}"]`).prop('selected', true);
3914-
3915- if (settings.reverse_proxy !== undefined) oai_settings.reverse_proxy = settings.reverse_proxy;
3916- $('#openai_reverse_proxy').val(oai_settings.reverse_proxy);
3917-
3918- $('.reverse_proxy_warning').toggle(oai_settings.reverse_proxy !== '');
39193737
39203738 $('#openai_logit_bias_preset').empty();
39213739 for (const preset of Object.keys(oai_settings.bias_presets)) {
@@ -3935,22 +3753,11 @@ function loadOpenAISettings(data, settings) {
39353753 }
39363754 $('#openai_logit_bias_preset').trigger('change');
39373755
3938- // Upgrade Palm to Makersuite
3939- if (oai_settings.chat_completion_source === 'palm') {
3940- oai_settings.chat_completion_source = chat_completion_sources.MAKERSUITE;
3941- }
3942-
39433756 setNamesBehaviorControls();
39443757 setContinuePostfixControls();
39453758
3946- if (oai_settings.custom_prompt_post_processing === custom_prompt_post_processing_types.CLAUDE) {
3759+ $('#openrouter_providers_chat').trigger('change');
3947- oai_settings.custom_prompt_post_processing = custom_prompt_post_processing_types.MERGE;
3760+ $('#chat_completion_source').trigger('change');
3948- }
3949-
3950- $('#chat_completion_source').val(oai_settings.chat_completion_source).trigger('change');
3951- $('#oai_max_context_unlocked').prop('checked', oai_settings.max_context_unlocked);
3952- $('#custom_prompt_post_processing').val(oai_settings.custom_prompt_post_processing);
3953- $(`#custom_prompt_post_processing option[value="${oai_settings.custom_prompt_post_processing}"]`).prop('selected', true);
39543761}
39553762
39563763function setNamesBehaviorControls() {
@@ -4101,109 +3908,16 @@ async function getStatusOpen() {
41013908/**
41023909 * Persist a settings preset with the given name
41033910 *
41043911 * @param {string} name - Name of the preset
41053912 * @param {ChatCompletionSettings} settings The OpenAi settings object
41063913 * @param {boolean} triggerUi Whether the change event of preset UI element should be emitted
41073914 * @returns {Promise<void>}
41083915 */
41093916async function saveOpenAIPreset(name, settings, triggerUi = true) {
41103917 const presetBody = {};
4111- chat_completion_source: settings.chat_completion_source,
3918+ for (const [presetKey, [, settingsKey]] of Object.entries(settingsToUpdate)) {
4112- openai_model: settings.openai_model,
3919+ presetBody[presetKey] = settings[settingsKey];
4113- claude_model: settings.claude_model,
3920+ }
4114- openrouter_model: settings.openrouter_model,
4115- openrouter_use_fallback: settings.openrouter_use_fallback,
4116- openrouter_group_models: settings.openrouter_group_models,
4117- openrouter_sort_models: settings.openrouter_sort_models,
4118- openrouter_providers: settings.openrouter_providers,
4119- openrouter_allow_fallbacks: settings.openrouter_allow_fallbacks,
4120- openrouter_middleout: settings.openrouter_middleout,
4121- ai21_model: settings.ai21_model,
4122- mistralai_model: settings.mistralai_model,
4123- cohere_model: settings.cohere_model,
4124- perplexity_model: settings.perplexity_model,
4125- groq_model: settings.groq_model,
4126- siliconflow_model: settings.siliconflow_model,
4127- xai_model: settings.xai_model,
4128- pollinations_model: settings.pollinations_model,
4129- aimlapi_model: settings.aimlapi_model,
4130- electronhub_model: settings.electronhub_model,
4131- electronhub_sort_models: settings.electronhub_sort_models,
4132- electronhub_group_models: settings.electronhub_group_models,
4133- moonshot_model: settings.moonshot_model,
4134- fireworks_model: settings.fireworks_model,
4135- cometapi_model: settings.cometapi_model,
4136- zai_model: settings.zai_model,
4137- zai_endpoint: settings.zai_endpoint,
4138- custom_model: settings.custom_model,
4139- custom_url: settings.custom_url,
4140- custom_include_body: settings.custom_include_body,
4141- custom_exclude_body: settings.custom_exclude_body,
4142- custom_include_headers: settings.custom_include_headers,
4143- custom_prompt_post_processing: settings.custom_prompt_post_processing,
4144- google_model: settings.google_model,
4145- vertexai_model: settings.vertexai_model,
4146- nanogpt_model: settings.nanogpt_model,
4147- deepseek_model: settings.deepseek_model,
4148- azure_base_url: settings.azure_base_url,
4149- azure_deployment_name: settings.azure_deployment_name,
4150- azure_api_version: settings.azure_api_version,
4151- azure_openai_model: settings.azure_openai_model,
4152- temperature: settings.temp_openai,
4153- frequency_penalty: settings.freq_pen_openai,
4154- presence_penalty: settings.pres_pen_openai,
4155- top_p: settings.top_p_openai,
4156- top_k: settings.top_k_openai,
4157- top_a: settings.top_a_openai,
4158- min_p: settings.min_p_openai,
4159- repetition_penalty: settings.repetition_penalty_openai,
4160- openai_max_context: settings.openai_max_context,
4161- openai_max_tokens: settings.openai_max_tokens,
4162- wrap_in_quotes: settings.wrap_in_quotes,
4163- names_behavior: settings.names_behavior,
4164- send_if_empty: settings.send_if_empty,
4165- jailbreak_prompt: settings.jailbreak_prompt,
4166- impersonation_prompt: settings.impersonation_prompt,
4167- new_chat_prompt: settings.new_chat_prompt,
4168- new_group_chat_prompt: settings.new_group_chat_prompt,
4169- new_example_chat_prompt: settings.new_example_chat_prompt,
4170- continue_nudge_prompt: settings.continue_nudge_prompt,
4171- bias_preset_selected: settings.bias_preset_selected,
4172- reverse_proxy: settings.reverse_proxy,
4173- proxy_password: settings.proxy_password,
4174- max_context_unlocked: settings.max_context_unlocked,
4175- wi_format: settings.wi_format,
4176- scenario_format: settings.scenario_format,
4177- personality_format: settings.personality_format,
4178- group_nudge_prompt: settings.group_nudge_prompt,
4179- stream_openai: settings.stream_openai,
4180- prompts: settings.prompts,
4181- prompt_order: settings.prompt_order,
4182- show_external_models: settings.show_external_models,
4183- assistant_prefill: settings.assistant_prefill,
4184- assistant_impersonation: settings.assistant_impersonation,
4185- claude_use_sysprompt: settings.claude_use_sysprompt,
4186- use_makersuite_sysprompt: settings.use_makersuite_sysprompt,
4187- vertexai_auth_mode: settings.vertexai_auth_mode,
4188- vertexai_region: settings.vertexai_region,
4189- vertexai_express_project_id: settings.vertexai_express_project_id,
4190- squash_system_messages: settings.squash_system_messages,
4191- image_inlining: settings.image_inlining,
4192- inline_image_quality: settings.inline_image_quality,
4193- video_inlining: settings.video_inlining,
4194- audio_inlining: settings.audio_inlining,
4195- bypass_status_check: settings.bypass_status_check,
4196- continue_prefill: settings.continue_prefill,
4197- continue_postfix: settings.continue_postfix,
4198- function_calling: settings.function_calling,
4199- show_thoughts: settings.show_thoughts,
4200- reasoning_effort: settings.reasoning_effort,
4201- enable_web_search: settings.enable_web_search,
4202- request_images: settings.request_images,
4203- seed: settings.seed,
4204- n: settings.n,
4205- extensions: settings.extensions,
4206- };
42073921
42083922 const savePresetSettings = await fetch('/api/presets/save', {
42093923 method: 'POST',
@@ -6171,7 +5885,7 @@ function updateFeatureSupportFlags() {
61715885 for (const [key, value] of Object.entries(featureFlags)) {
61725886 const element = document.getElementById(key);
61735887 if (element) {
61745888 element.dataset.ccToggle = String(value ?? false);
61755889 }
61765890 }
61775891}