{"record":{"id":"3497efaa9798e6cc","repo":"headroomlabs-ai/headroom","slug":"query-vector-dimension-query-vector-shape-0-doe","errorCode":null,"errorMessage":"Query vector dimension {query_vector.shape[0]} does not match index dimension {self._dimension}","messagePattern":"Query vector dimension (.+?) does not match index dimension (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"headroom/memory/adapters/hnsw.py","lineNumber":599,"sourceCode":"\n        Returns:\n            List of search results sorted by similarity (descending).\n\n        Raises:\n            ValueError: If neither query_vector nor query_text is provided,\n                       or if query_text is provided (embedding must be done externally).\n        \"\"\"\n        if filter.query_vector is None:\n            if filter.query_text is not None:\n                raise ValueError(\n                    \"query_text provided but HNSWVectorIndex does not embed text. \"\n                    \"Provide query_vector directly or use an Embedder first.\"\n                )\n            raise ValueError(\"Either query_vector or query_text must be provided\")\n\n        query_vector = np.asarray(filter.query_vector, dtype=np.float32)\n        if query_vector.shape[0] != self._dimension:\n            raise ValueError(\n                f\"Query vector dimension {query_vector.shape[0]} does not match \"\n                f\"index dimension {self._dimension}\"\n            )\n\n        with self._lock:\n            # NOTE: Use len() directly, not self.size - Lock is not reentrant!\n            current_size = len(self._memory_to_hnsw)\n            if current_size == 0:\n                return []\n\n            # Search with more results than needed to account for filtering\n            # Retrieve extra candidates to improve recall after filtering\n            k_with_buffer = min(\n                filter.top_k * 10,  # Get 10x candidates for filtering\n                current_size,  # But not more than we have\n            )\n\n            # Query HNSW index","sourceCodeStart":581,"sourceCodeEnd":617,"githubUrl":"https://github.com/headroomlabs-ai/headroom/blob/322425c43bffde1ed0b64fecf3cf5951565dd82b/headroom/memory/adapters/hnsw.py#L581-L617","documentation":"Raised by HNSWVectorIndex.search when the provided query_vector length does not equal the index's dimension. The HNSW graph computes distances in a fixed-dimensional space, so a mismatched query vector cannot be compared against indexed entries.","triggerScenarios":"Searching an index built for one embedding model with vectors from another; hand-constructed query vectors of the wrong length; truncation or reshaping bugs upstream that alter vector length.","commonSituations":"Switching embedder models after the index was built; using a pooled/averaged vector with unexpected shape; a stale index file loaded with a new default dimension.","solutions":["Verify len(query_vector) == index dimension (exposed via the index's dimension property) before searching.","If the embedder changed, rebuild the index so both dimensions agree.","Log the offending vector's shape at the call site to catch upstream reshape bugs."],"exampleFix":"// before\nresults = await index.search(VectorFilter(query_vector=vec))  # len(vec)=384, index=768\n\n// after\nassert len(vec) == index.dimension, f\"{len(vec)} != {index.dimension}\"\nresults = await index.search(VectorFilter(query_vector=vec))","handlingStrategy":"validation","validationCode":"if len(filter.query_vector) != index.dimension:\n    raise ValueError(f\"query dim {len(filter.query_vector)} != {index.dimension}\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Derive both index dimension and query vectors from the same embedder instance.","Log vector shapes when wiring new embedders."],"tags":["hnsw","search","dimension-mismatch","validation"],"backgroundTag":null,"analyzedSha":"322425c43bffde1ed0b64fecf3cf5951565dd82b","analyzedAt":"2026-08-15T01:03:05.481Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}