Skip to content

Commit 8dba798

Browse files
committed
refac
1 parent 9dccd29 commit 8dba798

2 files changed

Lines changed: 16 additions & 7 deletions

File tree

backend/open_webui/retrieval/vector/dbs/pgvector.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
SearchResult,
3535
GetResult,
3636
)
37+
from open_webui.utils.misc import sanitize_text_for_db
3738
from open_webui.config import (
3839
PGVECTOR_DB_URL,
3940
PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH,
@@ -289,7 +290,9 @@ def insert(self, collection_name: str, items: List[VectorItem]) -> None:
289290
vector = self.adjust_vector_length(item['vector'])
290291
# Use raw SQL for BYTEA/pgcrypto
291292
# Ensure metadata is converted to its JSON text representation
292-
json_metadata = json.dumps(item['metadata'])
293+
# Sanitize to strip null bytes / surrogates that PostgreSQL cannot store
294+
json_metadata = sanitize_text_for_db(json.dumps(item['metadata']))
295+
item_text = sanitize_text_for_db(item['text'])
293296
self.session.execute(
294297
text("""
295298
INSERT INTO document_chunk
@@ -305,7 +308,7 @@ def insert(self, collection_name: str, items: List[VectorItem]) -> None:
305308
'id': item['id'],
306309
'vector': vector,
307310
'collection_name': collection_name,
308-
'text': item['text'],
311+
'text': item_text,
309312
'metadata_text': json_metadata,
310313
'key': PGVECTOR_PGCRYPTO_KEY,
311314
},
@@ -338,7 +341,9 @@ def upsert(self, collection_name: str, items: List[VectorItem]) -> None:
338341
if PGVECTOR_PGCRYPTO:
339342
for item in items:
340343
vector = self.adjust_vector_length(item['vector'])
341-
json_metadata = json.dumps(item['metadata'])
344+
# Sanitize to strip null bytes / surrogates that PostgreSQL cannot store
345+
json_metadata = sanitize_text_for_db(json.dumps(item['metadata']))
346+
item_text = sanitize_text_for_db(item['text'])
342347
self.session.execute(
343348
text("""
344349
INSERT INTO document_chunk
@@ -358,7 +363,7 @@ def upsert(self, collection_name: str, items: List[VectorItem]) -> None:
358363
'id': item['id'],
359364
'vector': vector,
360365
'collection_name': collection_name,
361-
'text': item['text'],
366+
'text': item_text,
362367
'metadata_text': json_metadata,
363368
'key': PGVECTOR_PGCRYPTO_KEY,
364369
},

backend/open_webui/retrieval/vector/utils.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from datetime import datetime
22

3+
from open_webui.utils.misc import sanitize_text_for_db
4+
35
KEYS_TO_EXCLUDE = ['content', 'pages', 'tables', 'paragraphs', 'sections', 'figures']
46

57

@@ -12,15 +14,17 @@ def filter_metadata(metadata: dict[str, any]) -> dict[str, any]:
1214
def process_metadata(
1315
metadata: dict[str, any],
1416
) -> dict[str, any]:
15-
# Removes large fields and converts non-serializable types (datetime, list, dict) to strings.
17+
# Removes large fields, converts non-serializable types (datetime, list, dict) to strings,
18+
# and sanitizes strings for database storage (strips null bytes and invalid surrogates).
1619
result = {}
1720
for key, value in metadata.items():
1821
# Skip large fields
1922
if key in KEYS_TO_EXCLUDE:
2023
continue
2124
# Convert non-serializable fields to strings
2225
if isinstance(value, (datetime, list, dict)):
23-
result[key] = str(value)
26+
result[key] = sanitize_text_for_db(str(value))
2427
else:
25-
result[key] = value
28+
result[key] = sanitize_text_for_db(value)
2629
return result
30+

0 commit comments

Comments
 (0)