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
- Correct default_model_small in the provider config to a valid model ID for that provider
- List the provider's models (crush models) and pick an existing ID
- Add the referenced model to the provider's models list so the fallback resolves
- 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
- Define the small model explicitly in the provider's models list
- Re-verify default_model_small after provider deprecations
- Use short utility models that providers keep stable across versions
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
- default large model %s not found for provider %s
- coder agent not configured
- coder agent configuration is missing
- failed to initialize config: %w
- provider %s has no models configured
AI-assisted analysis of charmbracelet/crush@7944b8e522 (2026-08-29).
Data as JSON: /api/errors/cff826899982c448.
Report an issue: GitHub.