From 9d2ca5ac0594e9c052fcd1d6494547287f066dbd Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Thu, 24 Sep 2026 18:27:33 +0200 Subject: [PATCH] ui : put manage, discover and providers in one dialog Assisted-by: pi:llama.cpp/DeepSeek-V4.1-Flash --- .../app/backends/DialogBackendForm.svelte | 30 +++++++-- .../app/backends/SettingsBackends.svelte | 37 ++++++++--- .../app/dialogs/DialogManageModels.svelte | 65 +++++++++++++++---- .../app/dialogs/DialogModelsDiscover.svelte | 25 ------- .../src/lib/components/app/dialogs/index.ts | 1 - .../SidebarNavigation.svelte | 3 - .../settings/SettingsChat/SettingsChat.svelte | 5 +- .../SettingsChatProvidersTab.svelte | 34 ---------- .../src/lib/components/app/settings/index.ts | 1 - 9 files changed, 108 insertions(+), 93 deletions(-) delete mode 100644 tools/ui/src/lib/components/app/dialogs/DialogModelsDiscover.svelte delete mode 100644 tools/ui/src/lib/components/app/settings/SettingsChat/SettingsChatProvidersTab.svelte diff --git a/tools/ui/src/lib/components/app/backends/DialogBackendForm.svelte b/tools/ui/src/lib/components/app/backends/DialogBackendForm.svelte index 9cdbfddbb2..c9049b42a0 100644 --- a/tools/ui/src/lib/components/app/backends/DialogBackendForm.svelte +++ b/tools/ui/src/lib/components/app/backends/DialogBackendForm.svelte @@ -4,7 +4,8 @@ import { CheckCircle2, Loader2, XCircle } from '@lucide/svelte'; import { Button } from '$lib/components/ui/button'; import * as Dialog from '$lib/components/ui/dialog'; - import { BACKEND_ID_PREFIX, BACKEND_PRESETS } from '$lib/constants'; + import * as ToggleGroup from '$lib/components/ui/toggle-group'; + import { BACKEND_ID_PREFIX, BACKEND_PRESETS, BACKEND_PROTOCOLS } from '$lib/constants'; import { BackendsService } from '$lib/services'; import type { BackendTestResult } from '$lib/services/backends.service'; import { backendsStore } from '$lib/stores'; @@ -29,8 +30,15 @@ let draft = $state(createBackend()); - // presets offered for the protocol the caller is adding - let presets = $derived(BACKEND_PRESETS.filter((preset) => preset.protocol === defaultProtocol)); + // the caller seeds the protocol, the picker overrides it while adding + let protocolPick = $state(undefined); + let protocol = $derived( + BACKEND_PROTOCOLS.includes(protocolPick as BackendProtocol) + ? (protocolPick as BackendProtocol) + : (backend?.protocol ?? defaultProtocol) + ); + // presets offered for the protocol being added + let presets = $derived(BACKEND_PRESETS.filter((preset) => preset.protocol === protocol)); let testResult = $state(null); let testing = $state(false); @@ -149,12 +157,26 @@ {isEdit ? 'Edit backend' : 'Add backend'} - {defaultProtocol === 'llama.cpp' + {protocol === 'llama.cpp' ? 'Point at another llama-server.' : 'Connect an OpenAI-compatible endpoint.'} + {#if !isEdit} +
+

Protocol

+ + + {#each BACKEND_PROTOCOLS as option (option)} + + {option === 'llama.cpp' ? 'llama.cpp' : 'OpenAI-compatible'} + + {/each} + +
+ {/if} + {#if !isEdit && presets.length > 0}

Recommended providers

diff --git a/tools/ui/src/lib/components/app/backends/SettingsBackends.svelte b/tools/ui/src/lib/components/app/backends/SettingsBackends.svelte index 6729af8a0e..9610412dd2 100644 --- a/tools/ui/src/lib/components/app/backends/SettingsBackends.svelte +++ b/tools/ui/src/lib/components/app/backends/SettingsBackends.svelte @@ -9,14 +9,33 @@ interface Props { class?: string; - protocol: BackendProtocol; + /** Narrows the list to one protocol; omit it to list every provider at once. */ + protocol?: BackendProtocol; } let { class: className, protocol }: Props = $props(); - // the switcher above the list narrows it to one protocol - let backends = $derived(backendsStore.external.filter((b) => b.protocol === protocol)); - let isLlamaCpp = $derived(protocol === 'llama.cpp'); + let backends = $derived( + protocol + ? backendsStore.external.filter((b) => b.protocol === protocol) + : backendsStore.external + ); + // the bundled server belongs to the list whenever llama.cpp providers are in it + let showsLocal = $derived(protocol === undefined || protocol === 'llama.cpp'); + let addTitle = $derived( + protocol === 'openai' + ? 'Add a backend' + : protocol === 'llama.cpp' + ? 'Add a llama.cpp backend' + : 'Add a provider' + ); + let addDescription = $derived( + protocol === 'openai' + ? 'Connect an OpenAI-compatible endpoint.' + : protocol === 'llama.cpp' + ? 'Point at another llama-server.' + : 'Point at a llama-server or connect an OpenAI-compatible endpoint.' + ); let isAdding = $state(false); let editing = $state(null); @@ -48,12 +67,12 @@ void backendsModelsStore.loadAll()} /> - {#if isLlamaCpp && !serverStore.localServerMissing} + {#if showsLocal && !serverStore.localServerMissing} - {isLlamaCpp ? 'Add a llama.cpp backend' : 'Add a backend'} + {addTitle} - - {isLlamaCpp ? 'Point at another llama-server.' : 'Connect an OpenAI-compatible endpoint.'} - + {addDescription} diff --git a/tools/ui/src/lib/components/app/dialogs/DialogManageModels.svelte b/tools/ui/src/lib/components/app/dialogs/DialogManageModels.svelte index 8c5217f628..7d7d79dff8 100644 --- a/tools/ui/src/lib/components/app/dialogs/DialogManageModels.svelte +++ b/tools/ui/src/lib/components/app/dialogs/DialogManageModels.svelte @@ -1,8 +1,10 @@ - - - - - - diff --git a/tools/ui/src/lib/components/app/dialogs/index.ts b/tools/ui/src/lib/components/app/dialogs/index.ts index 5f23a5009d..5950f9a004 100644 --- a/tools/ui/src/lib/components/app/dialogs/index.ts +++ b/tools/ui/src/lib/components/app/dialogs/index.ts @@ -549,4 +549,3 @@ export { default as DialogMermaidPreview } from './DialogMermaidPreview.svelte'; * * @see ModelsDiscover in $lib/components/app/models/discover */ -export { default as DialogModelsDiscover } from './DialogModelsDiscover.svelte'; diff --git a/tools/ui/src/lib/components/app/navigation/SidebarNavigation/SidebarNavigation.svelte b/tools/ui/src/lib/components/app/navigation/SidebarNavigation/SidebarNavigation.svelte index 832928c616..f2b1faa5a8 100644 --- a/tools/ui/src/lib/components/app/navigation/SidebarNavigation/SidebarNavigation.svelte +++ b/tools/ui/src/lib/components/app/navigation/SidebarNavigation/SidebarNavigation.svelte @@ -6,7 +6,6 @@ ActionIcon, DialogConversationRename, DialogManageModels, - DialogModelsDiscover, DialogSettingsChat, Logo, SidebarNavigationActions, @@ -457,8 +456,6 @@ - -