fix: apply the shared metadata size cap to the last four vector DB backends (#29502)

Chunk metadata inserted into the vector DB carries arbitrary client-
supplied fields (e.g. custom metadata from file uploads), so it needs
the same size cap, type coercion and null-byte sanitization every
other backend already applies through process_metadata(). Four
backends never called it: Qdrant, Qdrant multitenancy, Milvus
multitenancy and Oracle23ai, so an oversized or malformed metadata
blob went into those unfiltered.

Wire process_metadata() in at each backend's single insert/upsert
chokepoint, matching the pattern already used by the other eleven
backends.
This commit is contained in:
Classic298 2026-09-04 17:42:20 +02:00 committed by GitHub
parent 82f11b14c9
commit ea1b58eb6a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 8 additions and 7 deletions

View file

@ -24,6 +24,7 @@ from open_webui.retrieval.vector.main import (
VectorDBBase,
VectorItem,
)
from open_webui.retrieval.vector.utils import process_metadata
from pymilvus import DataType
from pymilvus import MilvusClient as Client
from pymilvus.exceptions import MilvusException
@ -191,7 +192,7 @@ class MilvusClient(VectorDBBase):
'id': item['id'],
'vector': item['vector'],
'text': text,
'metadata': item['metadata'],
'metadata': process_metadata(item['metadata']),
RESOURCE_ID_FIELD: resource_id,
}
)

View file

@ -57,7 +57,7 @@ from open_webui.retrieval.vector.main import (
VectorDBBase,
VectorItem,
)
from open_webui.retrieval.vector.utils import iter_filter_conditions
from open_webui.retrieval.vector.utils import iter_filter_conditions, process_metadata
from open_webui.utils.json_codec import JSONCodec
log = logging.getLogger(__name__)
@ -400,7 +400,7 @@ class Oracle23aiClient(VectorDBBase):
Returns:
str: JSON representation of metadata
"""
return json.dumps(metadata, default=self._decimal_handler) if metadata else '{}'
return json.dumps(process_metadata(metadata), default=self._decimal_handler) if metadata else '{}'
def _json_to_metadata(self, json_str: str) -> Dict:
"""

View file

@ -22,7 +22,7 @@ from open_webui.retrieval.vector.main import (
VectorDBBase,
VectorItem,
)
from open_webui.retrieval.vector.utils import iter_filter_conditions
from open_webui.retrieval.vector.utils import iter_filter_conditions, process_metadata
from qdrant_client import QdrantClient as Qclient
from qdrant_client.http.models import PointStruct
from qdrant_client.models import models
@ -136,7 +136,7 @@ class QdrantClient(VectorDBBase):
PointStruct(
id=item['id'],
vector=item['vector'],
payload={'text': item['text'], 'metadata': item['metadata']},
payload={'text': item['text'], 'metadata': process_metadata(item['metadata'])},
)
for item in items
]

View file

@ -23,7 +23,7 @@ from open_webui.retrieval.vector.main import (
VectorDBBase,
VectorItem,
)
from open_webui.retrieval.vector.utils import iter_filter_conditions
from open_webui.retrieval.vector.utils import iter_filter_conditions, process_metadata
from qdrant_client import QdrantClient as Qclient
from qdrant_client.http.exceptions import UnexpectedResponse
from qdrant_client.http.models import PointStruct
@ -182,7 +182,7 @@ class QdrantClient(VectorDBBase):
vector=item['vector'],
payload={
'text': item['text'],
'metadata': item['metadata'],
'metadata': process_metadata(item['metadata']),
TENANT_ID_FIELD: tenant_id,
},
)