(req: RerankRequest)
| 128 | |
| 129 | @app.post("/v1/rerank", response_model=RerankResponse) |
| 130 | def rerank(req: RerankRequest): |
| 131 | if not req.documents: |
| 132 | return {"results": []} |
| 133 | model = _get_model() |
| 134 | # CrossEncoder.predict scores each (query, document) pair jointly. |
| 135 | pairs = [(req.query, doc) for doc in req.documents] |
| 136 | scores = model.predict(pairs) # numpy array of floats |
| 137 | results = [ |
| 138 | {"index": i, "relevance_score": float(score)} |
| 139 | for i, score in enumerate(scores) |
| 140 | ] |
| 141 | # Sort best-first; QodeX re-sorts too, but this keeps top_n meaningful. |
| 142 | results.sort(key=lambda r: r["relevance_score"], reverse=True) |
| 143 | if req.top_n is not None: |
| 144 | results = results[: req.top_n] |
| 145 | return {"results": results} |
| 146 | |
| 147 | |
| 148 | # Also accept the Ollama-style path so QodeX's first attempt (/api/rerank) works |
no test coverage detected