BerriAI/litellm · error · RuntimeError

Mavvrik FOCUS destination: connector is disconnected (410).

Error message

Mavvrik FOCUS destination: connector is disconnected (410). Re-enable the connection in the Mavvrik dashboard.

What it means

On first delivery, the destination POSTs to the Mavvrik agent endpoint to register the connector (body {"name": connection_id}). A 410 Gone response means Mavvrik knows this connector but it has been disabled/deleted on their side, so the destination refuses to proceed and tells the user to re-enable it. self._registered stays False so the next attempt retries registration.

Source

Thrown at litellm/integrations/focus/destinations/mavvrik_destination.py:123

        Returns metricsMarker from the Mavvrik response — the last date index
        Mavvrik has successfully processed. Used by the logger to catch up any
        dates that were missed due to previous export failures.

        Returns None if the connector was already registered (cached).
        """
        if self._registered:
            return None
        resp: Final = await self._http.client.request(
            method="POST",
            url=self._agent_url,
            headers=self._auth_headers,
            json={"name": self.connection_id},
            timeout=30.0,
        )
        if resp.status_code == 410:
            self._registered = False
            raise RuntimeError(
                "Mavvrik FOCUS destination: connector is disconnected (410). "
                "Re-enable the connection in the Mavvrik dashboard."
            )
        if resp.status_code >= 400:
            raise RuntimeError(f"Mavvrik FOCUS destination: register failed ({resp.status_code}): {resp.text[:200]}")
        self._registered = True
        metrics_marker: Final = resp.json().get("metricsMarker", 0)
        verbose_logger.debug(
            "Mavvrik FOCUS destination: connector registered (metricsMarker=%s)",
            metrics_marker,
        )
        return metrics_marker

    async def _get_signed_url(self, date_str: str) -> str:
        """GET upload-url endpoint → GCS signed URL for the given date."""
        params: Final = {"name": date_str, "type": "metrics", "datetime": date_str}
        resp: Final = await self._http.client.request(
            method="GET",

View on GitHub (pinned to 6c2dcb801b)

Solutions

  1. Open the Mavvrik dashboard, find the connection, and re-enable it (or create a new one).
  2. If you created a new connector, update MAVVRIK_CONNECTION_ID to the new ID and restart/recreate the destination.
  3. Verify the connector is enabled before redeploying: the register call should then return 2xx and a metricsMarker.
  4. Alert on this error — it never self-heals without dashboard action.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    await mavvrik_dest.deliver(content=csv, time_window=tw, filename="f.csv")
except RuntimeError as e:
    if "disconnected (410)" in str(e):
        page_oncall("Mavvrik connector disabled — re-enable in Mavvrik dashboard")
        # do NOT retry-loop: requires human action in Mavvrik
    raise

Prevention

When it happens

Trigger: Calling deliver() (or the register step) when the Mavvrik connection identified by MAVVRIK_CONNECTION_ID was disconnected in the Mavvrik dashboard — expired trial, manually disabled integration, or deleted connector with a reused ID.

Common situations: The connector was disabled by an admin during cleanup; tenant subscription lapsed; connection deleted and recreated with the same name but stale server-side state; long-running LiteLLM deployment whose connector was retired months earlier.

Related errors


AI-assisted analysis of BerriAI/litellm@6c2dcb801b (2026-08-15). Data as JSON: /api/errors/b02c6e15b6dc800b. Report an issue: GitHub.