From 01d8fa0053e58539252e11575faf6142ce9ea6cd Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Mon, 28 Sep 2026 16:16:09 +0200 Subject: [PATCH] ui : add the model configuration pane The pane shows a model's information, load and inference settings side by side: what its provider reports, the Hub records it falls back to, the load controls gated by what the serving backend can do, and the per-model overrides the load form writes. The slider control arrives with it. Assisted-by: pi:llama.cpp/DeepSeek-V4.1-Flash --- .../ModelsManagerModelConfiguration.svelte | 141 +++++++++ ...delsManagerModelConfigurationHeader.svelte | 172 +++++++++++ ...sManagerModelConfigurationInference.svelte | 281 ++++++++++++++++++ ...anagerModelConfigurationInformation.svelte | 245 +++++++++++++++ ...ModelsManagerModelConfigurationLoad.svelte | 195 ++++++++++++ .../ui/src/lib/components/ui/slider/index.ts | 7 + .../lib/components/ui/slider/slider.svelte | 53 ++++ 7 files changed, 1094 insertions(+) create mode 100644 tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfiguration.svelte create mode 100644 tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationHeader.svelte create mode 100644 tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationInference.svelte create mode 100644 tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationInformation.svelte create mode 100644 tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationLoad.svelte create mode 100644 tools/ui/src/lib/components/ui/slider/index.ts create mode 100644 tools/ui/src/lib/components/ui/slider/slider.svelte diff --git a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfiguration.svelte b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfiguration.svelte new file mode 100644 index 0000000000..23e0ab6451 --- /dev/null +++ b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfiguration.svelte @@ -0,0 +1,141 @@ + + +
+ + + (tab = value)} value={tab}> +
+ + Information + + Load + + Inference + +
+ +
+ + + + + + (edits = next)} + onReset={resetDraft} + onSave={() => onSave(draft)} + /> + + + + (edits = next)} + onReset={resetDraft} + onSave={() => onSave(draft)} + /> + +
+
+
diff --git a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationHeader.svelte b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationHeader.svelte new file mode 100644 index 0000000000..3212720802 --- /dev/null +++ b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationHeader.svelte @@ -0,0 +1,172 @@ + + +
+
+
+ + + +
+
+ + + {#if isCustomized} + CUSTOMIZED + {/if} +
+ + +

+ {#if backend && backendName} + + + {#snippet fallback()} + {#if backend.id === LOCAL_BACKEND_ID} + + {:else} + + {/if} + {/snippet} + + + + {backendName} + + {/if} + + + + + {statusLabel} + +

+
+
+ + +
+ +
+ + + {#if capabilities.loadUnload} + + {/if} +
+
diff --git a/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationInference.svelte b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationInference.svelte new file mode 100644 index 0000000000..2445b68cdc --- /dev/null +++ b/tools/ui/src/lib/components/app/models/ModelsManager/ModelsManagerModelConfiguration/ModelsManagerModelConfigurationInference.svelte @@ -0,0 +1,281 @@ + + +{#snippet numberInput(value: number, onInput: (value: number) => void)} + onInput(Number(event.currentTarget.value) || 0)} + type="number" + {value} + /> +{/snippet} + +{#snippet samplingRow( + label: string, + value: number | null | undefined, + enabled: boolean, + onToggle: (enabled: boolean) => void, + onValue: (value: number) => void, + max: number, + step: number +)} +
+
+ {label} + + onToggle(checked === true)} /> + + + {@render numberInput(value ?? 0, onValue)} + +
+ + onValue(next)} + {step} + type="single" + value={value ?? 0} + /> +
+{/snippet} + +

System prompt

+ +