From e77fd72692390de541350ff6dc2120f973f76f15 Mon Sep 17 00:00:00 2001 From: guenhter Date: Tue, 21 Jul 2026 16:11:49 +0200 Subject: [PATCH] feat: show file upload errors in knowledge base pick 96d4f3c # chore: update data When a file gets uploaded, the error not just shown in the toast which is easy to miss, but the faulty file is kept in the knowledge base and the error is visible there. --- backend/open_webui/routers/files.py | 27 +++++++++++---- backend/open_webui/routers/retrieval.py | 11 +++++++ .../workspace/Knowledge/KnowledgeBase.svelte | 2 ++ .../Knowledge/KnowledgeBase/Files.svelte | 33 +++++++++++++++++-- 4 files changed, 64 insertions(+), 9 deletions(-) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index aaebedc26c..53b3c7cbb3 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -161,6 +161,11 @@ async def process_uploaded_file( {'status': 'completed'}, db=db_session, ) + await Files.update_file_metadata_by_id( + file_item.id, + {'status': 'completed'}, + db=db_session, + ) else: raise Exception(f'File type {content_type} is not supported for processing') @@ -204,12 +209,8 @@ async def process_uploaded_file( # Keep the generic file status stream open until the # KB-specific vector write and durable link both finish. await Files.update_file_data_by_id(file_item.id, {'status': 'processing'}, db=db_session) - await process_file( - request, - ProcessFileForm(file_id=file_item.id, collection_name=knowledge_id), - user=user, - db=db_session, - ) + await Files.update_file_metadata_by_id(file_item.id, {'status': 'processing'}, db=db_session) + knowledge_file = await Knowledges.add_file_to_knowledge_by_id( knowledge_id=knowledge_id, file_id=file_item.id, @@ -217,6 +218,12 @@ async def process_uploaded_file( directory_id=file_metadata.get('directory_id'), db=db_session, ) + await process_file( + request, + ProcessFileForm(file_id=file_item.id, collection_name=knowledge_id), + user=user, + db=db_session, + ) if not knowledge_file: raise Exception(f'Failed to link file {file_item.id} to knowledge {knowledge_id}') log.info(f'Linked file {file_item.id} to knowledge {knowledge_id}') @@ -234,6 +241,14 @@ async def process_uploaded_file( }, db=db_session, ) + await Files.update_file_metadata_by_id( + file_item.id, + { + 'status': 'failed', + 'error': str(e.detail) if hasattr(e, 'detail') else str(e), + }, + db=db_session, + ) try: if db: diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index 3f62af4af4..1bc6bcb97c 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -1944,6 +1944,8 @@ async def process_file( if config.BYPASS_EMBEDDING_AND_RETRIEVAL: await Files.update_file_data_by_id(file.id, {'status': 'completed'}, db=db) + await Files.update_file_metadata_by_id(file.id, {'status': 'completed'}, db=db) + await Files.update_file_hash_by_id(file.id, hash, db=db) await publish_event( request, @@ -1993,6 +1995,7 @@ async def process_file( await Files.update_file_metadata_by_id( file.id, { + 'status': 'completed', 'collection_name': collection_name, }, db=session, @@ -2033,6 +2036,14 @@ async def process_file( {'status': 'failed'}, db=session, ) + await Files.update_file_metadata_by_id( + file.id, + { + 'status': 'failed', + 'error': str(e.detail) if hasattr(e, 'detail') else str(e), + }, + db=session, + ) # Clear the hash so the file can be re-uploaded after fixing the issue await Files.update_file_hash_by_id(file.id, None, db=session) diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte index 22a7a4b357..a0a18170b7 100644 --- a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte +++ b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte @@ -366,6 +366,7 @@ console.warn('File upload warning:', uploadedFile.error); toast.warning(uploadedFile.error); fileItems = fileItems.filter((file) => file.id !== uploadedFile.id); + init(); } else { toast.success($i18n.t('File added successfully.')); init(); @@ -454,6 +455,7 @@ console.warn('File upload warning:', uploadedFile.error); toast.warning(uploadedFile.error); fileItems = fileItems.filter((file) => file.id !== uploadedFile.id); + init(); } else { toast.success($i18n.t('File added successfully.')); init(); diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte index b8971ae0f9..7f10433c5c 100644 --- a/src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte +++ b/src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte @@ -22,6 +22,7 @@ import GarbageBin from '$lib/components/icons/GarbageBin.svelte'; import Pencil from '$lib/components/icons/Pencil.svelte'; import Spinner from '$lib/components/common/Spinner.svelte'; + import XMark from '$lib/components/icons/XMark.svelte'; import DirectoryRow from './DirectoryRow.svelte'; export let knowledge = null; @@ -89,7 +90,35 @@ }} >
- {#if file?.status !== 'uploading'} + {#if file?.status === 'uploading'} + + {:else if file?.meta?.status === 'failed'} + {#if file?.meta?.error} + + + + {:else} + + {/if} + {:else} - {:else} - {/if}