{"record":{"id":"8e52f8f6e07711ba","repo":"can1357/oh-my-pi","slug":"model-spec-provider-spec-id-resolved-to-an-e","errorCode":null,"errorMessage":"Model ${spec.provider}/${spec.id} resolved to an empty thinking range","messagePattern":"Model (.+?)/(.+?) resolved to an empty thinking range","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/catalog/src/compat/resolve.ts","lineNumber":1133,"sourceCode":"\t\t\"supportsReasoningEffort\" in compat &&\n\t\tcompat.supportsReasoningEffort === false\n\t) {\n\t\treturn undefined;\n\t}\n\tif (omitsWireReasoningEffort(spec.api, compat)) return undefined;\n\tconst rule = readRuleThinking(axes);\n\tif (spec.thinking && Array.isArray(spec.thinking.efforts) && spec.thinking.efforts.length > 0) {\n\t\treturn fillExplicitThinking(spec, facts, compat, spec.thinking, rule);\n\t}\n\tif (compat !== undefined && \"trustExplicitThinkingOnly\" in compat && compat.trustExplicitThinkingOnly === true) {\n\t\treturn undefined;\n\t}\n\tconst config: ThinkingConfig = {\n\t\tmode: rule.mode ?? defaultThinkingMode(spec, facts),\n\t\tefforts: rule.efforts ?? fallbackEfforts(spec, compat),\n\t};\n\tif (config.efforts.length === 0) {\n\t\tthrow new Error(`Model ${spec.provider}/${spec.id} resolved to an empty thinking range`);\n\t}\n\tif (rule.defaultLevel !== undefined) config.defaultLevel = rule.defaultLevel;\n\tconst effortMap = mergeEffortMap(spec, facts, rule.effortMap, compat, config.efforts);\n\tif (effortMap !== undefined) config.effortMap = effortMap;\n\tif (rule.effortBudgets !== undefined) config.effortBudgets = rule.effortBudgets;\n\tconst supportsDisplay = rule.supportsDisplay ?? defaultSupportsDisplay(spec, facts);\n\tif (supportsDisplay) config.supportsDisplay = true;\n\tconst requiresEffort =\n\t\trule.requiresEffort ?? (impliesMandatoryReasoning(facts, spec.id) || isQwenTemplateReasoningEffortCompat(compat));\n\tif (requiresEffort) config.requiresEffort = true;\n\tif (rule.suppressWhenOff) config.suppressWhenOff = true;\n\treturn config;\n}\n\nfunction defaultSupportsDisplay<TApi extends Api>(spec: ModelSpec<TApi>, facts: IdentityFacts): boolean {\n\treturn (\n\t\t(spec.api === \"anthropic-messages\" || spec.api === \"bedrock-converse-stream\") &&\n\t\tfacts.anthropicAdaptiveGenAtLeast(\"4.7\")","sourceCodeStart":1115,"sourceCodeEnd":1151,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/catalog/src/compat/resolve.ts#L1115-L1151","documentation":"Thrown while building a model's ThinkingConfig in resolve.ts: after applying the rule's efforts (or the fallback effort ladder) the resulting thinking range is empty, so there is no valid effort level to configure. The library refuses to produce a ThinkingConfig with zero efforts since downstream request builders require at least one level.","triggerScenarios":"resolveThinkingConfig (or similar) for a spec where rule.efforts and fallbackEfforts both yield [] — e.g. a KDL rule sets an efforts ladder that a later filter/patch axis empties out, or fallbackEfforts returns nothing for an unknown model class.","commonSituations":"A KDL `thinking` rule listing effort levels that a limits/identity correction axis removes entirely; a newly discovered model with no class/family match so no fallback ladder applies; typo in an effort name in the rule leaving zero recognized levels.","solutions":["Check the model's KDL thinking rule and ensure its efforts list uses valid effort identifiers.","Add/fix a class or family rule so fallbackEfforts can supply a ladder for the model.","Regenerate with `bun run gen:compat` and re-run resolution for the model id to confirm a non-empty range."],"exampleFix":"// before (classes/foo.kdl)\nrule \"foo-5\" { efforts [\"bogus-level\"] }\n// after: valid effort ladder\nrule \"foo-5\" { efforts [\"low\", \"medium\", \"high\"] }","handlingStrategy":"validation","validationCode":"null","typeGuard":"null","tryCatchPattern":"try {\n  const thinking = resolveThinking(spec);\n} catch (err) {\n  if (err.message.includes(\"empty thinking range\")) {\n    logger.error(\"thinking rule produced no efforts\", { model: spec.id });\n  }\n  throw err;\n}","preventionTips":["Ensure every thinking KDL rule lists at least one valid effort identifier.","Verify class/family coverage so fallbackEfforts has a ladder for new models.","After regen, smoke-test resolution for each newly added model id."],"tags":["catalog","compat","thinking","configuration"],"backgroundTag":"empty-thinking-effort-range","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}