diff --git a/backend/open_webui/routers/knowledge.py b/backend/open_webui/routers/knowledge.py index 1501f8effd..be56e3cfc3 100644 --- a/backend/open_webui/routers/knowledge.py +++ b/backend/open_webui/routers/knowledge.py @@ -41,7 +41,11 @@ router = APIRouter() ############################ -@router.get("/", response_model=list[KnowledgeUserResponse]) +class KnowledgeAccessResponse(KnowledgeUserResponse): + write_access: Optional[bool] = False + + +@router.get("/", response_model=list[KnowledgeAccessResponse]) async def get_knowledge(user=Depends(get_verified_user)): # Return knowledge bases with read access knowledge_bases = [] @@ -51,27 +55,29 @@ async def get_knowledge(user=Depends(get_verified_user)): knowledge_bases = Knowledges.get_knowledge_bases_by_user_id(user.id, "read") return [ - KnowledgeUserResponse( + KnowledgeAccessResponse( **knowledge_base.model_dump(), files=Knowledges.get_file_metadatas_by_id(knowledge_base.id), + write_access=has_access(user.id, "write", knowledge_base.access_control), ) for knowledge_base in knowledge_bases ] -@router.get("/list", response_model=list[KnowledgeUserResponse]) +@router.get("/list", response_model=list[KnowledgeAccessResponse]) async def get_knowledge_list(user=Depends(get_verified_user)): # Return knowledge bases with write access knowledge_bases = [] if user.role == "admin" and BYPASS_ADMIN_ACCESS_CONTROL: knowledge_bases = Knowledges.get_knowledge_bases() else: - knowledge_bases = Knowledges.get_knowledge_bases_by_user_id(user.id, "write") + knowledge_bases = Knowledges.get_knowledge_bases_by_user_id(user.id, "read") return [ - KnowledgeUserResponse( + KnowledgeAccessResponse( **knowledge_base.model_dump(), files=Knowledges.get_file_metadatas_by_id(knowledge_base.id), + write_access=has_access(user.id, "write", knowledge_base.access_control), ) for knowledge_base in knowledge_bases ] @@ -187,6 +193,7 @@ async def reindex_knowledge_files(request: Request, user=Depends(get_verified_us class KnowledgeFilesResponse(KnowledgeResponse): files: list[FileMetadataResponse] + write_access: Optional[bool] = False @router.get("/{id}", response_model=Optional[KnowledgeFilesResponse]) @@ -203,6 +210,7 @@ async def get_knowledge_by_id(id: str, user=Depends(get_verified_user)): return KnowledgeFilesResponse( **knowledge.model_dump(), files=Knowledges.get_file_metadatas_by_id(knowledge.id), + write_access=has_access(user.id, "write", knowledge.access_control), ) else: raise HTTPException( diff --git a/src/lib/components/workspace/Knowledge.svelte b/src/lib/components/workspace/Knowledge.svelte index d77ac02066..60556fb216 100644 --- a/src/lib/components/workspace/Knowledge.svelte +++ b/src/lib/components/workspace/Knowledge.svelte @@ -196,76 +196,80 @@
{#each filteredItems as item} - - - +
+ {/each} {:else} diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte index 876741eed7..1dd5c0e15d 100644 --- a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte +++ b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte @@ -429,7 +429,7 @@ }); if (res) { - knowledge = res; + fileItems = []; toast.success($i18n.t('Knowledge reset successfully.')); // Upload directory @@ -747,6 +747,7 @@ class="text-left w-full font-medium text-lg font-primary bg-transparent outline-hidden flex-1" bind:value={knowledge.name} placeholder={$i18n.t('Knowledge Name')} + disabled={!knowledge?.write_access} on:input={() => { changeDebounceHandler(); }} @@ -763,21 +764,27 @@ -
- -
+
+ {$i18n.t('Access')} +
+ + + {:else} +
+ {$i18n.t('Read Only')} +
+ {/if}
@@ -786,6 +793,7 @@ class="text-left text-xs w-full text-gray-500 bg-transparent outline-hidden" bind:value={knowledge.description} placeholder={$i18n.t('Knowledge Description')} + disabled={!knowledge?.write_access} on:input={() => { changeDebounceHandler(); }} @@ -812,22 +820,24 @@ }} /> -
- { - if (e.detail.type === 'directory') { - uploadDirectoryHandler(); - } else if (e.detail.type === 'text') { - showAddTextContentModal = true; - } else { - document.getElementById('files-input').click(); - } - }} - on:sync={(e) => { - showSyncConfirmModal = true; - }} - /> -
+ {#if knowledge?.write_access} +
+ { + if (e.detail.type === 'directory') { + uploadDirectoryHandler(); + } else if (e.detail.type === 'text') { + showAddTextContentModal = true; + } else { + document.getElementById('files-input').click(); + } + }} + on:sync={(e) => { + showSyncConfirmModal = true; + }} + /> +
+ {/if}
@@ -896,6 +906,7 @@
{ selectedFileId = fileId; @@ -959,28 +970,31 @@ {selectedFile?.meta?.name}
-
- -
+ {#if knowledge?.write_access} +
+ +
+ {/if} {#key selectedFile.id}