From c4d5054b7b45ef3cefbc03b999bbfec4cac519da Mon Sep 17 00:00:00 2001 From: Sven Seeberg Date: Tue, 16 Jun 2026 17:28:38 +0200 Subject: [PATCH] Fix knowledge file upload * https://github.com/open-webui/open-webui/issues/24974 --- backend/open_webui/retrieval/vector/utils.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/backend/open_webui/retrieval/vector/utils.py b/backend/open_webui/retrieval/vector/utils.py index 4915b024c3..10321b535f 100644 --- a/backend/open_webui/retrieval/vector/utils.py +++ b/backend/open_webui/retrieval/vector/utils.py @@ -1,5 +1,3 @@ -from datetime import datetime - from open_webui.utils.misc import sanitize_text_for_db KEYS_TO_EXCLUDE = ['content', 'pages', 'tables', 'paragraphs', 'sections', 'figures'] @@ -14,16 +12,20 @@ def filter_metadata(metadata: dict[str, any]) -> dict[str, any]: def process_metadata( metadata: dict[str, any], ) -> dict[str, any]: - # Removes large fields, converts non-serializable types (datetime, list, dict) to strings, - # and sanitizes strings for database storage (strips null bytes and invalid surrogates). + # Returns a dict whose values are only str/int/float/bool, which all supported + # vector DBs accept (notably ChromaDB's Rust bindings, which reject None and + # non-primitive types). Drops KEYS_TO_EXCLUDE and None values; coerces any + # other non-primitive (datetime, list, dict, tuple, bytes, numpy, ...) via str(). result = {} for key, value in metadata.items(): - # Skip large fields if key in KEYS_TO_EXCLUDE: continue - # Convert non-serializable fields to strings - if isinstance(value, (datetime, list, dict)): - result[key] = sanitize_text_for_db(str(value)) - else: + if value is None: + continue + if isinstance(value, bool) or isinstance(value, (int, float)): + result[key] = value + elif isinstance(value, str): result[key] = sanitize_text_for_db(value) + else: + result[key] = sanitize_text_for_db(str(value)) return result