run-llama/llama_index · error · NotImplementedError

SimpleVectorStore does not store nodes directly.

Error message

SimpleVectorStore does not store nodes directly.

What it means

SimpleVectorStore is a minimal in-memory vector store that only keeps embedding vectors plus a couple of lookup dicts — it never stores the full BaseNode objects. Its `get_nodes()` therefore deliberately raises NotImplementedError rather than returning wrong or empty results. Retrieving source nodes requires a store that persists documents (docstore) or a full-featured vector store integration.

Source

Thrown at llama-index-core/llama_index/core/vector_stores/simple.py:172

        """Get client."""
        return

    @property
    def _data(self) -> SimpleVectorStoreData:
        """Backwards compatibility."""
        return self.data

    def get(self, text_id: str) -> List[float]:
        """Get embedding."""
        return self.data.embedding_dict[text_id]

    def get_nodes(
        self,
        node_ids: Optional[List[str]] = None,
        filters: Optional[MetadataFilters] = None,
    ) -> List[BaseNode]:
        """Get nodes."""
        raise NotImplementedError("SimpleVectorStore does not store nodes directly.")

    def add(
        self,
        nodes: Sequence[BaseNode],
        **add_kwargs: Any,
    ) -> List[str]:
        """Add nodes to index."""
        for node in nodes:
            self.data.embedding_dict[node.node_id] = node.get_embedding()
            self.data.text_id_to_ref_doc_id[node.node_id] = node.ref_doc_id or "None"

            metadata = node_to_metadata_dict(
                node, remove_text=True, flat_metadata=False
            )
            metadata.pop("_node_content", None)
            self.data.metadata_dict[node.node_id] = metadata
        return [node.node_id for node in nodes]

View on GitHub (pinned to afd0fef371)

Solutions

  1. Use the docstore instead: `index.docstore.get_nodes(node_ids)` — VectorStoreIndex keeps nodes there by default.
  2. Switch to a vector store integration that stores documents (Chroma, Qdrant, Weaviate, etc.) if you need node retrieval from the store itself.
  3. Catch NotImplementedError and degrade gracefully if you support multiple backends.

Example fix

# before
nodes = simple_store.get_nodes(node_ids=["id1"])  # NotImplementedError

# after
nodes = index.docstore.get_nodes(["id1"])  # nodes live in the docstore
Defensive patterns

Strategy: fallback

Validate before calling

from llama_index.core.vector_stores import SimpleVectorStore

def store_supports_get_nodes(store) -> bool:
    return type(store).get_nodes is not SimpleVectorStore.get_nodes

Try / catch

try:
    nodes = store.get_nodes(node_ids=ids)
except NotImplementedError:
    nodes = index.docstore.get_nodes(ids) or []  # fallback source of truth

Prevention

When it happens

Trigger: Calling `vector_store.get_nodes(node_ids=[...])` or `get_nodes(filters=...)` on a `SimpleVectorStore` instance (the default store used by `VectorStoreIndex` without an external DB), e.g. to rehydrate nodes for citation or re-ranking.

Common situations: Prototypes built on the default in-memory index that later call node-retrieval APIs; code ported from Chroma/Qdrant/Weaviate integrations (which implement get_nodes) down to the simple store; calling `aget_nodes()` which delegates to the sync version and raises the same error.

Related errors


AI-assisted analysis of run-llama/llama_index@afd0fef371 (2026-08-15). Data as JSON: /api/errors/aa7ff82a678d40f0. Report an issue: GitHub.