From 206dc2389c9ebaff3984bf978accf3ff3095b06a Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Sun, 20 Sep 2026 00:46:45 +0200 Subject: [PATCH] ui : resolve provider icons in list headings and backend cards Assisted-by: pi:llama.cpp/DeepSeek-V4.1-Flash --- .../app/backends/BackendCard.svelte | 19 +++++++++++-------- .../app/backends/BackendIcon.svelte | 7 ++++++- .../ModelsSelector/ModelsSelectorList.svelte | 7 +++---- .../lib/components/app/navigation/utils.ts | 4 ---- .../lib/hooks/use-models-selector.svelte.ts | 4 +--- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/tools/ui/src/lib/components/app/backends/BackendCard.svelte b/tools/ui/src/lib/components/app/backends/BackendCard.svelte index 4f2d57abb7..556fefe772 100644 --- a/tools/ui/src/lib/components/app/backends/BackendCard.svelte +++ b/tools/ui/src/lib/components/app/backends/BackendCard.svelte @@ -1,13 +1,13 @@
- {#if preset} - - {:else} - - {/if} + + {#snippet fallback()} + {#if isLocal} + + {:else} + + {/if} + {/snippet} +

{backend.name}

diff --git a/tools/ui/src/lib/components/app/backends/BackendIcon.svelte b/tools/ui/src/lib/components/app/backends/BackendIcon.svelte index d8dc6be131..c221a36c65 100644 --- a/tools/ui/src/lib/components/app/backends/BackendIcon.svelte +++ b/tools/ui/src/lib/components/app/backends/BackendIcon.svelte @@ -2,6 +2,7 @@ import BackendPresetIcon from './BackendPresetIcon.svelte'; import type { Backend } from '$lib/types'; import { backendFaviconUrl, findBackendPreset } from '$lib/utils'; + import type { Snippet } from 'svelte'; import { SvelteSet } from 'svelte/reactivity'; /** Favicons that failed to load, so a row remount does not ask again. */ @@ -10,9 +11,11 @@ interface Props { backend?: Backend; class?: string; + /** Rendered when the backend has neither a bundled mark nor a favicon. */ + fallback?: Snippet; } - let { backend, class: className = 'h-4 w-4' }: Props = $props(); + let { backend, class: className = 'h-4 w-4', fallback }: Props = $props(); let preset = $derived(backend ? findBackendPreset(backend.baseUrl) : undefined); let faviconUrl = $derived(preset || !backend ? null : backendFaviconUrl(backend.baseUrl)); @@ -29,4 +32,6 @@ onerror={() => failedFavicons.add(faviconUrl)} src={faviconUrl} /> +{:else} + {@render fallback?.()} {/if} diff --git a/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorList.svelte b/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorList.svelte index c523b48a00..5bfaa3693c 100644 --- a/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorList.svelte +++ b/tools/ui/src/lib/components/app/models/ModelsSelector/ModelsSelectorList.svelte @@ -3,12 +3,13 @@ import { ChevronLeft, CircleAlert, Heart, Loader2 } from '@lucide/svelte'; import { ModelsSelectorOption } from '$lib/components/app'; import { CollapsibleSection } from '$lib/components/app'; - import { BackendPresetIcon } from '$lib/components/app/backends'; + import { BackendIcon } from '$lib/components/app/backends'; import { DialogConfirmDownload } from '$lib/components/app/dialogs'; import Logo from '$lib/components/app/misc/Logo.svelte'; import type { GroupedModelOptions, ModelItem } from '$lib/components/app/navigation/utils'; import { ModelDownloadConfirmAction } from '$lib/enums'; import { modelsStore } from '$lib/stores'; + import { getBackend } from '$lib/utils/api-base'; interface Props { groups: GroupedModelOptions; @@ -153,9 +154,7 @@ {/if} - {#if provider.preset} - - {/if} + {provider.name} diff --git a/tools/ui/src/lib/components/app/navigation/utils.ts b/tools/ui/src/lib/components/app/navigation/utils.ts index 7240015dce..c7e37313c6 100644 --- a/tools/ui/src/lib/components/app/navigation/utils.ts +++ b/tools/ui/src/lib/components/app/navigation/utils.ts @@ -1,5 +1,4 @@ import { ModelModality } from '$lib/enums'; -import type { BackendPreset } from '$lib/types'; import type { ModelOption } from '$lib/types/models'; import { SvelteMap } from 'svelte/reactivity'; @@ -25,8 +24,6 @@ export interface ProviderGroup { /** Rows left after the search filter, before the cap. */ matched: number; name: string; - /** Brand mark of the endpoint the backend was created from, when known. */ - preset?: BackendPreset; } export interface GroupedModelOptions { @@ -139,7 +136,6 @@ export function groupProviderOptions( error: string | null; loading: boolean; name: string; - preset?: BackendPreset; }[], limit = Infinity ): ProviderGroup[] { diff --git a/tools/ui/src/lib/hooks/use-models-selector.svelte.ts b/tools/ui/src/lib/hooks/use-models-selector.svelte.ts index 886211c82a..526717dacd 100644 --- a/tools/ui/src/lib/hooks/use-models-selector.svelte.ts +++ b/tools/ui/src/lib/hooks/use-models-selector.svelte.ts @@ -12,7 +12,6 @@ import { } from '$lib/constants'; import { backendsModelsStore, backendsStore, modelsStore, serverStore } from '$lib/stores'; import type { ModelOption } from '$lib/types/models'; -import { findBackendPreset } from '$lib/utils/backend'; import { rawModelId } from '$lib/utils/model-option-id'; import { onMount } from 'svelte'; @@ -140,8 +139,7 @@ export function useModelsSelector(opts: UseModelsSelectorOptions): UseModelsSele catalog: state.models.length, error: state.error, loading: state.loading, - name: backend.name, - preset: findBackendPreset(backend.baseUrl) + name: backend.name }; }) );