From ea4ef6535ea2dddd86e4a0ccad01849e8c106e3d Mon Sep 17 00:00:00 2001 From: pragnyanramtha Date: Sat, 16 May 2026 15:59:09 +0000 Subject: [PATCH] fix: reject ragged multi-vector embeddings --- test/collection/test_byteops.py | 33 ++++++++++++++++++++++++++++- weaviate/collections/grpc/shared.py | 23 ++++++++++++++++++-- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/test/collection/test_byteops.py b/test/collection/test_byteops.py index f847e179c..072d2bc2b 100644 --- a/test/collection/test_byteops.py +++ b/test/collection/test_byteops.py @@ -1,4 +1,9 @@ -from weaviate.collections.grpc.shared import _ByteOps +import pytest + +from weaviate.collections.grpc.query import _QueryGRPC +from weaviate.collections.grpc.shared import _ByteOps, _Pack, _Unpack +from weaviate.exceptions import WeaviateInvalidInputError +from weaviate.util import _ServerVersion def test_decode_float32s(): @@ -22,3 +27,29 @@ def test_decode_int64s(): assert _ByteOps.decode_int64s( b"\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00" ) == [1, 2] + + +def test_multi_vector_pack_round_trip(): + vector = [[1.0, 2.0], [3.0, 4.0]] + + assert _Unpack.multi(_Pack.multi(vector)) == vector + + +def test_multi_vector_pack_rejects_ragged_vectors(): + with pytest.raises(WeaviateInvalidInputError, match="consistent dimensions"): + _Pack.multi([[1.0, 2.0], [3.0]]) + + +def test_near_vector_request_rejects_ragged_multi_vector(): + query = _QueryGRPC( + _ServerVersion.from_string("1.29.0"), + "TestCollection", + None, + None, + True, + True, + True, + ) + + with pytest.raises(WeaviateInvalidInputError, match="consistent dimensions"): + query.near_vector(near_vector=[[1.0, 2.0], [3.0]]) diff --git a/weaviate/collections/grpc/shared.py b/weaviate/collections/grpc/shared.py index f13e5c4b1..ae4df2b18 100644 --- a/weaviate/collections/grpc/shared.py +++ b/weaviate/collections/grpc/shared.py @@ -802,8 +802,27 @@ def single(vector: OneDimensionalVectorType) -> bytes: @staticmethod def multi(vector: TwoDimensionalVectorType) -> bytes: - vector_list = [item for sublist in vector for item in sublist] - return struct.pack("