diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz index e572817dca..a3fcf8dcdb 100644 Binary files a/tools/server/public/index.html.gz and b/tools/server/public/index.html.gz differ diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte index fd2f7f60e5..27ab975cbd 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte @@ -10,21 +10,11 @@ import { INPUT_CLASSES } from '$lib/constants/input-classes'; import { SETTING_CONFIG_DEFAULT } from '$lib/constants/settings-config'; import { config } from '$lib/stores/settings.svelte'; - import { modelsStore, modelOptions, selectedModelId } from '$lib/stores/models.svelte'; + import { modelOptions, selectedModelId } from '$lib/stores/models.svelte'; import { isRouterMode } from '$lib/stores/server.svelte'; import { chatStore } from '$lib/stores/chat.svelte'; import { activeMessages } from '$lib/stores/conversations.svelte'; - import { - FileTypeCategory, - MimeTypeApplication, - FileExtensionAudio, - FileExtensionImage, - FileExtensionPdf, - FileExtensionText, - MimeTypeAudio, - MimeTypeImage, - MimeTypeText - } from '$lib/enums'; + import { MimeTypeText } from '$lib/enums'; import { isIMEComposing, parseClipboardContent } from '$lib/utils'; import { AudioRecorder, @@ -61,7 +51,6 @@ let audioRecorder: AudioRecorder | undefined; let chatFormActionsRef: ChatFormActions | undefined = $state(undefined); let currentConfig = $derived(config()); - let fileAcceptString = $state(undefined); let fileInputRef: ChatFormFileInputInvisible | undefined = $state(undefined); let isRecording = $state(false); let message = $state(''); @@ -104,40 +93,6 @@ return null; }); - // State for model props reactivity - let modelPropsVersion = $state(0); - - // Fetch model props when active model changes (works for both MODEL and ROUTER mode) - $effect(() => { - if (activeModelId) { - const cached = modelsStore.getModelProps(activeModelId); - if (!cached) { - modelsStore.fetchModelProps(activeModelId).then(() => { - modelPropsVersion++; - }); - } - } - }); - - // Derive modalities from active model (works for both MODEL and ROUTER mode) - let hasAudioModality = $derived.by(() => { - if (activeModelId) { - void modelPropsVersion; // Trigger reactivity on props fetch - return modelsStore.modelSupportsAudio(activeModelId); - } - - return false; - }); - - let hasVisionModality = $derived.by(() => { - if (activeModelId) { - void modelPropsVersion; // Trigger reactivity on props fetch - return modelsStore.modelSupportsVision(activeModelId); - } - - return false; - }); - function checkModelSelected(): boolean { if (!hasModelSelected) { // Open the model selector @@ -148,42 +103,12 @@ return true; } - function getAcceptStringForFileType(fileType: FileTypeCategory): string { - switch (fileType) { - case FileTypeCategory.IMAGE: - return [...Object.values(FileExtensionImage), ...Object.values(MimeTypeImage)].join(','); - - case FileTypeCategory.AUDIO: - return [...Object.values(FileExtensionAudio), ...Object.values(MimeTypeAudio)].join(','); - - case FileTypeCategory.PDF: - return [...Object.values(FileExtensionPdf), ...Object.values(MimeTypeApplication)].join( - ',' - ); - - case FileTypeCategory.TEXT: - return [...Object.values(FileExtensionText), MimeTypeText.PLAIN].join(','); - - default: - return ''; - } - } - function handleFileSelect(files: File[]) { onFileUpload?.(files); } - function handleFileUpload(fileType?: FileTypeCategory) { - if (fileType) { - fileAcceptString = getAcceptStringForFileType(fileType); - } else { - fileAcceptString = undefined; - } - - // Use setTimeout to ensure the accept attribute is applied before opening dialog - setTimeout(() => { - fileInputRef?.click(); - }, 10); + function handleFileUpload() { + fileInputRef?.click(); } async function handleKeydown(event: KeyboardEvent) { @@ -343,13 +268,7 @@ }); - + void; + onFileUpload?: () => void; } let { @@ -27,10 +26,6 @@ ? 'Text files and PDFs supported. Images, audio, and video require vision models.' : 'Attach files'; }); - - function handleFileUpload(fileType?: FileTypeCategory) { - onFileUpload?.(fileType); - } @@ -61,7 +56,7 @@ handleFileUpload(FileTypeCategory.IMAGE)} + onclick={() => onFileUpload?.()} > @@ -81,7 +76,7 @@ handleFileUpload(FileTypeCategory.AUDIO)} + onclick={() => onFileUpload?.()} > @@ -98,7 +93,7 @@ handleFileUpload(FileTypeCategory.TEXT)} + onclick={() => onFileUpload?.()} > @@ -109,7 +104,7 @@ handleFileUpload(FileTypeCategory.PDF)} + onclick={() => onFileUpload?.()} > 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 730c348b30..dde9bda2d8 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 @@ -24,7 +24,7 @@ isRecording?: boolean; hasText?: boolean; uploadedFiles?: ChatUploadedFile[]; - onFileUpload?: (fileType?: FileTypeCategory) => void; + onFileUpload?: () => void; onMicClick?: () => void; onStop?: () => void; } diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormFileInputInvisible.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormFileInputInvisible.svelte index 52f3913b93..d758822f3c 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormFileInputInvisible.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormFileInputInvisible.svelte @@ -1,35 +1,14 @@