external.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import logging
  2. import requests
  3. from typing import Optional, List, Tuple
  4. from urllib.parse import quote
  5. from open_webui.env import ENABLE_FORWARD_USER_INFO_HEADERS, SRC_LOG_LEVELS
  6. from open_webui.retrieval.models.base_reranker import BaseReranker
  7. log = logging.getLogger(__name__)
  8. log.setLevel(SRC_LOG_LEVELS["RAG"])
  9. class ExternalReranker(BaseReranker):
  10. def __init__(
  11. self,
  12. api_key: str,
  13. url: str = "http://localhost:8080/v1/rerank",
  14. model: str = "reranker",
  15. ):
  16. self.api_key = api_key
  17. self.url = url
  18. self.model = model
  19. def predict(
  20. self, sentences: List[Tuple[str, str]], user=None
  21. ) -> Optional[List[float]]:
  22. query = sentences[0][0]
  23. docs = [i[1] for i in sentences]
  24. payload = {
  25. "model": self.model,
  26. "query": query,
  27. "documents": docs,
  28. "top_n": len(docs),
  29. }
  30. try:
  31. log.info(f"ExternalReranker:predict:model {self.model}")
  32. log.info(f"ExternalReranker:predict:query {query}")
  33. r = requests.post(
  34. f"{self.url}",
  35. headers={
  36. "Content-Type": "application/json",
  37. "Authorization": f"Bearer {self.api_key}",
  38. **(
  39. {
  40. "X-OpenWebUI-User-Name": quote(user.name, safe=" "),
  41. "X-OpenWebUI-User-Id": user.id,
  42. "X-OpenWebUI-User-Email": user.email,
  43. "X-OpenWebUI-User-Role": user.role,
  44. }
  45. if ENABLE_FORWARD_USER_INFO_HEADERS and user
  46. else {}
  47. ),
  48. },
  49. json=payload,
  50. )
  51. r.raise_for_status()
  52. data = r.json()
  53. if "results" in data:
  54. sorted_results = sorted(data["results"], key=lambda x: x["index"])
  55. return [result["relevance_score"] for result in sorted_results]
  56. else:
  57. log.error("No results found in external reranking response")
  58. return None
  59. except Exception as e:
  60. log.exception(f"Error in external reranking: {e}")
  61. return None