{"record":{"id":"8a7d6f1603d05fa6","repo":"MemPalace/mempalace","slug":"embedding-must-be-a-non-empty-1d-vector","errorCode":null,"errorMessage":"embedding must be a non-empty 1D vector","messagePattern":"embedding must be a non-empty 1D vector","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mempalace/backends/milvus.py","lineNumber":212,"sourceCode":"            parts.append(\"(\" + \" or \".join(part for part in nested if part) + \")\")\n        else:\n            raise UnsupportedFilterError(f\"where_document operator {key!r} not supported\")\n    return \" and \".join(part for part in parts if part)\n\n\ndef _combine_filter(*filters: str) -> str:\n    present = [flt for flt in filters if flt]\n    if not present:\n        return \"\"\n    if len(present) == 1:\n        return present[0]\n    return \"(\" + \") and (\".join(present) + \")\"\n\n\ndef _as_vector_array(vector: list[float]) -> np.ndarray:\n    arr = np.asarray(vector, dtype=np.float32)\n    if arr.ndim != 1 or arr.size == 0:\n        raise ValueError(\"embedding must be a non-empty 1D vector\")\n    return arr\n\n\ndef _normalize_vectors(embeddings: list[list[float]]) -> tuple[list[list[float]], int]:\n    vectors = []\n    dims = set()\n    for embedding in embeddings:\n        arr = _as_vector_array(embedding)\n        vectors.append(arr.astype(float).tolist())\n        dims.add(int(arr.size))\n    if len(dims) > 1:\n        raise DimensionMismatchError(f\"milvus batch cannot mix embedding dimensions {sorted(dims)}\")\n    return vectors, dims.pop() if dims else 0\n\n\ndef _clean_text(value: Any) -> str:\n    text = \"\" if value is None else str(value)\n    return strip_lone_surrogates(text).replace(\"\\x00\", \"\")","sourceCodeStart":194,"sourceCodeEnd":230,"githubUrl":"https://github.com/MemPalace/mempalace/blob/06cb6987f02610784fefbad4b2bd5d026d164ba6/mempalace/backends/milvus.py#L194-L230","documentation":"Raised by _as_vector_array() when an embedding passed to add/upsert/query is not a non-empty 1D vector — np.asarray(...).ndim != 1 or size == 0. This is a plain ValueError (not BackendError), thrown before any Milvus call, catching malformed embeddings such as 2D nested lists, scalars, empty lists, or ragged inputs that numpy flattens oddly.","triggerScenarios":"add(ids=[\"1\"], embeddings=[[]]) (empty vector), embeddings=[[[0.1, 0.2]]] (nested list → ndim 2), embeddings=[0.5] (scalar → ndim 0), or query_texts with a query embedding of [] instead of a real vector.","commonSituations":"Embedding API failures that return empty arrays; passing a batch matrix where a single row is expected (or vice versa); chunking bugs that produce zero-length text embeddings.","solutions":["Check each embedding is a non-empty flat list of floats before calling add/query","Fix batch shape: pass one row per id/document, not the whole matrix as one embedding","Log and skip failed embedder calls rather than forwarding empty outputs"],"exampleFix":"# before\ncollection.add(ids=[\"1\"], documents=[\"text\"], embeddings=[[]])\n\n# after\nif not emb:  # embedder returned nothing\n    raise RuntimeError(\"embedder returned empty vector\")\ncollection.add(ids=[\"1\"], documents=[\"text\"], embeddings=[emb])","handlingStrategy":"validation","validationCode":"import numpy as np\n\ndef valid_embeddings(embeddings) -> bool:\n    try:\n        for e in embeddings:\n            arr = np.asarray(e, dtype=np.float32)\n            if arr.ndim != 1 or arr.size == 0:\n                return False\n    except (TypeError, ValueError):\n        return False\n    return True","typeGuard":"def is_nonempty_1d_vector(v) -> bool:\n    return isinstance(v, (list, tuple)) and len(v) > 0 and all(isinstance(x, (int, float)) and not isinstance(x, bool) for x in v)","tryCatchPattern":"try:\n    collection.add(ids=ids, documents=docs, embeddings=embs)\nexcept ValueError as e:\n    if \"non-empty 1D vector\" in str(e):\n        raise RuntimeError(f\"embedder produced malformed vectors for {len(embs)} inputs\") from e\n    raise","preventionTips":["Assert embedder output length matches input count and is non-empty","Skip or fail loudly on empty embedder results; never forward them","Check ndim==1 before batch insert"],"tags":["milvus","embeddings","validation","shape"],"backgroundTag":null,"analyzedSha":"06cb6987f02610784fefbad4b2bd5d026d164ba6","analyzedAt":"2026-08-15T03:03:36.213Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}