From 967b1137dcb7a52615f17d086ee89095bb9b60f3 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 7 Mar 2026 19:31:51 -0600 Subject: [PATCH] refac --- backend/open_webui/utils/middleware.py | 32 ++++++++++++++++++++++---- backend/open_webui/utils/tools.py | 4 ++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 4aa7c2f41..18bddc531 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -2241,10 +2241,34 @@ async def process_chat_payload(request, form_data, user, metadata, model): folder.data["system_prompt"], form_data, metadata, user ) if "files" in folder.data: - form_data["files"] = [ - *folder.data["files"], - *form_data.get("files", []), - ] + folder_files = folder.data["files"] + if ( + metadata.get("params", {}).get("function_calling") + == "native" + ): + # Native FC: knowledge files will be handled by the + # builtin query_knowledge_files tool, not RAG. + knowledge_files = [ + f + for f in folder_files + if f.get("type") == "collection" + or f.get("collection_names") + ] + attachment_files = [ + f + for f in folder_files + if f not in knowledge_files + ] + form_data["files"] = [ + *attachment_files, + *form_data.get("files", []), + ] + metadata["folder_knowledge"] = knowledge_files + else: + form_data["files"] = [ + *folder_files, + *form_data.get("files", []), + ] # Model "Knowledge" handling user_message = get_last_user_message(form_data["messages"]) diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index 7c5542907..081e2f5fa 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -432,6 +432,10 @@ def get_builtin_tools( # If model has attached knowledge (any type), only provide query_knowledge_files # Otherwise, provide all KB browsing tools model_knowledge = model.get("info", {}).get("meta", {}).get("knowledge", []) + # Merge folder-attached knowledge so builtin tools can search it + folder_knowledge = extra_params.get("__metadata__", {}).get("folder_knowledge") + if folder_knowledge: + model_knowledge = list(model_knowledge or []) + list(folder_knowledge) if is_builtin_tool_enabled("knowledge"): if model_knowledge: # Model has attached knowledge - only allow semantic search within it