{"record":{"id":"a647869c725856d8","repo":"run-llama/llama_index","slug":"delete-nodes-not-implemented","errorCode":null,"errorMessage":"delete_nodes not implemented","messagePattern":"delete_nodes not implemented","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"llama-index-core/llama_index/core/vector_stores/types.py","lineNumber":402,"sourceCode":"        \"\"\"\n        Delete nodes using with ref_doc_id.\"\"\"\n\n    async def adelete(self, ref_doc_id: str, **delete_kwargs: Any) -> None:\n        \"\"\"\n        Delete nodes using with ref_doc_id.\n        NOTE: this is not implemented for all vector stores. If not implemented,\n        it will just call delete synchronously.\n        \"\"\"\n        self.delete(ref_doc_id, **delete_kwargs)\n\n    def delete_nodes(\n        self,\n        node_ids: Optional[List[str]] = None,\n        filters: Optional[MetadataFilters] = None,\n        **delete_kwargs: Any,\n    ) -> None:\n        \"\"\"Delete nodes from vector store.\"\"\"\n        raise NotImplementedError(\"delete_nodes not implemented\")\n\n    async def adelete_nodes(\n        self,\n        node_ids: Optional[List[str]] = None,\n        filters: Optional[MetadataFilters] = None,\n        **delete_kwargs: Any,\n    ) -> None:\n        \"\"\"Asynchronously delete nodes from vector store.\"\"\"\n        self.delete_nodes(node_ids, filters)\n\n    def clear(self) -> None:\n        \"\"\"Clear all nodes from configured vector store.\"\"\"\n        raise NotImplementedError(\"clear not implemented\")\n\n    async def aclear(self) -> None:\n        \"\"\"Asynchronously clear all nodes from configured vector store.\"\"\"\n        self.clear()\n","sourceCodeStart":384,"sourceCodeEnd":420,"githubUrl":"https://github.com/run-llama/llama_index/blob/afd0fef371831f9bda13e5af7167cf4e981278ab/llama-index-core/llama_index/core/vector_stores/types.py#L384-L420","documentation":"`BaseVectorStore.delete_nodes()` follows the same pattern as get_nodes: declared on the base class with a default body that raises NotImplementedError, overridden only by stores that support node-level deletion. Many integrations only implement document-level `delete(ref_doc_id)`. The async `adelete_nodes()` delegates synchronously, so it raises the same error.","triggerScenarios":"Calling `store.delete_nodes(node_ids=[...])` or `store.delete_nodes(filters=...)` on a store integration without the override; code that assumes fine-grained node deletion exists everywhere (e.g. partial re-indexing pipelines).","commonSituations":"Building incremental ingestion that prunes stale chunks by node id; switching backends from a store that supports node deletion (Qdrant, Chroma) to one that does not; cleanup scripts run against the default SimpleVectorStore-backed index.","solutions":["Detect support before calling: `type(store).delete_nodes is not BaseVectorStore.delete_nodes`.","Fall back to document-level deletion: `store.delete(ref_doc_id)` for each affected document, then re-add.","Use a store integration that implements delete_nodes if per-node deletion is required.","Wrap calls in try/except NotImplementedError for multi-backend tooling."],"exampleFix":"# before\nstore.delete_nodes(node_ids=stale_ids)  # NotImplementedError\n\n# after\nfrom llama_index.core.vector_stores import BaseVectorStore\nif type(store).delete_nodes is not BaseVectorStore.delete_nodes:\n    store.delete_nodes(node_ids=stale_ids)\nelse:\n    for doc_id in stale_ref_doc_ids:\n        store.delete(doc_id)","handlingStrategy":"fallback","validationCode":"from llama_index.core.vector_stores import BaseVectorStore\n\ndef supports_delete_nodes(store) -> bool:\n    return type(store).delete_nodes is not BaseVectorStore.delete_nodes","typeGuard":null,"tryCatchPattern":"try:\n    store.delete_nodes(node_ids=stale_ids)\nexcept NotImplementedError:\n    for ref in affected_ref_doc_ids:\n        store.delete(ref)","preventionTips":["Track node_id -> ref_doc_id mappings so document-level delete is always a viable fallback.","Probe delete_nodes support per store class before running incremental updates.","Prefer delete-by-document in portable pipelines."],"tags":["vector-store","not-implemented","deletion","python"],"backgroundTag":null,"analyzedSha":"afd0fef371831f9bda13e5af7167cf4e981278ab","analyzedAt":"2026-08-15T05:42:58.429Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}