# classifier.dev benchmark
Measured accuracy, calibration, cost and latency for every model considered.
Every number here comes from a real run, and the cost column is what the providers actually billed. Measured 2026-09-17. The eval code is in the repository (eval/), so all of this is re-runnable.
## Against the model it runs on
The fast tier is Jev, TypeSafe's decision model. The smart tier is Jev plus a reasoning model re-asking only the answers Jev put under 0.7 confidence. So the question this service has to answer is whether it beats calling Jev yourself. Two public test sets, 400 items each, measured live over the public API with no key on 2026-09-18. "unsure" is accuracy on just the items Jev was unsure about — the only ones the smart tier touches.
AG News emotion
all unsure(49) all unsure(122)
-------------------------------------------------------------------------
jev alone = classifier.dev fast 87.5% 65.3% 61.8% 36.9%
classifier.dev smart 90.0% 83.7% 62.7% 41.8%The fast tier is Jev, packed a thousand to a request, so the table shows one row for both. Measured separately it scored the same within noise (fast 87.3% vs 87.5%, 62.0% vs 61.8%), and every one of its 42 disagreements with Jev alone was on an item one side had already put under 0.7 confidence. The smart tier re-asked 43 / 126 of 400 items and took about 68 / 171 ms per item amortised. Calling Jev yourself costs about $0.005 / $0.004 per thousand and needs a TypeSafe key; this service costs nothing and needs none.
Read it with the noise in mind: on 400 items, a gap under about 5 points overall is not evidence, and the unsure columns rest on fewer items still. Re-run: npm run vs-jev (eval/vs_jev.py).
## Single label
Two public test sets, 400 items each. AG News is four-way topic; emotion is six-way and genuinely hard, because sadness, fear and anger blur.
model AG News emotion ms/item $/1k --------------------------------------------------------------------- jev-1.13 (classifier-fast) 87.7% 60.5% 2 0.005 qwen3.7-flash, reasoning 87.5% * 3,445 0.040 ling-3.0-flash 82.0% 57.0% 731 0.002 granite-4.0-h-micro (before) 63.2% 52.5% 594 0.002
The ms/item for jev is amortised: 400 items ride in one request that returns in about 650ms. The others are one call per item.
The last row is what this service was quietly serving until 2026-09-17. Its primary model had been delisted upstream, every request 404'd against it and fell through to granite, and nothing in the deployed numbers said so.
## Calibration
Accuracy by the confidence the model attached to its own answer.
n accuracy n accuracy confidence AG News emotion --------------------------------------------------------------- [0.9, 1.0] 323 91.6% 200 82.0% [0.7, 0.9) 27 85.2% 79 49.4% [0.5, 0.7) 28 64.3% 52 36.5% [0.0, 0.5) 22 63.6% 69 29.0%
For comparison, the previous model's logprob "confidence" put 348 of 400 news items at or above 0.9 and was right on 68% of them.
ESCALATION (the smart tier)
Only the items Jev put under 0.7 confidence are re-asked. What matters is how a second model does on exactly those, not overall.
emotion, 122 uncertain news, 49 uncertain
model acc -> whole set acc -> whole set
------------------------------------------------------------------------------
jev alone 36.9% 61.8% 65.3% 87.5%
gemini-3.8-flash (smart) 43.4% 63.7% 85.7% 90.0%
qwen3.8-flash 36.1% 61.5% 79.6% 89.2%
qwen3.7-flash ~37% 61.0% ~66% 87.7%
deepseek-v4-flash 36.9% 61.8% 34.7% 83.8%
mercury-2.5 26.2% 58.5% 38.8% 84.3%
claude-fable-5.1 71.3% 72.3% 91.8% 90.7%
gpt-6-astra 54.9% 67.2% 69.4% 88.0%Most cheap models are no better than Jev on the cases Jev finds hard; the frontier models are, at about $2 per thousand escalations. The smart tier calls gemini-3.8-flash, the fast model that helped on both sets: about $0.70 per thousand escalated items, 2.3 seconds each.
## Multi label
Seven hand-written tasks, 12 to 50 labels each, 3 runs. Macro P/R/F1.
configuration P R F1 latency $/1k -------------------------------------------------------------------------- jev, one yes/no per label, >= 0.7 0.81 0.99 0.887 232ms 0.053 ling-3.0 sweep + second pass 0.90 0.74 0.799 1,538ms 0.008 mercury-2.5 sweep + second pass 0.92 0.72 0.797 945ms 0.038 granite-4.0 sweep + second pass 0.71 0.46 0.546 1,575ms 0.017 jev candidates re-judged by qwen3.7 0.43 (parse failures) 23,000ms
Read eval/README.md before quoting these: n=7, one annotator, no held-out split. Gaps of 0.03 are noise; the gaps above are not.
## Throughput
Twelve concurrent requests of 300 inputs each against the decision model: 3,600 classifications in 2.7 seconds wall clock, no throttling. A single request of 1,000 short inputs returns in about 1.5 seconds.
## Caveats
Public benchmarks are likely present in training data, so treat the accuracy figures as optimistic. Use them to rank the models; they will not predict what you see on your own task. The calibration table is the one to trust, because it says how much to believe a given answer.
If you want help measuring your own data, the offer of a call stands: https://cal.com/michaelsf/coffee
Built by @michael_chomsky — https://x.com/michael_chomsky