Expose "Allow fallback providers" for OpenRouter

5f2a73ac9fce25752d5dbec3b237cc96a7fdf5e6

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

6 files changed, +33 -16Ignore whitespace
public/index.html+15 -14
@@ -2091,6 +2091,10 @@
2091 <h4 data-i18n="Model Providers">Model Providers</h4>2091 <h4 data-i18n="Model Providers">Model Providers</h4>
2092 <select id="openrouter_providers_text" class="openrouter_providers" multiple>2092 <select id="openrouter_providers_text" class="openrouter_providers" multiple>
2093 </select>2093 </select>
2094 <label class="checkbox_label" for="openrouter_allow_fallbacks_textgenerationwebui" title="Automatically chooses an alternative provider if chosen providers can't serve your request.">
2095 <input id="openrouter_allow_fallbacks_textgenerationwebui" type="checkbox" />
2096 <span data-i18n="Allow fallback providers">Allow fallback providers</span>
2097 </label>
2094 </div>2098 </div>
2095 </div>2099 </div>
2096 <div data-tg-type="infermaticai" class="flex-container flexFlowColumn">2100 <div data-tg-type="infermaticai" class="flex-container flexFlowColumn">
@@ -2668,11 +2672,10 @@
2668 <option data-i18n="-- Connect to the API --">-- Connect to the API --</option>2672 <option data-i18n="-- Connect to the API --">-- Connect to the API --</option>
2669 </select>2673 </select>
2670 </div>2674 </div>
2671 <div>2675 <label for="openrouter_use_fallback" class="checkbox_label marginTopBot5" data-i18n="[title]Allow fallback routes Description" title="Automatically chooses an alternative model if the chosen model can't serve your request.">
2672 <h4 data-i18n="Model Providers">Model Providers</h4>2676 <input id="openrouter_use_fallback" type="checkbox" />
2673 <select id="openrouter_providers_chat" class="openrouter_providers" multiple>2677 <span data-i18n="Allow fallback models">Allow fallback models</span>
2674 </select>2678 </label>
2675 </div>
2676 <div class="marginTopBot5">2679 <div class="marginTopBot5">
2677 <div class="inline-drawer wide100p">2680 <div class="inline-drawer wide100p">
2678 <div class="inline-drawer-toggle inline-drawer-header">2681 <div class="inline-drawer-toggle inline-drawer-header">
@@ -2703,16 +2706,14 @@
2703 </div>2706 </div>
2704 </div>2707 </div>
2705 </div>2708 </div>
2706 <div class="marginTopBot5">2709 <div>
2707 <label for="openrouter_use_fallback" class="checkbox_label">2710 <h4 data-i18n="Model Providers">Model Providers</h4>
2708 <input id="openrouter_use_fallback" type="checkbox" />2711 <select id="openrouter_providers_chat" class="openrouter_providers" multiple>
2709 <span data-i18n="Allow fallback routes">Allow fallback routes</span>2712 </select>
2713 <label class="checkbox_label marginTopBot5" for="openrouter_allow_fallbacks" title="Automatically chooses an alternative provider if chosen providers can't serve your request.">
2714 <input id="openrouter_allow_fallbacks" type="checkbox" />
2715 <span data-i18n="Allow fallback providers">Allow fallback providers</span>
2710 </label>2716 </label>
2711 <div class="toggle-description justifyLeft wide100p">
2712 <span data-i18n="Allow fallback routes Description">
2713 Automatically chooses an alternative model if the chosen model can't serve your request.
2714 </span>
2715 </div>
2716 </div>2717 </div>
2717 <div class="marginTopBot5">2718 <div class="marginTopBot5">
2718 <label for="openrouter_force_instruct" class="checkbox_label">2719 <label for="openrouter_force_instruct" class="checkbox_label">
public/scripts/openai.js+12 -0
@@ -278,6 +278,7 @@ const default_settings = {
278 openrouter_group_models: false,278 openrouter_group_models: false,
279 openrouter_sort_models: 'alphabetically',279 openrouter_sort_models: 'alphabetically',
280 openrouter_providers: [],280 openrouter_providers: [],
281 openrouter_allow_fallbacks: true,
281 jailbreak_system: false,282 jailbreak_system: false,
282 reverse_proxy: '',283 reverse_proxy: '',
283 chat_completion_source: chat_completion_sources.OPENAI,284 chat_completion_source: chat_completion_sources.OPENAI,
@@ -357,6 +358,7 @@ const oai_settings = {
357 openrouter_group_models: false,358 openrouter_group_models: false,
358 openrouter_sort_models: 'alphabetically',359 openrouter_sort_models: 'alphabetically',
359 openrouter_providers: [],360 openrouter_providers: [],
361 openrouter_allow_fallbacks: true,
360 jailbreak_system: false,362 jailbreak_system: false,
361 reverse_proxy: '',363 reverse_proxy: '',
362 chat_completion_source: chat_completion_sources.OPENAI,364 chat_completion_source: chat_completion_sources.OPENAI,
@@ -1881,6 +1883,7 @@ async function sendOpenAIRequest(type, messages, signal) {
1881 generate_data['top_a'] = Number(oai_settings.top_a_openai);1883 generate_data['top_a'] = Number(oai_settings.top_a_openai);
1882 generate_data['use_fallback'] = oai_settings.openrouter_use_fallback;1884 generate_data['use_fallback'] = oai_settings.openrouter_use_fallback;
1883 generate_data['provider'] = oai_settings.openrouter_providers;1885 generate_data['provider'] = oai_settings.openrouter_providers;
1886 generate_data['allow_fallbacks'] = oai_settings.openrouter_allow_fallbacks;
18841887
1885 if (isTextCompletion) {1888 if (isTextCompletion) {
1886 generate_data['stop'] = getStoppingStrings(isImpersonate, isContinue);1889 generate_data['stop'] = getStoppingStrings(isImpersonate, isContinue);
@@ -3001,6 +3004,7 @@ function loadOpenAISettings(data, settings) {
3001 oai_settings.openrouter_sort_models = settings.openrouter_sort_models ?? default_settings.openrouter_sort_models;3004 oai_settings.openrouter_sort_models = settings.openrouter_sort_models ?? default_settings.openrouter_sort_models;
3002 oai_settings.openrouter_use_fallback = settings.openrouter_use_fallback ?? default_settings.openrouter_use_fallback;3005 oai_settings.openrouter_use_fallback = settings.openrouter_use_fallback ?? default_settings.openrouter_use_fallback;
3003 oai_settings.openrouter_force_instruct = settings.openrouter_force_instruct ?? default_settings.openrouter_force_instruct;3006 oai_settings.openrouter_force_instruct = settings.openrouter_force_instruct ?? default_settings.openrouter_force_instruct;
3007 oai_settings.openrouter_allow_fallbacks = settings.openrouter_allow_fallbacks ?? default_settings.openrouter_allow_fallbacks;
3004 oai_settings.ai21_model = settings.ai21_model ?? default_settings.ai21_model;3008 oai_settings.ai21_model = settings.ai21_model ?? default_settings.ai21_model;
3005 oai_settings.mistralai_model = settings.mistralai_model ?? default_settings.mistralai_model;3009 oai_settings.mistralai_model = settings.mistralai_model ?? default_settings.mistralai_model;
3006 oai_settings.cohere_model = settings.cohere_model ?? default_settings.cohere_model;3010 oai_settings.cohere_model = settings.cohere_model ?? default_settings.cohere_model;
@@ -3105,6 +3109,7 @@ function loadOpenAISettings(data, settings) {
3105 $('#openrouter_use_fallback').prop('checked', oai_settings.openrouter_use_fallback);3109 $('#openrouter_use_fallback').prop('checked', oai_settings.openrouter_use_fallback);
3106 $('#openrouter_force_instruct').prop('checked', oai_settings.openrouter_force_instruct);3110 $('#openrouter_force_instruct').prop('checked', oai_settings.openrouter_force_instruct);
3107 $('#openrouter_group_models').prop('checked', oai_settings.openrouter_group_models);3111 $('#openrouter_group_models').prop('checked', oai_settings.openrouter_group_models);
3112 $('#openrouter_allow_fallbacks').prop('checked', oai_settings.openrouter_allow_fallbacks);
3108 $('#openrouter_providers_chat').val(oai_settings.openrouter_providers).trigger('change');3113 $('#openrouter_providers_chat').val(oai_settings.openrouter_providers).trigger('change');
3109 $('#squash_system_messages').prop('checked', oai_settings.squash_system_messages);3114 $('#squash_system_messages').prop('checked', oai_settings.squash_system_messages);
3110 $('#continue_prefill').prop('checked', oai_settings.continue_prefill);3115 $('#continue_prefill').prop('checked', oai_settings.continue_prefill);
@@ -3334,6 +3339,7 @@ async function saveOpenAIPreset(name, settings, triggerUi = true) {
3334 openrouter_group_models: settings.openrouter_group_models,3339 openrouter_group_models: settings.openrouter_group_models,
3335 openrouter_sort_models: settings.openrouter_sort_models,3340 openrouter_sort_models: settings.openrouter_sort_models,
3336 openrouter_providers: settings.openrouter_providers,3341 openrouter_providers: settings.openrouter_providers,
3342 openrouter_allow_fallbacks: settings.openrouter_allow_fallbacks,
3337 ai21_model: settings.ai21_model,3343 ai21_model: settings.ai21_model,
3338 mistralai_model: settings.mistralai_model,3344 mistralai_model: settings.mistralai_model,
3339 cohere_model: settings.cohere_model,3345 cohere_model: settings.cohere_model,
@@ -3770,6 +3776,7 @@ function onSettingsPresetChange() {
3770 openrouter_group_models: ['#openrouter_group_models', 'openrouter_group_models', false],3776 openrouter_group_models: ['#openrouter_group_models', 'openrouter_group_models', false],
3771 openrouter_sort_models: ['#openrouter_sort_models', 'openrouter_sort_models', false],3777 openrouter_sort_models: ['#openrouter_sort_models', 'openrouter_sort_models', false],
3772 openrouter_providers: ['#openrouter_providers_chat', 'openrouter_providers', false],3778 openrouter_providers: ['#openrouter_providers_chat', 'openrouter_providers', false],
3779 openrouter_allow_fallbacks: ['#openrouter_allow_fallbacks', 'openrouter_allow_fallbacks', true],
3773 ai21_model: ['#model_ai21_select', 'ai21_model', false],3780 ai21_model: ['#model_ai21_select', 'ai21_model', false],
3774 mistralai_model: ['#model_mistralai_select', 'mistralai_model', false],3781 mistralai_model: ['#model_mistralai_select', 'mistralai_model', false],
3775 cohere_model: ['#model_cohere_select', 'cohere_model', false],3782 cohere_model: ['#model_cohere_select', 'cohere_model', false],
@@ -5102,6 +5109,11 @@ $(document).ready(async function () {
5102 saveSettingsDebounced();5109 saveSettingsDebounced();
5103 });5110 });
51045111
5112 $('#openrouter_allow_fallbacks').on('input', function () {
5113 oai_settings.openrouter_allow_fallbacks = !!$(this).prop('checked');
5114 saveSettingsDebounced();
5115 });
5116
5105 $('#squash_system_messages').on('input', function () {5117 $('#squash_system_messages').on('input', function () {
5106 oai_settings.squash_system_messages = !!$(this).prop('checked');5118 oai_settings.squash_system_messages = !!$(this).prop('checked');
5107 saveSettingsDebounced();5119 saveSettingsDebounced();
public/scripts/preset-manager.js+1 -0
@@ -332,6 +332,7 @@ class PresetManager {
332 'featherless_model',332 'featherless_model',
333 'max_tokens_second',333 'max_tokens_second',
334 'openrouter_providers',334 'openrouter_providers',
335 'openrouter_allow_fallbacks',
335 ];336 ];
336 const settings = Object.assign({}, getSettingsByApiId(this.apiId));337 const settings = Object.assign({}, getSettingsByApiId(this.apiId));
337338
public/scripts/textgen-settings.js+3 -0
@@ -187,6 +187,7 @@ const settings = {
187 server_urls: {},187 server_urls: {},
188 custom_model: '',188 custom_model: '',
189 bypass_status_check: false,189 bypass_status_check: false,
190 openrouter_allow_fallbacks: true,
190};191};
191192
192export let textgenerationwebui_banned_in_macros = [];193export let textgenerationwebui_banned_in_macros = [];
@@ -261,6 +262,7 @@ export const setting_names = [
261 'logit_bias',262 'logit_bias',
262 'custom_model',263 'custom_model',
263 'bypass_status_check',264 'bypass_status_check',
265 'openrouter_allow_fallbacks',
264];266];
265267
266const DYNATEMP_BLOCK = document.getElementById('dynatemp_block_ooba');268const DYNATEMP_BLOCK = document.getElementById('dynatemp_block_ooba');
@@ -1172,6 +1174,7 @@ export function getTextGenGenerationData(finalPrompt, maxTokens, isImpersonate,
11721174
1173 if (settings.type === OPENROUTER) {1175 if (settings.type === OPENROUTER) {
1174 params.provider = settings.openrouter_providers;1176 params.provider = settings.openrouter_providers;
1177 params.allow_fallbacks = settings.openrouter_allow_fallbacks;
1175 }1178 }
11761179
1177 if (settings.type === KOBOLDCPP) {1180 if (settings.type === KOBOLDCPP) {
src/endpoints/backends/chat-completions.js+1 -1
@@ -879,7 +879,7 @@ router.post('/generate', jsonParser, function (request, response) {
879879
880 if (Array.isArray(request.body.provider) && request.body.provider.length > 0) {880 if (Array.isArray(request.body.provider) && request.body.provider.length > 0) {
881 bodyParams['provider'] = {881 bodyParams['provider'] = {
882 allow_fallbacks: true,882 allow_fallbacks: request.body.allow_fallbacks ?? true,
883 order: request.body.provider ?? [],883 order: request.body.provider ?? [],
884 };884 };
885 }885 }
src/endpoints/backends/text-completions.js+1 -1
@@ -309,7 +309,7 @@ router.post('/generate', jsonParser, async function (request, response) {
309 if (request.body.api_type === TEXTGEN_TYPES.OPENROUTER) {309 if (request.body.api_type === TEXTGEN_TYPES.OPENROUTER) {
310 if (Array.isArray(request.body.provider) && request.body.provider.length > 0) {310 if (Array.isArray(request.body.provider) && request.body.provider.length > 0) {
311 request.body.provider = {311 request.body.provider = {
312 allow_fallbacks: true,312 allow_fallbacks: request.body.allow_fallbacks ?? true,
313 order: request.body.provider,313 order: request.body.provider,
314 };314 };
315 } else {315 } else {