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

  1. Switch the coder model to one that exposes reasoning levels (e.g. a thinking-capable Claude or GPT model)
  2. Add ReasoningLevels to the custom model definition if it does support reasoning
  3. 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

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


AI-assisted analysis of charmbracelet/crush@7944b8e522 (2026-08-29). Data as JSON: /api/errors/59994364339ad5e3. Report an issue: GitHub.