classCohereRerank(BaseNodePostprocessor):model:str=Field(description="Cohere model name.")top_n:int=Field(description="Top N nodes to return.")base_url:Optional[str]=Field(description="Cohere base url.",default=None)_client:Any=PrivateAttr()def__init__(self,top_n:int=2,model:str="rerank-english-v2.0",api_key:Optional[str]=None,base_url:Optional[str]=None,):super().__init__(top_n=top_n,model=model)try:api_key=api_keyoros.environ["COHERE_API_KEY"]exceptIndexError:raiseValueError("Must pass in cohere api key or ""specify via COHERE_API_KEY environment variable ")try:fromcohereimportClientexceptImportError:raiseImportError("Cannot import cohere package, please `pip install cohere`.")self._client=Client(api_key=api_key,base_url=base_url)@classmethoddefclass_name(cls)->str:return"CohereRerank"def_postprocess_nodes(self,nodes:List[NodeWithScore],query_bundle:Optional[QueryBundle]=None,)->List[NodeWithScore]:dispatcher.event(ReRankStartEvent(query=query_bundle,nodes=nodes,top_n=self.top_n,model_name=self.model))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=self._client.rerank(model=self.model,top_n=self.top_n,query=query_bundle.query_str,documents=texts,)new_nodes=[]forresultinresults.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