googleapis / googleapis/python-genai
Part-level media_resolution on image generation models causes prompt_token_count=None
- Dominant language
- Python
- Stars
- 4k
- Forks
- 1k
- Avg merge
- 2d 11h
- Merged PRs (30d)
- 40
Description
## Description
When using Part-level `media_resolution` on image generation models (`gemini-2.5-flash-image`, `gemini-3-pro-image-preview`, `gemini-3.1-flash-image-preview`), the response `usage_metadata.prompt_token_count` is `None`. Without the Part-level setting, prompt tokens are reported correctly.
The image generates successfully in both cases — only the token usage reporting is broken.
**Note:** Config-level `media_resolution` (via `GenerateContentConfig`) returns `400 INVALID_ARGUMENT` on all image generation models. Part-level is the only way to set it for these models.
## Environment
- SDK version: `google-genai==1.69.0`
- Python: 3.10
- API: Gemini Developer API
## Minimal reproduction
```python
from google import genai
from google.genai import types
from PIL import Image
img = Image.new("RGB", (1024, 1024), color="blue")
client = genai.Client()
model = "gemini-2.5-flash-image"
prompt = "Add a red circle to this image"
config = types.GenerateContentConfig(
response_modalities=["TEXT", "IMAGE"],
)
# Without Part-level media_resolution — works fine
contents = [types.Content(role="user", parts=[
types.Part(text=prompt),
types.Part(img),
])]
r1 = client.models.generate_content(model=model, contents=contents, config=config)
print("Without media_resolution:")
print(f" prompt_token_count: {r1.usage_metadata.prompt_token_count}") # 266
print(f" candidates_token_count: {r1.usage_metadata.candidates_token_count}") # 1290
# With Part-level media_resolution — prompt_token_count is None
image_part = types.Part(img)
image_part.media_resolution = types.PartMediaResolution(
level=types.PartMediaResolutionLevel.MEDIA_RESOLUTION_HIGH
)
contents2 = [types.Content(role="user", parts=[
types.Part(text=prompt),
image_part,
])]
r2 = client.models.generate_content(model=model, contents=contents2, config=config)
print("\nWith Part-level MEDIA_RESOLUTION_HIGH:")
print(f" prompt_token_count: {r2.usage_metadata.prompt_token_count}") # None (BUG)
print(f" candidates_token_count: {r2.usage_metadata.candidates_token_count}") # 1290
```
## Actual output
```
Without media_resolution:
prompt_token_count: 266
candidates_token_count: 1290
With Part-level MEDIA_RESOLUTION_HIGH:
prompt_token_count: None
candidates_token_count: 1290
```
## Expected behavior
`prompt_token_count` should be reported in both cases. It should reflect the higher token count from the increased media resolution.
## Additional context
- Reproduces on all three image generation models: `gemini-2.5-flash-image`, `gemini-3-pro-image-preview`, `gemini-3.1-flash-image-preview`
- Config-level `media_resolution` (set on `GenerateContentConfig`) returns `400 INVALID_ARGUMENT` for image generation models, so Part-level is the only option
- The image is generated successfully when Part-level `media_resolution` is set — only the usage reporting is affected
- Related: #1907, #470, #1349
Contributor guide
Assessment
This issue has not been assessed yet.