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 @@ }} >