From e4d69bf6cd99e4c98970e621d41dee1417e497f1 Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Sun, 27 Sep 2026 18:19:05 +0200 Subject: [PATCH] ui : keep the model selector usable when a provider is down The selector was disabled whenever no backend was reachable, which locked the one control that lets you leave the broken provider. It now stays enabled and wears the error colours, the manager marks the unreachable provider in its section header, and the banner only speaks when there is a single provider and nowhere to switch to. Assisted-by: pi:llama.cpp/DeepSeek-V4.1-Flash --- .../ChatFormActionModels.svelte | 19 +++++++++--- .../ChatScreen/ChatScreenServerError.svelte | 8 +++-- .../ModelsManagerModelsTable.svelte | 12 ++++++- .../ModelsSelectorDropdown.svelte | 17 ++++++---- .../ModelsSelector/ModelsSelectorSheet.svelte | 31 ++++++++++++------- 5 files changed, 61 insertions(+), 26 deletions(-) diff --git a/tools/ui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionModels.svelte b/tools/ui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionModels.svelte index 91b79860c8..434db0cf4f 100644 --- a/tools/ui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionModels.svelte +++ b/tools/ui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionModels.svelte @@ -1,7 +1,8 @@ {#if hasError || isLoadingModel} 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 f7ee7ff9ee..d42e5529a2 100644 --- a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsTable.svelte +++ b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelsTable.svelte @@ -49,7 +49,13 @@ import { Button } from '$lib/components/ui/button'; import { FAMILY_ROW_WINDOW, MODEL_ROW_WINDOW } from '$lib/constants'; import { ModelDownloadConfirmAction, ServerModelStatus } from '$lib/enums'; - import { backendsStore, modelsStore, settingsStore, uiStore } from '$lib/stores'; + import { + backendsModelsStore, + backendsStore, + modelsStore, + settingsStore, + uiStore + } from '$lib/stores'; import type { ModelOption } from '$lib/types/models'; import { getBackend } from '$lib/utils/api-base'; import { getBackendCapabilities } from '$lib/utils/backend'; @@ -709,13 +715,17 @@ {/if} {/snippet} + {@const backendState = group.backendId ? backendsModelsStore.get(group.backendId) : null} + Promise | boolean | void; disabled?: boolean; + /** The provider behind this selector is unreachable. */ + error?: boolean; forceForegroundText?: boolean; /** When true, user's global selection takes priority over currentModel (for form selector) */ useGlobalSelection?: boolean; @@ -36,6 +38,7 @@ class: className = '', currentModel = null, disabled = false, + error = false, forceForegroundText = false, onModelChange, useGlobalSelection = false @@ -107,13 +110,15 @@