classToolRetrieverRouterQueryEngine(BaseQueryEngine):""" Tool Retriever router query engine. Selects a set of candidate query engines to execute a query. Args: retriever (ObjectRetriever): A retriever that retrieves a set of query engine tools. summarizer (Optional[TreeSummarize]): Tree summarizer to summarize sub-results. """def__init__(self,retriever:ObjectRetriever[QueryEngineTool],llm:Optional[LLM]=None,summarizer:Optional[TreeSummarize]=None,)->None:llm=llmorSettings.llmself._summarizer=summarizerorTreeSummarize(llm=llm,summary_template=DEFAULT_TREE_SUMMARIZE_PROMPT_SEL,)self._retriever=retrieversuper().__init__(Settings.callback_manager)def_get_prompt_modules(self)->PromptMixinType:"""Get prompt sub-modules."""# NOTE: don't include tools for nowreturn{"summarizer":self._summarizer}def_query(self,query_bundle:QueryBundle)->RESPONSE_TYPE:withself.callback_manager.event(CBEventType.QUERY,payload={EventPayload.QUERY_STR:query_bundle.query_str})asquery_event:query_engine_tools=self._retriever.retrieve(query_bundle)responses=[]forquery_engine_toolinquery_engine_tools:query_engine=query_engine_tool.query_engineresponses.append(query_engine.query(query_bundle))iflen(responses)>1:final_response=combine_responses(self._summarizer,responses,query_bundle)else:final_response=responses[0]# add selected resultfinal_response.metadata=final_response.metadataor{}final_response.metadata["retrieved_tools"]=query_engine_toolsquery_event.on_end(payload={EventPayload.RESPONSE:final_response})returnfinal_responseasyncdef_aquery(self,query_bundle:QueryBundle)->RESPONSE_TYPE:withself.callback_manager.event(CBEventType.QUERY,payload={EventPayload.QUERY_STR:query_bundle.query_str})asquery_event:query_engine_tools=self._retriever.retrieve(query_bundle)tasks=[]forquery_engine_toolinquery_engine_tools:query_engine=query_engine_tool.query_enginetasks.append(query_engine.aquery(query_bundle))responses=run_async_tasks(tasks)iflen(responses)>1:final_response=awaitacombine_responses(self._summarizer,responses,query_bundle)else:final_response=responses[0]# add selected resultfinal_response.metadata=final_response.metadataor{}final_response.metadata["retrieved_tools"]=query_engine_toolsquery_event.on_end(payload={EventPayload.RESPONSE:final_response})returnfinal_response