{"record":{"id":"db3dd3e4f1bc4d2b","repo":"run-llama/llama_index","slug":"query-id-query-id-not-found-in-either-retriever","errorCode":null,"errorMessage":"Query id {query_id} not found in either `retriever_dict` or `query_engine_dict`.","messagePattern":"Query id (.+?) not found in either `retriever_dict` or `query_engine_dict`\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"llama-index-core/llama_index/core/retrievers/recursive_retriever.py","lineNumber":153,"sourceCode":"            additional_nodes.extend(cur_additional_nodes)\n\n        # dedup nodes in case some nodes could be retrieved from multiple sources\n        nodes_to_add = self._deduplicate_nodes(nodes_to_add)\n        additional_nodes = self._deduplicate_nodes(additional_nodes)\n        return nodes_to_add, additional_nodes\n\n    def _get_object(self, query_id: str) -> RQN_TYPE:\n        \"\"\"Fetch retriever or query engine.\"\"\"\n        node = self._node_dict.get(query_id, None)\n        if node is not None:\n            return node\n        retriever = self._retriever_dict.get(query_id, None)\n        if retriever is not None:\n            return retriever\n        query_engine = self._query_engine_dict.get(query_id, None)\n        if query_engine is not None:\n            return query_engine\n        raise ValueError(\n            f\"Query id {query_id} not found in either `retriever_dict` \"\n            \"or `query_engine_dict`.\"\n        )\n\n    def _retrieve_rec(\n        self,\n        query_bundle: QueryBundle,\n        query_id: Optional[str] = None,\n        cur_similarity: Optional[float] = None,\n    ) -> Tuple[List[NodeWithScore], List[NodeWithScore]]:\n        \"\"\"Query recursively.\"\"\"\n        if self._verbose:\n            print_text(\n                f\"Retrieving with query id {query_id}: {query_bundle.query_str}\\n\",\n                color=\"blue\",\n            )\n        query_id = query_id or self._root_id\n        cur_similarity = cur_similarity or 1.0","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/run-llama/llama_index/blob/afd0fef371831f9bda13e5af7167cf4e981278ab/llama-index-core/llama_index/core/retrievers/recursive_retriever.py#L135-L171","documentation":"During recursive traversal, when a fetched object's IndexNode id (query_id) points into another node, _get_object looks the id up in node_dict, then retriever_dict, then query_engine_dict. This ValueError means the id matched none of them, i.e. an IndexNode references a target that was never registered with the RecursiveRetriever. It surfaces mid-retrieve, after retrieval has already begun.","triggerScenarios":"An IndexNode whose index_id/embedding reference (e.g. 'subindex2') has no entry in retriever_dict/query_engine_dict; building the dicts from a subset of the linked indexes; ids serialized into IndexNodes that were renamed after the index was built; using SummaryIndex nodes whose obj ids no longer exist.","commonSituations":"Persisting an index of IndexNodes and later reconstructing the RecursiveRetriever with an incomplete or renamed mapping; hierarchical RAG where sub-indexes were added/removed between runs; docstring-style examples where the dict keys are 'vector' etc. but nodes reference different ids.","solutions":["Register the missing id: add retriever_dict[query_id] = target_retriever (or query_engine_dict[query_id] = engine, or node_dict[query_id] = node) so every IndexNode reference resolves.","Audit links vs registrations: collect all IndexNode references in your index tree and diff against retriever_dict | query_engine_dict | node_dict keys before querying.","If the link is stale, rebuild the IndexNode with the correct index_id and re-index."],"exampleFix":"# before\n# IndexNode(id_='n1', text='...', index_id='sub2') exists,\n# but retriever_dict = {'root': r, 'sub1': r1}\nretriever = RecursiveRetriever('root', retriever_dict)\n\n# after\nretriever_dict = {'root': r, 'sub1': r1, 'sub2': r2}  # every index_id registered\nretriever = RecursiveRetriever('root', retriever_dict)","handlingStrategy":"validation","validationCode":"known_ids = set(retriever_dict) | set(query_engine_dict) | set(node_dict)\n# collect every index_id your IndexNodes reference\nreferenced = {n.index_id for n in index_nodes}  # adapt to your tree walk\nmissing = referenced - known_ids - {root_id}\nassert not missing, f\"unregistered ids: {missing}\"","typeGuard":null,"tryCatchPattern":"try:\n    nodes = retriever.retrieve(q)\nexcept ValueError as e:\n    if \"not found in either\" in str(e):\n        raise KeyError(f\"IndexNode link unregistered: {e}\") from e\n    raise","preventionTips":["Register every IndexNode target in retriever_dict/query_engine_dict/node_dict.","Diff node references against registered ids after loading a persisted index.","Rebuild IndexNodes whenever you rename dict keys."],"tags":["retriever","recursive-retrieval","index-nodes","lookup"],"backgroundTag":null,"analyzedSha":"afd0fef371831f9bda13e5af7167cf4e981278ab","analyzedAt":"2026-08-15T05:42:58.429Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}