{"record":{"id":"40f68253413906b9","repo":"alibaba/open-code-review","slug":"provider-q-has-no-model-configured-run-ocr-conf","errorCode":null,"errorMessage":"provider %q has no model configured; run 'ocr config model' to select one or pass --model","messagePattern":"provider %q has no model configured; run 'ocr config model' to select one or pass --model","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/llm/resolver.go","lineNumber":523,"sourceCode":"\tgateOverrideOnModelList := !ambientAuth\n\n\t// Apply model override with validation.\n\tif modelOverride != \"\" {\n\t\tif gateOverrideOnModelList && len(availableModels) > 0 {\n\t\t\tif !ModelListContains(availableModels, modelOverride) {\n\t\t\t\treturn ResolvedEndpoint{}, false, fmt.Errorf(\n\t\t\t\t\t\"model %q is not available for provider %q; available models: %s\",\n\t\t\t\t\tmodelOverride,\n\t\t\t\t\tcfg.Provider,\n\t\t\t\t\tstrings.Join(availableModels, \", \"),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tmodel = modelOverride\n\t}\n\n\tif model == \"\" {\n\t\treturn ResolvedEndpoint{}, false, fmt.Errorf(\"provider %q has no model configured; run 'ocr config model' to select one or pass --model\", cfg.Provider)\n\t}\n\n\tif protocol == ProtocolAnthropic {\n\t\tvar err error\n\t\tah := \"authorization\"\n\t\tif isPreset && authHeader != \"\" {\n\t\t\tah = authHeader\n\t\t}\n\t\tif entry.AuthHeader != \"\" {\n\t\t\tah = entry.AuthHeader\n\t\t}\n\t\tauthHeader, err = NormalizeAuthHeader(ah)\n\t\tif err != nil {\n\t\t\treturn ResolvedEndpoint{}, false, fmt.Errorf(\"provider %q: %w\", cfg.Provider, err)\n\t\t}\n\t\tif authHeader == \"\" {\n\t\t\tauthHeader = defaultAuthHeader(protocol)\n\t\t}","sourceCodeStart":505,"sourceCodeEnd":541,"githubUrl":"https://github.com/alibaba/open-code-review/blob/5cf97d0d15cbd41b602513c4be3bfec3cee5bf7f/internal/llm/resolver.go#L505-L541","documentation":"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`.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\n[providers.anthropic]\napi_key = \"sk-...\"\n\n// after\n[providers.anthropic]\napi_key = \"sk-...\"\nmodel = \"claude-sonnet-4-20250514\"","handlingStrategy":"validation","validationCode":"// Go: ensure a model is resolvable before invoking the resolver\nfunc requireModel(cfgModel, entryModel, override string) error {\n\tif strings.TrimSpace(cfgModel) == \"\" && strings.TrimSpace(entryModel) == \"\" && strings.TrimSpace(override) == \"\" {\n\t\treturn errors.New(\"no model: run 'ocr config model' or pass --model\")\n\t}\n\treturn nil\n}","typeGuard":"func modelSelected(cfgModel, entryModel, override string) bool {\n\treturn strings.TrimSpace(cfgModel) != \"\" || strings.TrimSpace(entryModel) != \"\" || strings.TrimSpace(override) != \"\"\n}","tryCatchPattern":"ep, ok, err := resolver.TryProviderConfig(cfg, \"\")\nif err != nil && strings.Contains(err.Error(), \"has no model configured\") {\n\tfmt.Fprintln(os.Stderr, \"run 'ocr config model' or pass --model\")\n\tos.Exit(2)\n}","preventionTips":["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"],"tags":["config","model"],"backgroundTag":"missing-required-config-field","analyzedSha":"5cf97d0d15cbd41b602513c4be3bfec3cee5bf7f","analyzedAt":"2026-09-02T02:08:09.116Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}