hev-rerank
Use Jev, TypeSafe's System One decision model, as a reranker. One call carries the query and up to 30 candidate documents; the model answers one question per document, in parallel: is this document relevant to the query? The answer is a calibrated probability, so the score is both a sort key (rerank) and an absolute threshold (prune).
This repo is the whole recipe: the prompt, the request state shape, a 90-line Python wrapper, and the results of running it against hosted and open-weight rerankers and LLM judges on BEIR shortlists.
Results
nDCG@10, every system permuting the same BM25 top-30 shortlist per query. Jev uses the
domain-neutral phrasing in prompt.yaml, untuned per corpus.
| Reranker | SciFact (300 q) | NFCorpus (323 q) | FiQA (300 q) | p50 / p95 per query | Cost per 300 q |
|---|---|---|---|---|---|
| BM25 order, no rerank | 0.667 | 0.310 | 0.234 | ||
| MiniLM-L6 cross-encoder (local) | 0.682 | 0.336 | 0.323 | ||
| Cohere rerank-v3.5 | 0.745 | 0.340 | 0.374 | 129–277 ms / 267–698 ms | $0.60 |
| Mixedbread mxbai-rerank-large-v2 (hosted) | 0.749 | 0.324 | 0.354 | 322–380 ms / 374–460 ms | $1.05 |
| Voyage rerank-2.5 | 0.755 | 0.357 | 0.395 | 177–187 ms / 255–300 ms | ~$0.15 |
| Voyage rerank-3 | 0.755 | 0.357 | 0.402 | 173–192 ms / 285–288 ms | ~$0.15 |
| gpt-5.6-luna (reasoning off), listwise | 0.747 | 0.355 | 0.363 | 3.1–3.2 s / 3.8–5.8 s | ~$0.71 |
| Claude Haiku 4.5, listwise | 0.723 | 2.9 s / 11.6 s | $4.18 | ||
| Claude Opus 5 (low effort), listwise | 0.756 | 5.0 s / 7.5 s | $28.40 | ||
| Jev, 30 Nouls in one state | 0.768 | 0.358 | 0.376 | 208–238 ms / 0.8–1.8 s | $0.13–0.19 |
| Jev, one Noul per (query, doc) pair | 0.772 | 0.358 | 0.376 | 122–144 ms per call | $0.23–0.30 |
Paired-bootstrap per query, Jev's one-state shape against each reranker: at or above Cohere on all three corpora (two wins, one tie); above Mixedbread (two wins, one interval touching zero); trading with Voyage, the strongest purpose-built reranker here (edge on SciFact, tie on NFCorpus, loss on FiQA by ~0.02); above every LLM used as a reranker on cost and latency, and on quality except Opus 5, which it ties at ~1/100 the cost.
The honest one-liner: a general decision model with no reranker training lands in the same quality and price bracket as the best purpose-built rerankers, a third of Cohere's price, and returns a calibrated probability per document that none of them do. Voyage rerank-3 is as good and slightly cheaper; what Jev adds over it is the probability and the fact that the same call shape covers routing, classification and extraction gating.
Costs are the runs' actual token usage at list price (Voyage measured from its billed
usage.total_tokens). Full tables, confidence intervals, determinism, position-bias and
calibration checks: RESULTS.md.
Install
pip install hev-rerank # or: uv add hev-rerank
export TYPESAFE_API_KEY=... # https://console.typesafe.ai/settings/keys
Use
from hev_rerank import rerank
hits = rerank(
"does vitamin D supplementation improve bone density in older adults",
[{"title": t, "text": x} for t, x in first_stage_results], # strings work too
top_n=10, # optional
threshold=0.1, # optional: drop candidates the model is confident are irrelevant
)
for h in hits:
print(h.score, h.index, h.document["title"])
rerank returns RerankResult(index, score, document) best-first. Lists longer than
max_docs_per_call (30) are split into concurrent calls under Jev's ~32k-token request
budget. Scores across calls are comparable because each is an absolute probability.
The shape, and why
- State:
{"query": ..., "documents": {"D00": {...}, "D01": {...}, ...}}(schema). - Questions: one
Noulper document id, fromprompt.yaml. All questions in a request are evaluated in parallel, so 30 documents cost about the same wall time as 5. - Score: the Noul probability. Calibration on the SciFact run: documents scored ≥ 0.9 were judged relevant 76% of the time; documents scored < 0.1, 0.5% of the time.
Why not one Choice over the documents? It is slightly better when exactly one document is
relevant (SciFact: +0.01 nDCG@10, +3 pts P@1) and much worse when many are (NFCorpus,
median 16 relevant per query: 0.316 vs 0.358). A reranker that does not know the corpus
should ask per-document Nouls.
Limits
- ~32k tokens per request (state + questions): ~30–50 typical passages per call.
- Rate limits are undocumented; sustained 429s appeared at ~24 requests in flight.
- Tail latency on 30-document states (p95 0.8–1.8 s) is higher than specialized hosted rerankers'. Fanning out per-pair calls trades 30× the calls for a p95 near 0.25 s per call.
- Hosted only; the data leaves your environment.
License
Apache-2.0.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hev_rerank-0.1.0.tar.gz.
File metadata
- Download URL: hev_rerank-0.1.0.tar.gz
- Upload date:
- Size: 11.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6de9424e34b4722aba6001af0ad222ded3a56cd22915bb4aac98153687772cc1
|
|
| MD5 |
dabeb1abb76d2c8fe4cdd30825cb7f50
|
|
| BLAKE2b-256 |
7bbe856f720b51a3e23fd21784f92ece0d3071ee820976b8911b4a1d64479880
|
File details
Details for the file hev_rerank-0.1.0-py3-none-any.whl.
File metadata
- Download URL: hev_rerank-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a245f68763b0d6b33631ff87f083d74262191cccc176b17f6490e8d2ec54f25a
|
|
| MD5 |
3186b400e31ea756ff50ba9607b127ac
|
|
| BLAKE2b-256 |
9dde68f512ef9ad709a8233de9d1334b773a76af0aa9746c61b909629f17e698
|