mlflow/mlflow · error · NotImplementedError

{self.__class__.__name__} does not support update_webhook

Error message

{self.__class__.__name__} does not support update_webhook

What it means

AbstractStore.update_webhook is a stub that raises NotImplementedError naming the concrete store class. The configured model-registry backend does not override update_webhook, so modifying an existing webhook is unsupported there.

Source

Thrown at mlflow/store/model_registry/abstract_store.py:1282

        secret: str | None = None,
        status: WebhookStatus | None = None,
    ) -> Webhook:
        """
        Update an existing webhook.

        Args:
            webhook_id: Webhook ID.
            name: New webhook name.
            description: New webhook description.
            url: New webhook URL.
            events: New list of event types.
            secret: New webhook secret.
            status: New webhook status.

        Returns:
            A single updated :py:class:`mlflow.entities.model_registry.Webhook` object.
        """
        raise NotImplementedError(f"{self.__class__.__name__} does not support update_webhook")

    def delete_webhook(self, webhook_id: str) -> None:
        """
        Delete a webhook.

        Args:
            webhook_id: Webhook ID.

        Returns:
            None
        """
        raise NotImplementedError(f"{self.__class__.__name__} does not support delete_webhook")

    def test_webhook(self, webhook_id: str, event: WebhookEvent | None = None) -> WebhookTestResult:
        """
        Test a webhook by sending a test event to the specified URL.

        Args:

View on GitHub (pinned to 6a27f2decc)

Solutions

  1. Use a registry backend that supports webhooks (e.g., Databricks REST store)
  2. Recreate the webhook instead of updating it if the backend lacks update support
  3. Upgrade MLflow to a version where the backend implements update_webhook

Example fix

// before
client = MlflowClient(registry_uri='./mlruns')
client.update_webhook('wh-123', description='new')
// after
mlflow.set_registry_uri('databricks')
client = MlflowClient()
client.update_webhook('wh-123', description='new')
Defensive patterns

Strategy: try-catch

Validate before calling

uri = mlflow.get_registry_uri()
if not uri.startswith('databricks'):
    raise RuntimeError('update_webhook requires a backend that implements webhooks')

Type guard

def webhook_updatable(store_cls) -> bool:
    from mlflow.store.model_registry.abstract_store import AbstractStore
    return store_cls.update_webhook is not AbstractStore.update_webhook

Try / catch

try:
    client.update_webhook(webhook_id, description='new')
except NotImplementedError as e:
    logger.error('Backend does not support update_webhook: %s', e)

Prevention

When it happens

Trigger: Calling MlflowClient().update_webhook(webhook_id, ...) against a registry store that does not implement webhook updates (e.g., FileStore or a SqlAlchemy backend without webhook support).

Common situations: Editing webhook URL/secret/status while using a local file or sqlite registry instead of Databricks; copying webhook admin code between environments with different registry URIs.

Related errors


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