From: Pascal Date: Fri, 9 Jan 2026 15:45:32 +0000 (+0100) Subject: Webui/file upload (#18694) X-Git-Tag: upstream/0.0.7721~35 X-Git-Url: https://git.djapps.eu/?a=commitdiff_plain;h=ec8fd7876b6195bd8582eba4f1debb23d13fde81;p=pkg%2Fggml%2Fsources%2Fllama.cpp Webui/file upload (#18694) * webui: fix restrictive file type validation * webui: simplify file processing logic * chore: update webui build output * webui: remove file picker extension whitelist (1/2) * webui: remove file picker extension whitelist (2/2) * chore: update webui build output * refactor: Cleanup * chore: update webui build output * fix: update ChatForm storybook test after removing accept attribute * chore: update webui build output * refactor: more cleanup * chore: update webui build output --- diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz index e572817d..a3fcf8dc 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 fd2f7f60..27ab975c 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 730c348b..dde9bda2 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 52f3913b..d758822f 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 @@