{"record":{"id":"05a4f228f548888b","repo":"JuliusBrussee/caveman","slug":"cave-claude-reasoning-capability-unknown","errorCode":"cave_claude_reasoning_capability_unknown","errorMessage":"cave_claude_reasoning_capability_unknown:${model}","messagePattern":"cave_claude_reasoning_capability_unknown:(.+?)","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/agent/src/claude-runtime.ts","lineNumber":518,"sourceCode":"  reasoning: AgentDefinition[\"reasoning\"],\n  outputMaxTokens: number | undefined,\n): Pick<ClaudeSDKOptions, \"thinking\" | \"effort\"> {\n  if (reasoning === \"off\") return { thinking: { type: \"disabled\" } };\n  const capability = claudeThinkingCapability(model);\n  if (capability === \"adaptive\") {\n    return {\n      thinking: { type: \"adaptive\" },\n      effort: claudeEffort(reasoning),\n    };\n  }\n  if (capability === \"manual\") {\n    const budgetTokens = reasoning === \"high\" ? 8_192 : reasoning === \"medium\" ? 4_096 : 1_024;\n    if (outputMaxTokens !== undefined && outputMaxTokens <= budgetTokens) {\n      throw new Error(\"cave_claude_output_budget_too_small_for_reasoning\");\n    }\n    return { thinking: { type: \"enabled\", budgetTokens } };\n  }\n  throw new Error(`cave_claude_reasoning_capability_unknown:${model}`);\n}\n\nfunction claudeThinkingCapability(model: string): \"adaptive\" | \"manual\" | \"unknown\" {\n  if (/^claude-(?:haiku-4-5|sonnet-4-5|opus-4-(?:1|5))(?:-\\d{8})?$/.test(model)) {\n    return \"manual\";\n  }\n  if (/^claude-(?:sonnet|opus)-4-[678](?:-\\d{8})?$/.test(model) ||\n      /^claude-(?:fable|mythos|sonnet|opus)-5(?:-\\d+)?$/.test(model)) {\n    return \"adaptive\";\n  }\n  return \"unknown\";\n}\n\n// Accepts ANY result subtype: error subtypes (error_max_turns, …) carry the\n// same provider `usage` a success does, so the receipt can be built from a\n// failed run too.\ntype ClaudeCredentialRegime = \"metered\" | \"subscription\" | \"unknown\";\n","sourceCodeStart":500,"sourceCodeEnd":536,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/3ee70a102609e550bd2e68004bf5990a9341c851/packages/agent/src/claude-runtime.ts#L500-L536","documentation":"claudeThinkingCapability classifies models by regex into \"adaptive\", \"manual\", or \"unknown\". When reasoning is enabled and the model is neither adaptive nor manual (capability \"unknown\"), the runtime refuses to guess how to configure thinking and throws with the model name embedded, so new/renamed Claude models fail loudly until supported.","triggerScenarios":"Enabling reasoning on a model string that does not match the known patterns, e.g. \"claude-3-5-sonnet\", \"claude-opus-4-6\", a dated snapshot with unexpected format, or a typo like \"claude-sonet-4-5\".","commonSituations":"Using an older or newer Claude model added after this runtime's capability table was written; misspelling the model name in CAVE_MODEL or provider.json; snapshot date suffix variants not matching the regex.","solutions":["Switch to a supported model, e.g. anthropic/claude-haiku-4-5 or claude-sonnet-4-5.","If reasoning is not required, set the agent's reasoning to \"off\" (capability check is skipped).","Upgrade the caveman agent package so its capability table recognizes your model.","Fix typos in the configured model name."],"exampleFix":"// before\nmodel: \"anthropic/claude-3-5-sonnet-20241022\"\n// after\nmodel: \"anthropic/claude-sonnet-4-5\"","handlingStrategy":"validation","validationCode":"const KNOWN = [/^claude-(?:haiku-4-5|sonnet-4-5|opus-4-(?:1|5))(?:-\\d{8})?$/];\nfunction isKnownClaudeModel(model) {\n  return KNOWN.some((re) => re.test(model));\n}\nif (reasoning !== \"off\" && !isKnownClaudeModel(model)) {\n  throw new Error(`model \"${model}\" unknown to this runtime; disable reasoning or pick a supported model`);\n}","typeGuard":"function isKnownClaudeModel(v) { return typeof v === \"string\" && /^claude-(?:haiku-4-5|sonnet-4-5|opus-4-(?:1|5))(?:-\\d{8})?$/.test(v); }","tryCatchPattern":"try {\n  await run(agent, { reasoning: \"high\" });\n} catch (e) {\n  if (String(e.message).startsWith(\"cave_claude_reasoning_capability_unknown:\")) {\n    console.error(`Unsupported model for reasoning: ${e.message.split(\":\")[1]}; falling back to reasoning off`);\n    return run(agent, { reasoning: \"off\" });\n  }\n  throw e;\n}","preventionTips":["Pin models from the runtime's supported list","Upgrade the agent package before adopting newly released Claude models","Catch unknown-model strings early by validating model names at config load time"],"tags":["claude","reasoning","unknown-model","unsupported-value"],"backgroundTag":"unsupported-enum-value","analyzedSha":"3ee70a102609e550bd2e68004bf5990a9341c851","analyzedAt":"2026-09-20T15:53:39.229Z","contentChangedAt":"2026-09-20T15:53:39.229Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}