{"record":{"id":"7804b80a2ad85605","repo":"BerriAI/litellm","slug":"api-key-is-required-for-openai-image-variations","errorCode":null,"errorMessage":"API key is required for OpenAI image variations","messagePattern":"API key is required for OpenAI image variations","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/images/main.py","lineNumber":660,"sourceCode":"\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))\n\n    if image_variation_provider == LITELLM_IMAGE_VARIATION_PROVIDERS.OPENAI:\n        if api_key is None:\n            raise ValueError(\"API key is required for OpenAI image variations\")\n        if api_base is None:\n            raise ValueError(\"API base is required for OpenAI image variations\")\n\n        response = openai_image_variations.image_variations(\n            model_response=model_response,\n            api_key=api_key,\n            api_base=api_base,\n            model=model,\n            image=image,\n            timeout=litellm_params.get(\"timeout\", None),\n            custom_llm_provider=custom_llm_provider,\n            logging_obj=litellm_logging_obj,\n            optional_params={},\n            litellm_params=litellm_params,\n        )\n    elif image_variation_provider == LITELLM_IMAGE_VARIATION_PROVIDERS.TOPAZ:\n        if api_key is None:\n            raise ValueError(\"API key is required for Topaz image variations\")","sourceCodeStart":642,"sourceCodeEnd":678,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/images/main.py#L642-L678","documentation":"On the OpenAI branch of litellm.image_variation, the api key is resolved via provider_config.get_api_key(litellm_params.get('api_key')), which falls back to the OPENAI_API_KEY environment variable and litellm module-level key. If that chain yields None, litellm refuses to make the unsigned /v1/images/variations request and raises this ValueError.","triggerScenarios":"Calling image_variation(model='dall-e-2', image=..., api_base='...') with no api_key argument while OPENAI_API_KEY is unset in the process; running in a container/CI where the env var was never injected; having set the key only on a different litellm module attribute that this path does not read.","commonSituations":"Scripts that work locally (key in shell profile) but fail in Docker, systemd, cron, or CI where the env var is absent; proxy deployments missing the secret in the environment; explicit api_key=None overriding nothing.","solutions":["Export OPENAI_API_KEY in the environment running litellm.","Or pass the key explicitly: litellm.image_variation(..., api_key='sk-...').","In the proxy, define the key via litellm_settings/environment config or a secret manager rather than relying on an inherited shell.","Fail fast at startup: assert os.getenv('OPENAI_API_KEY') before serving image-variation requests."],"exampleFix":"# before\nresp = litellm.image_variation(model=\"dall-e-2\", image=img, api_base=\"https://api.openai.com/v1\")\n# ValueError: API key is required for OpenAI image variations\n\n# after\nexport OPENAI_API_KEY=sk-...\n# or\nresp = litellm.image_variation(model=\"dall-e-2\", image=img, api_base=\"https://api.openai.com/v1\", api_key=\"sk-...\")","handlingStrategy":"validation","validationCode":"import os\n\napi_key = os.getenv(\"OPENAI_API_KEY\")\nif not api_key:\n    raise RuntimeError(\"OPENAI_API_KEY not set; required for openai image variations\")\nresp = litellm.image_variation(model=\"dall-e-2\", image=img, api_key=api_key, api_base=\"https://api.openai.com/v1\")","typeGuard":null,"tryCatchPattern":"try:\n    resp = litellm.image_variation(model=\"dall-e-2\", image=img, api_base=base)\nexcept ValueError as e:\n    if \"API key is required for OpenAI image variations\" in str(e):\n        raise RuntimeError(\"set OPENAI_API_KEY or pass api_key=\") from e\n    raise","preventionTips":["Inject OPENAI_API_KEY via your secret manager into every container/worker that serves variations.","Fail fast at boot: assert required env vars per enabled provider.","Never log the key while validating it — check presence, not value."],"tags":["litellm","image-variation","openai","api-key","credentials"],"backgroundTag":"missing-api-key","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}