Fable 5.1 vs GPT-6 Astra: Same Price, 57% Apart

Claude Fable 5.1 and GPT-6 Astra both list at $10 per million input tokens and $50 per million output, so every comparison table calls it a tie. The column the tables leave out is cache reads: Fable 5.1 charges $0.25 per million, 2.5% of its input price, and Astra charges $1.00. On a 40-turn agent session with a 95.7% cache hit rate, that one column puts the two models 57% apart, $4.13 vs $6.47. The same price cut narrows the gap between model tiers: on cache reads Fable 5.1 costs only 1.25x what Sonnet 5 does, against 5x on list price. It also makes switching models mid-session expensive. On turn 30 of a warm Fable session, sending one step cold to Haiku 4.5 costs 36% more than staying put. This post covers three charts, a break-even table for mid-session switches, a Python script that computes your effective price from your own usage logs, and where routing still saves money now that cached input is this cheap.

Published 2026-09-23 by Dor Amir on the Nadir blog.

Filed under Pricing & Models.

Two $10 models, two different bills

The frontier tier now has two models at exactly the same list price. Claude Fable 5.1 shipped on September 1 at $10 per million input tokens and $50 per million output. Source: Anthropic, Pricing GPT-6 Astra lists at the same $10 in and $50 out. Source: OpenAI, GPT-6 Astra model page Any comparison table built from those two columns calls it a tie.

It isn't, and the difference sits in a column most comparison tables leave out. Fable 5.1 bills cache reads at $0.25 per million, 2.5% of its input price and 75% below Fable 5's $1.00. Astra bills cached input at $1.00, the 10% ratio the whole industry has used since prompt caching launched. Anthropic's own estimate is that the cut lowers Fable 5.1's effective cost by around 25% on typical workloads and by as much as 45% on highly agentic ones. Source: VentureBeat

Agents spend most of their input on cache reads, so for agent traffic that is the column that matters. This post works through the same agent session on both $10 models, then on Anthropic's cheaper tiers. It found three things:

  1. Same list price, 57% apart on the bill. On a 40-turn agent session, Astra costs $6.47 and Fable 5.1 costs $4.13.
  2. The gap between cheap and expensive models has mostly closed on cached input. A cached token costs $0.25 on Fable 5.1 and $0.20 on Sonnet 5. On list price they're 5x apart.
  3. A cheaper model can make one turn cost more. On turn 30 of a warm Fable 5.1 session, sending a single step to Haiku 4.5 costs 36% more than staying put. Sending it to Sonnet 5 costs 2.7x more.

The price card that matters for agents

ModelInputCache write (5 min)Cache readRead / inputOutput
Claude Fable 5.1$10.00$12.50$0.252.5%$50.00
GPT-6 Astra$10.00$12.50$1.0010%$50.00
Claude Fable 5$10.00$12.50$1.0010%$50.00
Claude Opus 5.5$4.00$5.00$0.205%$20.00
Claude Sonnet 5$2.00$2.50$0.2010%$10.00
Claude Haiku 4.5$1.00$1.25$0.1010%$5.00

All prices are USD per million tokens at list rates, September 2026. Anthropic's rates come from its pricing page, and Astra's from OpenAI's model page, which also lists a $12.50 cache-write rate and a surcharge on prompts over 272K tokens. Sonnet 5 is listed at $2/$10: the increase to $3/$15 that was scheduled for September 1 was cancelled, a trap this blog covered when it was announced.

Fable 5 and Astra match on every column of this table. Fable 5.1 changed only the cache-read column, and that is enough to change which model is cheaper for agents.

The session: 40 turns, one agent

The worked example is a typical coding or research agent loop:

Each turn reads the previous turn's prefix from cache and writes the new 3K to cache. Across the session that comes to 3.12M cache-read tokens, 140K cache-write tokens and 32K output tokens. Cache reads make up 95.7% of all input, which is normal for agents. An agent's prompt grows every turn, so most of each prompt is history the provider has already seen.

Stacked horizontal bars showing one 40-turn agent session billed on five models. Fable 5.1 costs $4.13 and GPT-6 Astra costs $6.47 at the same $10/$50 list price. The only segment that differs between them is cache reads, $0.78 vs $3.12. Opus 5.5 is $1.96, Sonnet 5 $1.29, Haiku 4.5 $0.65.
Stacked horizontal bars showing one 40-turn agent session billed on five models. Fable 5.1 costs $4.13 and GPT-6 Astra costs $6.47 at the same $10/$50 list price. The only segment that differs between them is cache reads, $0.78 vs $3.12. Opus 5.5 is $1.96, Sonnet 5 $1.29, Haiku 4.5 $0.65.
ModelCache readsCache writesOutput**Session total**Uncached (no caching)
Claude Fable 5.1$0.78$1.75$1.60$4.13$34.20
GPT-6 Astra$3.12$1.75$1.60$6.47$34.20
Claude Opus 5.5$0.62$0.70$0.64$1.96$13.68
Claude Sonnet 5$0.62$0.35$0.32$1.29$6.84
Claude Haiku 4.5$0.31$0.18$0.16$0.65$3.42

On list prices alone the two $10 models look identical. On the bill Astra costs 57% more, because the cache-read segment is the only one that differs. Two more details are easy to miss:

What "$10 per million input" really costs

List input price describes a request with no cache hits, which agents almost never send. What an agent actually pays per input token is a blend: reads at the read rate, plus new tokens at the write rate. It depends almost entirely on your cache hit rate.

Line chart of effective input price per million tokens against cache hit rate from 50% to 98%. GPT-6 Astra and Claude Fable 5.1 start close together, about $6.75 and $6.38 at 50%, then separate. At 95.7% hits Astra is $1.49 and Fable 5.1 is $0.78. Claude Sonnet 5 falls from about $1.35 to $0.30.
Line chart of effective input price per million tokens against cache hit rate from 50% to 98%. GPT-6 Astra and Claude Fable 5.1 start close together, about $6.75 and $6.38 at 50%, then separate. At 95.7% hits Astra is $1.49 and Fable 5.1 is $0.78. Claude Sonnet 5 falls from about $1.35 to $0.30.

At a 50% hit rate the two $10 models are 6% apart, and the cheaper cache reads barely matter. At the 90-98% hit rates agent loops actually run at, the gap grows to about 2x. The discount pays off in proportion to how much of your traffic is long, warm sessions. A support bot answering one-shot questions sees almost none of it. A coding agent in a 40-turn loop sees most of it. That's why Anthropic quotes a range, around 25% typical and up to 45% agentic, rather than one number.

The model tiers are closer together on cached input

This is the part with consequences for routing. Here is the price gap between the top and bottom of Anthropic's lineup, token type by token type:

Token typeFable 5.1Sonnet 5Fable vs Sonnet
Uncached input$10.00$2.005.0x
Cache write (5 min)$12.50$2.505.0x
Cache read$0.25$0.201.25x
Output$50.00$10.005.0x

The 5x gap that makes downrouting worth it still applies to output, uncached input and cache writes. On cache reads, the token type agents consume most of, the gap is now 1.25x. Opus 5.5 reads at $0.20 too, the same as Sonnet 5.

So a router that compares list prices will overestimate what it saves on warm agent turns. Across the whole session, Fable 5.1 costs 3.2x as much as Sonnet 5 ($4.13 vs $1.29), not the 5x the list prices suggest. Downrouting still saves money. The savings are just in different places now.

The cheaper model can cost more for one turn

Prompt caches belong to one model. Switch models in the middle of a session and the new model has no copy of the prefix. It has to take the whole prompt in again at full price, or write it to a fresh cache at 1.25x. This blog has priced that switch penalty before. Fable 5.1 makes it much bigger, because what you give up by leaving is a 97.5% discount rather than a 90% one.

Here's turn 30 of the same session: a 107K-token cached prefix, 3K of new context, 800 output tokens.

Bar chart of the cost of turn 30. Staying on warm Fable 5.1 costs $0.104. Sending one turn cold to Haiku 4.5 costs $0.142. Staying on warm GPT-6 Astra costs $0.185. Sending one turn cold to Sonnet 5 costs $0.283.
Bar chart of the cost of turn 30. Staying on warm Fable 5.1 costs $0.104. Sending one turn cold to Haiku 4.5 costs $0.142. Staying on warm GPT-6 Astra costs $0.185. Sending one turn cold to Sonnet 5 costs $0.283.

The warm turn on Fable 5.1 costs $0.104. The same turn sent cold to Haiku 4.5, a model with one tenth of Fable's list price, costs $0.142. Sent cold to Sonnet 5 it costs $0.283, 2.7x more than not switching. Using the cheaper model makes that one turn more expensive.

That doesn't make switching wrong. It makes switching for a single step wrong. What matters is how many turns you'll stay on the cheaper model:

Switch at turn 30Switch turn vs stayingTurns needed to break even
Fable 5.1 → Sonnet 5$0.283 vs $0.1044
Fable 5.1 → Haiku 4.5$0.142 vs $0.1042
GPT-6 Astra → Sonnet 5$0.283 vs $0.1852
GPT-6 Astra → Haiku 4.5$0.142 vs $0.1851 (wins immediately)

On Astra, the old 10% read ratio, a switch to Haiku pays for itself on the first turn. On Fable 5.1, a switch to Sonnet needs to stay for four turns. Commit to Sonnet 5 for the last 11 turns of the session and you pay $0.69 instead of $1.19, so the switch still wins. The same change for a single turn loses. The cheaper cache reads doubled the number of turns a switch must last before it pays off.

Where routing still saves money in September 2026

None of this makes model routing less valuable. It changes where the savings are:

The mistake is treating routing as a per-request choice between list prices. Every routing decision is now also a caching decision, and the cheaper reads get, the more a router that ignores caching costs you.

Tutorial: work out your effective price from your own logs

You don't need our session model. Your API responses already contain the numbers. Anthropic splits every request's input into input_tokens (uncached), cache_creation_input_tokens (writes) and cache_read_input_tokens (reads). OpenAI reports cached input under prompt_tokens_details.cached_tokens in Chat Completions, or input_tokens_details.cached_tokens in the Responses API.

# Effective price per model from logged usage blocks. Prices in USD / 1M tokens.
PRICES = {
    "claude-fable-5-1": {"in": 10.0, "write": 12.50, "read": 0.25, "out": 50.0},
    "gpt-6-astra":      {"in": 10.0, "write": 12.50, "read": 1.00, "out": 50.0},
    "claude-sonnet-5":  {"in": 2.0,  "write": 2.50,  "read": 0.20, "out": 10.0},
    "claude-haiku-4-5": {"in": 1.0,  "write": 1.25,  "read": 0.10, "out": 5.0},
}

def split_usage(provider: str, u: dict) -> dict:
    """Normalize one response's usage block to uncached / write / read / output."""
    if provider == "anthropic":
        return {
            "in": u.get("input_tokens", 0),
            "write": u.get("cache_creation_input_tokens", 0),
            "read": u.get("cache_read_input_tokens", 0),
            "out": u.get("output_tokens", 0),
        }
    # OpenAI Chat Completions. Anything not served from cache is billed at the
    # write rate here, the conservative reading of Astra's $12.50 write price.
    cached = (u.get("prompt_tokens_details") or {}).get("cached_tokens", 0)
    return {
        "in": 0,
        "write": u.get("prompt_tokens", 0) - cached,
        "read": cached,
        "out": u.get("completion_tokens", 0),
    }

def effective_prices(rows):
    """rows: iterable of (model, provider, usage_dict). Returns a per-model report."""
    agg = {}
    for model, provider, usage in rows:
        a = agg.setdefault(model, {"in": 0, "write": 0, "read": 0, "out": 0})
        for k, v in split_usage(provider, usage).items():
            a[k] += v
    report = {}
    for model, t in agg.items():
        p = PRICES[model]
        input_tokens = t["in"] + t["write"] + t["read"]
        input_cost = (t["in"] * p["in"] + t["write"] * p["write"] + t["read"] * p["read"]) / 1e6
        output_cost = t["out"] * p["out"] / 1e6
        report[model] = {
            "hit_rate": t["read"] / max(input_tokens, 1),
            "effective_input_per_m": input_cost / max(input_tokens, 1) * 1e6,
            "list_input_per_m": p["in"],
            "output_share": output_cost / max(input_cost + output_cost, 1e-9),
            "total_usd": input_cost + output_cost,
        }
    return report

Run it over a week of production logs and look at three numbers per model:

  1. `hit_rate`. Below about 80% and the 2.5% read price hardly matters for you. Fix cache stability first: anything that rewrites the prefix turns reads back into writes.
  2. `effective_input_per_m` against `list_input_per_m`. This is your real input price. On a healthy agent it should be 5-15% of the list price.
  3. `output_share`. Above about 35% and output tokens are the biggest cost. Shorter outputs and routing output-heavy steps to a cheaper model will save more than any input-side trick.

One caveat for comparing across vendors: tokenizers differ. Anthropic notes that Claude 4.7 and later models produce roughly 30% more tokens for the same text than earlier Claude models. We've covered what that does to per-task cost. The fair comparison is the effective price multiplied by how many tokens each model uses for your prompts, which is what total_usd above measures from real traffic.

Getting a cache-aware routing decision from Nadir

Nadir's decision endpoint takes the session's cache state as an input, so the router weighs the cost of losing a warm cache against what it would save on the cheaper model. It uses each model's own cache-read rate rather than assuming a flat 10%, which is the difference between a correct and an incorrect answer on Fable 5.1:

curl https://api.getnadir.com/v1/recommend \
  -H "X-API-Key: $NADIR_API_KEY" \
  -d '{
    "prompt": "Rename the helper and update its two call sites.",
    "cache_state": {
      "model": "claude-fable-5-1",
      "cached_tokens": 107000,
      "ttl": "5m",
      "expected_remaining_turns": 1
    }
  }'

With one turn left, the answer is to stay on the warm model even though a cheaper model could handle the prompt. With a dozen turns left, the answer is to switch now. The response includes both projected costs and the reason for the decision, so you can audit the call instead of taking it on trust. The same cache-read and cache-write breakdown appears per model in the dashboard's cost view. If you're choosing between Fable 5.1 and Astra for an agent product, that breakdown answers the question with your own traffic.

Checklist

  1. Add a cache-read column to your model comparison sheet. Blended prices that leave it out were reasonable when every model read cache at 10% of input. They aren't any more.
  2. Estimate cost at your own hit rate, not at list price. The two $10 models are 6% apart at 50% hits and about 2x apart at 96%.
  3. Pick models at session boundaries, not step by step. On a 2.5%-read model, a switch needs to last several turns before it pays off.
  4. Send fresh-context work to cheaper models. Subagents, one-shot calls and new sessions have no cache to lose.
  5. Keep an eye on output. When input gets this cheap, output becomes the biggest cost, and it's still priced 5x apart between tiers.
  6. Recompute when prices change. Cache-read rates now vary by model, by generation and by vendor. A router with hardcoded prices will be wrong after the next price change.

List prices were never the full story for agents, and September made the gap large enough to change which model is cheaper. Price the cache-read column alongside the other two and route with it. Start free, or read the complete guide to cutting LLM API costs for the rest of the stack.

Related reading

More on pricing & models

Pages on this site

Machine-readable summaries of this site: llms.txt and llms-full.txt.