{"record":{"id":"badd170934f16739","repo":"MemPalace/mempalace","slug":"metadatas-length-len-metadatas-does-not-match-i-badd17","errorCode":null,"errorMessage":"metadatas length {len(metadatas)} does not match ids length {n}","messagePattern":"metadatas length (.+?) does not match ids length (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mempalace/backends/qdrant.py","lineNumber":231,"sourceCode":"            if not any(_matches_where_document(document, clause) for clause in value or []):\n                return False\n            continue\n        raise UnsupportedFilterError(f\"where_document operator {key!r} not supported\")\n    return True\n\n\ndef _validate_write_batch(\n    *,\n    documents: list[str],\n    ids: list[str],\n    metadatas: Optional[list[dict]],\n    embeddings: Optional[list[list[float]]],\n) -> None:\n    n = len(ids)\n    if len(documents) != n:\n        raise ValueError(f\"documents length {len(documents)} does not match ids length {n}\")\n    if metadatas is not None and len(metadatas) != n:\n        raise ValueError(f\"metadatas length {len(metadatas)} does not match ids length {n}\")\n    if embeddings is not None and len(embeddings) != n:\n        raise ValueError(f\"embeddings length {len(embeddings)} does not match ids length {n}\")\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))","sourceCodeStart":213,"sourceCodeEnd":249,"githubUrl":"https://github.com/MemPalace/mempalace/blob/06cb6987f02610784fefbad4b2bd5d026d164ba6/mempalace/backends/qdrant.py#L213-L249","documentation":"_validate_write_batch requires that when metadatas is provided its length matches len(ids). The check fires before any network call, raising ValueError so a truncated or extended metadata list cannot be paired with the wrong documents.","triggerScenarios":"add(ids=[\"1\",\"2\"], documents=[d1,d2], metadatas=[m1]) — metadata built per-document but one entry dropped/skipped by a conditional.","commonSituations":"Metadata dicts appended inside try/except blocks that swallow failures; defaulting some rows to no metadata and building a shorter list.","solutions":["Ensure one metadata entry per id; use [{}] as a placeholder when a row has no metadata (or pass None entirely).","Construct the batch as records and derive all arrays together.","Assert equal lengths in your ingest pipeline before calling add/upsert."],"exampleFix":"# before\nmetas = [m for m in raw_metas if m]  # may drop entries\ncol.add(ids=ids, documents=docs, metadatas=metas)\n\n# after\nmetas = [m if m else {} for m in raw_metas]\ncol.add(ids=ids, documents=docs, metadatas=metas)","handlingStrategy":"validation","validationCode":"metas = [m or {} for m in metas]  # one per id, never fewer\nassert len(metas) == len(ids)\ncol.add(ids=ids, documents=docs, metadatas=metas)","typeGuard":"def metadata_aligned(ids, metas) -> bool:\n    return metas is None or len(metas) == len(ids)","tryCatchPattern":"try:\n    col.add(ids=ids, documents=docs, metadatas=metas)\nexcept ValueError as e:\n    if \"metadatas length\" in str(e):\n        metas = (metas or []) + [{}] * (len(ids) - len(metas or []))\n        col.add(ids=ids, documents=docs, metadatas=metas)","preventionTips":["Never conditionally append metadata; use {} placeholders so lengths stay equal.","Pass metadatas=None when none of the rows have metadata."],"tags":["qdrant","validation","batch-mismatch","metadata"],"backgroundTag":null,"analyzedSha":"06cb6987f02610784fefbad4b2bd5d026d164ba6","analyzedAt":"2026-08-15T03:03:36.213Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}