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

  1. If targeting a preset provider, set the field via providers.<name>.<field> instead
  2. Rename the custom provider to a non-preset name, e.g. custom_providers.my-anthropic-proxy
  3. 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

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


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