From 7d0640a44d0624f4dec47e60cab13dde0aae812e Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Sun, 16 Aug 2026 18:16:48 +0200 Subject: [PATCH] ui : add sampling and penalties submenus to model selector Add reusable ModelsSelectorSettingsSubmenu that renders a settings section's fields as inline editable inputs bound to settingsStore. Wire it into the model selector dropdown for the Sampling and Penalties sections, showing server defaults as placeholders and disabling the submenus until a model is loaded. --- .../app/models/ModelsSelectorDropdown.svelte | 29 +++++- .../ModelsSelectorSettingsSubmenu.svelte | 91 +++++++++++++++++++ .../ui/src/lib/components/app/models/index.ts | 2 + 3 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 tools/ui/src/lib/components/app/models/ModelsSelectorSettingsSubmenu.svelte diff --git a/tools/ui/src/lib/components/app/models/ModelsSelectorDropdown.svelte b/tools/ui/src/lib/components/app/models/ModelsSelectorDropdown.svelte index ccd46b2f3d..1fd7292161 100644 --- a/tools/ui/src/lib/components/app/models/ModelsSelectorDropdown.svelte +++ b/tools/ui/src/lib/components/app/models/ModelsSelectorDropdown.svelte @@ -8,11 +8,17 @@ DropdownMenuSearchable, ModelId, ModelsSelectorList, - ModelsSelectorOption + ModelsSelectorOption, + ModelsSelectorSettingsSubmenu } from '$lib/components/app'; import * as DropdownMenu from '$lib/components/ui/dropdown-menu'; import * as Tooltip from '$lib/components/ui/tooltip'; - import { MODEL_SELECTOR_ICON, SETTINGS_KEYS } from '$lib/constants'; + import { + MODEL_SELECTOR_ICON, + SETTINGS_CHAT_SECTIONS, + SETTINGS_KEYS, + SETTINGS_SECTION_SLUGS + } from '$lib/constants'; import { KeyboardKey, ServerModelStatus } from '$lib/enums'; import { useModelsSelector } from '$lib/hooks/use-models-selector.svelte'; import { useReasoningMenu } from '$lib/hooks/use-reasoning-menu.svelte'; @@ -66,6 +72,17 @@ const reasoning = useReasoningMenu(); + const samplingSection = $derived( + SETTINGS_CHAT_SECTIONS.find((s) => s.slug === SETTINGS_SECTION_SLUGS.SAMPLING) + ); + const penaltiesSection = $derived( + SETTINGS_CHAT_SECTIONS.find((s) => s.slug === SETTINGS_SECTION_SLUGS.PENALTIES) + ); + + // Sampling/penalties need a loaded model to show server defaults, so + // disable the submenus until one is loaded. + const hasModelLoaded = $derived(modelsStore.loadedModelIds.length > 0); + const showOrgNameInTrigger = $derived( settingsStore.config[SETTINGS_KEYS.SHOW_MODEL_ORG_NAME_IN_TRIGGER] ?? false ); @@ -352,6 +369,14 @@ + + {#if samplingSection} + + {/if} + + {#if penaltiesSection} + + {/if} {:else} diff --git a/tools/ui/src/lib/components/app/models/ModelsSelectorSettingsSubmenu.svelte b/tools/ui/src/lib/components/app/models/ModelsSelectorSettingsSubmenu.svelte new file mode 100644 index 0000000000..d1d58efa63 --- /dev/null +++ b/tools/ui/src/lib/components/app/models/ModelsSelectorSettingsSubmenu.svelte @@ -0,0 +1,91 @@ + + + + + + + {section.title} + + + + {#each section.fields ?? [] as field (field.key)} + {#if field.type === SettingsFieldType.INPUT} + + {:else if field.type === SettingsFieldType.CHECKBOX} + + {/if} + {/each} + + diff --git a/tools/ui/src/lib/components/app/models/index.ts b/tools/ui/src/lib/components/app/models/index.ts index 3ac6ecb678..abd05adc26 100644 --- a/tools/ui/src/lib/components/app/models/index.ts +++ b/tools/ui/src/lib/components/app/models/index.ts @@ -65,6 +65,8 @@ export { default as ModelsSelectorList } from './ModelsSelectorList.svelte'; */ export { default as ModelsSelectorOption } from './ModelsSelectorOption.svelte'; +export { default as ModelsSelectorSettingsSubmenu } from './ModelsSelectorSettingsSubmenu.svelte'; + /** * **ModelsSelectorSheet** - Mobile model selection sheet *