Initialize page on load
| @@ -266,8 +266,8 @@ export async function loadAphroditeModels(data) { | |||
| 266 | } | 266 | } |
| 267 | } | 267 | } |
| 268 | 268 | ||
| 269 | let selectedModelId = null; | 269 | // Page -1 will be initialized from a selected model. |
| 270 | let currentPage = 1; | 270 | let currentPage = -1; |
| 271 | export async function loadFeatherlessModels(data) { | 271 | export 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; |
| 298 | 298 | ||
| 299 | // Initialize pagination with the full set of models | 299 | // 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); |
| 301 | 303 | ||
| 302 | // Function to set up pagination (also used for filtered results) | 304 | // Function to set up pagination (also used for filtered results) |
| @@ -354,11 +356,11 @@ export async function loadFeatherlessModels(data) { | |||
| 354 | 356 | ||
| 355 | modelCardBlock.appendChild(card); | 357 | modelCardBlock.appendChild(card); |
| 356 | 358 | ||
| 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 | } |
| 360 | 362 | ||
| 361 | card.addEventListener('click', function() { | 363 | card.addEventListener('click', function () { |
| 362 | document.querySelectorAll('.model-card').forEach(c => c.classList.remove('selected')); | 364 | document.querySelectorAll('.model-card').forEach(c => c.classList.remove('selected')); |
| 363 | card.classList.add('selected'); | 365 | card.classList.add('selected'); |
| 364 | onFeatherlessModelSelect(model.id); | 366 | onFeatherlessModelSelect(model.id); |
| @@ -376,24 +378,22 @@ export async function loadFeatherlessModels(data) { | |||
| 376 | }); | 378 | }); |
| 377 | } | 379 | } |
| 378 | 380 | ||
| 379 | |||
| 380 | |||
| 381 | // Add event listener for input on the search bar | 381 | // Add event listener for input on the search bar |
| 382 | searchBar.addEventListener('input', function() { | 382 | searchBar.addEventListener('input', function () { |
| 383 | applyFiltersAndSort(); | 383 | applyFiltersAndSort(); |
| 384 | }); | 384 | }); |
| 385 | 385 | ||
| 386 | // Add event listener for the sort order select | 386 | // Add event listener for the sort order select |
| 387 | sortOrderSelect.addEventListener('change', function() { | 387 | sortOrderSelect.addEventListener('change', function () { |
| 388 | applyFiltersAndSort(); | 388 | applyFiltersAndSort(); |
| 389 | }); | 389 | }); |
| 390 | 390 | ||
| 391 | // Add event listener for the class select | 391 | // Add event listener for the class select |
| 392 | classSelect.addEventListener('change', function() { | 392 | classSelect.addEventListener('change', function () { |
| 393 | applyFiltersAndSort(); | 393 | applyFiltersAndSort(); |
| 394 | }); | 394 | }); |
| 395 | 395 | ||
| 396 | categoriesSelect.addEventListener('change', function() { | 396 | categoriesSelect.addEventListener('change', function () { |
| 397 | applyFiltersAndSort(); | 397 | applyFiltersAndSort(); |
| 398 | }); | 398 | }); |
| 399 | 399 | ||
| @@ -411,6 +411,12 @@ export async function loadFeatherlessModels(data) { | |||
| 411 | 411 | ||
| 412 | // Function to apply sorting and filtering based on user input | 412 | // 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 | } |
| 462 | 468 | ||
| 463 | 469 | // 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 | } |
| 465 | 479 | ||
| 466 | async function fetchFeatherlessStats() { | 480 | async function fetchFeatherlessStats() { |
| @@ -476,10 +490,9 @@ async function fetchFeatherlessNew() { | |||
| 476 | } | 490 | } |
| 477 | 491 | ||
| 478 | function onFeatherlessModelSelect(modelId) { | 492 | function 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 | } |
| @@ -487,12 +500,12 @@ function onFeatherlessModelSelect(modelId) { | |||
| 487 | let isGridView = false; // Default state set to grid view | 500 | let isGridView = false; // Default state set to grid view |
| 488 | 501 | ||
| 489 | // Ensure the correct initial view is applied when the page loads | 502 | // Ensure the correct initial view is applied when the page loads |
| 490 | document.addEventListener('DOMContentLoaded', function() { | 503 | document.addEventListener('DOMContentLoaded', function () { |
| 491 | const modelCardBlock = document.getElementById('model_card_block'); | 504 | const modelCardBlock = document.getElementById('model_card_block'); |
| 492 | modelCardBlock.classList.add('list-view'); | 505 | modelCardBlock.classList.add('list-view'); |
| 493 | 506 | ||
| 494 | const toggleButton = document.getElementById('model_grid_toggle'); | 507 | const toggleButton = document.getElementById('model_grid_toggle'); |
| 495 | toggleButton.addEventListener('click', function() { | 508 | toggleButton.addEventListener('click', function () { |
| 496 | // Toggle between grid and list view | 509 | // Toggle between grid and list view |
| 497 | if (isGridView) { | 510 | if (isGridView) { |
| 498 | modelCardBlock.classList.remove('grid-view'); | 511 | modelCardBlock.classList.remove('grid-view'); |
| @@ -679,20 +692,6 @@ function getAphroditeModelTemplate(option) { | |||
| 679 | `)); | 692 | `)); |
| 680 | } | 693 | } |
| 681 | 694 | ||
| 682 | function 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 | |||
| 696 | async function downloadOllamaModel() { | 695 | async 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); |
| 886 | 884 | ||
| @@ -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.', |
| @@ -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 | }; |
| 190 | 191 | ||
| 191 | export let textgenerationwebui_banned_in_macros = []; | 192 | export let textgenerationwebui_banned_in_macros = []; |