ResumeJSON

Which model, and why

Latency alone would pick whichever model answers fastest with the wrong fields. So every candidate was scored on both: wall-clock time, and field-level accuracy against hand-written ground truth for three real CVs.

The measurement

Three fixtures, chosen for the ways a CV goes wrong: a clean single-column English CV, a two-column designer CV whose extracted text interleaves the columns and whose dates are written five different ways, and an Indonesian CV that must not be translated. 53 assertions in total — the exact company, the exact title, each start and end date, whether the latest role is current, whether skills were split, whether job titles survived in the document's own language.

Three runs per model per fixture, true median reported, measured 26 August 2026 through OpenRouter. The clock stops after the response body is parsed, which matters more than it sounds — see below.

Results

ModelFastestMedianSlowestChecksCost / parseReasoning tokensVerdict
google/gemini-2.5-flash-lite1.52 s1.71 s2.29 s53/53$0.000250In production
google/gemini-3.1-flash-lite1.68 s1.97 s2.46 s53/53$0.001000Fast, four times dearer
google/gemini-3.7-flash12.73 s14.60 s25.80 s53/53$0.004432,681Cannot disable reasoning
deepseek/deepseek-v4-flash-073120.99 s27.48 s43.23 s53/53$0.000221,4917.6 s with reasoning off
openai/gpt-5-nano18.77 s31.90 s36.49 s53/53$0.001654,352Cannot disable reasoning

What the numbers said

Every model that completed scored 53/53. On a task this tightly specified — a fixed schema, a forbidden-to-invent rule, a stated date format — the models agree. So the choice is decided by latency, and the entire latency spread turns out to be one thing: reasoning tokens.

The two flash-lite models emit none and answer in under two seconds. Every model that deliberates first takes between 13 and 43 seconds. Filling a fixed schema from a document that already contains every answer is not a task that needs deliberation.

The newest Gemini Flash was tested on the expectation that newer means faster. It was the slowest but one, at eighteen times the cost per parse for the same accuracy. Asking it to skip the deliberation returns 400 Reasoning is mandatory for this endpoint and cannot be disabled. gpt-5-nano refuses the same way. For both, the latency is structural rather than a setting.

The measurement we got wrong first

The first version of this sweep reported gpt-5-nano at 691 ms, and it became the default on that basis. The deployed service then took 20.9 seconds on the same input.

await fetch() resolves when the response headers arrive. The script stopped the clock there and parsed the body on the next line, so it was timing how fast a model starts answering. A model that buffers its whole answer was timed honestly; a model that streams four thousand reasoning tokens was credited with the time before its first token. The error did not add noise — it ranked the slowest model first.

Reproduce it yourself: the fixtures, the ground truth and the runner are in the repo as scripts/bench-models.mjs.