Spaces:
Paused
Paused
| import logging | |
| import requests | |
| from typing import Optional, List, Tuple | |
| from open_webui.env import SRC_LOG_LEVELS | |
| log = logging.getLogger(__name__) | |
| log.setLevel(SRC_LOG_LEVELS["RAG"]) | |
| class ExternalReranker: | |
| def __init__( | |
| self, | |
| api_key: str, | |
| url: str = "http://localhost:8080/v1/rerank", | |
| model: str = "reranker", | |
| ): | |
| self.api_key = api_key | |
| self.url = url | |
| self.model = model | |
| def predict(self, sentences: List[Tuple[str, str]]) -> Optional[List[float]]: | |
| query = sentences[0][0] | |
| docs = [i[1] for i in sentences] | |
| payload = { | |
| "model": self.model, | |
| "query": query, | |
| "documents": docs, | |
| "top_n": len(docs), | |
| } | |
| try: | |
| log.info(f"ExternalReranker:predict:model {self.model}") | |
| log.info(f"ExternalReranker:predict:query {query}") | |
| r = requests.post( | |
| f"{self.url}", | |
| headers={ | |
| "Content-Type": "application/json", | |
| "Authorization": f"Bearer {self.api_key}", | |
| }, | |
| json=payload, | |
| ) | |
| r.raise_for_status() | |
| data = r.json() | |
| if "results" in data: | |
| sorted_results = sorted(data["results"], key=lambda x: x["index"]) | |
| return [result["relevance_score"] for result in sorted_results] | |
| else: | |
| log.error("No results found in external reranking response") | |
| return None | |
| except Exception as e: | |
| log.exception(f"Error in external reranking: {e}") | |
| return None | |