From aeb43f038cf9301e6c36943171739dfa0d77457f Mon Sep 17 00:00:00 2001 From: expruc Date: Mon, 13 Oct 2025 13:57:24 +0300 Subject: [PATCH 1/4] Added option to prevent attachment of individual files from knowledges --- backend/open_webui/config.py | 7 +++++++ backend/open_webui/main.py | 9 +++++++++ backend/open_webui/routers/auths.py | 6 ++++++ .../chat/MessageInput/InputMenu/Knowledge.svelte | 6 ++++-- src/lib/stores/index.ts | 1 + 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 41e88df5d2..a8e9aaa781 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1542,6 +1542,13 @@ ENABLE_CHANNELS = PersistentConfig( os.environ.get("ENABLE_CHANNELS", "False").lower() == "true", ) +ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS = PersistentConfig( + "ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS", + "knowledge.individual_file_attachments.enable", + os.environ.get("ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS", "True").lower() + == "true", +) + ENABLE_NOTES = PersistentConfig( "ENABLE_NOTES", "notes.enable", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index dc4468e8e7..092e87fe9c 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -218,6 +218,7 @@ from open_webui.config import ( RAG_TEMPLATE, DEFAULT_RAG_TEMPLATE, RAG_FULL_CONTEXT, + ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS, BYPASS_EMBEDDING_AND_RETRIEVAL, RAG_EMBEDDING_MODEL, RAG_EMBEDDING_MODEL_AUTO_UPDATE, @@ -355,6 +356,7 @@ from open_webui.config import ( API_KEYS_ALLOWED_ENDPOINTS, ENABLE_FOLDERS, ENABLE_CHANNELS, + ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS, ENABLE_NOTES, ENABLE_COMMUNITY_SHARING, ENABLE_MESSAGE_RATING, @@ -771,6 +773,9 @@ app.state.config.BANNERS = WEBUI_BANNERS app.state.config.ENABLE_FOLDERS = ENABLE_FOLDERS app.state.config.ENABLE_CHANNELS = ENABLE_CHANNELS +app.state.config.ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS = ( + ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS +) app.state.config.ENABLE_NOTES = ENABLE_NOTES app.state.config.ENABLE_COMMUNITY_SHARING = ENABLE_COMMUNITY_SHARING app.state.config.ENABLE_MESSAGE_RATING = ENABLE_MESSAGE_RATING @@ -843,6 +848,9 @@ app.state.config.FILE_IMAGE_COMPRESSION_HEIGHT = FILE_IMAGE_COMPRESSION_HEIGHT app.state.config.RAG_FULL_CONTEXT = RAG_FULL_CONTEXT +app.state.config.ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS = ( + ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS +) app.state.config.BYPASS_EMBEDDING_AND_RETRIEVAL = BYPASS_EMBEDDING_AND_RETRIEVAL app.state.config.ENABLE_RAG_HYBRID_SEARCH = ENABLE_RAG_HYBRID_SEARCH app.state.config.ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS = ( @@ -1850,6 +1858,7 @@ async def get_app_config(request: Request): "enable_folders": app.state.config.ENABLE_FOLDERS, "enable_channels": app.state.config.ENABLE_CHANNELS, "enable_notes": app.state.config.ENABLE_NOTES, + "enable_individual_knowledge_file_attachments": app.state.config.ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS, "enable_web_search": app.state.config.ENABLE_WEB_SEARCH, "enable_code_execution": app.state.config.ENABLE_CODE_EXECUTION, "enable_code_interpreter": app.state.config.ENABLE_CODE_INTERPRETER, diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py index 3d83dcaea6..1190dcfe50 100644 --- a/backend/open_webui/routers/auths.py +++ b/backend/open_webui/routers/auths.py @@ -940,6 +940,7 @@ async def get_admin_config(request: Request, user=Depends(get_admin_user)): "ENABLE_CHANNELS": request.app.state.config.ENABLE_CHANNELS, "ENABLE_NOTES": request.app.state.config.ENABLE_NOTES, "ENABLE_USER_WEBHOOKS": request.app.state.config.ENABLE_USER_WEBHOOKS, + "ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS": request.app.state.config.ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS, "PENDING_USER_OVERLAY_TITLE": request.app.state.config.PENDING_USER_OVERLAY_TITLE, "PENDING_USER_OVERLAY_CONTENT": request.app.state.config.PENDING_USER_OVERLAY_CONTENT, "RESPONSE_WATERMARK": request.app.state.config.RESPONSE_WATERMARK, @@ -962,6 +963,7 @@ class AdminConfig(BaseModel): ENABLE_CHANNELS: bool ENABLE_NOTES: bool ENABLE_USER_WEBHOOKS: bool + ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS: bool PENDING_USER_OVERLAY_TITLE: Optional[str] = None PENDING_USER_OVERLAY_CONTENT: Optional[str] = None RESPONSE_WATERMARK: Optional[str] = None @@ -986,6 +988,9 @@ async def update_admin_config( request.app.state.config.ENABLE_FOLDERS = form_data.ENABLE_FOLDERS request.app.state.config.ENABLE_CHANNELS = form_data.ENABLE_CHANNELS request.app.state.config.ENABLE_NOTES = form_data.ENABLE_NOTES + request.app.state.config.ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS = ( + form_data.ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS + ) if form_data.DEFAULT_USER_ROLE in ["pending", "user", "admin"]: request.app.state.config.DEFAULT_USER_ROLE = form_data.DEFAULT_USER_ROLE @@ -1030,6 +1035,7 @@ async def update_admin_config( "ENABLE_CHANNELS": request.app.state.config.ENABLE_CHANNELS, "ENABLE_NOTES": request.app.state.config.ENABLE_NOTES, "ENABLE_USER_WEBHOOKS": request.app.state.config.ENABLE_USER_WEBHOOKS, + "ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS": request.app.state.config.ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS, "PENDING_USER_OVERLAY_TITLE": request.app.state.config.PENDING_USER_OVERLAY_TITLE, "PENDING_USER_OVERLAY_CONTENT": request.app.state.config.PENDING_USER_OVERLAY_CONTENT, "RESPONSE_WATERMARK": request.app.state.config.RESPONSE_WATERMARK, diff --git a/src/lib/components/chat/MessageInput/InputMenu/Knowledge.svelte b/src/lib/components/chat/MessageInput/InputMenu/Knowledge.svelte index df8d8aabab..a49de7906f 100644 --- a/src/lib/components/chat/MessageInput/InputMenu/Knowledge.svelte +++ b/src/lib/components/chat/MessageInput/InputMenu/Knowledge.svelte @@ -2,7 +2,7 @@ import { onMount, tick, getContext } from 'svelte'; import { decodeString } from '$lib/utils'; - import { knowledge } from '$lib/stores'; + import { knowledge, config } from '$lib/stores'; import { getKnowledgeBases } from '$lib/apis/knowledge'; @@ -99,7 +99,9 @@ }; } ); - + if (!($config?.features?.enable_individual_knowledge_file_attachments ?? true)) { + items = items.filter((it) => it.type !== 'file'); + } await tick(); loaded = true; diff --git a/src/lib/stores/index.ts b/src/lib/stores/index.ts index 57257d59d3..fe7e6688b5 100644 --- a/src/lib/stores/index.ts +++ b/src/lib/stores/index.ts @@ -274,6 +274,7 @@ type Config = { enable_autocomplete_generation: boolean; enable_direct_connections: boolean; enable_version_update_check: boolean; + enable_individual_knowledge_file_attachments: boolean; }; oauth: { providers: { From d42e8d2b67696c8b77b2050411558f9eb08e2c92 Mon Sep 17 00:00:00 2001 From: expruc Date: Fri, 17 Oct 2025 21:34:57 +0300 Subject: [PATCH 2/4] fixed knowledge attachment using # not filtering out knowledge files --- .../chat/MessageInput/Commands/Knowledge.svelte | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/lib/components/chat/MessageInput/Commands/Knowledge.svelte b/src/lib/components/chat/MessageInput/Commands/Knowledge.svelte index 77e5c16804..314a5e9107 100644 --- a/src/lib/components/chat/MessageInput/Commands/Knowledge.svelte +++ b/src/lib/components/chat/MessageInput/Commands/Knowledge.svelte @@ -13,7 +13,7 @@ import Database from '$lib/components/icons/Database.svelte'; import GlobeAlt from '$lib/components/icons/GlobeAlt.svelte'; import Youtube from '$lib/components/icons/Youtube.svelte'; - import { folders } from '$lib/stores'; + import { folders, config } from '$lib/stores'; import Folder from '$lib/components/icons/Folder.svelte'; const i18n = getContext('i18n'); @@ -167,6 +167,16 @@ }; }); + // if ($config?.features?.enable_individual_knowledge_file_attachments) { + // items = items.filter((item) => item.type === 'file'); + // } + // else { + // items = items.filter((item) => item.type === 'collection'); + // } + if (!($config?.features?.enable_individual_knowledge_file_attachments ?? true)) { + items = items.filter((it) => it.type !== 'file'); + } + fuse = new Fuse(items, { keys: ['name', 'description'] }); From 4e615141024027e723c98a7e5c8c949a8d7bfa56 Mon Sep 17 00:00:00 2001 From: expruc Date: Fri, 17 Oct 2025 22:28:35 +0300 Subject: [PATCH 3/4] added option to toggle from UI (general settings) --- src/lib/components/admin/Settings/General.svelte | 7 +++++++ .../components/chat/MessageInput/Commands/Knowledge.svelte | 6 ------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/lib/components/admin/Settings/General.svelte b/src/lib/components/admin/Settings/General.svelte index 390334b215..f0a16a6933 100644 --- a/src/lib/components/admin/Settings/General.svelte +++ b/src/lib/components/admin/Settings/General.svelte @@ -707,6 +707,13 @@ +
+
+ {$i18n.t('Allow Individual Knowledge File Attachments')} +
+ + +
diff --git a/src/lib/components/chat/MessageInput/Commands/Knowledge.svelte b/src/lib/components/chat/MessageInput/Commands/Knowledge.svelte index 314a5e9107..27552f5b17 100644 --- a/src/lib/components/chat/MessageInput/Commands/Knowledge.svelte +++ b/src/lib/components/chat/MessageInput/Commands/Knowledge.svelte @@ -167,12 +167,6 @@ }; }); - // if ($config?.features?.enable_individual_knowledge_file_attachments) { - // items = items.filter((item) => item.type === 'file'); - // } - // else { - // items = items.filter((item) => item.type === 'collection'); - // } if (!($config?.features?.enable_individual_knowledge_file_attachments ?? true)) { items = items.filter((it) => it.type !== 'file'); } From ebdf5a747719fb1b6d97bff5697190f21eab704f Mon Sep 17 00:00:00 2001 From: expruc Date: Sat, 6 Dec 2025 17:57:30 +0200 Subject: [PATCH 4/4] cleanup --- backend/open_webui/main.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 092e87fe9c..634653256d 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -218,7 +218,6 @@ from open_webui.config import ( RAG_TEMPLATE, DEFAULT_RAG_TEMPLATE, RAG_FULL_CONTEXT, - ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS, BYPASS_EMBEDDING_AND_RETRIEVAL, RAG_EMBEDDING_MODEL, RAG_EMBEDDING_MODEL_AUTO_UPDATE, @@ -776,6 +775,7 @@ app.state.config.ENABLE_CHANNELS = ENABLE_CHANNELS app.state.config.ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS = ( ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS ) + app.state.config.ENABLE_NOTES = ENABLE_NOTES app.state.config.ENABLE_COMMUNITY_SHARING = ENABLE_COMMUNITY_SHARING app.state.config.ENABLE_MESSAGE_RATING = ENABLE_MESSAGE_RATING @@ -848,9 +848,6 @@ app.state.config.FILE_IMAGE_COMPRESSION_HEIGHT = FILE_IMAGE_COMPRESSION_HEIGHT app.state.config.RAG_FULL_CONTEXT = RAG_FULL_CONTEXT -app.state.config.ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS = ( - ENABLE_INDIVIDUAL_KNOWLEDGE_FILE_ATTACHMENTS -) app.state.config.BYPASS_EMBEDDING_AND_RETRIEVAL = BYPASS_EMBEDDING_AND_RETRIEVAL app.state.config.ENABLE_RAG_HYBRID_SEARCH = ENABLE_RAG_HYBRID_SEARCH app.state.config.ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS = (