Haiku 5.5 returns 400 for thinking disabled at xhigh: a Sume agent fix
Claude Haiku 5.5 rejects thinking disabled at xhigh or max effort. How that 400 shows up in an agent that calls Sume, and how to set the pair.

If a request to Claude Haiku 5.5 sets thinking: {"type": "disabled"} together with effort of xhigh or max, the API returns a 400. The fix is to omit the thinking field or send {"type": "adaptive"} at those levels, or to lower effort to high or below if you want thinking off. This matters for a Sume agent wrapper because a generic client often adds a fixed thinking setting to every call, and a tool loop that raises effort for one hard step can then fail before any Sume tool runs.
The rules on the vendor page
Anthropic's effort page states that Haiku 5.5 has thinking on by default, that thinking counts toward max_tokens, and that thinking: disabled is allowed at high effort or below. At xhigh or max it returns a 400, so adaptive thinking is the way to use those levels.
| thinking setting | effort low to high | effort xhigh or max |
|---|---|---|
| Omitted (default) | Thinking on | Thinking on |
| adaptive | Allowed | Allowed |
| disabled | Allowed | 400 error |
How the failure looks in a Sume loop
The 400 comes from the model API, so no Sume call was made and nothing was billed by Sume. A loop that treats any error as retryable may re-send the same request and hit the same 400 forever. Separate model errors from Sume tool errors: a Sume tool error such as insufficient_scope or an admission refusal belongs to the tool result, while a model 400 is a client bug.
One related fact from Sume's own catalog: Haiku 5.5 is the replacement for Haiku 4.5 in Sume's in-app agent model list, and the retired 4.5 row maps onto it. That is a statement about Sume's chat model picker, not about the model field of its API.
A safe default
For the dotted and dashed model-id naming problem that sits next to this one, see the Haiku 4.5 dashed alias 400.
- Pick effort per step, and derive
thinkingfrom it: omit it abovehigh, and senddisabledonly athighor below. - Never send both a fixed
disabledand a variable effort. - Leave
max_tokenslarge enough for thinking, since it counts toward the limit. - Log the HTTP status of the model call apart from the MCP tool result.
A small helper that cannot produce the bad pair
The simplest fix is to compute the two settings together in one function, so no code path can set a fixed disabled beside a high effort. Anthropic's rule is that disabled is accepted at high or below and rejected at xhigh and max, so the helper encodes that and nothing else.
Keep the helper in your client, not in a prompt. A model cannot be asked to avoid a 400 it never sees, and the error arrives before any tool runs. Write one test per level so a later change to the defaults shows up in CI, not in a paid run.
Sources
Related posts
More in Developers
- Hono 4.13.10 split adapters: update a Sume webhook receiver
Hono 4.13.10 moved adapters to @hono/bun, @hono/deno and @hono/cloudflare-workers. The Sume verifyWebhook call needs no change; only the entrypoint imports do.
- Hono 4.13.13 deprecates app.mount(): mount a Sume webhook sub-app
Hono 4.13.13 deprecates app.mount() in favor of Mount Middleware. A Sume webhook receiver written as a Hono sub-app uses app.route() and keeps its raw body.
- Which Sume hosted MCP tools are read-only? 24 the docs label Read
The tools-and-gates page labels 24 hosted MCP tools as Read across five groups, plus meta and account tools. List and verify with tools_list.
- Can hosted MCP run a Sume Format? Call it over REST with an API key
The hosted MCP tools-and-gates inventory lists no Format-run tool. Run Formats with POST /v1/formats/{handle}/{slug}/runs and an API key that has formats:write.
Written by Sume