charmbracelet/crush · warning
no reasoning levels available
Error message
no reasoning levels available
What it means
setReasoningItems throws this error when the resolved coder model has an empty ReasoningLevels map, meaning the model offers no reasoning effort settings — so a reasoning-selection dialog has nothing to display.
Source
Thrown at internal/ui/dialog/reasoning.go:251
}
return m
}
func (r *Reasoning) setReasoningItems() error {
cfg := r.com.Config()
agentCfg, ok := cfg.Agents[config.AgentCoder]
if !ok {
return errors.New("agent configuration not found")
}
selectedModel := cfg.Models[agentCfg.Model]
model := cfg.GetModelByType(agentCfg.Model)
if model == nil {
return errors.New("model configuration not found")
}
if len(model.ReasoningLevels) == 0 {
return errors.New("no reasoning levels available")
}
currentEffort := selectedModel.ReasoningEffort
if currentEffort == "" {
currentEffort = model.DefaultReasoningEffort
}
items := make([]list.FilterableItem, 0, len(model.ReasoningLevels))
selectedIndex := 0
for i, effort := range model.ReasoningLevels {
item := &ReasoningItem{
Versioned: list.NewVersioned(),
effort: effort,
title: common.FormatReasoningEffort(effort),
isCurrent: effort == currentEffort,
t: r.com.Styles,
}
items = append(items, item)View on GitHub (pinned to 7944b8e522)
Solutions
- Switch the coder model to one that exposes reasoning levels (e.g. a thinking-capable Claude or GPT model)
- Add ReasoningLevels to the custom model definition if it does support reasoning
- Skip opening the reasoning dialog for models without reasoning support
Example fix
// before: reasoning dialog opened for a non-reasoning model
model := cfg.GetModelByType(agentCfg.Model)
if len(model.ReasoningLevels) > 0 {
NewReasoning(...)
}
// after: guard the caller
if model := cfg.GetModelByType(agentCfg.Model); model != nil && len(model.ReasoningLevels) > 0 {
NewReasoning(...)
} Defensive patterns
Strategy: type-guard
Validate before calling
model := cfg.GetModelByType(agentCfg.Model)
if model != nil && len(model.ReasoningLevels) == 0 {
// hide the reasoning dialog entry for this model
} Type guard
func supportsReasoning(cfg *config.Config, mt config.SelectedModelType) bool {
m := cfg.GetModelByType(mt)
return m != nil && len(m.ReasoningLevels) > 0
} Try / catch
if err := dialog.SetReasoningItems(); err != nil {
// gracefully omit the reasoning option in the UI
} Prevention
- Only show the reasoning dialog for reasoning-capable models
- Check ReasoningLevels before advertising reasoning controls
- Keep custom model definitions complete with ReasoningLevels and DefaultReasoningEffort
When it happens
Trigger: Opening the reasoning dialog while the selected model is a non-reasoning model (no ReasoningLevels defined in the provider catalog); a custom model definition that omits reasoning levels.
Common situations: Selecting models like small/fast chat models that do not expose thinking/reasoning controls; stale or hand-written model definitions missing ReasoningLevels; provider catalog versions where a model dropped reasoning support.
Related errors
- agent configuration not found
- model configuration not found
- configuration not found
- agent configuration not found
- task agent not configured
AI-assisted analysis of charmbracelet/crush@7944b8e522 (2026-08-29).
Data as JSON: /api/errors/59994364339ad5e3.
Report an issue: GitHub.