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

  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.