{"record":{"id":"fd5adebb6e266348","repo":"BerriAI/litellm","slug":"provider-provider-not-supported-for-focus-expo-fd5ade","errorCode":null,"errorMessage":"Provider '{provider}' not supported for Focus export configuration","messagePattern":"Provider '(.+?)' not supported for Focus export configuration","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"litellm/integrations/focus/destinations/factory.py","lineNumber":83,"sourceCode":"                raise ValueError(\"VANTAGE_INTEGRATION_TOKEN must be provided for Vantage exports\")\n            return {k: v for k, v in resolved.items() if v is not None}\n        if provider == \"gcs\":\n            resolved = {\n                \"bucket_name\": overrides.get(\"bucket_name\") or os.getenv(\"FOCUS_GCS_BUCKET_NAME\"),\n                \"service_account_json\": overrides.get(\"service_account_json\")\n                or os.getenv(\"FOCUS_GCS_PATH_SERVICE_ACCOUNT\"),\n            }\n            if not resolved.get(\"bucket_name\"):\n                raise ValueError(\"FOCUS_GCS_BUCKET_NAME must be provided for GCS exports\")\n            return {k: v for k, v in resolved.items() if v is not None}\n        if provider == \"mavvrik\":\n            resolved = {\n                \"api_key\": overrides.get(\"api_key\") or os.getenv(\"MAVVRIK_API_KEY\"),\n                \"api_endpoint\": overrides.get(\"api_endpoint\") or os.getenv(\"MAVVRIK_API_ENDPOINT\"),\n                \"connection_id\": overrides.get(\"connection_id\") or os.getenv(\"MAVVRIK_CONNECTION_ID\"),\n            }\n            return {k: v for k, v in resolved.items() if v is not None}\n        raise NotImplementedError(f\"Provider '{provider}' not supported for Focus export configuration\")\n","sourceCodeStart":65,"sourceCodeEnd":84,"githubUrl":"https://github.com/BerriAI/litellm/blob/6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d/litellm/integrations/focus/destinations/factory.py#L65-L84","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Use exactly one of: s3, vantage, gcs, mavvrik (lowercase).","Strip and lowercase the provider string before passing it: provider.strip().lower().","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.","As a last resort, implement a custom FocusDestination subclass instead of relying on the factory."],"exampleFix":"# before\nprovider = config[\"provider\"]  # e.g. 'S3' or 'azure'\n\n# after\nprovider = config[\"provider\"].strip().lower()\nassert provider in {\"s3\", \"vantage\", \"gcs\", \"mavvrik\"}, f\"unsupported: {provider}\"","handlingStrategy":"type-guard","validationCode":"SUPPORTED = {\"s3\", \"vantage\", \"gcs\", \"mavvrik\"}\nprovider = raw_provider.strip().lower()\nif provider not in SUPPORTED:\n    raise ValueError(f\"Unsupported Focus export provider '{raw_provider}'; choose from {sorted(SUPPORTED)}\")","typeGuard":"def is_supported_focus_provider(provider: str) -> bool:\n    return provider.strip().lower() in {\"s3\", \"vantage\", \"gcs\", \"mavvrik\"}","tryCatchPattern":"try:\n    cfg = focus_destination_config(provider=provider, overrides=overrides)\nexcept NotImplementedError as e:\n    fail_fast(f\"Config bug: {e}\")  # do not retry; this is deterministic","preventionTips":["Normalize the provider string (strip + lower) at the config boundary.","Pin your LiteLLM version and re-check the factory allow-list when upgrading before using new provider names."],"tags":["focus","factory","validation","programming-error"],"backgroundTag":null,"analyzedSha":"6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d","analyzedAt":"2026-08-15T07:12:03.035Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}