Jev vs OpenAI Decisions: classifier models head to head in three small games
We had two new classifier APIs play each other in browser games to see what separates them on speed, accuracy, refusals and cost.

What is a classifier model?
A classifier model (the vendors call them decision models) reads some input and picks one answer from a list you give it. It doesn’t write text. You send the state and a question with its options, and you get back the pick plus a probability for every option.
state: {
you: { health: 72, fireball_ready: true },
opponent: { health: 65, action: "walk_forward" },
range: "mid",
opponent_fireball: { ticks_to_hit: 40 }
}“Pick the move that gives you the best outcome right now.”
“Given the incoming fireball and mid range, the best move is probably to jump in, though a fireball of your own could also work…”
A bunch of these came out in the last month. TypeSafe launched Jev in September, OpenAI opened its Decisions API as a public beta on October 6, and Cloudflare, Microsoft and Amazon each shipped one within a couple of weeks. We wanted to see how two of them compare on the same tasks, so we built Classifier Arena, where Jev and OpenAI Decisions play each other in small browser games.
When a classifier model is useful
A lot of what companies ask us to build is classification, even when it ends up behind a chat window. Routing a support ticket to the right team, deciding whether an inbound email is a lead, picking which tool an agent should call next, flagging a message as spam, or grading another model’s answer against a rubric are all “here’s the input, pick one of these”.
- Route a support ticket
“I was charged twice for my October invoice.”
billing (picked)bugaccount accesssales - Triage an inbound email
“We’re looking for help automating claims intake, can we set up a call?”
lead (picked)existing clientvendor pitchspam - Pick an agent’s next step
User asked for last quarter’s revenue. No report in context yet.
search_docsrun_sql (picked)ask_useranswer - Grade another model’s answer
Answer cites a refund policy that was archived in 2024.
passneeds reviewfail (picked)
Most teams do this today with a general LLM and a prompt that says “answer with one of these words”. That works, but it’s slower and way more expensive than it needs to be, and you have to parse text and hope the model stayed on the list. A classifier model always answers from your list. In our tests both came back in about 150 to 200 ms, and they cost a few cents per thousand decisions (Jev is $0.042 and OpenAI Decisions $0.10 per million input tokens, and output is free for both). You also get a probability for each option, so the low-confidence cases can go to a person.
They don’t fit everything. Neither model tells you why it picked something, so we’d be careful using one for a regulated decision where someone has to explain the outcome. TypeSafe’s own docs list counting, arithmetic, comparing dates and multi-hop reasoning as weak spots for Jev, so it helps to work those fields out in code before you send the state. And if the answer isn’t on a list you can write down ahead of time, you still need a generative model.
How the arena works
Both models get the same game state, the same prompt, the same options in the same order and the same timing: one request in flight at a time, at least 100 ms between requests, and a 1 second timeout. Each game has one frozen prompt that was never tuned for either model. When a game turned out dull we changed the game and left the prompt alone. Every decision is logged, and any match replays exactly from its log.
- Same game state
- Same prompt
- Same options
- Same option order (reshuffled per question)
- Same timing: 1 request at a time, 1 s timeout
We shuffle the option order for every question, using the same shuffle for both models. In an early test with one fighter state, a single reshuffle of the same 11 options changed OpenAI’s top pick on 20 of 20 calls, while Jev kept its pick every time. That’s one state, so we don’t want to read too much into it, but a fixed order could have quietly favored one model.
| Model | Top pick, original order | Top pick, shuffled | Pick changed |
|---|---|---|---|
| Jev | fireball | fireball | 0 of 20 |
| OpenAI Decisions | heavy_punch | sweep | 20 of 20 |
All the published matches ran from one Mac between October 12 and 16, and the API calls for the whole thing cost $4.24.
Fighter
A 2D fight between two identical stick figures, best of three rounds. Each model picks one of 11 moves (jab, sweep, fireball, block high and so on) from the current state, over and over. The game runs at 60 ticks a second and never waits for an answer, so a model that answers faster gets more moves.
This one tests the decision loop under time pressure, meaning how quickly a model can turn a changing state into a reasonable action. Jev won 75% of 56 matches.
We think most of that came from speed. Jev had the lower median latency in every match and made about 38% more decisions per match (284 vs 206). The bigger the latency gap in a match, the more often Jev won: 6 of 9 when the gap was under 25 ms, 15 of 21 at 25 to 50 ms, and 21 of 26 above 50 ms.
6 of 9
15 of 21
21 of 26
Against a scripted bot, OpenAI won 7 of 12 and Jev only 2 of 10. Those are small samples, but they suggest Jev won the fights by getting more moves in.
Inbox Invaders
Text messages fall down two lanes, one per model. Each model labels the lowest message in its lane as legit, spam or smishing (SMS phishing) before it lands. A wrong label or a message that lands unanswered costs health, and smishing costs three times as much. The messages come from a public SMS phishing dataset (Mishra & Soni, 2022), and the dataset’s labels are the right answers.
- Legitcosts 1 if wrong or missed
No problem. Talk to you later
- Spamcosts 1 if wrong or missed
You won’t believe it but it’s true. It’s Incredible Txts! Reply G now to learn truly amazing things that will blow your mind.
- Smishingcosts 3 if wrong or missed
URGENT! Your Mobile number has been awarded with a £2000 prize GUARANTEED. Call <phone> from land line. Claim 3030. Valid 12hrs only
This is the most realistic of the three, because it’s a normal classification task with a deadline. Jev won 92.3% of 52 matches.
Both models were about equally accurate (95.7% for Jev, 95.0% for OpenAI), so the result came down to speed, and the faster model won 49 of 52 matches. 7.8% of OpenAI’s answers arrived after their message had already landed, against 1.1% of Jev’s. Per match, messages that landed unanswered cost OpenAI about 67 health and Jev about 9, and wrong answers cost OpenAI about 30 and Jev about 19 (more of OpenAI’s mistakes were on smishing, which costs triple).
If your use case is labeling a queue overnight, that speed gap probably doesn’t matter and these two are close to a tie. If it’s in front of a user or inside an agent loop, it adds up quickly.
Clue Clash
A Codenames-esque word game that works like a reverse dictionary. Both models see the same definition and pick the word it defines from the same 16 close-meaning nouns (char, groom, skinner, porter and so on). Each definition is revealed in three steps and both models pick at every step, so a match is 16 words and 48 picks each. The words and definitions come from Open English Wordnet.
- Step 1
a laborer who tendsfires (as on a coal-fired train or steamship)
OpenAIstoker 31% ✓ rightJevgroom 37% ✗ wrong - Step 2
a laborer who tends fires (as on acoal-fired train or steamship)
OpenAIstoker 99% ✓ rightJevstoker 100% ✓ right - Step 3
a laborer who tends fires (as on a coal-fired train or steamship)
OpenAIstoker 100% ✓ rightJevstoker 100% ✓ right
It’s turn based, so speed only matters for the tiebreak and the 1 second timeout, which makes this the accuracy test. Jev won 81.7% of 60 matches.
Jev won this one on accuracy. Out of 960 picks at each step of the reveal, it got 619 right at the first step against OpenAI’s 574, 823 against 773 at the second, and 904 against 883 at the third. Only 6 of Jev’s 49 wins were ties decided by the faster correct answers, which is what happened in the featured match above (33 to 33).
What surprised us
OpenAI’s Decisions API sometimes declined to answer. It returns a refusal with no choice and no reason, and that happened on 1.6% of fighter decisions and 0.4% of Clue Clash picks. Jev never refused. OpenAI refused nothing in Inbox Invaders (0 of 24,730), even though that game is full of phishing and spam texts, and the Clue Clash refusals were on harmless definitions like “red table grape of California” (the answer is emperor, refused 6 times) and vague first-step fragments like “a small …”. Our guess is the API declines when no option clearly fits, more than any content filter, but without a reason in the response we can’t confirm it. If you build on it, plan for the case where you get no answer.
| Game | OpenAI refusals |
|---|---|
| Fighter | 283 of 17,940 (1.6%) |
| Inbox Invaders | 0 of 24,730 |
| Clue Clash | 13 of 3,408 (0.4%) |
“red table grape of California”
emperor · refused 6 times“a small …”
a first-step fragmentLatency includes the network. The two APIs are hosted by different vendors in different places, so part of Jev’s speed edge may be distance from our machine and not the model. We’d want to rerun from a couple of other locations before saying much more about speed.
The same text also costs a different number of tokens on each API. Jev counted the fighter prompt as 1,166 input tokens and OpenAI as 782, so the per-token price gap overstates the per-decision one. Jev still came out cheaper per 1,000 decisions in every game ($0.024 to $0.049, against $0.034 to $0.077 for OpenAI).
| Game | Model | Accuracy | Refusals | p50 | p95 | Cost / 1k |
|---|---|---|---|---|---|---|
| Fighter | Jev | not graded | 0.0% | 147 ms | 238 ms | $0.049 |
| OpenAI | not graded | 1.6% | 188 ms | 385 ms | $0.077 | |
| Inbox Invaders | Jev | 95.7% | 0.0% | 164 ms | 240 ms | $0.024 |
| OpenAI | 95.0% | 0.0% | 196 ms | 326 ms | $0.034 | |
| Clue Clash | Jev | 81.3% | 0.0% | 159 ms | 215 ms | $0.028 |
| OpenAI | 78.4% | 0.4% | 208 ms | 385 ms | $0.035 |
Deciding what counts as a valid match took more thought than we expected. If you rerun every match where a model timed out, you throw away exactly the matches the slower model lost. So in the final rules a timeout or a refusal counts as that model’s miss, and only setup failures (network errors, or the machine pausing mid-match) make a match invalid. A rule like that can move a leaderboard by several points, and you’d never see it in the headline number.
Pick a classifier with an eval
The games are silly, and nobody should pick a model because it wins at stick-figure fighting. They do show the kinds of things two classifier models can differ on, though: accuracy on your task, latency at the pace you’d run it, how often you get no answer, sensitivity to option order, and cost per decision. Two models can tie on one and be far apart on another, like Inbox Invaders, where accuracy was the same and speed decided almost every match.
For a real project the eval should come from your own data, and it probably won’t be as fun as these. Take a few hundred real examples (tickets, emails, claims, whatever the decision is about), label them, and run each candidate on the same set with the same prompt and options. Track accuracy per class, p50 and p95 latency from where you’ll deploy, refusals and timeouts, and cost. Then rerun it when a new model comes out, which in this category is about every week right now. If the decision step sits behind one interface in your code, switching models becomes a config change.
- input
- “I was charged twice for my October invoice, can someone fix this?”
- options
- billing · bug · account access · sales
- expected
- billing
- source
- real support ticket, personal details removed
- Accuracy per class
- p50 and p95 latency from where you deploy
- Refusals and timeouts
- Pick changes when options are reordered
- Cost per 1,000 decisions
Try it
The code is on GitHub at Malleable-ai/classifier-arena. You can replay every published match in your browser without any API keys. With keys you can run your own matches, and every paid command prints a cost estimate first (a head-to-head fighter match is about 9 cents).
Adding a provider that speaks one of the two existing API formats is config only. Cloudflare’s Clef models follow Jev’s System One format, so they should drop in by changing the endpoint and model, and the repo’s provider docs walk through Clef-flash as the example (we haven’t run it ourselves yet). Adding a game means writing one engine, one prompt and a renderer, and the leaderboard, logs and replays pick it up.
These are the classifier models we know of as of mid-October 2026:
- TypeSafeJevThe one that started the category. Early access.(opens in a new tab)
- OpenAIDecisions APIRuns gpt-6-luna. Public beta.(opens in a new tab)
- CloudflareClef and Clef-flashWorkers AI, open weights (Apache 2.0), same API format as Jev.(opens in a new tab)
- MicrosoftMicrosoft-Decision-1In Microsoft Foundry, launched October 9.(opens in a new tab)
- AWS Strands LabsStrands Decider 2BOpen source and small enough to run on a laptop.(opens in a new tab)
If you’re trying to work out which of these fits a classification problem at your company, this kind of eval is something we set up with clients, and we’re happy to talk it through.
Results are from one machine, one frozen prompt per game, and five days of matches, so treat them as a snapshot. Not affiliated with or endorsed by TypeSafe or OpenAI. Inspired by llm-colosseum, where LLMs play a fighting game against each other.