From 8b1d96755eebee077eb6b0784a08c98b9283ae76 Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Fri, 21 Nov 2025 14:26:50 +0100 Subject: [PATCH] feat: New Model Selection UX WIP --- .../ChatFormActions/ChatFormActions.svelte | 24 +- .../ChatMessages/ChatMessageAssistant.svelte | 114 ++++---- .../app/chat/ChatSidebar/ChatSidebar.svelte | 2 - .../webui/src/lib/components/app/index.ts | 2 +- .../SelectorModel.svelte} | 245 ++++++++---------- .../server/webui/src/lib/types/settings.d.ts | 1 - 6 files changed, 175 insertions(+), 213 deletions(-) rename tools/server/webui/src/lib/components/app/{chat/ChatForm/ChatFormModelSelector.svelte => misc/SelectorModel.svelte} (66%) diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte index 086587a86a..1b565ec7b9 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte @@ -2,15 +2,13 @@ import { Square, ArrowUp } from '@lucide/svelte'; import { Button } from '$lib/components/ui/button'; import { - BadgeModelName, ChatFormActionFileAttachments, - ChatFormModelSelector, ChatFormActionRecord, - DialogModelInformation + SelectorModel } from '$lib/components/app'; import { FileTypeCategory } from '$lib/enums/files'; import { getFileTypeCategory } from '$lib/utils/file-type'; - import { isRouterMode, supportsAudio } from '$lib/stores/server.svelte'; + import { supportsAudio } from '$lib/stores/server.svelte'; import type { ChatUploadedFile } from '$lib/types/chat'; interface Props { @@ -39,29 +37,18 @@ onStop }: Props = $props(); - let inRouterMode = $derived(isRouterMode()); let hasAudioModality = $derived(supportsAudio()); let hasAudioAttachments = $derived( uploadedFiles.some((file) => getFileTypeCategory(file.type) === FileTypeCategory.AUDIO) ); let shouldShowRecordButton = $derived(hasAudioModality && !hasText && !hasAudioAttachments); let shouldShowSubmitButton = $derived(!shouldShowRecordButton || hasAudioAttachments); - - let showModelInfoDialog = $state(false);
- {#if !inRouterMode} - (showModelInfoDialog = true)} - showTooltip - /> - {:else} - - {/if} + {#if isLoading} - {#if isOpen} + {#if isOpen && isRouter}
handleOptionSelect(option.id)} + aria-selected={currentModel === option.model || activeId === option.id} + onclick={() => handleSelect(option.id)} > - - {option.name} - - - {#if option.description} - {option.description} - {/if} + {option.name} {/each}
@@ -345,8 +326,8 @@ {/if}
{/if} - - {#if error} -

{error}

- {/if} + +{#if showModelDialog && !isRouter} + +{/if} diff --git a/tools/server/webui/src/lib/types/settings.d.ts b/tools/server/webui/src/lib/types/settings.d.ts index b47842b66e..24be6053e2 100644 --- a/tools/server/webui/src/lib/types/settings.d.ts +++ b/tools/server/webui/src/lib/types/settings.d.ts @@ -45,7 +45,6 @@ export interface SettingsChatServiceOptions { onReasoningChunk?: (chunk: string) => void; onToolCallChunk?: (chunk: string) => void; onModel?: (model: string) => void; - onFirstValidChunk?: () => void; onComplete?: ( response: string, reasoningContent?: string,