{"record":{"id":"019552d80be2742b","repo":"headroomlabs-ai/headroom","slug":"query-text-provided-but-sqlitevectorindex-does-not","errorCode":null,"errorMessage":"query_text provided but SQLiteVectorIndex does not embed text. Provide query_vector directly or use an Embedder first.","messagePattern":"query_text provided but SQLiteVectorIndex does not embed text\\. Provide query_vector directly or use an Embedder first\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"headroom/memory/adapters/sqlite_vector.py","lineNumber":662,"sourceCode":"                        f\"DELETE FROM vec_metadata WHERE rowid IN ({placeholders})\",\n                        rowid_chunk,\n                    )\n\n                conn.commit()\n                return len(rowids)\n\n    async def search(self, filter: VectorFilter) -> list[VectorSearchResult]:\n        \"\"\"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","sourceCodeStart":644,"sourceCodeEnd":680,"githubUrl":"https://github.com/headroomlabs-ai/headroom/blob/322425c43bffde1ed0b64fecf3cf5951565dd82b/headroom/memory/adapters/sqlite_vector.py#L644-L680","documentation":"Raised by SQLiteVectorIndex.search when query_vector is None but query_text is set. This backend performs pure vector search over pre-embedded data and has no text embedding capability; the caller must embed the text externally or pass a vector.","triggerScenarios":"Calling search with VectorFilter(query_text=...) directly on SQLiteVectorIndex; code ported from a composite service that embedded internally; assuming the filter's text field is supported everywhere.","commonSituations":"Backend swaps (HNSW facade to raw SQLite index) dropping the embedding step; search handlers built around text input wired straight to the index.","solutions":["Embed the query first: vec = await embedder.embed(text); search with query_vector=vec.","Route text searches through a component that owns both an Embedder and the index.","Standardize on query_vector at the index layer and handle text at a higher layer."],"exampleFix":"// before\nresults = await index.search(VectorFilter(query_text=q))\n\n// after\nresults = await index.search(VectorFilter(query_vector=await embedder.embed(q)))","handlingStrategy":"validation","validationCode":"if filter.query_vector is None and filter.query_text is not None:\n    filter.query_vector = await embedder.embed(filter.query_text)\n    filter.query_text = None\nresults = await index.search(filter)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Wrap the index with an embedding-aware search service.","Pass vectors, not text, to raw vector backends."],"tags":["sqlite-vec","search","query-text","validation"],"backgroundTag":null,"analyzedSha":"322425c43bffde1ed0b64fecf3cf5951565dd82b","analyzedAt":"2026-08-15T01:03:05.481Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}