classXinferenceRerank(BaseNodePostprocessor):"""Class for Xinference Rerank."""top_n:int=Field(default=5,description="The number of nodes to return.",)model:str=Field(default="bge-reranker-base",description="The Xinference model uid to use.",)base_url:str=Field(default="http://localhost:9997",description="The Xinference base url to use.",)@classmethoddefclass_name(cls)->str:return"XinferenceRerank"defget_query_str(self,query):returnquery.query_strifisinstance(query,QueryBundle)elsequerydef_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.")iflen(nodes)==0:return[]withself.callback_manager.event(CBEventType.RERANKING,payload={EventPayload.NODES:nodes,EventPayload.MODEL_NAME:self.model,EventPayload.QUERY_STR:self.get_query_str(query_bundle),EventPayload.TOP_K:self.top_n,},)asevent:headers={"Content-Type":"application/json"}json_data={"model":self.model,"query":self.get_query_str(query_bundle),"documents":[node.node.get_content(metadata_mode=MetadataMode.EMBED)fornodeinnodes],}response=requests.post(url=f"{self.base_url}/v1/rerank",headers=headers,json=json_data)response.encoding="utf-8"ifresponse.status_code!=200:raiseException(f"Xinference call failed with status code {response.status_code}."f"Details: {response.text}")rerank_nodes=[NodeWithScore(node=nodes[result["index"]].node,score=result["relevance_score"])forresultinresponse.json()["results"][:self.top_n]]event.on_end(payload={EventPayload.NODES:rerank_nodes})dispatcher.event(ReRankEndEvent(nodes=rerank_nodes))returnrerank_nodes