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
- Run `ocr config model` to select a model interactively
- Or pass `--model <name>` on the command line
- 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
- Complete `ocr config` setup (provider AND model) before first use
- Set a default model in the provider entry for scripted/CI environments
- Keep --model overrides optional, relying on a configured default
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
- model is required
- model %q is not available for provider %q; available models:
- load config: %w
- unset supports provider, max_tokens, effort, custom_provider
- MCP server %q not found
AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02).
Data as JSON: /api/errors/40f68253413906b9.
Report an issue: GitHub.