{"record":{"id":"37f4ade22991054b","repo":"headroomlabs-ai/headroom","slug":"query-dimension-query-vector-shape-0-does-not-m","errorCode":null,"errorMessage":"Query dimension {query_vector.shape[0]} does not match index dimension {self._dimension}","messagePattern":"Query dimension (.+?) does not match index dimension (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"headroom/memory/adapters/sqlite_vector.py","lineNumber":670,"sourceCode":"        \"\"\"Search for similar vectors.\n\n        Args:\n            filter: Search filter with query vector and constraints.\n\n        Returns:\n            List of search results sorted by similarity (descending).\n        \"\"\"\n        if filter.query_vector is None:\n            if filter.query_text is not None:\n                raise ValueError(\n                    \"query_text provided but SQLiteVectorIndex does not embed text. \"\n                    \"Provide query_vector directly or use an Embedder first.\"\n                )\n            raise ValueError(\"query_vector 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 dimension {query_vector.shape[0]} does not match \"\n                f\"index dimension {self._dimension}\"\n            )\n\n        with self._lock:\n            with self._get_conn() as conn:\n                # sqlite-vec returns distance (lower = more similar for L2)\n                # For cosine, we need to convert: similarity = 1 - distance\n                # But sqlite-vec's cosine distance is already 1 - cosine_similarity\n                # So similarity = 1 - distance\n\n                # Get more results than needed for post-filtering\n                k_with_buffer = filter.top_k * 10\n\n                # Query sqlite-vec for nearest neighbors\n                # sqlite-vec requires 'k = ?' constraint\n                # Use subquery to get KNN results first, then join with metadata\n                rows = conn.execute(","sourceCodeStart":652,"sourceCodeEnd":688,"githubUrl":"https://github.com/headroomlabs-ai/headroom/blob/322425c43bffde1ed0b64fecf3cf5951565dd82b/headroom/memory/adapters/sqlite_vector.py#L652-L688","documentation":"Raised by SQLiteVectorIndex.search when the query vector's length does not equal the index dimension. The sqlite-vec virtual table computes distances in a fixed-dimensional space, so a differently-sized query vector is rejected before the SQL query runs.","triggerScenarios":"Querying with vectors from a different embedding model than the one used at index build time; manually built or reshaped vectors with wrong length; default dimension (384) assumed while the index was created larger.","commonSituations":"Embedder changed between indexing and searching; multiple models in one app writing to one index; dimension defaults disagreeing across services.","solutions":["Assert len(query_vector) == index dimension before searching; log both values on failure.","Pin a single embedder per index/db_path and derive dimension from it everywhere.","If the model legitimately changed, rebuild the index and re-embed all memories."],"exampleFix":"// before\nresults = await index.search(VectorFilter(query_vector=vec))\n\n// after\nif len(vec) != index.dimension:\n    raise ValueError(f\"query dim {len(vec)} != index dim {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 dim {index.dimension}\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Single embedder per index; derive dimension from it on both write and read paths.","Smoke-test search right after index creation to catch dimension drift early."],"tags":["sqlite-vec","search","dimension-mismatch","validation"],"backgroundTag":null,"analyzedSha":"322425c43bffde1ed0b64fecf3cf5951565dd82b","analyzedAt":"2026-08-15T01:03:05.481Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}