{"record":{"id":"b48b746a70624657","repo":"BerriAI/litellm","slug":"invalid-image-variation-provider-custom-llm-prov","errorCode":null,"errorMessage":"Invalid image variation provider: {custom_llm_provider}. Supported providers are: {LITELLM_IMAGE_VARIATION_PROVIDERS}","messagePattern":"Invalid image variation provider: (.+?)\\. Supported providers are: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/images/main.py","lineNumber":638,"sourceCode":"    # get logging object\n    litellm_logging_obj: Final = cast(LiteLLMLoggingObj, kwargs.get(\"litellm_logging_obj\"))\n\n    # get the litellm params\n    litellm_params: Final = get_litellm_params(**kwargs)\n    # get the custom llm provider\n    model, custom_llm_provider, dynamic_api_key, api_base = get_llm_provider(\n        model=model,\n        custom_llm_provider=litellm_params.get(\"custom_llm_provider\", None),\n        api_base=litellm_params.get(\"api_base\", None),\n        api_key=litellm_params.get(\"api_key\", None),\n    )\n\n    # route to the correct provider w/ the params\n    try:\n        llm_provider: Final = LlmProviders(custom_llm_provider)\n        image_variation_provider: Final = LITELLM_IMAGE_VARIATION_PROVIDERS(llm_provider)\n    except ValueError:\n        raise ValueError(\n            f\"Invalid image variation provider: {custom_llm_provider}. Supported providers are: {LITELLM_IMAGE_VARIATION_PROVIDERS}\"\n        )\n    model_response: Final = ImageResponse()\n\n    response: ImageResponse | None = None\n\n    provider_config: Final = ProviderConfigManager.get_provider_model_info(\n        model=model or \"\",  # openai defaults to dall-e-2\n        provider=llm_provider,\n    )\n\n    if provider_config is None:\n        raise ValueError(\n            f\"image variation provider has no known model info config - required for getting api keys, etc.: {custom_llm_provider}. Supported providers are: {LITELLM_IMAGE_VARIATION_PROVIDERS}\"\n        )\n\n    api_key: Final = provider_config.get_api_key(litellm_params.get(\"api_key\", None))\n    api_base = provider_config.get_api_base(litellm_params.get(\"api_base\", None))","sourceCodeStart":620,"sourceCodeEnd":656,"githubUrl":"https://github.com/BerriAI/litellm/blob/6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d/litellm/images/main.py#L620-L656","documentation":"image_variations() only supports providers listed in the LITELLM_IMAGE_VARIATION_PROVIDERS enum (currently OpenAI and Topaz). The code converts the routed provider into that enum at litellm/images/main.py:636; any other provider raises ValueError listing the supported set.","triggerScenarios":"Calling litellm.image_variations(image=..., model='replicate/...') or with custom_llm_provider for any provider other than openai/topaz; using the 'provider/model' prefix of an unsupported provider.","commonSituations":"Developer assumes image_variations works everywhere image_generation does (vertex, azure, etc.); or migration code reuses the image_generation provider list for variations.","solutions":["Use OpenAI (dall-e-2) or Topaz for image variations: model='dall-e-2' or model='topaz/topaz-image-alter-v1'","For other providers, call the underlying variation API directly or use image_edit where supported","Upgrade litellm — variation provider support may expand"],"exampleFix":"# before\nlitellm.image_variations(model=\"stability/sd3.5\", image=\"cat.png\")\n\n# after\nlitellm.image_variations(model=\"dall-e-2\", image=\"cat.png\")","handlingStrategy":"type-guard","validationCode":"SUPPORTED_VARIATION_PROVIDERS = {\"openai\", \"topaz\"}\n\ndef can_variation(provider: str) -> bool:\n    return provider in SUPPORTED_VARIATION_PROVIDERS","typeGuard":"from litellm.types.utils import LITELLM_IMAGE_VARIATION_PROVIDERS\nfrom litellm.constants import LlmProviders\n\ndef is_variation_provider(model_or_provider: str) -> bool:\n    provider = model_or_provider.split(\"/\", 1)[0]\n    try:\n        return LlmProviders(provider) in [p.value for p in LITELLM_IMAGE_VARIATION_PROVIDERS]\n    except ValueError:\n        return False","tryCatchPattern":"try:\n    r = litellm.image_variations(model=m, image=img)\nexcept ValueError as e:\n    if \"Invalid image variation provider\" in str(e):\n        # switch to dall-e-2 or a Topaz model, or surface unsupported to the user\n        raise","preventionTips":["Restrict image_variations UI/API surface to openai and topaz models","Grep release notes when upgrading — variation provider set changes","Fall back to image_edit where variation semantics are acceptable"],"tags":["image-variations","unsupported-provider","validation"],"backgroundTag":null,"analyzedSha":"6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d","analyzedAt":"2026-08-15T07:12:03.035Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}