diff --git a/backend/open_webui/models/knowledge.py b/backend/open_webui/models/knowledge.py index cc3ef7adee..42370c0d7e 100644 --- a/backend/open_webui/models/knowledge.py +++ b/backend/open_webui/models/knowledge.py @@ -232,6 +232,21 @@ class KnowledgeTable: except Exception: return None + def get_knowledge_by_id_and_user_id( + self, id: str, user_id: str + ) -> Optional[KnowledgeModel]: + knowledge = self.get_knowledge_by_id(id) + if not knowledge: + return None + + if knowledge.user_id == user_id: + return knowledge + + user_group_ids = {group.id for group in Groups.get_groups_by_member_id(user_id)} + if has_access(user_id, "write", knowledge.access_control, user_group_ids): + return knowledge + return None + def get_knowledges_by_file_id(self, file_id: str) -> list[KnowledgeModel]: try: with get_db() as db: diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index e10722c0c8..39b747fed8 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -27,6 +27,7 @@ from open_webui.constants import ERROR_MESSAGES from open_webui.env import SRC_LOG_LEVELS from open_webui.retrieval.vector.factory import VECTOR_DB_CLIENT +from open_webui.models.channels import Channels from open_webui.models.users import Users from open_webui.models.files import ( FileForm, @@ -138,6 +139,7 @@ def process_uploaded_file(request, file, file_path, file_item, file_metadata, us f"File type {file.content_type} is not provided, but trying to process anyway" ) process_file(request, ProcessFileForm(file_id=file_item.id), user=user) + except Exception as e: log.error(f"Error processing file: {file_item.id}") Files.update_file_data_by_id( @@ -247,6 +249,13 @@ def upload_file_handler( ), ) + if "channel_id" in file_metadata: + channel = Channels.get_channel_by_id_and_user_id( + file_metadata["channel_id"], user.id + ) + if channel: + Channels.add_file_to_channel_by_id(channel.id, file_item.id, user.id) + if process: if background_tasks and process_in_background: background_tasks.add_task( diff --git a/backend/open_webui/routers/knowledge.py b/backend/open_webui/routers/knowledge.py index f67390518b..1501f8effd 100644 --- a/backend/open_webui/routers/knowledge.py +++ b/backend/open_webui/routers/knowledge.py @@ -363,11 +363,6 @@ def add_file_to_knowledge_by_id( detail=ERROR_MESSAGES.FILE_NOT_PROCESSED, ) - # Add file to knowledge base - Knowledges.add_file_to_knowledge_by_id( - knowledge_id=id, file_id=form_data.file_id, user_id=user.id - ) - # Add content to the vector database try: process_file( @@ -375,6 +370,11 @@ def add_file_to_knowledge_by_id( ProcessFileForm(file_id=form_data.file_id, collection_name=id), user=user, ) + + # Add file to knowledge base + Knowledges.add_file_to_knowledge_by_id( + knowledge_id=id, file_id=form_data.file_id, user_id=user.id + ) except Exception as e: log.debug(e) raise HTTPException( diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte index 26690b3c33..876741eed7 100644 --- a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte +++ b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte @@ -206,16 +206,16 @@ fileItems = [...(fileItems ?? []), fileItem]; try { - // If the file is an audio file, provide the language for STT. - let metadata = null; - if ( - (file.type.startsWith('audio/') || file.type.startsWith('video/')) && + let metadata = { + knowledge_id: knowledge.id, + // If the file is an audio file, provide the language for STT. + ...((file.type.startsWith('audio/') || file.type.startsWith('video/')) && $settings?.audio?.stt?.language - ) { - metadata = { - language: $settings?.audio?.stt?.language - }; - } + ? { + language: $settings?.audio?.stt?.language + } + : {}) + }; const uploadedFile = await uploadFile(localStorage.token, file, metadata).catch((e) => { toast.error(`${e}`); @@ -441,16 +441,14 @@ }; const addFileHandler = async (fileId) => { - const updatedKnowledge = await addFileToKnowledgeById(localStorage.token, id, fileId).catch( - (e) => { - toast.error(`${e}`); - return null; - } - ); + const res = await addFileToKnowledgeById(localStorage.token, id, fileId).catch((e) => { + toast.error(`${e}`); + return null; + }); - if (updatedKnowledge) { - knowledge = updatedKnowledge; + if (res) { toast.success($i18n.t('File added successfully.')); + init(); } else { toast.error($i18n.t('Failed to add file.')); fileItems = fileItems.filter((file) => file.id !== fileId); @@ -462,13 +460,12 @@ console.log('Starting file deletion process for:', fileId); // Remove from knowledge base only - const updatedKnowledge = await removeFileFromKnowledgeById(localStorage.token, id, fileId); + const res = await removeFileFromKnowledgeById(localStorage.token, id, fileId); + console.log('Knowledge base updated:', res); - console.log('Knowledge base updated:', updatedKnowledge); - - if (updatedKnowledge) { - knowledge = updatedKnowledge; + if (res) { toast.success($i18n.t('File removed successfully.')); + await init(); } } catch (e) { console.error('Error in deleteFileHandler:', e); diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte index 14c105f791..37a0ab454f 100644 --- a/src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte +++ b/src/lib/components/workspace/Knowledge/KnowledgeBase/Files.svelte @@ -50,7 +50,9 @@