From 090d675e3c577944a0d48d1fa588cdeb71e6264d Mon Sep 17 00:00:00 2001 From: tinysolver Date: Sat, 3 Oct 2026 15:41:06 +0900 Subject: [PATCH] fix(openrouter): map ImageGenerationRequestQuality members to a gemini tier litellm.image_generation takes quality as a string or an ImageGenerationRequestQuality member. The tier lookup used str(quality), which gives "ImageGenerationRequestQuality.MEDIUM" for a member, so low, medium, high and auto got no tier on google/ models and quality was dropped. The lookup now uses the value itself, as the chat-based path did --- .../image_generation/transformation.py | 3 ++- ...est_openrouter_image_gen_transformation.py | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/litellm/llms/openrouter/image_generation/transformation.py b/litellm/llms/openrouter/image_generation/transformation.py index 19c94144c54..481d165c93d 100644 --- a/litellm/llms/openrouter/image_generation/transformation.py +++ b/litellm/llms/openrouter/image_generation/transformation.py @@ -118,7 +118,8 @@ class OpenRouterImageGenerationConfig(BaseImageGenerationConfig): ratio of an OpenAI pixel size. A tier size or an image_config set by the caller wins """ size: Final = str(mapped_params.get("size") or "") - tier: Final = QUALITY_RESOLUTION_TIERS.get(str(mapped_params["quality"])) + quality: Final = mapped_params["quality"] + tier: Final = QUALITY_RESOLUTION_TIERS.get(quality) if isinstance(quality, str) else None params: Final = {key: value for key, value in mapped_params.items() if key != "quality"} if tier is None or (size and PIXEL_SIZE.fullmatch(size) is None): return params diff --git a/tests/unit/llms/openrouter/image_generation/test_openrouter_image_gen_transformation.py b/tests/unit/llms/openrouter/image_generation/test_openrouter_image_gen_transformation.py index f5ec6a15a54..3b323261421 100644 --- a/tests/unit/llms/openrouter/image_generation/test_openrouter_image_gen_transformation.py +++ b/tests/unit/llms/openrouter/image_generation/test_openrouter_image_gen_transformation.py @@ -12,6 +12,7 @@ from litellm.llms.openrouter.common_utils import OpenRouterException from litellm.llms.openrouter.image_generation.transformation import ( OpenRouterImageGenerationConfig, ) +from litellm.types.llms.openai import ImageGenerationRequestQuality from litellm.types.utils import ImageResponse, ImageUsage, ImageUsageInputTokensDetails CONFIG: Final = OpenRouterImageGenerationConfig() @@ -235,6 +236,26 @@ def test_map_openai_params_quality_tier_yields_to_an_image_config_already_set(): assert mapped == {"image_config": {"image_size": "1K"}, "quality": "high", "size": "1536x1024"} +@pytest.mark.parametrize("quality", list(ImageGenerationRequestQuality)) +def test_map_openai_params_reads_a_quality_enum_member_like_its_string(quality: ImageGenerationRequestQuality): + """litellm.image_generation takes ImageGenerationRequestQuality members as quality""" + from_enum = CONFIG.map_openai_params( + non_default_params={"quality": quality, "size": "1024x1024"}, + optional_params={}, + model=RESOLUTION_TIER_MODEL, + drop_params=False, + ) + from_string = CONFIG.map_openai_params( + non_default_params={"quality": quality.value, "size": "1024x1024"}, + optional_params={}, + model=RESOLUTION_TIER_MODEL, + drop_params=False, + ) + + assert from_enum == from_string + assert "image_size" in from_enum["image_config"] + + @patch("litellm.llms.openrouter.image_generation.transformation.get_secret_str") def test_validate_environment_with_api_key(mock_get_secret: MagicMock): result = CONFIG.validate_environment(