{"record":{"id":"78fba0d3251248b9","repo":"mlflow/mlflow","slug":"provider-name-is-already-registered-self-prov","errorCode":null,"errorMessage":"Provider {name} is already registered: {self._providers[name]}","messagePattern":"Provider (.+?) is already registered: (.+?)","errorType":"validation","errorClass":"MlflowException","httpStatus":null,"severity":"error","filePath":"mlflow/gateway/provider_registry.py","lineNumber":18,"sourceCode":"import logging\n\nfrom mlflow import MlflowException\nfrom mlflow.gateway.config import Provider\nfrom mlflow.gateway.providers import BaseProvider\nfrom mlflow.utils.plugins import get_entry_points\nfrom mlflow.utils.provider_filter import is_provider_allowed\n\n_logger = logging.getLogger(__name__)\n\n\nclass ProviderRegistry:\n    def __init__(self):\n        self._providers: dict[str | Provider, type[BaseProvider]] = {}\n\n    def register(self, name: str, provider: type[BaseProvider]):\n        if name in self._providers:\n            raise MlflowException.invalid_parameter_value(\n                f\"Provider {name} is already registered: {self._providers[name]}\"\n            )\n        self._providers[name] = provider\n\n    def get(self, name: str) -> type[BaseProvider]:\n        if name not in self._providers:\n            raise MlflowException.invalid_parameter_value(f\"Provider '{name}' not found\")\n\n        if not is_provider_allowed(name):\n            _logger.debug(\n                \"Provider '%s' blocked by MLFLOW_GATEWAY_ALLOWED_PROVIDERS\",\n                name,\n            )\n            raise MlflowException.invalid_parameter_value(\n                f\"Provider '{name}' is not allowed by the current gateway provider policy.\"\n            )\n        return self._providers[name]\n","sourceCodeStart":1,"sourceCodeEnd":36,"githubUrl":"https://github.com/mlflow/mlflow/blob/6a27f2decc0b76eb1b54af31849784addb357dbc/mlflow/gateway/provider_registry.py#L1-L36","documentation":"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.","triggerScenarios":"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'.","commonSituations":"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.","solutions":["Use a unique provider name for your custom provider (don't shadow built-ins).","Register the provider only once at import time (guard with a module-level flag).","Remove an existing registration first if replacement is intended.","In tests, use a fresh ProviderRegistry instance or unregister between tests."],"exampleFix":"// before\nregistry.register(\"openai\", MyOpenAIProvider)\n// after\nregistry.register(\"my-openai\", MyOpenAIProvider)","handlingStrategy":"validation","validationCode":"if name in registry.keys():\n    raise ValueError(f\"Provider {name} already registered as {registry.get(name)}\")","typeGuard":null,"tryCatchPattern":"try:\n    registry.register(\"my-provider\", MyProvider)\nexcept MlflowException as e:\n    if \"already registered\" in str(e):\n        logger.info(\"Provider already registered, skipping\")\n    else:\n        raise","preventionTips":["Guard plugin registration with a module-level idempotency flag.","Namespace custom provider names (e.g. 'acme-llm').","In tests, construct a fresh ProviderRegistry per test."],"tags":["mlflow","gateway","registry","duplicate-registration"],"backgroundTag":"duplicate-registration","analyzedSha":"6a27f2decc0b76eb1b54af31849784addb357dbc","analyzedAt":"2026-08-29T20:54:51.419Z","schemaVersion":2},"datasetVersion":"2026-08-29T22:17:34.462Z"}