Chess benchmark
Standard chess and Chess960 against fixed engine opponents. Compare ratings, rejected moves and the cost and time of each game.
Chess960
Select a column to sort. Scroll sideways for all metrics →
| # | Model | Rating 95% interval | Games | Illegal / invalid | API cost / game | Sec / move | Min / game |
|---|---|---|---|---|---|---|---|
| 1 | GPT-6.1 Solreasoning medium | 1,543 | 24 | 1.8%15 / 818 | $0.959 | 49.8 | 27.8 |
| 2 | GPT-6 Astrareasoning medium | 1,305 | 24 | 2.2%16 / 718 | $2.53 | 40.4 | 19.7 |
| 3 | Claude Opus 5.5reasoning medium | 1,258 | 24 | 4.9%39 / 790 | $0.903 | 14.0 | 7.3 |
| 4 | GPT-6 Solreasoning medium | 1,157 | 24 | 1.6%11 / 674 | $0.908 | 53.5 | 24.6 |
| 5 | Claude Sonnet 5.5reasoning medium | 1,094 | 24 | 7.7%73 / 944 | $0.531 | 10.8 | 6.5 |
| 6 | Claude Haiku 5.5reasoning medium | 1,085 | 24 | 3.5%31 / 894 | $0.060 | 16.2 | 9.7 |
| 7 | Claude Fable 5.1reasoning medium | 1,052 | 24 | 11.3%92 / 815 | $3.42 | 29.8 | 15.0 |
| 8 | gpt-oss 20Blocal, thinking low · open weights | 809provisional | 1 | 18.8%3 / 16 | n/a | 1,536.9 | 333.0 |
| 9 | Ministral 3 8Blocal, no thinking · open weights | 713provisional | 2 | 64.3%18 / 28 | n/a | 21.7 | 2.2 |
| 10 | Qwen3.5 9Blocal, no thinking · open weights | 713provisional | 2 | 88.9%8 / 9 | n/a | 281.9 | 7.0 |
| 11 | Qwen3.8 27Blocal, no thinking · open weights | 713provisional | 2 | 50.0%13 / 26 | n/a | 1,440.0 | 180.0 |
| 12 | GPT-6 Lunareasoning medium | 697 | 24 | 11.3%77 / 684 | $0.021 | 12.2 | 5.2 |
| 13 | Qwen3.8 Flash-Nextlocal, thinking low · open weights | 645provisional | 4 | 19.0%24 / 126 | n/a | 292.0 | 124.1 |
| 14 | Gemma 3 4Blocal, no thinking · open weights | 506provisional | 2 | 60.0%12 / 20 | n/a | 20.5 | 1.7 |
No models match your search.
Illegal / invalid = rejected answers ÷ answered requests, including retries. Time includes all model replies, retries and queue wait. Per move counts each model turn, including a final forfeit. Per game excludes engine time.
Move quality and additional metrics
| Model | Accuracy | Blunders /100 | Engine match | Forfeits | Output tokens / move |
|---|---|---|---|---|---|
| GPT-6.1 Solreasoning medium | 83.6 | 7.6 | 37.2% | 0 | 1,453 |
| GPT-6 Astrareasoning medium | 83.7 | 5.7 | 34.1% | 0 | 737 |
| Claude Opus 5.5reasoning medium | 81.2 | 10.0 | 31.4% | 0 | 997 |
| GPT-6 Solreasoning medium | 81.6 | 6.9 | 29.4% | 0 | 2,351 |
| Claude Sonnet 5.5reasoning medium | 81.4 | 7.1 | 27.8% | 0 | 999 |
| Claude Haiku 5.5reasoning medium | 78.4 | 9.4 | 26.2% | 0 | 2,889 |
| Claude Fable 5.1reasoning medium | 82.9 | 8.0 | 30.7% | 0 | 1,802 |
| gpt-oss 20Blocal, thinking low · open weights | 78.5 | 7.7 | 7.7% | 0 | 8,507 |
| Ministral 3 8Blocal, no thinking · open weights | 74.9 | 20.0 | 10.0% | 2 | 24 |
| Qwen3.5 9Blocal, no thinking · open weights | 92.5 | 0.0 | 0.0% | 2 | 2,512 |
| Qwen3.8 27Blocal, no thinking · open weights | 65.7 | 23.1 | 0.0% | 2 | 5,847 |
| GPT-6 Lunareasoning medium | 71.6 | 14.7 | 19.8% | 2 | 708 |
| Qwen3.8 Flash-Nextlocal, thinking low · open weights | 72.4 | 14.7 | 23.5% | 0 | 5,273 |
| Gemma 3 4Blocal, no thinking · open weights | 83.3 | 0.0 | 25.0% | 2 | 24 |
The Pareto frontier connects results where no other model is both at least as strong and cheaper or faster, with one strict improvement. Higher and further left is better. Based on point estimates, including provisional results; bars show 95% intervals. Short games can reduce per-game cost and time.
Recent games and opponents
Latest games
The opponents
Each game is against one rung of this ladder, chosen near the model's current estimate. Stockfish's limited-strength levels are pinned at their nominal ratings. The weaker rungs are rated from games against them.
| Opponent | Rating | Where the rating comes from |
|---|---|---|
| Random mover | -99 | measured from 119 engine games |
| Skill 0, 75% random moves | 136 | measured from 121 engine games |
| Skill 0, 50% random moves | 411 | measured from 159 engine games |
| Skill 0, 25% random moves | 785 | measured from 200 engine games |
| Skill 0, 10% random moves | 1,063 | measured from 120 engine games |
| Stockfish 1320 | 1,320 | Stockfish calibration (pinned) |
| Stockfish Skill 0 | 1,370 | measured from 241 engine games |
| Stockfish 1500 | 1,500 | Stockfish calibration (pinned) |
| Stockfish Skill 2 | 1,519 | measured from 121 engine games |
| Stockfish 1700 | 1,700 | Stockfish calibration (pinned) |
| Stockfish Skill 4 | 1,793 | measured from 118 engine games |
| Stockfish 1900 | 1,900 | Stockfish calibration (pinned) |
| Stockfish 2100 | 2,100 | Stockfish calibration (pinned) |
| Stockfish 2300 | 2,300 | Stockfish calibration (pinned) |
| Stockfish 2500 | 2,500 | Stockfish calibration (pinned) |
| Stockfish 2800 | 2,800 | Stockfish calibration (pinned) |
| Stockfish 3190 | 3,190 | Stockfish calibration (pinned) |
MethodologyProtocol, scoring & limitations
A game
Every move is a fresh request. The model gets the variant, its colour, the starting position, the moves so far and the current position, and answers with one move inside a tag. It can think as long as its settings allow. It doesn't get a list of legal moves, because keeping track of the board is part of the test.
An illegal or unreadable answer gets one line of feedback and another try, up to 3 tries a move. After that the model forfeits. Every rejected try is kept and counted under Illegal / invalid. The denominator is answered requests, including retries, from finished games. Transport failures are excluded.
A game ends normally (mate, stalemate, repetition, the 50-move rule), or by adjudication: once Stockfish rates the position at 10 pawns or more for one side across 6 measured positions in a row, after a long dead-level stretch, or at 300 plies. Adjudicated games are flagged.
Ratings
Models only ever play the opponents in the ladder, never each other. Every game is one result against an opponent with a fixed benchmark rating, and each model's rating is fitted to its own results alone. Adding a model never moves anyone else's number. A Chess960 game uses the same start position for every model, in the same order. Colours alternate.
We pin Stockfish's limited-strength levels at their nominal UCI_Elo values and fit the weaker opponents against them. This is an internal engine-anchored scale. We haven't independently validated those nominal values at our 0.5-second move time or in Chess960. It isn't interchangeable with ChessBench, FIDE or Chess.com ratings.
Grading
Stockfish analyses the position before and after every model move at 1,000,000 nodes. From that we take the engine's best move, its top three, and how much winning chance the move gave up. Inaccuracies, mistakes and blunders use Lichess's thresholds (5, 10 and 15 points of winning chance). Accuracy is Lichess's per-move formula. Because that formula forgives every move in a position already won or lost, we report it only for moves made while the game was still open.
Cost and time
Claude models run through Claude Code and OpenAI models through the Codex CLI, on a subscription, with our own instructions and every tool switched off. Local models run on our own DGX Sparks. Nobody is billed per request, so the cost we show is API-equivalent: what the same tokens, rejected tries included, would cost at the lab's list price. Local models have no list price, so their cost shows as n/a, not zero.
Token counts are what each request actually used. The Codex CLI adds about 9,800 tokens of its own context to every request and Claude Code about 640, so input tokens are higher than the chess prompt alone. Time is the wall-clock wait for each answer, including any queue on our side, so compare it within a route rather than across them.
What it doesn't show
Chess is one skill. A strong rating says a model can track a board and plan within these rules. It doesn't say how good the model is at your work. Models with no reasoning setting run at their provider's default. A request that fails on our side (a timeout, an outage, a usage limit) aborts the game, and an aborted game never counts against the model.