Benchmark dashboard

PhishNChips: 12 decision models on phishing detection

Each model judged the same 3,011 unique emails as phishing or legitimate. Compare how often they were right, what they missed, what they wrongly flagged, and what each decision cost.

Run note. The run completed 36,131 of 36,132 decisions. One Decider Flash V1.2 decision remained rate-limited with HTTP 429 after retries, so its scores cover 3,010 of 3,011 emails.

12 models3,011 unique emails5 source sets36,131 decisions

Overview

Best for

The top model for each need on the selected dataset. Ties go to the more accurate model.

Best model for each need
NeedModelResultTies

Leaderboard

Sort with the column headers or the menu. Metrics that need both classes are hidden on single-class sets.

How certain are the scores

Each dot is a model's accuracy and the bar is its 95% interval: the range the true rate plausibly sits in given the number of emails. Gaps smaller than the intervals are within noise.

Trade-offs

The dashed line joins the models nobody beats on both axes. Hover, focus or tap a point for its numbers.

Quality against cost and speed

Precision against recall

Up and to the right is better: fewer false alarms and fewer misses.

Where the errors fall

Every decision lands in one of four outcomes. A missed phishing email lets an attack through; a false alarm blocks real mail and costs analyst time. Total errors is the two added together.

In a real inbox

These test sets hold far more phishing than a real mailbox. Pick a realistic share of phishing and each model's recall and false-positive rate are scaled to it, showing how much of what it flags would really be phishing.

Precision is the share of flagged email that is really phishing. A model with no observed false positives can still have a small true rate, which is what the worst case allows for.

Across every dataset

Accuracy per model on each source set. Phishing-only sets score the detection rate and the legitimate-only set scores the pass rate, so compare down a column, not across. Source sets overlap, so their rows are not added together.

Accuracy by model and dataset
ModelAll unique emails, 3,011 emails, both classesCore emails, 2,000 emails, both classesCross-domain legitimate (v5), 333 emails, legitimate onlyInfrastructure phishing (expanded), 54 emails, phishing onlyReal phishing validation, 998 emails, phishing only
Clef88.4%83.0%96.7%94.4%99.2%
d1-ultra81.7%74.5%100.0%48.1%96.6%
Clef Omni79.7%69.4%100.0%100.0%100.0%
Jev 1.1479.0%71.2%100.0%37.0%95.1%
Clef Flash78.7%68.0%100.0%98.1%99.9%
Decider V1.271.8%61.3%100.0%44.4%93.2%
GPT-6 Luna Decisions69.3%56.9%100.0%44.4%94.5%
d168.0%55.5%100.0%37.0%93.4%
Decider Flash V1.267.2%54.4%100.0%42.6%93.0%
Drex v2.066.5%52.0%100.0%57.4%95.8%
Microsoft Decision-164.2%51.6%100.0%46.3%89.9%
Mercury Decide59.6%53.0%100.0%20.4%73.3%

How to read this

Precision and recall
Precision is the share of flagged emails that were phishing, so it measures how far an alert can be trusted. For a mail gateway or a cloud email security tool it comes first: every false alarm quarantines real mail or costs an analyst time, and real inboxes hold little phishing, so a model that is not precise buries the genuine attacks. Recall is the share of phishing that was flagged. A model can be precise yet miss most phishing, so read the two together. Precision here is measured with 67% phishing in the test set. See "In a real inbox" for what it falls to at realistic volumes.
F1
One score that combines precision and recall. It sits closer to the lower of the two, so a model cannot score well by being strong on one and weak on the other. For example, 100% precision with 40% recall gives an F1 of only 57%. It is only shown on sets that contain both phishing and legitimate email, and it depends on the phishing share of the test set.
Accuracy
Share of decisions that were correct. On the main set 2,011 emails are phishing and 1,000 are legitimate, so flagging everything would already score 67%. It hides which kind of mistake was made, so it ranks below precision and recall.
False-positive rate
Share of legitimate emails wrongly flagged. Reported only where the set contains legitimate emails.
95% interval
The Wilson score interval around a rate. With 3,011 emails, scores a point or two apart often overlap and should not be read as a ranking.
Real-inbox precision
Precision recalculated from each model's recall and false-positive rate at a chosen share of phishing. Those two rates do not depend on the mix of the test set, but precision does.
Brier score
Mean squared error of the model's probability against the true label. Lower is better and rewards well-calibrated confidence.
Cost and latency
Cost is the reported spend divided by the decisions with cost data, scaled to 1,000 decisions. Latency is the mean time per decision.

Scores come from the 3,011-email unique set plus its four source sets. The repeated all-emails rows in the raw export are identical to the main set and are counted once. Rates are recomputed from the confusion counts.

Method and reproduction

Data
PhishNChips v5.2 at revision 89afcc3: 3,387 rows across four files, reduced to 3,011 unique emails (2,011 phishing, 1,000 legitimate) after dropping 2 rows with a blank required field and 374 exact duplicates. The dataset's own labels are the ground truth and were not independently checked.
Question
Each model answered one binary question, PHISHING or LEGITIMATE, with the same written definitions every time. This is not the PhishNChips baseline prompt, which asks whether to click a link. Only the sender, subject, body, link text and URL strings were sent, never the label, and no link was visited.
Run
One run of one prompt on 2026-10-18, through the OpenRouter decisions endpoint. The three Clef models were pinned to the Cloudflare provider with fallback off. Failed calls were retried up to three times. Latency is client-observed and includes retries. Cost is what OpenRouter reported per decision.
Limits
Hosted models change, so a repeat run can differ. The main set holds twice as much phishing as legitimate email, so use the core set for a balanced comparison. Cost and latency depend on routing and load on the day.

The scripts, the recorded predictions (without email text) and step-by-step instructions are in the project repository. You can reproduce the results at three levels:

python3 eval/summarize_results.py --check   # rebuild every score from the recorded predictions
python3 eval/prepare_data.py                # rebuild the 3,011-email corpus from the pinned files
python3 eval/run_models.py --run-models --confirm-send   # repeat the run (needs OPENROUTER_API_KEY, costs money)