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.
Summary
celeste.images.editworks correctly withgemini-2.5-flash-imagebut fails withgemini-3-pro-image-preview, returning400 Bad Request: Request contains an invalid argument.Environment
celeste-ai==0.9.3GOOGLE_API_KEYenvironment variableSteps to Reproduce
Actual Result
HTTP 400 error from Google
generateContentendpoint:Expected Result
celeste.images.edit(..., model="gemini-3-pro-image-preview")should work out of the box, just likegemini-2.5-flash-imagedoes.Root Cause
In
celeste-ai==0.9.3, the Gemini image client hardcodesgenerationConfig.responseModalitiesto["Image"]for all Gemini models:However, according to Google's Gemini image generation documentation,
gemini-3-pro-image-previewrequiresresponseModalities: ["TEXT", "IMAGE"](both modalities), whilegemini-2.5-flash-imageworks with just["Image"].Reference: https://ai.google.dev/gemini-api/docs/image-generation
Proposed Fix
Make
responseModalitiesmodel-aware:["TEXT", "IMAGE"]forgemini-3-pro-image-preview["Image"]forgemini-2.5-flash-image(or make it configurable)Alternatively, expose a parameter to control
generationConfig.responseModalitiesfor Gemini image models.