From 681c160749c08c620a4f7fcdb92cbc4419517638 Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Tue, 22 Sep 2026 12:56:30 +0200 Subject: [PATCH] ui : make the manager rail pick providers, not models Assisted-by: pi:llama.cpp/DeepSeek-V4.1-Flash --- .../models/ModelsManager/ModelsManager.svelte | 74 ++++++----- .../ModelsManagerModelsList.svelte | 96 ++++---------- .../ModelsManagerModelsListItem.svelte | 125 ++++-------------- .../ModelsManagerModelsTable.svelte | 12 +- .../app/models/ModelsManager/utils.ts | 6 +- 5 files changed, 112 insertions(+), 201 deletions(-) diff --git a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManager.svelte b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManager.svelte index 0fbd66cf48..abc1b1edcd 100644 --- a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManager.svelte +++ b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManager.svelte @@ -9,7 +9,7 @@ loadOverrides, type ModelOverride, type ModelsListFilter, - type ModelsListGroup, + type ModelsProviderGroup, saveOverrides } from './utils'; import { LOCAL_BACKEND_ID } from '$lib/constants'; @@ -28,15 +28,17 @@ let filter = $state(''); let view = $state('all'); + let selectedBackendId = $state(null); let selectedId = $state(null); let overrides = $state>(loadOverrides()); let allModels = $derived(modelsStore.models); - let selected = $derived(allModels.find((option) => option.id === selectedId) ?? null); - let favorites = $derived( - allModels.filter((option) => modelsStore.favoriteModelIds.has(option.model)) + let isFavorite = $derived((option: ModelOption) => + modelsStore.favoriteModelIds.has(option.model) ); - let matches = $derived.by(() => { + // the rail counts follow the active view and filter, so it always says how many + // models each provider contributes to what the table is showing + let visible = $derived.by(() => { const term = filter.trim().toLowerCase(); return allModels.filter((option) => { @@ -49,25 +51,23 @@ return true; }); }); - let groups = $derived.by(() => { - const byBackend = new SvelteMap(); + let providers = $derived.by(() => { + const counts = new SvelteMap(); - for (const option of matches) { + for (const option of visible) { const backendId = option.backendId ?? LOCAL_BACKEND_ID; - if (!byBackend.has(backendId)) byBackend.set(backendId, []); - - byBackend.get(backendId)!.push(option); + counts.set(backendId, (counts.get(backendId) ?? 0) + 1); } - const ordered: ModelsListGroup[] = []; - const localItems = byBackend.get(LOCAL_BACKEND_ID); + const ordered: ModelsProviderGroup[] = []; + const localCount = counts.get(LOCAL_BACKEND_ID); - if (localItems?.length) { + if (localCount) { ordered.push({ backendId: LOCAL_BACKEND_ID, + count: localCount, isLocal: true, - items: localItems, label: 'This server' }); } @@ -75,15 +75,26 @@ for (const backend of backendsStore.enabled) { if (backend.id === LOCAL_BACKEND_ID) continue; - const items = byBackend.get(backend.id); + const count = counts.get(backend.id); - if (items?.length) { - ordered.push({ backendId: backend.id, isLocal: false, items, label: backend.name }); + if (count) { + ordered.push({ + backendId: backend.id, + count, + isLocal: false, + label: backend.name + }); } } return ordered; }); + let matches = $derived( + selectedBackendId === null + ? visible + : visible.filter((option) => (option.backendId ?? LOCAL_BACKEND_ID) === selectedBackendId) + ); + let selected = $derived(allModels.find((option) => option.id === selectedId) ?? null); let summary = $derived.by(() => { const local = matches.filter(isLocalOption); const bytes = local.reduce((total, option) => { @@ -102,7 +113,12 @@ .join(' ยท '); }); let title = $derived( - view === 'favorites' ? 'Favorites' : view === 'loaded' ? 'Loaded models' : 'All models' + view === 'favorites' + ? 'Favorites' + : view === 'loaded' + ? 'Loaded models' + : (providers.find((provider) => provider.backendId === selectedBackendId)?.label ?? + 'All models') ); function toggleFavorite(option: ModelOption): void { @@ -138,24 +154,22 @@
-
+
modelsStore.favoriteModelIds.has(option.model)} - onSelect={(option) => (selectedId = option.id)} - onToggleFavorite={toggleFavorite} - {selectedId} + onSelect={(backendId) => (selectedBackendId = backendId)} + {providers} + {selectedBackendId} + totalCount={visible.length} />
modelsStore.favoriteModelIds.has(option.model)} + bind:filter + bind:view + {isFavorite} models={matches} onCopyId={copyId} onGetModels={() => onOpenDiscover?.()} diff --git a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsList/ModelsManagerModelsList.svelte b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsList/ModelsManagerModelsList.svelte index 0a3246c45b..5eab87328e 100644 --- a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsList/ModelsManagerModelsList.svelte +++ b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsList/ModelsManagerModelsList.svelte @@ -1,83 +1,39 @@ -
- +
+

Providers

-
- {#if favorites.length > 0} - - {#snippet icon()} - - {/snippet} +
+ onSelect(null)} + /> - {#each favorites as option (option.id)} - onSelect(option)} - onToggleFavorite={() => onToggleFavorite(option)} - {option} - /> - {/each} - - {/if} - - {#each groups as group (group.backendId)} - - {#snippet icon()} - {#if group.isLocal} - - {/if} - {/snippet} - - {#each group.items as option (option.id)} - onSelect(option)} - onToggleFavorite={() => onToggleFavorite(option)} - {option} - /> - {/each} - + {#each providers as provider (provider.backendId)} + onSelect(provider.backendId)} + /> {/each} - - {#if groups.length === 0 && favorites.length === 0} -

No models found.

- {/if}
diff --git a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsList/ModelsManagerModelsListItem.svelte b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsList/ModelsManagerModelsListItem.svelte index 5fe4bbdfae..512c032cd7 100644 --- a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsList/ModelsManagerModelsListItem.svelte +++ b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsList/ModelsManagerModelsListItem.svelte @@ -1,109 +1,40 @@ -
-
- - - {#if isFavorite} - - {/if} - - - - -
- - {#if expanded} -
- {#if quant} - {quant} - {/if} - - {#if size} - {size} - {/if} - - -
+ {#if isLocal} + + {:else if backendId} + + {:else} + {/if} -
+ + {label} + + {count} + diff --git a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsTable.svelte b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsTable.svelte index 24837b3e09..d5baaf3970 100644 --- a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsTable.svelte +++ b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsTable.svelte @@ -1,4 +1,6 @@