refac: kb files

This commit is contained in:
Timothy Jaeryang Baek 2025-12-10 15:48:27 -05:00
parent f31ca75892
commit c15201620d
5 changed files with 51 additions and 28 deletions

View file

@ -232,6 +232,21 @@ class KnowledgeTable:
except Exception: except Exception:
return None 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]: def get_knowledges_by_file_id(self, file_id: str) -> list[KnowledgeModel]:
try: try:
with get_db() as db: with get_db() as db:

View file

@ -27,6 +27,7 @@ from open_webui.constants import ERROR_MESSAGES
from open_webui.env import SRC_LOG_LEVELS from open_webui.env import SRC_LOG_LEVELS
from open_webui.retrieval.vector.factory import VECTOR_DB_CLIENT 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.users import Users
from open_webui.models.files import ( from open_webui.models.files import (
FileForm, 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" 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) process_file(request, ProcessFileForm(file_id=file_item.id), user=user)
except Exception as e: except Exception as e:
log.error(f"Error processing file: {file_item.id}") log.error(f"Error processing file: {file_item.id}")
Files.update_file_data_by_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 process:
if background_tasks and process_in_background: if background_tasks and process_in_background:
background_tasks.add_task( background_tasks.add_task(

View file

@ -363,11 +363,6 @@ def add_file_to_knowledge_by_id(
detail=ERROR_MESSAGES.FILE_NOT_PROCESSED, 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 # Add content to the vector database
try: try:
process_file( process_file(
@ -375,6 +370,11 @@ def add_file_to_knowledge_by_id(
ProcessFileForm(file_id=form_data.file_id, collection_name=id), ProcessFileForm(file_id=form_data.file_id, collection_name=id),
user=user, 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: except Exception as e:
log.debug(e) log.debug(e)
raise HTTPException( raise HTTPException(

View file

@ -206,16 +206,16 @@
fileItems = [...(fileItems ?? []), fileItem]; fileItems = [...(fileItems ?? []), fileItem];
try { try {
let metadata = {
knowledge_id: knowledge.id,
// If the file is an audio file, provide the language for STT. // If the file is an audio file, provide the language for STT.
let metadata = null; ...((file.type.startsWith('audio/') || file.type.startsWith('video/')) &&
if (
(file.type.startsWith('audio/') || file.type.startsWith('video/')) &&
$settings?.audio?.stt?.language $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) => { const uploadedFile = await uploadFile(localStorage.token, file, metadata).catch((e) => {
toast.error(`${e}`); toast.error(`${e}`);
@ -441,16 +441,14 @@
}; };
const addFileHandler = async (fileId) => { const addFileHandler = async (fileId) => {
const updatedKnowledge = await addFileToKnowledgeById(localStorage.token, id, fileId).catch( const res = await addFileToKnowledgeById(localStorage.token, id, fileId).catch((e) => {
(e) => {
toast.error(`${e}`); toast.error(`${e}`);
return null; return null;
} });
);
if (updatedKnowledge) { if (res) {
knowledge = updatedKnowledge;
toast.success($i18n.t('File added successfully.')); toast.success($i18n.t('File added successfully.'));
init();
} else { } else {
toast.error($i18n.t('Failed to add file.')); toast.error($i18n.t('Failed to add file.'));
fileItems = fileItems.filter((file) => file.id !== fileId); fileItems = fileItems.filter((file) => file.id !== fileId);
@ -462,13 +460,12 @@
console.log('Starting file deletion process for:', fileId); console.log('Starting file deletion process for:', fileId);
// Remove from knowledge base only // 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 (res) {
if (updatedKnowledge) {
knowledge = updatedKnowledge;
toast.success($i18n.t('File removed successfully.')); toast.success($i18n.t('File removed successfully.'));
await init();
} }
} catch (e) { } catch (e) {
console.error('Error in deleteFileHandler:', e); console.error('Error in deleteFileHandler:', e);

View file

@ -50,7 +50,9 @@
<div class="line-clamp-1"> <div class="line-clamp-1">
{file?.name ?? file?.meta?.name} {file?.name ?? file?.meta?.name}
{#if file?.meta?.size}
<span class="text-xs text-gray-500">{formatFileSize(file?.meta?.size)}</span> <span class="text-xs text-gray-500">{formatFileSize(file?.meta?.size)}</span>
{/if}
</div> </div>
</div> </div>
</div> </div>