From be970735dee97081419442fc127e95db27877bbf Mon Sep 17 00:00:00 2001 From: ripepersimmon Date: Wed, 26 Nov 2025 12:38:29 +0900 Subject: [PATCH] feat: Add gemini-3-pro-image-preview model support for imageSize parameters (#17019) - Add model identifier to FLASH_IMAGE_PREVIEW_MODEL_IDENTIFIERS - Add imageSize parameter support (1K, 2K, 4K) with GeminiImageSize type - Add tests for imageSize parameter transformation - Update documentation with new model --- .../docs/completion/image_generation_chat.md | 4 +-- .../gemini/image_generation/transformation.py | 3 +- litellm/types/llms/vertex_ai.py | 5 +++ .../vertex_ai/gemini/test_transformation.py | 36 ++++++++++++++++++- tests/llm_translation/test_gemini.py | 1 + 5 files changed, 45 insertions(+), 4 deletions(-) diff --git a/docs/my-website/docs/completion/image_generation_chat.md b/docs/my-website/docs/completion/image_generation_chat.md index 5538b7f8ff3..83488ac7ce8 100644 --- a/docs/my-website/docs/completion/image_generation_chat.md +++ b/docs/my-website/docs/completion/image_generation_chat.md @@ -224,8 +224,8 @@ asyncio.run(generate_image()) | Provider | Model | |----------|--------| -| Google AI Studio | `gemini/gemini-2.0-flash-preview-image-generation`, `gemini/gemini-2.5-flash-image-preview` | -| Vertex AI | `vertex_ai/gemini-2.0-flash-preview-image-generation`, `vertex_ai/gemini-2.5-flash-image-preview` | +| Google AI Studio | `gemini/gemini-2.0-flash-preview-image-generation`, `gemini/gemini-2.5-flash-image-preview`, `gemini/gemini-3-pro-image-preview` | +| Vertex AI | `vertex_ai/gemini-2.0-flash-preview-image-generation`, `vertex_ai/gemini-2.5-flash-image-preview`, `vertex_ai/gemini-3-pro-image-preview` | ## Spec diff --git a/litellm/llms/gemini/image_generation/transformation.py b/litellm/llms/gemini/image_generation/transformation.py index d47759d0e82..e79414394fa 100644 --- a/litellm/llms/gemini/image_generation/transformation.py +++ b/litellm/llms/gemini/image_generation/transformation.py @@ -25,6 +25,7 @@ FLASH_IMAGE_PREVIEW_MODEL_IDENTIFIERS = ( "2.0-flash-preview-image", "2.0-flash-preview-image-generation", "2.5-flash-image-preview", + "3-pro-image-preview", ) class GoogleImageGenConfig(BaseImageGenerationConfig): DEFAULT_BASE_URL: str = "https://generativelanguage.googleapis.com/v1beta" @@ -75,7 +76,7 @@ class GoogleImageGenConfig(BaseImageGenerationConfig): "1792x1024": "16:9", "1024x1792": "9:16", "1280x896": "4:3", - "896x1280": "3:4" + "896x1280": "3:4", } return aspect_ratio_map.get(size, "1:1") diff --git a/litellm/types/llms/vertex_ai.py b/litellm/types/llms/vertex_ai.py index 7a4a4723abd..5f00edc1ffa 100644 --- a/litellm/types/llms/vertex_ai.py +++ b/litellm/types/llms/vertex_ai.py @@ -183,8 +183,13 @@ GeminiResponseModalities = Literal["TEXT", "IMAGE", "AUDIO", "VIDEO"] GeminiImageAspectRatio = Literal["1:1", "2:3", "3:2", "3:4", "4:3", "9:16", "16:9", "21:9"] +GeminiImageSize = Literal["1K", "2K", "4K"] + + class GeminiImageConfig(TypedDict, total=False): aspectRatio: GeminiImageAspectRatio + imageSize: GeminiImageSize + class PrebuiltVoiceConfig(TypedDict): voiceName: str diff --git a/tests/litellm/llms/vertex_ai/gemini/test_transformation.py b/tests/litellm/llms/vertex_ai/gemini/test_transformation.py index a0f24376614..6d005af28ac 100644 --- a/tests/litellm/llms/vertex_ai/gemini/test_transformation.py +++ b/tests/litellm/llms/vertex_ai/gemini/test_transformation.py @@ -191,4 +191,38 @@ async def test__transform_request_body_image_config_snake_case(): assert "generationConfig" in rb assert "image_config" in rb["generationConfig"] - assert rb["generationConfig"]["image_config"] == {"aspect_ratio": "16:9"} \ No newline at end of file + assert rb["generationConfig"]["image_config"] == {"aspect_ratio": "16:9"} + + +@pytest.mark.asyncio +async def test__transform_request_body_image_config_with_image_size(): + """Test imageSize parameter support in imageConfig""" + model = "gemini-3-pro-image-preview" + messages = [ + { + "role": "user", + "content": [ + {"type": "text", "text": "Generate a 4K image of Tokyo skyline"} + ] + } + ] + optional_params = { + "imageConfig": {"aspectRatio": "16:9", "imageSize": "4K"}, + "responseModalities": ["Image"] + } + litellm_params = {} + transform_request_params = { + "messages": messages, + "model": model, + "optional_params": optional_params, + "custom_llm_provider": "gemini", + "litellm_params": litellm_params, + "cached_content": None, + } + + rb: RequestBody = transformation._transform_request_body(**transform_request_params) + + assert "generationConfig" in rb + assert "imageConfig" in rb["generationConfig"] + assert rb["generationConfig"]["imageConfig"]["aspectRatio"] == "16:9" + assert rb["generationConfig"]["imageConfig"]["imageSize"] == "4K" \ No newline at end of file diff --git a/tests/llm_translation/test_gemini.py b/tests/llm_translation/test_gemini.py index 1065509dd4e..57667085c00 100644 --- a/tests/llm_translation/test_gemini.py +++ b/tests/llm_translation/test_gemini.py @@ -295,6 +295,7 @@ def test_gemini_image_generation(): [ "gemini/gemini-2.5-flash-image-preview", "gemini/gemini-2.0-flash-preview-image-generation", + "gemini/gemini-3-pro-image-preview", ], ) def test_gemini_flash_image_preview_models(model_name: str):