{"record":{"id":"906c2e9fd363cd96","repo":"run-llama/llama_index","slug":"get-nodes-not-implemented","errorCode":null,"errorMessage":"get_nodes not implemented","messagePattern":"get_nodes not implemented","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"llama-index-core/llama_index/core/vector_stores/types.py","lineNumber":352,"sourceCode":"class BasePydanticVectorStore(BaseComponent, ABC):\n    \"\"\"Abstract vector store protocol.\"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n    stores_text: bool\n    is_embedding_query: bool = True\n\n    @property\n    @abstractmethod\n    def client(self) -> Any:\n        \"\"\"Get client.\"\"\"\n\n    def get_nodes(\n        self,\n        node_ids: Optional[List[str]] = None,\n        filters: Optional[MetadataFilters] = None,\n    ) -> List[BaseNode]:\n        \"\"\"Get nodes from vector store.\"\"\"\n        raise NotImplementedError(\"get_nodes not implemented\")\n\n    async def aget_nodes(\n        self,\n        node_ids: Optional[List[str]] = None,\n        filters: Optional[MetadataFilters] = None,\n    ) -> List[BaseNode]:\n        \"\"\"Asynchronously get nodes from vector store.\"\"\"\n        return self.get_nodes(node_ids, filters)\n\n    @abstractmethod\n    def add(\n        self,\n        nodes: Sequence[BaseNode],\n        **kwargs: Any,\n    ) -> List[str]:\n        \"\"\"Add nodes to vector store.\"\"\"\n\n    async def async_add(","sourceCodeStart":334,"sourceCodeEnd":370,"githubUrl":"https://github.com/run-llama/llama_index/blob/afd0fef371831f9bda13e5af7167cf4e981278ab/llama-index-core/llama_index/core/vector_stores/types.py#L334-L370","documentation":"`BaseVectorStore.get_nodes()` is a concrete-not-abstract convenience method on the base class: it exists so all stores share the signature, but only some integrations (e.g. Chroma, Qdrant) override it. Calling it on a store that never implemented node retrieval raises NotImplementedError. The async `aget_nodes()` simply delegates to it, so both paths fail identically.","triggerScenarios":"Calling `store.get_nodes(node_ids=[...])` or `await store.aget_nodes(...)` on a vector store integration that did not override the method (many community integrations, SimpleVectorStore, stores that only keep embeddings).","commonSituations":"Writing generic code against BaseVectorStore and assuming node retrieval is universally available; migrating between vector store backends where the old one supported get_nodes; building citation/reference features that need full node content from the store.","solutions":["Check `type(store).get_nodes is BaseVectorStore.get_nodes` (or hasattr on the instance's class) before calling, and fall back to the docstore.","Retrieve nodes via `index.docstore.get_nodes(node_ids)` when a docstore is attached.","Switch to an integration that implements get_nodes if store-side node retrieval is a hard requirement."],"exampleFix":"# before\nnodes = any_store.get_nodes(node_ids=[\"a\", \"b\"])  # NotImplementedError on many stores\n\n# after\nfrom llama_index.core.vector_stores import BaseVectorStore\nif type(any_store).get_nodes is not BaseVectorStore.get_nodes:\n    nodes = any_store.get_nodes(node_ids=[\"a\", \"b\"])\nelse:\n    nodes = index.docstore.get_nodes([\"a\", \"b\"]) or []","handlingStrategy":"fallback","validationCode":"from llama_index.core.vector_stores import BaseVectorStore\n\ndef supports_get_nodes(store) -> bool:\n    return type(store).get_nodes is not BaseVectorStore.get_nodes","typeGuard":null,"tryCatchPattern":"try:\n    nodes = store.get_nodes(node_ids=ids)\nexcept NotImplementedError:\n    nodes = index.docstore.get_nodes(ids) or []","preventionTips":["Treat get_nodes as an optional capability; probe once at startup per store class.","Keep a docstore alongside the vector store when you need node rehydration.","Write a compatibility matrix test across the stores you deploy."],"tags":["vector-store","not-implemented","base-class","python"],"backgroundTag":null,"analyzedSha":"afd0fef371831f9bda13e5af7167cf4e981278ab","analyzedAt":"2026-08-15T05:42:58.429Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}