Claude Fable 5.1 · Coding
Claude Fable 5.1 for coding: our test runs
Claude Fable 5.1 ran our 5 coding prompts in llmwise, through the same pipeline your messages take. Here's every reply as it came, whether it passed, what it cost and what it counts as on Pro, next to the other models.
Based on 5 of our test runs on , through OpenRouter with the app's own prompt and settings. Updated .
Short answer
In our test runs on September 27, 2026, Claude Fable 5.1 passed 5 of 5 of our coding prompts (both hard ones): tied 1st of 15 models. Each reply counted as 1 message on Pro, where it has 31 a month, and cost $0.0425 to run on average.
Prompt by prompt
Each of the 5 coding prompts, and how Claude Fable 5.1's reply did.
| Prompt | Result | Cost | Time |
|---|---|---|---|
| Turn a title into a URL slugEveryday | Passed: All 7 tests passed. | $0.0167 | 5.5 s |
| Parse a duration like “1h 30m”Everyday | Passed: All 10 tests passed. | $0.0173 | 4.7 s |
| Merge overlapping intervalsEveryday | Passed: All 7 tests passed. | $0.0214 | 5.3 s |
| Evaluate an arithmetic expression, no evalHard | Passed: All 15 tests passed. | $0.0874 | 15.7 s |
| Parse CSV with quoted fieldsHard | Passed: All 8 tests passed. | $0.0697 | 14.3 s |
Every coding reply from Claude Fable 5.1
Turn a title into a URL slug
An everyday prompt: “Turn a title into a URL slug”, in full.
Passed: All 7 tests passed.
```javascript function slugify(title) { return String(title) .normalize("NFD") // split accented letters into base + combining marks .replace(/[\u0300-\u036f]/g, "") // strip the combining marks .toLowerCase() .replace(/[^a-z0-9]+/g, "-") // any run of non-alphanumerics -> single hyphen .replace(/^-+|-+$/g, ""); // trim leading/trailing hyphens } ```671 tokens in, 170 out · 5.5 s · $0.0167 · 1 message on Pro · answered by anthropic/claude-fable-5.1 via Anthropic ·
Parse a duration like “1h 30m”
An everyday prompt: “Parse a duration like “1h 30m””, in full.
Passed: All 10 tests passed.
```javascript function parseDuration(text) { if (typeof text !== 'string') return null; const match = /^\s*(?:(\d+)h)?\s*(?:(\d+)m)?\s*(?:(\d+)s)?\s*$/.exec(text); if (!match) return null; const [, h, m, s] = match; if (h === undefined && m === undefined && s === undefined) return null; return (Number(h ?? 0) * 3600) + (Number(m ?? 0) * 60) + Number(s ?? 0); } ```626 tokens in, 193 out · 4.7 s · $0.0173 · 1 message on Pro · answered by anthropic/claude-fable-5.1 via Anthropic ·
Merge overlapping intervals
An everyday prompt: “Merge overlapping intervals”, in full.
Passed: All 7 tests passed.
```javascript function mergeIntervals(intervals) { if (!Array.isArray(intervals) || intervals.length === 0) return []; // Copy so the input (and its inner pairs) is never mutated const sorted = intervals .map(([start, end]) => [start, end]) .sort((a, b) => a[0] - b[0] || a[1] - b[1]); const result = [sorted[0]]; for (let i = 1; i < sorted.length; i++) { const [start, end] = sorted[i]; const last = result[result.length - 1]; if (start <= last[1]) { // Overlapping or touching: extend the current interval if (end > last[1]) last[1] = end; } else { result.push([start, end]); } } return result; } ```621 tokens in, 275 out · 5.3 s · $0.0214 · 1 message on Pro · answered by anthropic/claude-fable-5.1 via Anthropic ·
Evaluate an arithmetic expression, no eval
A hard prompt: “Evaluate an arithmetic expression, no eval”, in full.
Passed: All 15 tests passed.
```javascript function evaluate(expression) { if (typeof expression !== "string") throw new Error("Expression must be a string"); // ---- Tokenizer ---- const tokens = []; let i = 0; while (i < expression.length) { const ch = expression[i]; if (ch === " " || ch === "\t" || ch === "\n" || ch === "\r") { i++; continue; } if (ch >= "0" && ch <= "9") { let start = i; while (i < expression.length && expression[i] >= "0" && expression[i] <= "9") i++; if (expression[i] === ".") { i++; if (!(expression[i] >= "0" && expression[i] <= "9")) { throw new Error(`Invalid number at position ${start}`); } while (i < expression.length && expression[i] >= "0" && expression[i] <= "9") i++; } tokens.push({ type: "num", value: parseFloat(expression.slice(start, i)), pos: start }); continue; } if ("+-*/^()".includes(ch)) { tokens.push({ type: ch, pos: i }); i++; continue; } throw new Error(`Unexpected character '${ch}' at position ${i}`); } tokens.push({ type: "end", pos: expression.length }); // ---- Parser ---- let p = 0; const peek = () => tokens[p]; const next = () => tokens[p++]; const fail = (tok) => new Error( tok.type === "end" ? "Unexpected end of expression" : `Unexpected token '${tok.type === "num" ? tok.value : tok.type}' at position ${tok.pos}` ); // expr := term (('+'|'-') term)* function parseExpr() { let value = parseTerm(); while (peek().type === "+" || peek().type === "-") { const op = next().type; const rhs = parseTerm(); value = op === "+" ? value + rhs : value - rhs; } return value; } // term := unary (('*'|'/') unary)* function parseTerm() { let value = parseUnary(); while (peek().type === "*" || peek().type === "/") { const op = next().type; const rhs = parseUnary(); value = op === "*" ? value * rhs : value / rhs; } return value; } // unary := '-' unary | power function parseUnary() { if (peek().type === "-") { next(); return -parseUnary(); } return parsePower(); } // power := atom ('^' unary)? (right-associative; exponent may carry unary minus) function parsePower() { const base = parseAtom(); if (peek().type === "^") { next(); const exponent = parseUnary(); return Math.pow(base, exponent); } return base; } // atom := number | '(' expr ')' function parseAtom() { const tok = next(); if (tok.type === "num") return tok.value; if (tok.type === "(") { const value = parseExpr(); const close = next(); if (close.type !== ")") throw fail(close); return value; } throw fail(tok); } const result = parseExpr(); if (peek().type !== "end") throw fail(peek()); return result; } ```762 tokens in, 1,561 out (387 of them reasoning) · 15.7 s · $0.0874 · 1 message on Pro · answered by anthropic/claude-fable-5.1 via Anthropic ·
Parse CSV with quoted fields
A hard prompt: “Parse CSV with quoted fields”, in full.
Passed: All 8 tests passed.
```javascript function parseCsv(text) { const rows = []; if (text.length === 0) return rows; let row = []; let field = ''; let i = 0; const n = text.length; while (i < n) { const ch = text[i]; if (field === '' && ch === '"' && fieldStart) { // Quoted field i++; while (i < n) { const c = text[i]; if (c === '"') { if (text[i + 1] === '"') { field += '"'; i += 2; } else { i++; break; } } else { field += c; i++; } } // After closing quote, consume any trailing chars until delimiter/newline while (i < n && text[i] !== ',' && text[i] !== '\n' && text[i] !== '\r') { field += text[i]; i++; } fieldStart = false; continue; } if (ch === ',') { row.push(field); field = ''; fieldStart = true; i++; } else if (ch === '\n' || (ch === '\r' && text[i + 1] === '\n')) { row.push(field); rows.push(row); row = []; field = ''; fieldStart = true; i += ch === '\r' ? 2 : 1; } else { field += ch; fieldStart = false; i++; } } // Handle final field/row unless text ended exactly on a line break const endsWithNewline = text.endsWith('\n'); if (!endsWithNewline) { row.push(field); rows.push(row); } return rows; // fieldStart tracks whether we're at the beginning of a field (so a quote // there opens a quoted field, while a quote mid-field is a literal char). var fieldStart; } ``` Note: `fieldStart` is declared with `var` (hoisted) and starts `undefined`, which is falsy — so the first field wouldn't be treated as quoted. Here is the corrected version with it initialized properly: ```javascript function parseCsv(text) { const rows = []; if (text.length === 0) return rows; let row = []; let field = ''; let fieldStart = true; let i = 0; const n = text.length; while (i < n) { const ch = text[i]; if (fieldStart && ch === '"') { i++; while (i < n) { const c = text[i]; if (c === '"') { if (text[i + 1] === '"') { field += '"'; i += 2; } else { i++; break; } } else { field += c; i++; } } while (i < n && text[i] !== ',' && text[i] !== '\n' && text[i] !== '\r') { field += text[i]; i++; } fieldStart = false; continue; } if (ch === ',') { row.push(field); field = ''; fieldStart = true; i++; } else if (ch === '\n' || (ch === '\r' && text[i + 1] === '\n')) { row.push(field); rows.push(row); row = []; field = ''; fieldStart = true; i += ch === '\r' ? 2 : 1; } else { field += ch; fieldStart = false; i++; } } if (!text.endsWith('\n')) { row.push(field); rows.push(row); } return rows; } ``` Use the second block.669 tokens in, 1,229 out · 14.3 s · $0.0697 · 1 message on Pro · answered by anthropic/claude-fable-5.1 via Anthropic ·
How it compares on coding
Claude Fable 5.1 beside the job's picks among every model. 13 models share the hard-problems pick, Claude Fable 5.1 among them.
| Model | Passed | On Pro | Cost per reply |
|---|---|---|---|
| GLM 5.3Our pick: hard problems (shared), best value | 5 of 5 | 250 a month on Pro | $0.0015 |
| GLM 5.3 FlashOur pick: hard problems (shared), everyday | 5 of 5 | 60 a day on Pro | $0.0003 |
| Claude Fable 5.1Our pick: hard problems (shared) | 5 of 5 | 31 a month on Pro | $0.0425 |
Every limit is published. Paid plans also have a monthly fair-use limit on AI cost: Pro $7.50, Max $20, Ultra $42, Studio $85. Using every message on your plan at typical sizes stays under it; very large messages and heavy research use it faster. Every limit, explained.
How these runs were done
Tests. Automatic. The function runs against the prompt's tests in a separate Node.js process with a time limit and no file, network or child-process access; it passes when every test passes.
Claude Fable 5.1, and coding, elsewhere
- Claude Fable 5.1: price, limits and messages on every plan
- The best AI for coding: our picks among every model
- Claude for coding
- Claude Fable 5.1 for writing: our test runs
- Claude Fable 5.1 for math: our test runs
- Claude Fable 5.1 for data analysis: our test runs
- Claude Fable 5.1 vs GPT-6 Astra
- Claude Fable 5.1 vs Claude Opus 5.5
- Claude Fable 5.1 vs Kimi K3
- Claude Fable 5.1 vs Grok 4.7
- Analyze a CSV with code: the prompt, and its price
- Our test runs: 50 prompts on every model
Questions
Is Claude Fable 5.1 good for coding?
In our test runs it passed 5 of 5 coding prompts, tied 1st of the 15 models in llmwise. Every reply is on this page, so you can judge them yourself.
How many of my messages does a coding reply from Claude Fable 5.1 use?
1 message each on Pro, where it has 31 a month on Pro. The price of a message is fixed and shown before you send it, however long the reply.
How were these runs done?
The same way for every model: each prompt sent through llmwise's own pipeline, each reply checked the same way. The methods page has every prompt and how each is scored.
Claude, GPT, Gemini, DeepSeek, Grok, Kimi, and GLM, in one chat.
See what a message costs before you send it. Free is 5 messages to try; sign in with an email link, no password or card.