alibaba/open-code-review · error
custom provider name %q conflicts with a preset provider; us
Error message
custom provider name %q conflicts with a preset provider; use providers.%s.%s to configure the preset or choose a different custom provider name
What it means
Custom provider names must not collide with built-in preset provider names. If llm.LookupProvider finds the requested custom name among presets, this error fires and suggests configuring the preset via providers.<name>.<field> or picking a different custom name.
Source
Thrown at cmd/opencodereview/config_cmd.go:814
}
if cfg.Providers == nil {
cfg.Providers = make(map[string]ProviderEntry)
}
entry := cfg.Providers[parts[1]]
if err := applyProviderField(parts[1], &entry, parts[2], key, value); err != nil {
return err
}
cfg.Providers[parts[1]] = entry
return nil
}
func setCustomProviderValue(cfg *Config, key, value string) error {
parts := strings.SplitN(key, ".", 3)
if len(parts) != 3 || parts[1] == "" || parts[2] == "" {
return fmt.Errorf("invalid custom provider key %q: expected custom_providers.<name>.<field>", key)
}
if preset, isPreset := llm.LookupProvider(parts[1]); isPreset {
return fmt.Errorf("custom provider name %q conflicts with a preset provider; use providers.%s.%s to configure the preset or choose a different custom provider name", parts[1], preset.Name, parts[2])
}
return setCustomProviderField(cfg, parts[1], parts[2], key, value)
}
func isAuxiliaryProviderField(field string) bool {
switch field {
case "extra_body", "extra_headers", "retry_codes":
return true
default:
return false
}
}
func setCustomProviderField(cfg *Config, name, field, key, value string) error {
if _, exists := cfg.CustomProviders[name]; isAuxiliaryProviderField(field) && !exists {
providerKey := strings.TrimSuffix(key, "."+field)
return fmt.Errorf("provider %q is not configured; set a core field first (protocol is required for every custom provider):\n ocr config set %s.protocol <protocol>", name, providerKey)
}View on GitHub (pinned to 5cf97d0d15)
Solutions
- If targeting a preset provider, set the field via providers.<name>.<field> instead
- Rename the custom provider to a non-preset name, e.g. custom_providers.my-anthropic-proxy
- List preset providers (docs/help) to pick an unused name
Example fix
// before ocr config set custom_providers.openai.api_key sk-... // after ocr config set providers.openai.api_key sk-...
Defensive patterns
Strategy: validation
Validate before calling
name="myprovider" ocr config get providers."$name".protocol 2>/dev/null && echo "$name is a preset; use providers.$name.<field>"
Try / catch
if preset, isPreset := llm.LookupProvider(parts[1]); isPreset {
return fmt.Errorf("custom provider name %q conflicts with a preset provider; use providers.%s.%s", parts[1], preset.Name, parts[2])
} Prevention
- Configure preset providers under providers.*, not custom_providers.*
- Choose custom names that do not match preset names
- Prefix custom gateways, e.g. my-openai-proxy
When it happens
Trigger: `ocr config set custom_providers.anthropic.api_key ...` or any custom_providers.* key whose <name> equals a preset provider name (e.g. anthropic, openai).
Common situations: Users assuming every provider must be declared under custom_providers even when it already exists as a preset; naming a custom gateway after the upstream vendor.
Related errors
- load config: %w
- unset supports provider, max_tokens, effort, custom_provider
- MCP server %q not found
- custom provider %q not found
- read app config %s: %w
AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02).
Data as JSON: /api/errors/fc40e60886fc79ee.
Report an issue: GitHub.