mlflow/mlflow · error · MlflowException

Provider {name} is already registered: {self._providers[name

Error message

Provider {name} is already registered: {self._providers[name]}

What it means

MLflow's gateway ProviderRegistry.register refuses to register a provider under a name that already exists in the registry, raising MlflowException.invalid_parameter_value. The message includes the previously registered provider class.

Source

Thrown at mlflow/gateway/provider_registry.py:18

import logging

from mlflow import MlflowException
from mlflow.gateway.config import Provider
from mlflow.gateway.providers import BaseProvider
from mlflow.utils.plugins import get_entry_points
from mlflow.utils.provider_filter import is_provider_allowed

_logger = logging.getLogger(__name__)


class ProviderRegistry:
    def __init__(self):
        self._providers: dict[str | Provider, type[BaseProvider]] = {}

    def register(self, name: str, provider: type[BaseProvider]):
        if name in self._providers:
            raise MlflowException.invalid_parameter_value(
                f"Provider {name} is already registered: {self._providers[name]}"
            )
        self._providers[name] = provider

    def get(self, name: str) -> type[BaseProvider]:
        if name not in self._providers:
            raise MlflowException.invalid_parameter_value(f"Provider '{name}' not found")

        if not is_provider_allowed(name):
            _logger.debug(
                "Provider '%s' blocked by MLFLOW_GATEWAY_ALLOWED_PROVIDERS",
                name,
            )
            raise MlflowException.invalid_parameter_value(
                f"Provider '{name}' is not allowed by the current gateway provider policy."
            )
        return self._providers[name]

View on GitHub (pinned to 6a27f2decc)

Solutions

  1. Use a unique provider name for your custom provider (don't shadow built-ins).
  2. Register the provider only once at import time (guard with a module-level flag).
  3. Remove an existing registration first if replacement is intended.
  4. In tests, use a fresh ProviderRegistry instance or unregister between tests.

Example fix

// before
registry.register("openai", MyOpenAIProvider)
// after
registry.register("my-openai", MyOpenAIProvider)
Defensive patterns

Strategy: validation

Validate before calling

if name in registry.keys():
    raise ValueError(f"Provider {name} already registered as {registry.get(name)}")

Try / catch

try:
    registry.register("my-provider", MyProvider)
except MlflowException as e:
    if "already registered" in str(e):
        logger.info("Provider already registered, skipping")
    else:
        raise

Prevention

When it happens

Trigger: Calling ProviderRegistry.register(name, provider) twice with the same name — e.g. custom provider plugin code registered at import time in two places, or re-registering a built-in provider name like 'openai'.

Common situations: Plugin module imported multiple times registering the same provider; user custom provider collides with a built-in name; test fixtures registering providers per-test without cleanup.

Related errors


AI-assisted analysis of mlflow/mlflow@6a27f2decc (2026-08-29). Data as JSON: /api/errors/78fba0d3251248b9. Report an issue: GitHub.