Skip to content

gemini-3-pro-image-preview fails in celeste.images.edit (400 “Request contains an invalid argument”) due to hardcoded responseModalities #123

Description

@Kamilbenkirane

Summary

celeste.images.edit works correctly with gemini-2.5-flash-image but fails with gemini-3-pro-image-preview, returning 400 Bad Request: Request contains an invalid argument.

Environment

  • celeste-ai==0.9.3
  • Python 3.12
  • OS: Linux (5.10.0-36-cloud-amd64)
  • Authentication: GOOGLE_API_KEY environment variable

Steps to Reproduce

import asyncio
import celeste
from celeste.artifacts import ImageArtifact

async def main():
    img = ImageArtifact(path="bw.png", mime_type="image/png")
    out = await celeste.images.edit(
        image=img,
        prompt="Colorize this black and white photo. Preserve exact dimensions.",
        model="gemini-3-pro-image-preview",
        provider=celeste.Provider.GOOGLE,
    )
    print(out.content)

asyncio.run(main())

Actual Result

HTTP 400 error from Google generateContent endpoint:

HTTP Request: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent "HTTP/1.1 400 Bad Request"
google API error: Request contains an invalid argument.

Expected Result

celeste.images.edit(..., model="gemini-3-pro-image-preview") should work out of the box, just like gemini-2.5-flash-image does.

Root Cause

In celeste-ai==0.9.3, the Gemini image client hardcodes generationConfig.responseModalities to ["Image"] for all Gemini models:

# src/celeste/modalities/images/providers/google/gemini.py
def _init_request(self, inputs: ImageInput) -> dict[str, Any]:
    return {
        "contents": [{"parts": parts}],
        "generationConfig": {
            "responseModalities": ["Image"],  # Hardcoded!
            "imageConfig": {},
        },
    }

However, according to Google's Gemini image generation documentation, gemini-3-pro-image-preview requires responseModalities: ["TEXT", "IMAGE"] (both modalities), while gemini-2.5-flash-image works with just ["Image"].

Reference: https://ai.google.dev/gemini-api/docs/image-generation

Proposed Fix

Make responseModalities model-aware:

  • Default to ["TEXT", "IMAGE"] for gemini-3-pro-image-preview
  • Keep ["Image"] for gemini-2.5-flash-image (or make it configurable)

Alternatively, expose a parameter to control generationConfig.responseModalities for Gemini image models.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions