classDashScopeRerank(BaseNodePostprocessor):model:str=Field(description="Dashscope rerank model name.")top_n:int=Field(description="Top N nodes to return.")_api_key:Optional[str]=PrivateAttr()def__init__(self,top_n:int=3,model:str="gte-rerank",return_documents:bool=False,api_key:Optional[str]=None,):try:api_key=api_keyoros.environ["DASHSCOPE_API_KEY"]exceptIndexError:raiseValueError("Must pass in dashscope api key or ""specify via DASHSCOPE_API_KEY environment variable ")super().__init__(top_n=top_n,model=model,return_documents=return_documents)self._api_key=api_key@classmethoddefclass_name(cls)->str:return"DashScopeRerank"def_postprocess_nodes(self,nodes:List[NodeWithScore],query_bundle:Optional[QueryBundle]=None,)->List[NodeWithScore]:dispatcher.event(ReRankStartEvent(model_name=self.model,top_n=self.top_n,query=query_bundle,nodes=nodes,))ifquery_bundleisNone:raiseValueError("Missing query bundle in extra info.")iflen(nodes)==0:return[]withself.callback_manager.event(CBEventType.RERANKING,payload={EventPayload.NODES:nodes,EventPayload.MODEL_NAME:self.model,EventPayload.QUERY_STR:query_bundle.query_str,EventPayload.TOP_K:self.top_n,},)asevent:texts=[node.node.get_content(metadata_mode=MetadataMode.EMBED)fornodeinnodes]results=dashscope.TextReRank.call(model=self.model,top_n=self.top_n,query=query_bundle.query_str,documents=texts,api_key=self._api_key,)new_nodes=[]forresultinresults.output.results:new_node_with_score=NodeWithScore(node=nodes[result.index].node,score=result.relevance_score)new_nodes.append(new_node_with_score)event.on_end(payload={EventPayload.NODES:new_nodes})dispatcher.event(ReRankEndEvent(nodes=new_nodes,))returnnew_nodes