alibaba/open-code-review · error

provider %q has no model configured; run 'ocr config model'

Error message

provider %q has no model configured; run 'ocr config model' to select one or pass --model

What it means

After applying cfg.Model, the provider entry's model, and any --model override, the resolver still has no model name, so no request can be built. It directs the user to `ocr config model` (interactive picker) or `--model`.

Source

Thrown at internal/llm/resolver.go:523

	gateOverrideOnModelList := !ambientAuth

	// Apply model override with validation.
	if modelOverride != "" {
		if gateOverrideOnModelList && len(availableModels) > 0 {
			if !ModelListContains(availableModels, modelOverride) {
				return ResolvedEndpoint{}, false, fmt.Errorf(
					"model %q is not available for provider %q; available models: %s",
					modelOverride,
					cfg.Provider,
					strings.Join(availableModels, ", "),
				)
			}
		}
		model = modelOverride
	}

	if model == "" {
		return ResolvedEndpoint{}, false, fmt.Errorf("provider %q has no model configured; run 'ocr config model' to select one or pass --model", cfg.Provider)
	}

	if protocol == ProtocolAnthropic {
		var err error
		ah := "authorization"
		if isPreset && authHeader != "" {
			ah = authHeader
		}
		if entry.AuthHeader != "" {
			ah = entry.AuthHeader
		}
		authHeader, err = NormalizeAuthHeader(ah)
		if err != nil {
			return ResolvedEndpoint{}, false, fmt.Errorf("provider %q: %w", cfg.Provider, err)
		}
		if authHeader == "" {
			authHeader = defaultAuthHeader(protocol)
		}

View on GitHub (pinned to 5cf97d0d15)

Solutions

  1. Run `ocr config model` to select a model interactively
  2. Or pass `--model <name>` on the command line
  3. Or add model = "..." to the provider entry (or top-level model) in the ocr config file

Example fix

// before
[providers.anthropic]
api_key = "sk-..."

// after
[providers.anthropic]
api_key = "sk-..."
model = "claude-sonnet-4-20250514"
Defensive patterns

Strategy: validation

Validate before calling

// Go: ensure a model is resolvable before invoking the resolver
func requireModel(cfgModel, entryModel, override string) error {
	if strings.TrimSpace(cfgModel) == "" && strings.TrimSpace(entryModel) == "" && strings.TrimSpace(override) == "" {
		return errors.New("no model: run 'ocr config model' or pass --model")
	}
	return nil
}

Type guard

func modelSelected(cfgModel, entryModel, override string) bool {
	return strings.TrimSpace(cfgModel) != "" || strings.TrimSpace(entryModel) != "" || strings.TrimSpace(override) != ""
}

Try / catch

ep, ok, err := resolver.TryProviderConfig(cfg, "")
if err != nil && strings.Contains(err.Error(), "has no model configured") {
	fmt.Fprintln(os.Stderr, "run 'ocr config model' or pass --model")
	os.Exit(2)
}

Prevention

When it happens

Trigger: Resolving a provider entry where the top-level cfg.Model is empty, the entry's model field is empty, and no --model override was supplied.

Common situations: Fresh install right after configuring a provider but never selecting a model; config hand-edited to add a provider without a model; scripting ocr in CI where neither the config nor flags supply a model.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02). Data as JSON: /api/errors/40f68253413906b9. Report an issue: GitHub.