classJinaRerank(BaseNodePostprocessor):api_url:str=Field(default=f"{DEFAULT_JINA_AI_API_URL}/rerank",description="The URL of the JinaAI Rerank API.",)api_key:str=Field(default=None,description="The JinaAI API key.")model:str=Field(default="jina-reranker-v1-base-en",description="The model to use when calling Jina AI API",)top_n:int=Field(description="Top N nodes to return.")_session:Any=PrivateAttr()def__init__(self,top_n:int=2,model:str="jina-reranker-v1-base-en",base_url:str=DEFAULT_JINA_AI_API_URL,api_key:Optional[str]=None,):super().__init__(top_n=top_n,model=model)self.api_url=f"{base_url}/rerank"self.api_key=get_from_param_or_env("api_key",api_key,"JINAAI_API_KEY","")self.model=modelself._session=requests.Session()self._session.headers.update({"Authorization":f"Bearer {self.api_key}","Accept-Encoding":"identity"})@classmethoddefclass_name(cls)->str:return"JinaRerank"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]resp=self._session.post(# type: ignoreself.api_url,json={"query":query_bundle.query_str,"documents":texts,"model":self.model,"top_n":self.top_n,},).json()if"results"notinresp:raiseRuntimeError(resp["detail"])results=resp["results"]new_nodes=[]forresultinresults: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