run-llama/llama_index · error · ValueError

Object {obj} is not retrievable.

Error message

Object {obj} is not retrievable.

What it means

During recursive retrieval, when an IndexNode references an object (node.obj or object_map[node.index_id]), BaseRetriever._retrieve_from_object handles NodeWithScore, BaseNode, BaseQueryEngine and BaseRetriever. Anything else — arbitrary Python objects, None-adjacent leftovers, plain strings — is not retrievable and raises ValueError.

Source

Thrown at llama-index-core/llama_index/core/base/base_retriever.py:95

                f"Retrieving from object {obj.__class__.__name__} with query {query_bundle.query_str}\n",
                color="llama_pink",
            )
        if isinstance(obj, NodeWithScore):
            return [obj]
        elif isinstance(obj, BaseNode):
            return [NodeWithScore(node=obj, score=score)]
        elif isinstance(obj, BaseQueryEngine):
            response = obj.query(query_bundle)
            return [
                NodeWithScore(
                    node=TextNode(text=str(response), metadata=response.metadata or {}),
                    score=score,
                )
            ]
        elif isinstance(obj, BaseRetriever):
            return obj.retrieve(query_bundle)
        else:
            raise ValueError(f"Object {obj} is not retrievable.")

    async def _aretrieve_from_object(
        self,
        obj: Any,
        query_bundle: QueryBundle,
        score: float,
    ) -> List[NodeWithScore]:
        """Retrieve nodes from object."""
        if isinstance(obj, NodeWithScore):
            return [obj]
        elif isinstance(obj, BaseNode):
            return [NodeWithScore(node=obj, score=score)]
        elif isinstance(obj, BaseQueryEngine):
            response = await obj.aquery(query_bundle)
            return [
                NodeWithScore(
                    node=TextNode(text=str(response), metadata=response.metadata or {}),
                    score=score,

View on GitHub (pinned to afd0fef371)

Solutions

  1. Make the IndexNode target a supported type: BaseRetriever, BaseQueryEngine, BaseNode, or NodeWithScore.
  2. Wrap unsupported logic in a custom retriever (subclass BaseRetriever and implement _retrieve) and put that on the IndexNode.
  3. Print type(node.obj) for the failing node to identify what was actually stored.

Example fix

# before
index_node = IndexNode(text="helper", index_id="x", obj=my_query_pipeline)

# after
class PipelineRetriever(BaseRetriever):
    def _retrieve(self, query_bundle):
        result = my_query_pipeline.run(query=query_bundle.query_str)
        return [NodeWithScore(node=TextNode(text=str(result)))]

index_node = IndexNode(text="helper", index_id="x", obj=PipelineRetriever())
Defensive patterns

Strategy: type-guard

Validate before calling

from llama_index.core.schema import BaseNode, NodeWithScore, IndexNode
from llama_index.core.base.query_engine import BaseQueryEngine
from llama_index.core.base.retriever import BaseRetriever

def index_node_retrievable(node: IndexNode) -> bool:
    obj = node.obj
    return obj is None or isinstance(obj, (BaseNode, NodeWithScore, BaseQueryEngine, BaseRetriever))

Type guard

from llama_index.core.base.retriever import BaseRetriever
from llama_index.core.base.query_engine import BaseQueryEngine

def is_retrievable(obj) -> bool:
    return isinstance(obj, (BaseRetriever, BaseQueryEngine))

Prevention

When it happens

Trigger: Building an IndexNode with obj= set to a type the dispatcher doesn't recognize (e.g. a query pipeline, a tool, a dict, a plain function) and then calling retriever.retrieve(); recursive retrieval over a tree/summary index whose object_map was populated with non-retriever objects.

Common situations: Using AutoMergingRetrieval or recursive document hierarchies with custom node objects; migrating old QueryPipeline-based recursion (BaseQueryEngine used to be handled, pipelines are not); storing raw metadata in obj by mistake.

Related errors


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