How we test
Methodology
How every race is run, scored and priced, so you can judge the results yourself.
Same inputs, same format
Jev and every LLM get the same state, the same instructions and the same options or levels for every item. The LLM is asked to reply with a fixed JSON object. Jev returns typed answers by design.
How a race runs
Each item is one call. Every racer gets 4 parallel lanes. Each call is sent once, with no retries. Latency is timed from sending the request to receiving the full response. Replays in Beginner mode play at the recorded latency.
Model settings
Every LLM runs at its provider's default settings. Claude Opus 5.5 cannot turn its thinking off, so it runs at low effort, and its thinking tokens are counted in its cost. The Claude models are claude-opus-5-5, claude-sonnet-5-5 and claude-haiku-4-5-20251001. Every Claude call has a 16,000-token output cap, and a reply cut off by the cap counts as a miss.
Parsing and scoring
An answer that cannot be parsed counts as a miss and is shown with a "couldn't parse" note, never hidden.
- Choice
- Correct when the answer equals the correct option.
- Noul
- Jev's probability at or above 0.5 counts as yes. Correct when that matches the right answer.
- Score
- Jev is correct when it is within 0.5 of the correct level. An LLM is correct when its level equals the correct level.
- Several questions in one request
- Accuracy is the share of questions answered right.
- Finding lines
- The F1 of the lines found against the correct lines. Correct at 0.8 or more.
- Text writing
- Shown to you, not scored.
Cost
Cost is tokens times the stored price per million tokens. Jev's output tokens are free. A call that returns an error costs $0. A model with no stored price shows "price unknown" and is never estimated.
Developer mode uses the same runner and the same math, with your own keys. Jev, Anthropic, OpenAI and Google models use the table below, matched by the exact model ID, and so does Jev reached through an OpenRouter key; any other model from OpenRouter is priced from OpenRouter's published list; any other model shows "price unknown". With a TypeSafe key, Jev's time in Developer mode is the time our server measured for its call to TypeSafe, so the hop from your browser to our server is not counted. With an OpenRouter key the call goes straight from your browser, so its time is what your browser measured, and it includes OpenRouter's routing.
OpenAI and Google charge more for very long prompts (over 272,000 tokens at OpenAI, over 200,000 at Google). This site never sends a prompt that long, so the table holds only the standard price. A discount a provider gives for a repeated prompt (cached input) is not applied, so a cost can read slightly high, never low. A promotional price shows its last day; after that day the model shows "price unknown" until the table is checked again.
| Model | Input $/M | Output $/M |
|---|---|---|
| TypeSafe (Jev) - https://docs.typesafe.ai/models | ||
| jev-1.13.0 | 0.042 | 0 |
| Anthropic - https://platform.claude.com/docs/en/about-claude/pricing | ||
| claude-haiku-4-5-20251001 | 1 | 5 |
| claude-opus-5-5 | 4 | 20 |
| claude-sonnet-5-5 | 2 | 10 |
| OpenAI - https://developers.openai.com/api/docs/pricing | ||
| babbage-002 | 0.4 | 0.4 |
| davinci-002 | 2 | 2 |
| gpt-3.5-turbo | 0.5 | 1.5 |
| gpt-3.5-turbo-0125 | 0.5 | 1.5 |
| gpt-3.5-turbo-1106 | 1 | 2 |
| gpt-3.5-turbo-instruct | 1.5 | 2 |
| gpt-4-0613 | 30 | 60 |
| gpt-4-turbo-2024-04-09 | 10 | 30 |
| gpt-4.1 | 2 | 8 |
| gpt-4.1-mini | 0.4 | 1.6 |
| gpt-4.1-nano | 0.1 | 0.4 |
| gpt-4o | 2.5 | 10 |
| gpt-4o-2024-05-13 | 5 | 15 |
| gpt-4o-mini | 0.15 | 0.6 |
| gpt-5 | 1.25 | 10 |
| gpt-5-mini | 0.25 | 2 |
| gpt-5-nano | 0.05 | 0.4 |
| gpt-5-pro | 15 | 120 |
| gpt-5.1 | 1.25 | 10 |
| gpt-5.2 | 1.75 | 14 |
| gpt-5.2-pro | 21 | 168 |
| gpt-5.4 | 2.5 | 15 |
| gpt-5.4-mini | 0.75 | 4.5 |
| gpt-5.4-nano | 0.2 | 1.25 |
| gpt-5.4-pro | 30 | 180 |
| gpt-5.5 | 5 | 30 |
| gpt-5.5-pro | 30 | 180 |
| gpt-5.6-cyber | 12.5 | 75 |
| gpt-5.6-luna | 0.2 | 1.2 |
| gpt-5.6-solpromotional price until 2026-11-21 | 4 | 20 |
| gpt-5.6-terra | 2 | 12 |
| gpt-6-astra | 10 | 50 |
| gpt-6-luna | 0.1 | 0.5 |
| gpt-6-sol | 2 | 10 |
| gpt-6.1-sol | 2 | 10 |
| o1 | 15 | 60 |
| o1-pro | 150 | 600 |
| o3 | 2 | 8 |
| o3-mini | 1.1 | 4.4 |
| o3-pro | 20 | 80 |
| o4-mini | 1.1 | 4.4 |
| Google - https://ai.google.dev/gemini-api/docs/pricing | ||
| gemini-2.5-flash | 0.3 | 2.5 |
| gemini-2.5-flash-lite | 0.1 | 0.4 |
| gemini-2.5-pro | 1.25 | 10 |
| gemini-3.1-flash-lite | 0.25 | 1.5 |
| gemini-3.1-pro-preview | 2 | 12 |
| gemini-3.5-flash | 1.5 | 9 |
| gemini-3.5-flash-lite | 0.3 | 2.5 |
| gemini-3.6-flashpromotional price until 2026-12-31 | 0.75 | 3.75 |
| gemini-3.7-flashpromotional price until 2026-12-31 | 0.75 | 3.75 |
| gemini-3.8-flashpromotional price until 2026-12-31 | 0.75 | 3.75 |
| gemini-omni-1.1-flash | 1.5 | 9 |
| OpenRouter - https://openrouter.ai/api/v1/models/typesafe/jev-1.13/endpoints | ||
| typesafe/jev-1.13-20260917 | 0.042 | 0 |
How items are chosen
Items and their correct answers are written for this site and checked by hand before recording. Some items are written to show a weakness TypeSafe documents. The same items are never re-run to get a different result. A recording interrupted by a rate limit, overload or network failure is discarded and recorded again, because that measures the account, not the model. When content changes, it is recorded again and old recordings stop showing.
Level 8 (Trick Jev) was rewritten once. The first set of six tricks did not fool Jev at all: it answered all 12 messages correctly, as did Haiku 4.5 and Opus 5.5, and Sonnet 5.5 had two replies that did not parse. We then wrote new tricks aimed at documented weaknesses (wording that points at someone else, a planted instruction, a question about cancelling rather than a request) and recorded that set once. Only the second set is shown in the level.
The Number Crunch Showdown game was rewritten once too. Its first set of counting and arithmetic problems was easy for Jev (it answered all 12 correctly), so we wrote harder ones (longer words, multi-digit arithmetic) and recorded that set once. Only the second set is shown in the game.
Recordings
Recordings are real outputs and are never edited.
| Task | Model | Recorded on | Items |
|---|---|---|---|
| carnival-hoops | jev-1.13.0 | 2026-10-05 | 8 |
| carnival-hoops | claude-haiku-4-5-20251001 | 2026-10-05 | 8 |
| carnival-hoops | claude-opus-5-5 | 2026-10-05 | 8 |
| carnival-hoops | claude-sonnet-5-5 | 2026-10-05 | 8 |
| citation-check | jev-1.13.0 | 2026-10-02 | 12 |
| citation-check | claude-haiku-4-5-20251001 | 2026-10-02 | 12 |
| citation-check | claude-opus-5-5 | 2026-10-02 | 12 |
| citation-check | claude-sonnet-5-5 | 2026-10-02 | 12 |
| confidence-catch | jev-1.13.0 | 2026-10-02 | 20 |
| confidence-catch | claude-haiku-4-5-20251001 | 2026-10-02 | 20 |
| confidence-catch | claude-opus-5-5 | 2026-10-02 | 20 |
| confidence-catch | claude-sonnet-5-5 | 2026-10-02 | 20 |
| date-defense | jev-1.13.0 | 2026-10-05 | 10 |
| date-defense | claude-haiku-4-5-20251001 | 2026-10-05 | 10 |
| date-defense | claude-opus-5-5 | 2026-10-05 | 10 |
| date-defense | claude-sonnet-5-5 | 2026-10-05 | 10 |
| dates-direct | jev-1.13.0 | 2026-10-02 | 4 |
| dates-direct | claude-haiku-4-5-20251001 | 2026-10-02 | 4 |
| dates-direct | claude-opus-5-5 | 2026-10-02 | 4 |
| dates-direct | claude-sonnet-5-5 | 2026-10-02 | 4 |
| dates-fixed | jev-1.13.0 | 2026-10-02 | 4 |
| dates-fixed | claude-haiku-4-5-20251001 | 2026-10-02 | 4 |
| dates-fixed | claude-opus-5-5 | 2026-10-02 | 4 |
| dates-fixed | claude-sonnet-5-5 | 2026-10-02 | 4 |
| fruits-direct | jev-1.13.0 | 2026-10-02 | 4 |
| fruits-direct | claude-haiku-4-5-20251001 | 2026-10-02 | 4 |
| fruits-direct | claude-opus-5-5 | 2026-10-02 | 4 |
| fruits-direct | claude-sonnet-5-5 | 2026-10-02 | 4 |
| fruits-fixed | jev-1.13.0 | 2026-10-02 | 4 |
| fruits-fixed | claude-haiku-4-5-20251001 | 2026-10-02 | 4 |
| fruits-fixed | claude-opus-5-5 | 2026-10-02 | 4 |
| fruits-fixed | claude-sonnet-5-5 | 2026-10-02 | 4 |
| guardrail-gauntlet | jev-1.13.0 | 2026-10-02 | 16 |
| guardrail-gauntlet | claude-haiku-4-5-20251001 | 2026-10-02 | 16 |
| guardrail-gauntlet | claude-opus-5-5 | 2026-10-02 | 16 |
| guardrail-gauntlet | claude-sonnet-5-5 | 2026-10-02 | 16 |
| headline-invaders | jev-1.13.0 | 2026-10-05 | 14 |
| headline-invaders | claude-haiku-4-5-20251001 | 2026-10-05 | 14 |
| headline-invaders | claude-opus-5-5 | 2026-10-05 | 14 |
| headline-invaders | claude-sonnet-5-5 | 2026-10-05 | 14 |
| how-sure | jev-1.13.0 | 2026-10-02 | 10 |
| how-sure | claude-haiku-4-5-20251001 | 2026-10-02 | 10 |
| how-sure | claude-opus-5-5 | 2026-10-02 | 10 |
| how-sure | claude-sonnet-5-5 | 2026-10-02 | 10 |
| inbox-keeper | jev-1.13.0 | 2026-10-05 | 12 |
| inbox-keeper | claude-haiku-4-5-20251001 | 2026-10-05 | 12 |
| inbox-keeper | claude-opus-5-5 | 2026-10-05 | 12 |
| inbox-keeper | claude-sonnet-5-5 | 2026-10-05 | 12 |
| intent-routing | jev-1.13.0 | 2026-10-02 | 12 |
| intent-routing | claude-haiku-4-5-20251001 | 2026-10-02 | 12 |
| intent-routing | claude-opus-5-5 | 2026-10-02 | 12 |
| intent-routing | claude-sonnet-5-5 | 2026-10-02 | 12 |
| needle-hunt | jev-1.13.0 | 2026-10-02 | 3 |
| needle-hunt | claude-haiku-4-5-20251001 | 2026-10-02 | 3 |
| needle-hunt | claude-opus-5-5 | 2026-10-02 | 3 |
| needle-hunt | claude-sonnet-5-5 | 2026-10-02 | 3 |
| negation-maze | jev-1.13.0 | 2026-10-05 | 10 |
| negation-maze | claude-haiku-4-5-20251001 | 2026-10-05 | 10 |
| negation-maze | claude-opus-5-5 | 2026-10-05 | 10 |
| negation-maze | claude-sonnet-5-5 | 2026-10-05 | 10 |
| number-crunch | jev-1.13.0 | 2026-10-02 | 12 |
| number-crunch | claude-haiku-4-5-20251001 | 2026-10-02 | 12 |
| number-crunch | claude-opus-5-5 | 2026-10-02 | 12 |
| number-crunch | claude-sonnet-5-5 | 2026-10-02 | 12 |
| phish-signals | jev-1.13.0 | 2026-10-02 | 3 |
| phish-signals | claude-haiku-4-5-20251001 | 2026-10-02 | 3 |
| phish-signals | claude-opus-5-5 | 2026-10-02 | 3 |
| phish-signals | claude-sonnet-5-5 | 2026-10-02 | 3 |
| product-match | jev-1.13.0 | 2026-10-02 | 16 |
| product-match | claude-haiku-4-5-20251001 | 2026-10-02 | 16 |
| product-match | claude-opus-5-5 | 2026-10-02 | 16 |
| product-match | claude-sonnet-5-5 | 2026-10-02 | 16 |
| review-broad | jev-1.13.0 | 2026-10-02 | 6 |
| review-broad | claude-haiku-4-5-20251001 | 2026-10-02 | 6 |
| review-broad | claude-opus-5-5 | 2026-10-02 | 6 |
| review-broad | claude-sonnet-5-5 | 2026-10-02 | 6 |
| review-parts | jev-1.13.0 | 2026-10-02 | 6 |
| review-parts | claude-haiku-4-5-20251001 | 2026-10-02 | 6 |
| review-parts | claude-opus-5-5 | 2026-10-02 | 6 |
| review-parts | claude-sonnet-5-5 | 2026-10-02 | 6 |
| review-score | jev-1.13.0 | 2026-10-02 | 20 |
| review-score | claude-haiku-4-5-20251001 | 2026-10-02 | 20 |
| review-score | claude-opus-5-5 | 2026-10-02 | 20 |
| review-score | claude-sonnet-5-5 | 2026-10-02 | 20 |
| router-dates | jev-1.13.0 | 2026-10-02 | 1 |
| router-dates | claude-haiku-4-5-20251001 | 2026-10-02 | 1 |
| router-dates | claude-opus-5-5 | 2026-10-02 | 1 |
| router-dates | claude-sonnet-5-5 | 2026-10-02 | 1 |
| router-phish | jev-1.13.0 | 2026-10-02 | 1 |
| router-phish | claude-haiku-4-5-20251001 | 2026-10-02 | 1 |
| router-phish | claude-opus-5-5 | 2026-10-02 | 1 |
| router-phish | claude-sonnet-5-5 | 2026-10-02 | 1 |
| router-poem | jev-latest | 2026-10-02 | 1 |
| router-poem | claude-haiku-4-5-20251001 | 2026-10-02 | 1 |
| router-poem | claude-opus-5-5 | 2026-10-02 | 1 |
| router-poem | claude-sonnet-5-5 | 2026-10-02 | 1 |
| router-sum | jev-1.13.0 | 2026-10-02 | 1 |
| router-sum | claude-haiku-4-5-20251001 | 2026-10-02 | 1 |
| router-sum | claude-opus-5-5 | 2026-10-02 | 1 |
| router-sum | claude-sonnet-5-5 | 2026-10-02 | 1 |
| router-summary | jev-latest | 2026-10-02 | 1 |
| router-summary | claude-haiku-4-5-20251001 | 2026-10-02 | 1 |
| router-summary | claude-opus-5-5 | 2026-10-02 | 1 |
| router-summary | claude-sonnet-5-5 | 2026-10-02 | 1 |
| router-ticket | jev-1.13.0 | 2026-10-02 | 1 |
| router-ticket | claude-haiku-4-5-20251001 | 2026-10-02 | 1 |
| router-ticket | claude-opus-5-5 | 2026-10-02 | 1 |
| router-ticket | claude-sonnet-5-5 | 2026-10-02 | 1 |
| sandbox-counting-trap | jev-1.13.0 | 2026-10-02 | 1 |
| sandbox-moderation | jev-1.13.0 | 2026-10-02 | 1 |
| sandbox-resume-fit | jev-1.13.0 | 2026-10-02 | 1 |
| sandbox-review-rating | jev-1.13.0 | 2026-10-02 | 1 |
| sandbox-spam-check | jev-1.13.0 | 2026-10-02 | 1 |
| sandbox-support-ticket | jev-1.13.0 | 2026-10-02 | 1 |
| severity-archery | jev-1.13.0 | 2026-10-05 | 10 |
| severity-archery | claude-haiku-4-5-20251001 | 2026-10-05 | 10 |
| severity-archery | claude-opus-5-5 | 2026-10-05 | 10 |
| severity-archery | claude-sonnet-5-5 | 2026-10-05 | 10 |
| speed-race | jev-1.13.0 | 2026-10-01 | 40 |
| speed-race | claude-haiku-4-5-20251001 | 2026-10-01 | 40 |
| speed-race | claude-opus-5-5 | 2026-10-01 | 40 |
| speed-race | claude-sonnet-5-5 | 2026-10-01 | 40 |
| trick-jev | jev-1.13.0 | 2026-10-02 | 12 |
| trick-jev | claude-haiku-4-5-20251001 | 2026-10-02 | 12 |
| trick-jev | claude-opus-5-5 | 2026-10-02 | 12 |
| trick-jev | claude-sonnet-5-5 | 2026-10-02 | 12 |
| write-me-a-poem | jev-latest | 2026-10-02 | 3 |
| write-me-a-poem | claude-haiku-4-5-20251001 | 2026-10-02 | 3 |
| write-me-a-poem | claude-opus-5-5 | 2026-10-02 | 3 |
| write-me-a-poem | claude-sonnet-5-5 | 2026-10-02 | 3 |
Load test
We check that the site holds up when many people use it at once. A k6 load test signs in a test user and has simulated people each walk 11 pages (Home, Path, level 1, Games, a game, Arena, Sandbox, the start quiz, Leaderboard, Profile and this page), pausing 2 to 5 seconds on each one, as a reader would. Beginner mode replays come from files and Developer mode calls go from your browser straight to the provider, so serving pages is the server's main work.
It ran on 2026-10-06 against the production build on one Windows PC, which ran the server and all the simulated people at the same time. The target is no failed requests and pages under 2.0 s for 95% of loads.
| People at once | Pages served | Failed | Median page | 95% under | Target met |
|---|---|---|---|---|---|
| 1,000 | 23,768 | 0% | 5.6 s | 6.6 s | No, too slow |
| 400 | 20,070 | 0% | 161 ms | 359 ms | Yes |
What it shows: no request failed in any run. At 1,000 people at once, one server process on one PC runs out of processor time, so pages queue and slow down instead of failing. A deployment spreads people over several server instances, which this local test does not cover. The first 1,000-person run also found a real bottleneck: every page waited for one of only 10 database connections. We raised that to 40, which nearly tripled the pages served per second.
One Node process served up to about 99 pages a second on this PC. That is comfortably up to 400 people at once; beyond that pages queue.