BerriAI/litellm · error · NotImplementedError

Provider '{provider}' not supported for Focus export configu

Error message

Provider '{provider}' not supported for Focus export configuration

What it means

The factory is an explicit allow-list dispatcher: it only knows 's3', 'vantage', 'gcs', and 'mavvrik'. Any other provider string falls through to raise NotImplementedError with the offending value interpolated. This is a programming/config error, not an environment issue.

Source

Thrown at litellm/integrations/focus/destinations/factory.py:83

                raise ValueError("VANTAGE_INTEGRATION_TOKEN must be provided for Vantage exports")
            return {k: v for k, v in resolved.items() if v is not None}
        if provider == "gcs":
            resolved = {
                "bucket_name": overrides.get("bucket_name") or os.getenv("FOCUS_GCS_BUCKET_NAME"),
                "service_account_json": overrides.get("service_account_json")
                or os.getenv("FOCUS_GCS_PATH_SERVICE_ACCOUNT"),
            }
            if not resolved.get("bucket_name"):
                raise ValueError("FOCUS_GCS_BUCKET_NAME must be provided for GCS exports")
            return {k: v for k, v in resolved.items() if v is not None}
        if provider == "mavvrik":
            resolved = {
                "api_key": overrides.get("api_key") or os.getenv("MAVVRIK_API_KEY"),
                "api_endpoint": overrides.get("api_endpoint") or os.getenv("MAVVRIK_API_ENDPOINT"),
                "connection_id": overrides.get("connection_id") or os.getenv("MAVVRIK_CONNECTION_ID"),
            }
            return {k: v for k, v in resolved.items() if v is not None}
        raise NotImplementedError(f"Provider '{provider}' not supported for Focus export configuration")

View on GitHub (pinned to 6c2dcb801b)

Solutions

  1. Use exactly one of: s3, vantage, gcs, mavvrik (lowercase).
  2. Strip and lowercase the provider string before passing it: provider.strip().lower().
  3. If you need a provider the code doesn't support, upgrade LiteLLM to the latest version and re-check the allow-list in factory.py.
  4. As a last resort, implement a custom FocusDestination subclass instead of relying on the factory.

Example fix

# before
provider = config["provider"]  # e.g. 'S3' or 'azure'

# after
provider = config["provider"].strip().lower()
assert provider in {"s3", "vantage", "gcs", "mavvrik"}, f"unsupported: {provider}"
Defensive patterns

Strategy: type-guard

Validate before calling

SUPPORTED = {"s3", "vantage", "gcs", "mavvrik"}
provider = raw_provider.strip().lower()
if provider not in SUPPORTED:
    raise ValueError(f"Unsupported Focus export provider '{raw_provider}'; choose from {sorted(SUPPORTED)}")

Type guard

def is_supported_focus_provider(provider: str) -> bool:
    return provider.strip().lower() in {"s3", "vantage", "gcs", "mavvrik"}

Try / catch

try:
    cfg = focus_destination_config(provider=provider, overrides=overrides)
except NotImplementedError as e:
    fail_fast(f"Config bug: {e}")  # do not retry; this is deterministic

Prevention

When it happens

Trigger: Calling the factory with a typo'd or unsupported provider, e.g. 'google_cloud', 'S3' (case-sensitive), 'azure', 'vantage-cloud', or a future provider on an older LiteLLM version that doesn't support it yet.

Common situations: Case mismatch ('S3' vs 's3'); referencing a provider added in a newer LiteLLM release than the one installed; copying a provider name from another tool's config format; trailing whitespace in the provider string.

Related errors


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