Initialize page on load

151a77cd366844b1ea36ba30d94079cf038e6c4c

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

2 files changed, +22 -30Showing whitespace changes
public/scripts/textgen-models.js+21 -30
@@ -266,8 +266,8 @@ export async function loadAphroditeModels(data) {
266 }266 }
267}267}
268268
269let selectedModelId = null;269// Page -1 will be initialized from a selected model.
270let currentPage = 1;270let currentPage = -1;
271export async function loadFeatherlessModels(data) {271export async function loadFeatherlessModels(data) {
272 const searchBar = document.getElementById('model_search_bar');272 const searchBar = document.getElementById('model_search_bar');
273 const modelCardBlock = document.getElementById('model_card_block');273 const modelCardBlock = document.getElementById('model_card_block');
@@ -297,6 +297,8 @@ export async function loadFeatherlessModels(data) {
297 const perPage = Number(localStorage.getItem(storageKey)) || 10;297 const perPage = Number(localStorage.getItem(storageKey)) || 10;
298298
299 // Initialize pagination with the full set of models299 // Initialize pagination with the full set of models
300 const selectedModelPage = (data.findIndex(x => x.id === textgen_settings.featherless_model) / perPage) + 1;
301 currentPage = currentPage === -1 && selectedModelPage > 0 ? selectedModelPage : 1;
300 setupPagination(originalModels, perPage);302 setupPagination(originalModels, perPage);
301303
302 // Function to set up pagination (also used for filtered results)304 // Function to set up pagination (also used for filtered results)
@@ -354,7 +356,7 @@ export async function loadFeatherlessModels(data) {
354356
355 modelCardBlock.appendChild(card);357 modelCardBlock.appendChild(card);
356358
357 if (model.id === selectedModelId) {359 if (model.id === textgen_settings.featherless_model) {
358 card.classList.add('selected');360 card.classList.add('selected');
359 }361 }
360362
@@ -376,8 +378,6 @@ export async function loadFeatherlessModels(data) {
376 });378 });
377 }379 }
378380
379
380
381 // Add event listener for input on the search bar381 // Add event listener for input on the search bar
382 searchBar.addEventListener('input', function () {382 searchBar.addEventListener('input', function () {
383 applyFiltersAndSort();383 applyFiltersAndSort();
@@ -411,6 +411,12 @@ export async function loadFeatherlessModels(data) {
411411
412 // Function to apply sorting and filtering based on user input412 // Function to apply sorting and filtering based on user input
413 async function applyFiltersAndSort() {413 async function applyFiltersAndSort() {
414 if (!(searchBar instanceof HTMLInputElement) ||
415 !(sortOrderSelect instanceof HTMLSelectElement) ||
416 !(classSelect instanceof HTMLSelectElement) ||
417 !(categoriesSelect instanceof HTMLSelectElement)) {
418 return;
419 }
414 const searchQuery = searchBar.value.toLowerCase();420 const searchQuery = searchBar.value.toLowerCase();
415 const selectedSortOrder = sortOrderSelect.value;421 const selectedSortOrder = sortOrderSelect.value;
416 const selectedClass = classSelect.value;422 const selectedClass = classSelect.value;
@@ -460,7 +466,15 @@ export async function loadFeatherlessModels(data) {
460 setupPagination(filteredModels, Number(localStorage.getItem(storageKey)) || perPage, currentPage);466 setupPagination(filteredModels, Number(localStorage.getItem(storageKey)) || perPage, currentPage);
461 }467 }
462468
463469 // Required to keep the /model command function
470 $('#featherless_model').empty();
471 for (const model of data) {
472 const option = document.createElement('option');
473 option.value = model.id;
474 option.text = model.id;
475 option.selected = model.id === textgen_settings.featherless_model;
476 $('#featherless_model').append(option);
477 }
464}478}
465479
466async function fetchFeatherlessStats() {480async function fetchFeatherlessStats() {
@@ -476,10 +490,9 @@ async function fetchFeatherlessNew() {
476}490}
477491
478function onFeatherlessModelSelect(modelId) {492function onFeatherlessModelSelect(modelId) {
479
480 const model = featherlessModels.find(x => x.id === modelId);493 const model = featherlessModels.find(x => x.id === modelId);
481 selectedModelId = modelId;
482 textgen_settings.featherless_model = modelId;494 textgen_settings.featherless_model = modelId;
495 $('#featherless_model').val(modelId);
483 $('#api_button_textgenerationwebui').trigger('click');496 $('#api_button_textgenerationwebui').trigger('click');
484 setGenerationParamsFromPreset({ max_length: model.context_length });497 setGenerationParamsFromPreset({ max_length: model.context_length });
485}498}
@@ -679,20 +692,6 @@ function getAphroditeModelTemplate(option) {
679 `));692 `));
680}693}
681694
682function getFeatherlessModelTemplate(option) {
683 const model = featherlessModels.find(x => x.id === option?.element?.value);
684
685 if (!option.id || !model) {
686 return option.text;
687 }
688
689 return $((`
690 <div class="flex-container flexFlowColumn">
691 <div><strong>${DOMPurify.sanitize(model.name)}</strong> | <span>${model.context_length || '???'} tokens</span></div>
692 </div>
693 `));
694}
695
696async function downloadOllamaModel() {695async function downloadOllamaModel() {
697 try {696 try {
698 const serverUrl = textgen_settings.server_urls[textgen_types.OLLAMA];697 const serverUrl = textgen_settings.server_urls[textgen_types.OLLAMA];
@@ -880,7 +879,6 @@ export function initTextGenModels() {
880 $('#ollama_download_model').on('click', downloadOllamaModel);879 $('#ollama_download_model').on('click', downloadOllamaModel);
881 $('#vllm_model').on('change', onVllmModelSelect);880 $('#vllm_model').on('change', onVllmModelSelect);
882 $('#aphrodite_model').on('change', onAphroditeModelSelect);881 $('#aphrodite_model').on('change', onAphroditeModelSelect);
883 $('#featherless_model').on('change', onFeatherlessModelSelect);
884 $('#tabby_download_model').on('click', downloadTabbyModel);882 $('#tabby_download_model').on('click', downloadTabbyModel);
885 $('#tabby_model').on('change', onTabbyModelSelect);883 $('#tabby_model').on('change', onTabbyModelSelect);
886884
@@ -955,13 +953,6 @@ export function initTextGenModels() {
955 width: '100%',953 width: '100%',
956 templateResult: getAphroditeModelTemplate,954 templateResult: getAphroditeModelTemplate,
957 });955 });
958 $('#featherless_model').select2({
959 placeholder: 'Select a model',
960 searchInputPlaceholder: 'Search models...',
961 searchInputCssClass: 'text_pole',
962 width: '100%',
963 templateResult: getFeatherlessModelTemplate,
964 });
965 providersSelect.select2({956 providersSelect.select2({
966 sorter: data => data.sort((a, b) => a.text.localeCompare(b.text)),957 sorter: data => data.sort((a, b) => a.text.localeCompare(b.text)),
967 placeholder: 'Select providers. No selection = all providers.',958 placeholder: 'Select providers. No selection = all providers.',
public/scripts/textgen-settings.js+1 -0
@@ -186,6 +186,7 @@ const settings = {
186 openrouter_allow_fallbacks: true,186 openrouter_allow_fallbacks: true,
187 xtc_threshold: 0.1,187 xtc_threshold: 0.1,
188 xtc_probability: 0,188 xtc_probability: 0,
189 featherless_model: '',
189};190};
190191
191export let textgenerationwebui_banned_in_macros = [];192export let textgenerationwebui_banned_in_macros = [];