charmbracelet/crush · error

default small model %s not found for provider %s

Error message

default small model %s not found for provider %s

What it means

Same fallback path as the large model, but for the small/utility model: defaultModelSelection calls c.GetModel(providerID, p.DefaultSmallModelID) and throws when the small default model ID cannot be resolved for that provider. It is fatal only when the provider has zero models configured to fall back to; otherwise the first configured model is silently used.

Source

Thrown at internal/config/load.go:748

		if defaultLargeModel == nil {
			slog.Warn("Default large model %s not found for provider %s", p.DefaultLargeModelID, p.ID)
			if len(providerConfig.Models) == 0 {
				return largeModel, smallModel, fmt.Errorf("default large model %s not found for provider %s", p.DefaultLargeModelID, p.ID)
			}
			defaultLargeModel = &providerConfig.Models[0]
		}
		largeModel = SelectedModel{
			Provider:        string(p.ID),
			Model:           defaultLargeModel.ID,
			MaxTokens:       defaultLargeModel.DefaultMaxTokens,
			ReasoningEffort: defaultLargeModel.DefaultReasoningEffort,
		}

		defaultSmallModel := c.GetModel(string(p.ID), p.DefaultSmallModelID)
		if defaultSmallModel == nil {
			slog.Warn("Default small model %s not found for provider %s", p.DefaultSmallModelID, p.ID)
			if len(providerConfig.Models) == 0 {
				return largeModel, smallModel, fmt.Errorf("default small model %s not found for provider %s", p.DefaultSmallModelID, p.ID)
			}
			defaultSmallModel = &providerConfig.Models[0]
		}
		smallModel = SelectedModel{
			Provider:        string(p.ID),
			Model:           defaultSmallModel.ID,
			MaxTokens:       defaultSmallModel.DefaultMaxTokens,
			ReasoningEffort: defaultSmallModel.DefaultReasoningEffort,
		}
		return largeModel, smallModel, err
	}

	enabledProviders := c.EnabledProviders()
	slices.SortFunc(enabledProviders, func(a, b ProviderConfig) int {
		return strings.Compare(a.ID, b.ID)
	})

	if len(enabledProviders) == 0 {

View on GitHub (pinned to 7944b8e522)

Solutions

  1. Correct default_model_small in the provider config to a valid model ID for that provider
  2. List the provider's models (crush models) and pick an existing ID
  3. Add the referenced model to the provider's models list so the fallback resolves
  4. Refresh the provider catalog to pick up renamed model IDs

Example fix

// before
"provider": { "id": "openai", "default_model_small": "gpt-4o-mn" }
// after
"provider": { "id": "openai", "default_model_small": "gpt-4o-mini" }
Defensive patterns

Strategy: validation

Validate before calling

if cfg.GetModel(providerID, p.DefaultSmallModelID) == nil {
  return fmt.Errorf("provider %s: unknown default small model %q", providerID, p.DefaultSmallModelID)
}

Try / catch

if err := cfg.Validate(); err != nil {
  if strings.Contains(err.Error(), "default small model") {
    // correct default_model_small before starting agents
  }
}

Prevention

When it happens

Trigger: Load/reloadFromDiskLocked runs and a provider's DefaultSmallModelID does not match any model in providerConfig.Models or the catwalk catalog, making GetModel return nil.

Common situations: Typo or stale default small model ID after a provider deprecated a model; copy-pasting a model ID from another provider; custom providers in crushrc whose models list omits the referenced default.

Related errors


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