charmbracelet/crush · error
failed to configure selected models: %w
Error message
failed to configure selected models: %w
What it means
After providers are configured, Load() calls resolveSelectedModels to pick the user's selected large/small models (validating them against known providers). Any failure resolving those selections is wrapped with this message.
Source
Thrown at internal/config/load.go:144
store.writeMu.Lock()
defer store.writeMu.Unlock()
// Apply top-level env vars before configuring providers so variables
// like AWS_PROFILE are visible to the AWS SDK credential chain.
cfg.applyEnv(valueResolver)
if err := cfg.configureProviders(context.Background(), store, env, valueResolver, store.knownProviders); err != nil {
return nil, fmt.Errorf("failed to configure providers: %w", err)
}
if !cfg.IsConfigured() {
slog.Warn("No providers configured")
return store, nil
}
resolved, err := resolveSelectedModels(cfg, store.knownProviders)
if err != nil {
return nil, fmt.Errorf("failed to configure selected models: %w", err)
}
cfg.Models[SelectedModelTypeLarge] = resolved.Large
cfg.Models[SelectedModelTypeSmall] = resolved.Small
// Persist any fallback corrections while we still hold writeMu.
if resolved.LargeFallback {
if err := store.updateLocked(ScopeGlobal, func(c *Config) map[string]any {
return store.updatePreferredModelFields(c, SelectedModelTypeLarge, resolved.Large)
}); err != nil {
return nil, fmt.Errorf("failed to update preferred large model: %w", err)
}
}
if resolved.SmallFallback {
if err := store.updateLocked(ScopeGlobal, func(c *Config) map[string]any {
return store.updatePreferredModelFields(c, SelectedModelTypeSmall, resolved.Small)
}); err != nil {
return nil, fmt.Errorf("failed to update preferred small model: %w", err)
}View on GitHub (pinned to 7944b8e522)
Solutions
- Read the wrapped error to see whether it's 'no providers configured' or an unknown model/provider reference
- Configure at least one provider, or re-enable default providers if disabled
- Remove or correct the preferred large/small model entries in crush.json so they match a configured provider
- Update crush / refresh the provider catalog if the model was renamed upstream
Example fix
// before (crush.json)
"options": {"preferred_model": {"large": "claude-opus-4-20250514"}}
// after
"options": {"preferred_model": {"large": "anthropic/claude-sonnet-4-20250514"}} Defensive patterns
Strategy: try-catch
Validate before calling
if cfg.Providers.Len() == 0 && len(knownProviders) == 0 {
return errors.New("configure at least one provider before selecting models")
}
// also verify preferred model IDs reference an existing provider Try / catch
store, err := config.Load(ctx, opts)
if err != nil {
if strings.Contains(err.Error(), "failed to configure selected models:") {
return fmt.Errorf("reselect models via `crush models`: %w", err)
}
return err
} Prevention
- Use model IDs exactly as listed by `crush models`
- After removing a provider, clear its preferred model entries
- Keep preferred_model in sync with the configured providers section
- Refresh the provider catalog regularly so IDs stay valid
When it happens
Trigger: resolveSelectedModels returns an error — typically because c.Providers is empty and no known providers exist (from defaultModelSelection), or the configured selected model references an unknown provider/model.
Common situations: Config names a preferred model from a provider that no longer exists or was removed from the catwalk catalog; providers section emptied while preferred models still reference it; typo'd model ID in options.preferred_model.
Related errors
- no providers found
- no providers found matching %q
- no providers configured, please configure at least one provi
- model configuration not found
- no providers configured - please run 'crush' to set up a pro
AI-assisted analysis of charmbracelet/crush@7944b8e522 (2026-08-29).
Data as JSON: /api/errors/bd136ee6b19c4e7b.
Report an issue: GitHub.