"Bind preset to connection" toggle (#3999) * Implement THE TOGGLE * Don't force reconnect on preset switch if toggle off * Don't clear custom models list either

864a733663cc7c827a303ba614d33a797a0c67ae

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

Signed
4 files changed, +160 -84Showing whitespace changes
public/css/toggle-dependent.css+12 -0
@@ -498,3 +498,15 @@ label[for="trim_spaces"]:not(:has(input:checked)) small {
498#banned_tokens_block_ooba:not(:has(#send_banned_tokens_textgenerationwebui:checked)) #banned_tokens_controls_ooba {498#banned_tokens_block_ooba:not(:has(#send_banned_tokens_textgenerationwebui:checked)) #banned_tokens_controls_ooba {
499 filter: brightness(0.5);499 filter: brightness(0.5);
500}500}
501
502#bind_preset_to_connection:checked ~ .toggleOff {
503 display: none;
504}
505
506#bind_preset_to_connection:not(:checked) ~ .toggleOn {
507 display: none;
508}
509
510label[for="bind_preset_to_connection"]:has(input:checked) {
511 color: var(--active);
512}
public/index.html+5 -0
@@ -176,6 +176,11 @@
176 </strong>176 </strong>
177177
178 <div class="flex-container gap3px">178 <div class="flex-container gap3px">
179 <label for="bind_preset_to_connection" class="margin0 menu_button menu_button_icon" title="Bind presets to API connections" data-i18n="[title]Bind presets to API connections">
180 <input id="bind_preset_to_connection" type="checkbox" class="displayNone" />
181 <i class="fa-fw fa-solid fa-link toggleOn"></i>
182 <i class="fa-fw fa-solid fa-link-slash toggleOff"></i>
183 </label>
179 <div id="import_oai_preset" class="margin0 menu_button menu_button_icon" title="Import preset" data-i18n="[title]Import preset">184 <div id="import_oai_preset" class="margin0 menu_button menu_button_icon" title="Import preset" data-i18n="[title]Import preset">
180 <i class="fa-fw fa-solid fa-file-import"></i>185 <i class="fa-fw fa-solid fa-file-import"></i>
181 </div>186 </div>
public/scripts/openai.js+116 -84
@@ -71,7 +71,7 @@ import { SlashCommand } from './slash-commands/SlashCommand.js';
71import { ARGUMENT_TYPE, SlashCommandArgument } from './slash-commands/SlashCommandArgument.js';71import { ARGUMENT_TYPE, SlashCommandArgument } from './slash-commands/SlashCommandArgument.js';
72import { renderTemplateAsync } from './templates.js';72import { renderTemplateAsync } from './templates.js';
73import { SlashCommandEnumValue } from './slash-commands/SlashCommandEnumValue.js';73import { SlashCommandEnumValue } from './slash-commands/SlashCommandEnumValue.js';
74import { Popup, POPUP_RESULT } from './popup.js';74import { Popup, POPUP_RESULT, POPUP_TYPE } from './popup.js';
75import { t } from './i18n.js';75import { t } from './i18n.js';
76import { ToolManager } from './tool-calling.js';76import { ToolManager } from './tool-calling.js';
77import { accountStorage } from './util/AccountStorage.js';77import { accountStorage } from './util/AccountStorage.js';
@@ -236,87 +236,87 @@ const sensitiveFields = [
236];236];
237237
238/**238/**
239 * preset_name -> [selector, setting_name, is_checkbox]239 * preset_name -> [selector, setting_name, is_checkbox, is_connection]
240 * @type {Record<string, [string, string, boolean]>}240 * @type {Record<string, [string, string, boolean, boolean]>}
241 */241 */
242export const settingsToUpdate = {242export const settingsToUpdate = {
243 chat_completion_source: ['#chat_completion_source', 'chat_completion_source', false],243 chat_completion_source: ['#chat_completion_source', 'chat_completion_source', false, true],
244 temperature: ['#temp_openai', 'temp_openai', false],244 temperature: ['#temp_openai', 'temp_openai', false, false],
245 frequency_penalty: ['#freq_pen_openai', 'freq_pen_openai', false],245 frequency_penalty: ['#freq_pen_openai', 'freq_pen_openai', false, false],
246 presence_penalty: ['#pres_pen_openai', 'pres_pen_openai', false],246 presence_penalty: ['#pres_pen_openai', 'pres_pen_openai', false, false],
247 top_p: ['#top_p_openai', 'top_p_openai', false],247 top_p: ['#top_p_openai', 'top_p_openai', false, false],
248 top_k: ['#top_k_openai', 'top_k_openai', false],248 top_k: ['#top_k_openai', 'top_k_openai', false, false],
249 top_a: ['#top_a_openai', 'top_a_openai', false],249 top_a: ['#top_a_openai', 'top_a_openai', false, false],
250 min_p: ['#min_p_openai', 'min_p_openai', false],250 min_p: ['#min_p_openai', 'min_p_openai', false, false],
251 repetition_penalty: ['#repetition_penalty_openai', 'repetition_penalty_openai', false],251 repetition_penalty: ['#repetition_penalty_openai', 'repetition_penalty_openai', false, false],
252 max_context_unlocked: ['#oai_max_context_unlocked', 'max_context_unlocked', true],252 max_context_unlocked: ['#oai_max_context_unlocked', 'max_context_unlocked', true, false],
253 openai_model: ['#model_openai_select', 'openai_model', false],253 openai_model: ['#model_openai_select', 'openai_model', false, true],
254 claude_model: ['#model_claude_select', 'claude_model', false],254 claude_model: ['#model_claude_select', 'claude_model', false, true],
255 windowai_model: ['#model_windowai_select', 'windowai_model', false],255 windowai_model: ['#model_windowai_select', 'windowai_model', false, true],
256 openrouter_model: ['#model_openrouter_select', 'openrouter_model', false],256 openrouter_model: ['#model_openrouter_select', 'openrouter_model', false, true],
257 openrouter_use_fallback: ['#openrouter_use_fallback', 'openrouter_use_fallback', true],257 openrouter_use_fallback: ['#openrouter_use_fallback', 'openrouter_use_fallback', true, true],
258 openrouter_group_models: ['#openrouter_group_models', 'openrouter_group_models', false],258 openrouter_group_models: ['#openrouter_group_models', 'openrouter_group_models', false, true],
259 openrouter_sort_models: ['#openrouter_sort_models', 'openrouter_sort_models', false],259 openrouter_sort_models: ['#openrouter_sort_models', 'openrouter_sort_models', false, true],
260 openrouter_providers: ['#openrouter_providers_chat', 'openrouter_providers', false],260 openrouter_providers: ['#openrouter_providers_chat', 'openrouter_providers', false, true],
261 openrouter_allow_fallbacks: ['#openrouter_allow_fallbacks', 'openrouter_allow_fallbacks', true],261 openrouter_allow_fallbacks: ['#openrouter_allow_fallbacks', 'openrouter_allow_fallbacks', true, true],
262 openrouter_middleout: ['#openrouter_middleout', 'openrouter_middleout', false],262 openrouter_middleout: ['#openrouter_middleout', 'openrouter_middleout', false, true],
263 ai21_model: ['#model_ai21_select', 'ai21_model', false],263 ai21_model: ['#model_ai21_select', 'ai21_model', false, true],
264 mistralai_model: ['#model_mistralai_select', 'mistralai_model', false],264 mistralai_model: ['#model_mistralai_select', 'mistralai_model', false, true],
265 cohere_model: ['#model_cohere_select', 'cohere_model', false],265 cohere_model: ['#model_cohere_select', 'cohere_model', false, true],
266 perplexity_model: ['#model_perplexity_select', 'perplexity_model', false],266 perplexity_model: ['#model_perplexity_select', 'perplexity_model', false, true],
267 groq_model: ['#model_groq_select', 'groq_model', false],267 groq_model: ['#model_groq_select', 'groq_model', false, true],
268 nanogpt_model: ['#model_nanogpt_select', 'nanogpt_model', false],268 nanogpt_model: ['#model_nanogpt_select', 'nanogpt_model', false, true],
269 deepseek_model: ['#model_deepseek_select', 'deepseek_model', false],269 deepseek_model: ['#model_deepseek_select', 'deepseek_model', false, true],
270 zerooneai_model: ['#model_01ai_select', 'zerooneai_model', false],270 zerooneai_model: ['#model_01ai_select', 'zerooneai_model', false, true],
271 xai_model: ['#model_xai_select', 'xai_model', false],271 xai_model: ['#model_xai_select', 'xai_model', false, true],
272 pollinations_model: ['#model_pollinations_select', 'pollinations_model', false],272 pollinations_model: ['#model_pollinations_select', 'pollinations_model', false, true],
273 custom_model: ['#custom_model_id', 'custom_model', false],273 custom_model: ['#custom_model_id', 'custom_model', false, true],
274 custom_url: ['#custom_api_url_text', 'custom_url', false],274 custom_url: ['#custom_api_url_text', 'custom_url', false, true],
275 custom_include_body: ['#custom_include_body', 'custom_include_body', false],275 custom_include_body: ['#custom_include_body', 'custom_include_body', false, true],
276 custom_exclude_body: ['#custom_exclude_body', 'custom_exclude_body', false],276 custom_exclude_body: ['#custom_exclude_body', 'custom_exclude_body', false, true],
277 custom_include_headers: ['#custom_include_headers', 'custom_include_headers', false],277 custom_include_headers: ['#custom_include_headers', 'custom_include_headers', false, true],
278 custom_prompt_post_processing: ['#custom_prompt_post_processing', 'custom_prompt_post_processing', false],278 custom_prompt_post_processing: ['#custom_prompt_post_processing', 'custom_prompt_post_processing', false, true],
279 google_model: ['#model_google_select', 'google_model', false],279 google_model: ['#model_google_select', 'google_model', false, true],
280 openai_max_context: ['#openai_max_context', 'openai_max_context', false],280 openai_max_context: ['#openai_max_context', 'openai_max_context', false, false],
281 openai_max_tokens: ['#openai_max_tokens', 'openai_max_tokens', false],281 openai_max_tokens: ['#openai_max_tokens', 'openai_max_tokens', false, false],
282 wrap_in_quotes: ['#wrap_in_quotes', 'wrap_in_quotes', true],282 wrap_in_quotes: ['#wrap_in_quotes', 'wrap_in_quotes', true, false],
283 names_behavior: ['#names_behavior', 'names_behavior', false],283 names_behavior: ['#names_behavior', 'names_behavior', false, false],
284 send_if_empty: ['#send_if_empty_textarea', 'send_if_empty', false],284 send_if_empty: ['#send_if_empty_textarea', 'send_if_empty', false, false],
285 impersonation_prompt: ['#impersonation_prompt_textarea', 'impersonation_prompt', false],285 impersonation_prompt: ['#impersonation_prompt_textarea', 'impersonation_prompt', false, false],
286 new_chat_prompt: ['#newchat_prompt_textarea', 'new_chat_prompt', false],286 new_chat_prompt: ['#newchat_prompt_textarea', 'new_chat_prompt', false, false],
287 new_group_chat_prompt: ['#newgroupchat_prompt_textarea', 'new_group_chat_prompt', false],287 new_group_chat_prompt: ['#newgroupchat_prompt_textarea', 'new_group_chat_prompt', false, false],
288 new_example_chat_prompt: ['#newexamplechat_prompt_textarea', 'new_example_chat_prompt', false],288 new_example_chat_prompt: ['#newexamplechat_prompt_textarea', 'new_example_chat_prompt', false, false],
289 continue_nudge_prompt: ['#continue_nudge_prompt_textarea', 'continue_nudge_prompt', false],289 continue_nudge_prompt: ['#continue_nudge_prompt_textarea', 'continue_nudge_prompt', false, false],
290 bias_preset_selected: ['#openai_logit_bias_preset', 'bias_preset_selected', false],290 bias_preset_selected: ['#openai_logit_bias_preset', 'bias_preset_selected', false, false],
291 reverse_proxy: ['#openai_reverse_proxy', 'reverse_proxy', false],291 reverse_proxy: ['#openai_reverse_proxy', 'reverse_proxy', false, true],
292 wi_format: ['#wi_format_textarea', 'wi_format', false],292 wi_format: ['#wi_format_textarea', 'wi_format', false, false],
293 scenario_format: ['#scenario_format_textarea', 'scenario_format', false],293 scenario_format: ['#scenario_format_textarea', 'scenario_format', false, false],
294 personality_format: ['#personality_format_textarea', 'personality_format', false],294 personality_format: ['#personality_format_textarea', 'personality_format', false, false],
295 group_nudge_prompt: ['#group_nudge_prompt_textarea', 'group_nudge_prompt', false],295 group_nudge_prompt: ['#group_nudge_prompt_textarea', 'group_nudge_prompt', false, false],
296 stream_openai: ['#stream_toggle', 'stream_openai', true],296 stream_openai: ['#stream_toggle', 'stream_openai', true, false],
297 prompts: ['', 'prompts', false],297 prompts: ['', 'prompts', false, false],
298 prompt_order: ['', 'prompt_order', false],298 prompt_order: ['', 'prompt_order', false, false],
299 api_url_scale: ['#api_url_scale', 'api_url_scale', false],299 api_url_scale: ['#api_url_scale', 'api_url_scale', false, true],
300 show_external_models: ['#openai_show_external_models', 'show_external_models', true],300 show_external_models: ['#openai_show_external_models', 'show_external_models', true, true],
301 proxy_password: ['#openai_proxy_password', 'proxy_password', false],301 proxy_password: ['#openai_proxy_password', 'proxy_password', false, true],
302 assistant_prefill: ['#claude_assistant_prefill', 'assistant_prefill', false],302 assistant_prefill: ['#claude_assistant_prefill', 'assistant_prefill', false, false],
303 assistant_impersonation: ['#claude_assistant_impersonation', 'assistant_impersonation', false],303 assistant_impersonation: ['#claude_assistant_impersonation', 'assistant_impersonation', false, false],
304 claude_use_sysprompt: ['#claude_use_sysprompt', 'claude_use_sysprompt', true],304 claude_use_sysprompt: ['#claude_use_sysprompt', 'claude_use_sysprompt', true, false],
305 use_makersuite_sysprompt: ['#use_makersuite_sysprompt', 'use_makersuite_sysprompt', true],305 use_makersuite_sysprompt: ['#use_makersuite_sysprompt', 'use_makersuite_sysprompt', true, false],
306 use_alt_scale: ['#use_alt_scale', 'use_alt_scale', true],306 use_alt_scale: ['#use_alt_scale', 'use_alt_scale', true, true],
307 squash_system_messages: ['#squash_system_messages', 'squash_system_messages', true],307 squash_system_messages: ['#squash_system_messages', 'squash_system_messages', true, false],
308 image_inlining: ['#openai_image_inlining', 'image_inlining', true],308 image_inlining: ['#openai_image_inlining', 'image_inlining', true, false],
309 inline_image_quality: ['#openai_inline_image_quality', 'inline_image_quality', false],309 inline_image_quality: ['#openai_inline_image_quality', 'inline_image_quality', false, false],
310 continue_prefill: ['#continue_prefill', 'continue_prefill', true],310 continue_prefill: ['#continue_prefill', 'continue_prefill', true, false],
311 continue_postfix: ['#continue_postfix', 'continue_postfix', false],311 continue_postfix: ['#continue_postfix', 'continue_postfix', false, false],
312 function_calling: ['#openai_function_calling', 'function_calling', true],312 function_calling: ['#openai_function_calling', 'function_calling', true, false],
313 show_thoughts: ['#openai_show_thoughts', 'show_thoughts', true],313 show_thoughts: ['#openai_show_thoughts', 'show_thoughts', true, false],
314 reasoning_effort: ['#openai_reasoning_effort', 'reasoning_effort', false],314 reasoning_effort: ['#openai_reasoning_effort', 'reasoning_effort', false, false],
315 enable_web_search: ['#openai_enable_web_search', 'enable_web_search', true],315 enable_web_search: ['#openai_enable_web_search', 'enable_web_search', true, false],
316 seed: ['#seed_openai', 'seed', false],316 seed: ['#seed_openai', 'seed', false, false],
317 n: ['#n_openai', 'n', false],317 n: ['#n_openai', 'n', false, false],
318 bypass_status_check: ['#openai_bypass_status_check', 'bypass_status_check', true],318 bypass_status_check: ['#openai_bypass_status_check', 'bypass_status_check', true, true],
319 request_images: ['#openai_request_images', 'request_images', true],319 request_images: ['#openai_request_images', 'request_images', true, false],
320};320};
321321
322const default_settings = {322const default_settings = {
@@ -399,6 +399,7 @@ const default_settings = {
399 request_images: false,399 request_images: false,
400 seed: -1,400 seed: -1,
401 n: 1,401 n: 1,
402 bind_preset_to_connection: true,
402};403};
403404
404const oai_settings = {405const oai_settings = {
@@ -481,6 +482,7 @@ const oai_settings = {
481 request_images: false,482 request_images: false,
482 seed: -1,483 seed: -1,
483 n: 1,484 n: 1,
485 bind_preset_to_connection: true,
484};486};
485487
486export let proxies = [488export let proxies = [
@@ -3395,6 +3397,7 @@ function loadOpenAISettings(data, settings) {
3395 oai_settings.continue_postfix = settings.continue_postfix ?? default_settings.continue_postfix;3397 oai_settings.continue_postfix = settings.continue_postfix ?? default_settings.continue_postfix;
3396 oai_settings.function_calling = settings.function_calling ?? default_settings.function_calling;3398 oai_settings.function_calling = settings.function_calling ?? default_settings.function_calling;
3397 oai_settings.openrouter_providers = settings.openrouter_providers ?? default_settings.openrouter_providers;3399 oai_settings.openrouter_providers = settings.openrouter_providers ?? default_settings.openrouter_providers;
3400 oai_settings.bind_preset_to_connection = settings.bind_preset_to_connection ?? default_settings.bind_preset_to_connection;
33983401
3399 // Migrate from old settings3402 // Migrate from old settings
3400 if (settings.names_in_completion === true) {3403 if (settings.names_in_completion === true) {
@@ -3511,6 +3514,7 @@ function loadOpenAISettings(data, settings) {
3511 $('#openai_show_thoughts').prop('checked', oai_settings.show_thoughts);3514 $('#openai_show_thoughts').prop('checked', oai_settings.show_thoughts);
3512 $('#openai_enable_web_search').prop('checked', oai_settings.enable_web_search);3515 $('#openai_enable_web_search').prop('checked', oai_settings.enable_web_search);
3513 $('#openai_request_images').prop('checked', oai_settings.request_images);3516 $('#openai_request_images').prop('checked', oai_settings.request_images);
3517 $('#bind_preset_to_connection').prop('checked', oai_settings.bind_preset_to_connection);
35143518
3515 $('#openai_reasoning_effort').val(oai_settings.reasoning_effort);3519 $('#openai_reasoning_effort').val(oai_settings.reasoning_effort);
3516 $(`#openai_reasoning_effort option[value="${oai_settings.reasoning_effort}"]`).prop('selected', true);3520 $(`#openai_reasoning_effort option[value="${oai_settings.reasoning_effort}"]`).prop('selected', true);
@@ -4039,7 +4043,7 @@ async function onExportPresetClick() {
4039 const preset = structuredClone(openai_settings[openai_setting_names[oai_settings.preset_settings_openai]]);4043 const preset = structuredClone(openai_settings[openai_setting_names[oai_settings.preset_settings_openai]]);
40404044
4041 const fieldValues = sensitiveFields.filter(field => preset[field]).map(field => `<b>${field}</b>: <code>${preset[field]}</code>`);4045 const fieldValues = sensitiveFields.filter(field => preset[field]).map(field => `<b>${field}</b>: <code>${preset[field]}</code>`);
4042 const shouldConfirm = fieldValues.length > 0;4046 if (fieldValues.length > 0) {
4043 const textHeader = t`Your preset contains proxy and/or custom endpoint settings.`;4047 const textHeader = t`Your preset contains proxy and/or custom endpoint settings.`;
4044 const textMessage = '<div>' + t`Do you want to remove these fields before exporting?` + `</div><br>${DOMPurify.sanitize(fieldValues.join('<br>'))}`;4048 const textMessage = '<div>' + t`Do you want to remove these fields before exporting?` + `</div><br>${DOMPurify.sanitize(fieldValues.join('<br>'))}`;
4045 const cancelButton = { text: 'Cancel', result: POPUP_RESULT.CANCELLED, appendAtEnd: true };4049 const cancelButton = { text: 'Cancel', result: POPUP_RESULT.CANCELLED, appendAtEnd: true };
@@ -4051,9 +4055,22 @@ async function onExportPresetClick() {
4051 return;4055 return;
4052 }4056 }
40534057
4054 if (!shouldConfirm || popupResult === POPUP_RESULT.AFFIRMATIVE) {4058 if (popupResult === POPUP_RESULT.AFFIRMATIVE) {
4055 sensitiveFields.forEach(field => delete preset[field]);4059 sensitiveFields.forEach(field => delete preset[field]);
4056 }4060 }
4061 }
4062
4063 const exportConnectionTemplate = $(await renderTemplateAsync('exportPreset'));
4064 await new Popup(exportConnectionTemplate, POPUP_TYPE.TEXT).show();
4065
4066 const removeConnectionData = exportConnectionTemplate.find('input[name="export_connection_data"]:checked').val() === 'false';
4067 if (removeConnectionData) {
4068 for (const [, [, settingName, , isConnection]] of Object.entries(settingsToUpdate)) {
4069 if (isConnection) {
4070 delete preset[settingName];
4071 }
4072 }
4073 }
40574074
4058 await eventSource.emit(event_types.OAI_PRESET_EXPORT_READY, preset);4075 await eventSource.emit(event_types.OAI_PRESET_EXPORT_READY, preset);
4059 const presetJsonString = JSON.stringify(preset, null, 4);4076 const presetJsonString = JSON.stringify(preset, null, 4);
@@ -4200,9 +4217,15 @@ function onSettingsPresetChange() {
4200 savePreset: saveOpenAIPreset,4217 savePreset: saveOpenAIPreset,
4201 presetNameBefore: presetNameBefore,4218 presetNameBefore: presetNameBefore,
4202 }).finally(r => {4219 }).finally(r => {
4220 if (oai_settings.bind_preset_to_connection) {
4203 $('.model_custom_select').empty();4221 $('.model_custom_select').empty();
4222 }
4223
4224 for (const [key, [selector, setting, isCheckbox, isConnection]] of Object.entries(settingsToUpdate)) {
4225 if (isConnection && !oai_settings.bind_preset_to_connection) {
4226 continue;
4227 }
42044228
4205 for (const [key, [selector, setting, isCheckbox]] of Object.entries(settingsToUpdate)) {
4206 if (preset[key] !== undefined) {4229 if (preset[key] !== undefined) {
4207 if (isCheckbox) {4230 if (isCheckbox) {
4208 updateCheckbox(selector, preset[key]);4231 updateCheckbox(selector, preset[key]);
@@ -4213,9 +4236,13 @@ function onSettingsPresetChange() {
4213 }4236 }
4214 }4237 }
42154238
4239 // These cannot be changed via preset if unbound to connection
4240 if (oai_settings.bind_preset_to_connection) {
4216 $('#chat_completion_source').trigger('change');4241 $('#chat_completion_source').trigger('change');
4217 $('#openai_logit_bias_preset').trigger('change');
4218 $('#openrouter_providers_chat').trigger('change');4242 $('#openrouter_providers_chat').trigger('change');
4243 }
4244
4245 $('#openai_logit_bias_preset').trigger('change');
42194246
4220 saveSettingsDebounced();4247 saveSettingsDebounced();
4221 eventSource.emit(event_types.OAI_PRESET_CHANGED_AFTER);4248 eventSource.emit(event_types.OAI_PRESET_CHANGED_AFTER);
@@ -5848,6 +5875,11 @@ export function initOpenAI() {
5848 saveSettingsDebounced();5875 saveSettingsDebounced();
5849 });5876 });
58505877
5878 $('#bind_preset_to_connection').on('input', function () {
5879 oai_settings.bind_preset_to_connection = !!$(this).prop('checked');
5880 saveSettingsDebounced();
5881 });
5882
5851 $('#api_button_openai').on('click', onConnectButtonClick);5883 $('#api_button_openai').on('click', onConnectButtonClick);
5852 $('#openai_reverse_proxy').on('input', onReverseProxyInput);5884 $('#openai_reverse_proxy').on('input', onReverseProxyInput);
5853 $('#model_openai_select').on('change', onModelChange);5885 $('#model_openai_select').on('change', onModelChange);
public/scripts/templates/exportPreset.html+27 -0
@@ -0,0 +1,27 @@
1<div class="flex-container flexFlowColumn marginBot10">
2 <h3 data-i18n="Do you want to export connection data with the preset?">
3 Do you want to export connection data with the preset?
4 </h3>
5
6 <div data-i18n="This includes the selected source, models, and other preferences set in the API Connections panel.">
7 This includes the selected source, models, and other preferences set in the API Connections panel.
8 </div>
9
10 <strong data-i18n="Your stored API keys are never exported.">
11 Your stored API keys are never exported.
12 </strong>
13</div>
14<div class="flex-container flexFlowColumn">
15 <label class="checkbox_label" for="export_connection_data_yes">
16 <input type="radio" id="export_connection_data_yes" name="export_connection_data" value="true">
17 <span data-i18n="Export connection data">
18 Export connection data
19 </span>
20 </label>
21 <label class="checkbox_label" for="export_connection_data_no">
22 <input type="radio" id="export_connection_data_no" name="export_connection_data" value="false" checked>
23 <span data-i18n="Do not export connection data">
24 Do not export connection data
25 </span>
26 </label>
27</div>