{"record":{"id":"dfa71a95205fe155","repo":"zeroclaw-labs/zeroclaw","slug":"qdrant-requires-non-zero-dimensional-embeddings","errorCode":null,"errorMessage":"Qdrant requires non-zero dimensional embeddings","messagePattern":"Qdrant requires non-zero dimensional embeddings","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-memory/src/qdrant.rs","lineNumber":935,"sourceCode":"    }\n\n    async fn store_with_agent(\n        &self,\n        key: &str,\n        content: &str,\n        category: MemoryCategory,\n        session_id: Option<&str>,\n        _namespace: Option<&str>,\n        _importance: Option<f64>,\n        agent_id: Option<&str>,\n    ) -> Result<()> {\n        self.ensure_initialized().await?;\n\n        let combined_text = format!(\"{}\\n{}\", key, content);\n        let embedder = self.embedder.read().clone();\n        let embedding = embedder.embed_one(&combined_text).await?;\n        if embedding.is_empty() {\n            anyhow::bail!(\"Qdrant requires non-zero dimensional embeddings\");\n        }\n\n        let id = Uuid::new_v4().to_string();\n        let timestamp = Utc::now().to_rfc3339();\n\n        let resolved_agent_id = agent_id.unwrap_or(\"default\").to_string();\n        let payload = MemoryPayload {\n            key: key.to_string(),\n            content: content.to_string(),\n            category: Self::category_to_str(&category),\n            timestamp,\n            session_id: session_id.map(str::to_string),\n            agent_id: Some(resolved_agent_id.clone()),\n        };\n\n        self.delete_points_matching(&[(\"key\", key), (\"agent_id\", resolved_agent_id.as_str())])\n            .await\n            .context(\"qdrant pre-upsert cleanup failed\")?;","sourceCodeStart":917,"sourceCodeEnd":953,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-memory/src/qdrant.rs#L917-L953","documentation":"store_with_agent() embeds \"<key>\\n<content>\" via embed_one() and requires a non-empty vector because a Qdrant point must carry a vector. If the installed embedder is the no-op provider (dimensions() == 0, empty Vec output), every store fails with this error before any HTTP call. Scroll-based reads (get/list) keep working, which makes it look like a partial outage.","triggerScenarios":"Backend set to qdrant while the memory factory installed the Noop embedder (no embedding provider configured); the embedder was hot-swapped to a provider that returns empty vectors.","commonSituations":"Choosing the qdrant backend for semantic search without configuring model_provider; local setups without an API key for an embedding API; assuming qdrant stores raw text like the sqlite backend.","solutions":["Configure a real embedding provider for memory (model_provider with an embedding-capable profile) and restart","If you don't want embeddings, switch the backend to sqlite (brain.db), which stores and searches without vectors","After a config/set provider change, confirm QdrantMemory::embedder_dimensions() > 0 before writing","Guard store call sites: skip or queue writes while dimensions are 0"],"exampleFix":"# before\n[memory]\nbackend = \"qdrant\"        # no model_provider -> Noop embedder; all stores fail\n\n# after\n[memory]\nbackend = \"qdrant\"\nmodel_provider = \"openai\"  # real embedder; stores now carry vectors","handlingStrategy":"validation","validationCode":"// With the concrete QdrantMemory handle (before any store):\nif qdrant_memory.embedder_dimensions() == 0 {\n    anyhow::bail!(\"configure an embedding provider before storing to the qdrant backend\");\n}","typeGuard":null,"tryCatchPattern":"match memory.store(key, content).await {\n    Err(e) if e.to_string().starts_with(\"Qdrant requires non-zero dimensional embeddings\") => {\n        surface_config_error(\"memory backend needs model_provider with embeddings\"); Ok(())\n    }\n    other => other,\n}","preventionTips":["Never enable the qdrant backend without an embedding-capable model_provider","Check embedder_dimensions() after any config/set provider change","Use the sqlite backend when embeddings are unwanted","Smoke-test one store() at startup to fail fast"],"tags":["qdrant","embeddings","configuration","rust","write-path"],"backgroundTag":"invalid-embedding-vector","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}