Field SOP
Field SOP

Claude Fable 5.1 API Migration SOP

Fable 5.1's 2026-09-01 launch lists three breaking API changes, each able to 400 or silently degrade at cutover. ① tool_choice any/tool now returns 400 — switch to auto with strict tool use or structured outputs. ② Thinking blocks are bound to the model: Fable 5.1 can read older models' thinking but not vice versa, so fallback loses the reasoning chain. ③ Editing history turns invalidates thinking blocks and errors on accounts created on or after 2026-08-31. This piece gives a three-step pre-upgrade audit, per-change code fixes, post-migration regression checks (parallel-call distribution, thinking continuity, 20+ round stress test, watermark/C2PA downstream compatibility), canary rollback, and eight pitfalls (whole-file rewrite tendency, low-effort memory answers, history edits breaking the cache). The turn-scoped system messages and context-editing betas are the fixes; exact header names are per official docs.

Published September 1, 202610 min read
<!-- claude-fable-5-1-api-migration-sop | sop | Claude Fable 5.1 API Migration SOP -->

On September 1, 2026, Anthropic released Claude Fable 5.1 (API identifier claude-fable-5-1) alongside Mythos 5.1. For teams running the Claude API in production this is not a routine swap: the announcement lists three breaking changes, any one of which can break a live call path the moment you change the model string, or degrade it quietly. This is an operations manual - pre-upgrade audit and migration first, then regression verification, rollback, and pitfalls. For capabilities and pricing see Claude Fable 5.1 and Mythos 5.1: What Changed; for cost arithmetic see Agentic Cost Comparison Under a Cache-First Architecture.


The three breaking changes at a glance

  1. Forced tool use is removed. Setting tool_choice to any or tool now returns a 400 error. Use auto instead, with strict tool use or structured outputs to constrain output shape.
  2. Thinking blocks are model-bound. Fable 5.1 can read thinking blocks from earlier models, but earlier models cannot read Fable 5.1's own, so the reasoning chain is lost when a router or fallback switches models.
  3. Editing history turns invalidates thinking blocks. Injecting or removing per-turn reminders, or rebuilding the system or tools array mid-conversation, now raises an error. Enforced for accounts created on or after August 31, 2026. The recommended fix is turn-scoped system messages plus server-side context editing.

Two fail loudly, one fails silently. The dangerous one is the second: no exception, just a noticeably worse model after fallback. Three beta capabilities ship behind a request header: per-message effort, turn-scoped system messages, and thinking.display: "updates". The last two are the antidotes to changes two and three.


Pre-upgrade checklist: three steps

Map the blast radius before editing code, including call sites introduced indirectly by frameworks or configuration.

1. Search for tool_choice

Do not limit the search to explicit assignments in source; tool_choice may come from a JSON config, a template string, or a framework default:

bash
rg -n "tool_choice|toolChoice" --glob '!*.lock' .
rg -n '"type"\s*:\s*"(any|tool)"' .

One trap: many frameworks internally default to tool_choice: any whenever the caller wants a structured result. Those call sites are invisible in your code, so review framework versions and defaults too. For each hit, record the intent - "must call this tool" and "must return this shape" have different fixes.

2. Map your model routing

The second change only affects systems with a fallback path. Confirm whether any code path feeds the same messages history to more than one model - timeout fallback, rate-limit fallback, difficulty routing, or switching to a cheaper model past a context threshold. One history plus several models means change two applies.

3. Check whether you rewrite history mid-conversation

The third change hits everything that mutates context mid-stream: per-turn reminders in messages, a rebuilt system, or a rebuilt tools array.

Turn the results into a migration backlog:

CheckHow to checkConsequence if hit
tool_choice other than autoSearch source and config, including framework defaultsRequests fail with 400
Router or fallback existsLook for a shared messages arrayChain lost on fallback
Mid-conversation rewriteInspect context construction and compactionError on accounts from 2026-08-31
Throughput depends on parallel callsMeasure calls per turn historicallyDocumented regression: one call per turn
Downstream consumes output textInspect logging, caching, diff pipelinesWatermark and C2PA change the bytes

Change 1: replace forced tool use with auto

Symptom: requests return 400 after switching to claude-fable-5-1.

Before - forced tool use used to guarantee a call or a shape:

python
resp = client.messages.create(
    model="claude-fable-5-1",
    max_tokens=8192,
    system=SYSTEM,
    tools=TOOLS,
    tool_choice={"type": "any"},      # now returns 400
    messages=messages,
)

After - hand the decision back to the model, constrain shape with structured outputs:

python
resp = client.messages.create(
    model="claude-fable-5-1",
    max_tokens=8192,
    system=SYSTEM,
    tools=TOOLS,
    tool_choice={"type": "auto"},     # the model decides whether to call a tool
    messages=messages,
)

tool_calls = [b for b in resp.content if b.type == "tool_use"]
if not tool_calls:
    handle_no_tool_call(resp)         # retry, fall back, or use the structured output path

auto means the model may call nothing, so the caller needs a branch for that. And if the real requirement is "must match this schema", use structured outputs instead: one constrains output format, the other calling behavior. Anthropic gave no reason for the removal (unconfirmed). Hard constraints such as "the final turn must call the submit tool" need validation and retry outside the loop.


Change 2: repair the reasoning chain on fallback

Symptom: no error, but quality drops sharply after falling back to an earlier model, especially on multi-step reasoning.

Root cause: compatibility is one-directional.

Before - all models share one history; switching changes only the model field:

python
def call(messages, prefer="claude-fable-5-1"):
    try:
        return client.messages.create(model=prefer, messages=messages, **KW)
    except (APITimeoutError, RateLimitError):
        # same history, different model: Fable 5.1 thinking blocks are noise here
        return client.messages.create(model=FALLBACK_MODEL, messages=messages, **KW)

After - project the history before falling back:

python
def call(messages, prefer="claude-fable-5-1"):
    try:
        return client.messages.create(model=prefer, messages=messages, **KW)
    except (APITimeoutError, RateLimitError):
        return client.messages.create(
            model=FALLBACK_MODEL,
            messages=strip_unreadable_thinking(messages, target=FALLBACK_MODEL),
            **KW,
        )

Drop thinking blocks the target cannot consume; the exact shape of strip_unreadable_thinking depends on how you store history. The fallback model then reasons again - unavoidable. The alternative, rebuilding the conversation, costs earlier context.


Change 3: stop rewriting history mid-conversation

Symptom: requests raise an error, and only for accounts created on or after August 31, 2026. Identical code keeps working on an old account and fails on a new one, which is easily misdiagnosed as flakiness.

Before - per-turn reminders, or a rebuilt system and tools array:

python
messages.append({"role": "user", "content": REMINDER})   # per-turn reminder: now raises
resp = client.messages.create(model=MODEL, system=new_system, tools=new_tools, messages=messages)

After - per-turn instructions go through turn-scoped system messages; history trimming goes to server-side context editing. Both are beta features enabled by a request header:

python
resp = client.beta.messages.create(
    model="claude-fable-5-1",
    max_tokens=8192,
    betas=["turn-scoped-system", "context-editing"],   # exact names per official docs, unconfirmed
    system=SYSTEM,                                     # stable for the whole session
    messages=[{"role": "user", "content": "..."}],
    # per-turn instructions passed in the official turn-scoped form
)

The exact beta header names and parameter shapes are unconfirmed here: check the official docs before shipping. The principle holds regardless - stable instructions go in system, per-turn instructions through the turn-scoped channel, history edits on the server rather than reordered client-side. If compaction stays client-side, strip thinking blocks there.


Post-migration regression checklist

Finished is not correct. Script these four checks.

  1. Tool calls per turn. Compare the per-turn call distribution between Fable 5 and 5.1 on a representative task set. Parallel calls are documented as less stable, so loops may issue one call per turn where they previously batched: measure the distribution, not the mean.
  2. Thinking block continuity. Assert across a multi-turn session that every response carries a parseable thinking block, and run the fallback path separately to confirm no blocks sit in history unused.
  3. Long-conversation stress. Build 20+ turn sessions that trigger compaction and confirm the change-3 error is gone - with an account created after 2026-08-31, since a pass on an old account proves nothing.
  4. Output shape. Confirm the output watermark and C2PA credentials do not break parsing; revisit anything doing exact matching, hash caching, or byte comparison.
CheckMethodPass criterion
Parallel tool callsCompare per-turn call distributionsNo drop in parallel batch share
Thinking continuityAssert blocks present and parseableContinuous; no unreadable residue
Long-conversation stability20+ turns with compactionNo change-3 errors
Downstream compatibilityExercise parsing, cache, diff pipelineWatermark and C2PA break nothing

Fallback and rollback strategy

Keep the old model path alive; do not cut over in one step.

  • Externalize the model identifier. Put the model ID in configuration, so rollback is a config change, not a release.
  • Gradual rollout. Start at 1% by user or request, watch the four metrics above, then step up. Passing demos is not a rollout criterion.
  • Predefined circuit breakers. Write thresholds down in advance - error rate, calls per turn, cost per task - and switch back automatically.
  • Isolate session state. Do not mix histories across paths during rollout, or change two gets amplified.

Pitfalls

  1. What the 2026-08-31 cutoff means. The change-3 check is enforced for accounts created on or after that date. Old account fine, new account failing is expected, not flakiness. Use a new account for regression or you are reading a false green.
  2. Batch versus real-time pricing. Batch is $5/$25 per million against $10/$50 real time, but interactive agents rarely absorb batch latency (SLA unconfirmed). Decide by whether the path tolerates async delivery, not unit price.
  3. Watermark and C2PA versus logs and caching. Output carries a mandatory statistical text watermark and generated files carry C2PA credentials, so output is no longer plain text: exact matching, dedup, and hash caching can break.
  4. Parallel degradation versus throughput. One call per turn means more turns per task, raising latency and token use together - worse than any error-raising change for throughput-sensitive systems. The 75% cache-read cut to $0.25 per million offsets cost, not latency.
  5. Whole-file rewrites versus code review. A documented tendency to rewrite whole files shows up as diff volume, heavier reviews, and more conflicts. Add diff-size monitoring to CI and ask for minimal edits.
  6. Memory-based answers at low effort. Documented: less narration, more memory-based answering. Do not minimize effort where external facts must be cited; per-message effort allocates per turn, it is not a global dial.
  7. History edits break your cache. Server-side context editing is coupled to prompt cache hit conditions. Re-measure hit rate after migrating; a falling hit rate is a silent cost incident.
  8. Provenance detection is in private preview. Keep it off the critical path.

One-page cheat sheet

ChangeSymptomFix
tool_choice: any / tool removed400 errorauto plus strict tool use or structured outputs; handle the no-call branch
Thinking blocks model-boundSilent quality drop after fallbackProject history first; strip unreadable blocks or keep per-model sessions
History edits invalidate thinking blocksError on accounts from 2026-08-31Turn-scoped system messages; server-side context editing
Parallel calls unstable (regression)One call per turnRe-estimate throughput; cache cut offsets cost, not latency
Whole-file rewrite tendency (regression)Diff volume explodesCI diff-size monitoring; require minimal edits
Low effort answers from memory (regression)Fluent but unsourcedDo not minimize effort where facts are cited
Output watermark plus C2PAExact matching and hash caching breakRework parsing and cache keys

References

  • Anthropic official announcement and release notes (Claude Fable 5.1 / Mythos 5.1, released 2026-09-01) - source for the three breaking changes, the three beta capabilities, the documented regressions, the 1M context window, 128K maximum output, adaptive thinking always on, the 75% cache-read cut to $0.25 per million tokens, base pricing $10/$50, batch $5/$25, output watermarking, C2PA credentials, and private preview status of the provenance detection API. Exact URL unconfirmed.
  • Anthropic official API documentation (tool use, strict tool use, structured outputs, thinking, beta headers) - exact beta header names and parameter shapes must come from the official docs; unconfirmed, and no documentation URL is asserted. Latency SLA and availability commitments for the batch channel are also unconfirmed.
  • Everything else here is implementation advice and engineering reasoning, flagged in place, not an official source.

FAQ

Q1: After switching tool_choice from any to auto, the model often calls no tool. What should I do? A1: That is expected - auto returns the call decision to the model and the API no longer guarantees a call. Clarify whether the requirement is "must call this tool" or "must return this shape": the second belongs to structured outputs. Then validate outside the loop so a missing call routes to retry or fallback.

Q2: Our fallback has always shared one history across models. Why is quality dropping now? A2: Earlier models cannot read Fable 5.1's thinking blocks, so what you pass down is noise and the chain breaks at fallback; earlier models could read each other's blocks, which is why this never showed up. Project the history first and strip what the target cannot read, or keep a session per model.

Q3: The same code passes on our test account and fails on a new one. Is this a configuration problem? A3: Probably not - the account creation date likely crossed the cutoff, since the change-3 check is enforced for accounts created on or after August 31, 2026. A pass on an old account implies nothing about a new one; run regression with a post-2026-08-31 account.

Q4: No errors after migrating, but every task takes more turns. Why? A4: Most likely the documented parallel tool calling regression - the loop issues one call per turn where it previously batched. Confirm by comparing the per-turn call distribution between old and new on a representative set. More turns raise latency and token use together; the cache-read cut offsets cost, not latency.

Q5: Can prompt wording work around the parallel degradation and the whole-file rewrite tendency? A5: It mitigates both but cannot remove them, since both are documented behavior regressions. For parallel calls, ask explicitly for independent calls in the same turn; effectiveness varies by task. For rewrites, ask for changed fragments only and add diff-size monitoring to CI.

This article is AI-assisted and human-edited. Last updated: 2026-09-01

FAQ

After switching `tool_choice` from `any` to `auto`, the model often calls no tool. What should I do?
That is expected - `auto` returns the call decision to the model and the API no longer guarantees a call. Clarify whether the requirement is "must call this tool" or "must return this shape": the second belongs to structured outputs. Then validate outside the loop so a missing call routes to retry or fallback.
Our fallback has always shared one history across models. Why is quality dropping now?
Earlier models cannot read Fable 5.1's thinking blocks, so what you pass down is noise and the chain breaks at fallback; earlier models could read each other's blocks, which is why this never showed up. Project the history first and strip what the target cannot read, or keep a session per model.
The same code passes on our test account and fails on a new one. Is this a configuration problem?
Probably not - the account creation date likely crossed the cutoff, since the change-3 check is enforced for accounts created on or after August 31, 2026. A pass on an old account implies nothing about a new one; run regression with a post-2026-08-31 account.
No errors after migrating, but every task takes more turns. Why?
Most likely the documented parallel tool calling regression - the loop issues one call per turn where it previously batched. Confirm by comparing the per-turn call distribution between old and new on a representative set. More turns raise latency and token use together; the cache-read cut offsets cost, not latency.
Can prompt wording work around the parallel degradation and the whole-file rewrite tendency?
It mitigates both but cannot remove them, since both are documented behavior regressions. For parallel calls, ask explicitly for independent calls in the same turn; effectiveness varies by task. For rewrites, ask for changed fragments only and add diff-size monitoring to CI.

Related

Field SOP

Migration SOP for Model Sunsets and Repricing: Four Steps to Inventory, Migrate, Recalculate, and Contain Cost

Three things happened at once on 2026-08-31: Sonnet 5 API rates moved from $2 and $10 to $3 and $15, GPT-5.4 and GPT-5.4 mini stopped being offered to Codex users signed in with ChatGPT, and kimi-k2.5 and moonshot-v1 sunset the same day. The three change types need completely different responses, yet most teams apply one uniform reaction and end up either overreacting or underreacting. This SOP runs four steps. Step zero classifies using keywords in the vendor announcement: sunset or deprecated means the ID stops responding, handle it today; replace or a default change means the entry point still works but the model behind it changed, so run a regression this week; pricing only means no interruption but a recalculation this month. Step one inventories every model ID in the codebase with a single grep, collapses them into one central config, and wires the check into CI. Step two executes the per-type migration. Step three recalculates monthly cost from three factors: tokenizer inflation, peak versus off-peak share, and cache hit rate. Also included: an eleven-item checklist, step four on limits, alerts and a fallback path, and seven ways this goes wrong, the most common being model IDs scattered through code where one fix misses three call sites.

Aug 31, 202612 min read
Field SOP

LLaDA-Image Local Deploy SOP: Setup, Inference, Production

A five-step SOP for running Ant's open-source 6B image model LLaDA-Image: (1) environment setup with dependencies and mirror-accelerated downloads; (2) choosing among four weight variants (Base 50-step / Turbo 4-step, each in BF16 or FP8, with ModelScope for China); (3) generating the first image with minimal Base and Turbo commands; (4) advanced work - reference-image editing, text rendering, ComfyUI integration, and degradation strategies when VRAM runs short; (5) productionizing with batch queues, concurrency sizing, cost monitoring, result storage and graceful failure modes. Includes 6 pitfalls and a 10-item launch checklist, with every command copied verbatim from the official README; note the repo license is null, so confirm rights before commercial use.

Sep 9, 202611 min read
Field SOP

Self-Hosting OpenMAIC: From Zero-Deploy to Agent Workbench

A complete SOP for getting OpenMAIC running from zero: (1) zero-deploy hosted mode with an access code from open.maic.chat; (2) standard local setup (pnpm >= 10: clone, pnpm install, .env, pnpm dev); (3) production (pnpm build && pnpm start, one-click Vercel, docker compose up --build); (4) advanced (Postgres persistence profile, ACCESS_CODE, MP4 export profile, Lemonade/FunASR local providers); (5) wiring it into agent workbenches (clawhub install openmaic or importing skills/openmaic/, generating classrooms from Feishu/Slack messages). Includes 6 pitfalls and a 10-item pre-launch checklist, with every command copied verbatim from the official README.

Sep 8, 202611 min read