charmbracelet/crush · error

failed to configure selected models

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.

Solutions

  1. Read the wrapped error to see whether it's 'no providers configured' or an unknown model/provider reference
  2. Configure at least one provider, or re-enable default providers if disabled
  3. Remove or correct the preferred large/small model entries in crush.json so they match a configured provider
  4. 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

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


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

Appendix: 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)