{"record":{"id":"605e908dae30426f","repo":"headroomlabs-ai/headroom","slug":"memory-memory-id-has-no-embedding-605e90","errorCode":null,"errorMessage":"Memory {memory.id} has no embedding","messagePattern":"Memory (.+?) has no embedding","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"headroom/memory/adapters/sqlite_vector.py","lineNumber":296,"sourceCode":"        conn: sqlite3.Connection,\n        memory_ids: list[str],\n    ) -> dict[str, int]:\n        \"\"\"Fetch rowids for the given memory IDs.\"\"\"\n        rowids: dict[str, int] = {}\n        for chunk in self._chunked(memory_ids):\n            placeholders = \", \".join(\"?\" for _ in chunk)\n            rows = conn.execute(\n                f\"SELECT rowid, memory_id FROM vec_metadata WHERE memory_id IN ({placeholders})\",\n                chunk,\n            ).fetchall()\n            for row in rows:\n                rowids[str(row[\"memory_id\"])] = int(row[\"rowid\"])\n        return rowids\n\n    def _prepare_memory_for_index(self, memory: Memory) -> tuple[np.ndarray, VectorMetadata]:\n        \"\"\"Validate a memory and prepare it for indexing.\"\"\"\n        if memory.embedding is None:\n            raise ValueError(f\"Memory {memory.id} has no embedding\")\n\n        embedding = np.asarray(memory.embedding, dtype=np.float32)\n        if embedding.shape[0] != self._dimension:\n            raise ValueError(\n                f\"Embedding dimension {embedding.shape[0]} does not match \"\n                f\"index dimension {self._dimension}\"\n            )\n\n        return embedding, VectorMetadata.from_memory(memory)\n\n    def _metadata_insert_params(self, memory_id: str, metadata: VectorMetadata) -> tuple[Any, ...]:\n        \"\"\"Build INSERT parameters for vector metadata.\"\"\"\n        return (\n            memory_id,\n            metadata.user_id,\n            metadata.session_id,\n            metadata.agent_id,\n            metadata.importance,","sourceCodeStart":278,"sourceCodeEnd":314,"githubUrl":"https://github.com/headroomlabs-ai/headroom/blob/322425c43bffde1ed0b64fecf3cf5951565dd82b/headroom/memory/adapters/sqlite_vector.py#L278-L314","documentation":"Raised by SQLiteVectorIndex._prepare_memory_for_index when a Memory passed for indexing has embedding None. Like the HNSW backend, the sqlite-vec index only stores pre-computed vectors and expects embedding to be produced by an external Embedder first.","triggerScenarios":"Calling index_memory/add with a memory that skipped the embedding step; embeddings computed asynchronously and not awaited; memories loaded from storage where the embedding column was null.","commonSituations":"Pipeline order bugs (index before embed); optional embeddings in the schema left unset; batch jobs where some records failed embedding earlier.","solutions":["Embed the memory before indexing: memory.embedding = await embedder.embed(memory.content).","Filter or re-queue memories with None embeddings in batch indexing loops.","Make embedding mandatory in your ingest path so un-embedded memories cannot reach the index."],"exampleFix":"// before\nawait index.index_memory(memory)  # embedding is None\n\n// after\nif memory.embedding is None:\n    memory.embedding = await embedder.embed(memory.content)\nawait index.index_memory(memory)","handlingStrategy":"validation","validationCode":"if memory.embedding is None:\n    memory.embedding = await embedder.embed(memory.content)\nawait index.index_memory(memory)","typeGuard":"def has_embedding(m: Memory) -> bool:\n    return m.embedding is not None","tryCatchPattern":"try:\n    await index.index_memory(memory)\nexcept ValueError as e:\n    if \"no embedding\" in str(e):\n        memory.embedding = await embedder.embed(memory.content)\n        await index.index_memory(memory)\n    else:\n        raise","preventionTips":["Enforce embed-then-index ordering in the ingest pipeline.","Skip and log records with missing embeddings in batch jobs instead of aborting."],"tags":["sqlite-vec","embedding","validation","vector-index"],"backgroundTag":null,"analyzedSha":"322425c43bffde1ed0b64fecf3cf5951565dd82b","analyzedAt":"2026-08-15T01:03:05.481Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}