googleapis / googleapis/python-genai

Part-level media_resolution on image generation models causes prompt_token_count=None

Open
#2,224 1 comment 0 reactions 1 assignee Claimed by @Venkaiahbabuneelam View on GitHub
priority: p2 type: bug
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.