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
- Make the IndexNode target a supported type: BaseRetriever, BaseQueryEngine, BaseNode, or NodeWithScore.
- Wrap unsupported logic in a custom retriever (subclass BaseRetriever and implement _retrieve) and put that on the IndexNode.
- 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
- Only attach retrievers/query engines/nodes as IndexNode.obj targets.
- Wrap custom logic in a BaseRetriever subclass.
- Validate the whole index's IndexNodes in a build-time check.
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
- Root id {root_id} not in retriever_dict, it must be a retrie
- Retriever and query engine ids must not overlap.
- Query id {query_id} not found in either `retriever_dict` or
- Must be a retriever or query engine.
- IndexNode obj is not serializable: {obj}
AI-assisted analysis of run-llama/llama_index@afd0fef371 (2026-08-15).
Data as JSON: /api/errors/aa91eb4fea6b0870.
Report an issue: GitHub.