adapter.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. """OWUI (Cohere-stiil) -> TEI rerank adapter.
  2. OWUI saadab: {"model":..,"query":..,"documents":[...],"top_n":N}
  3. ootab: {"results":[{"index":i,"relevance_score":s}, ...]}
  4. TEI ootab: {"query":..,"texts":[...]}
  5. tagastab: [{"index":i,"score":s}, ...]
  6. """
  7. import json
  8. import urllib.request
  9. from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
  10. TEI = "http://reranker:80/rerank"
  11. class Handler(BaseHTTPRequestHandler):
  12. server_version = "rerank-adapter/1.0"
  13. def _send(self, code, obj):
  14. body = json.dumps(obj).encode()
  15. self.send_response(code)
  16. self.send_header("Content-Type", "application/json")
  17. self.send_header("Content-Length", str(len(body)))
  18. self.end_headers()
  19. self.wfile.write(body)
  20. def do_GET(self):
  21. self._send(200, {"ok": True, "tei": TEI})
  22. def do_POST(self):
  23. try:
  24. n = int(self.headers.get("Content-Length") or 0)
  25. body = json.loads(self.rfile.read(n) or b"{}")
  26. except Exception as e:
  27. return self._send(400, {"error": "bad json: %s" % e})
  28. docs = body.get("documents") or body.get("texts") or []
  29. if isinstance(docs, str):
  30. docs = [docs]
  31. docs = [d if isinstance(d, str) else json.dumps(d) for d in docs]
  32. if not docs:
  33. return self._send(200, {"results": []})
  34. req = urllib.request.Request(
  35. TEI,
  36. data=json.dumps({"query": body.get("query", ""), "texts": docs}).encode(),
  37. headers={"Content-Type": "application/json"},
  38. )
  39. try:
  40. out = json.load(urllib.request.urlopen(req, timeout=600))
  41. except Exception as e:
  42. return self._send(500, {"error": "tei: %s" % e})
  43. if isinstance(out, dict):
  44. out = out.get("results") or out.get("data") or []
  45. results = []
  46. for o in out:
  47. try:
  48. results.append({"index": int(o["index"]), "relevance_score": float(o["score"])})
  49. except Exception:
  50. continue
  51. self._send(200, {"results": results})
  52. def log_message(self, *a):
  53. pass
  54. if __name__ == "__main__":
  55. ThreadingHTTPServer(("0.0.0.0", 80), Handler).serve_forever()