Description
The Gemini image adapter (@tanstack/ai-gemini) always returns usage: undefined in the ImageGenerationResult, even though the Gemini API response includes usageMetadata with token counts.
Current behavior
In packages/typescript/ai-gemini/src/adapters/image.ts#L171, transformGeminiResponse() hardcodes usage: undefined:
return {
id: generateId(this.name),
model,
images,
usage: undefined, // <-- always undefined
}
The same happens in transformImagenResponse() at L203.
Expected behavior
The adapter should parse usageMetadata from the Gemini response and return it in the usage field, similar to how the Gemini text/summarize adapters already do.
Example Gemini API response (from gemini-3-pro-image-preview:generateContent):
{
"candidates": [{ "content": { "parts": [{ "inlineData": { "mimeType": "image/jpeg", "data": "..." } }] } }],
"usageMetadata": {
"promptTokenCount": 36,
"candidatesTokenCount": 1211,
"totalTokenCount": 1405,
"promptTokensDetails": [{ "modality": "TEXT", "tokenCount": 36 }],
"candidatesTokensDetails": [{ "modality": "IMAGE", "tokenCount": 1120 }],
"thoughtsTokenCount": 158
}
}
The fix would map usageMetadata to the ImageGenerationResult.usage field:
usage: data.usageMetadata
? {
inputTokens: data.usageMetadata.promptTokenCount,
outputTokens: data.usageMetadata.candidatesTokenCount,
totalTokens: data.usageMetadata.totalTokenCount,
}
: undefined,
This is consistent with how the OpenAI image adapter already handles usage (ai-openai/src/adapters/image.ts#L109-L115).
Description
The Gemini image adapter (
@tanstack/ai-gemini) always returnsusage: undefinedin theImageGenerationResult, even though the Gemini API response includesusageMetadatawith token counts.Current behavior
In
packages/typescript/ai-gemini/src/adapters/image.ts#L171,transformGeminiResponse()hardcodesusage: undefined:The same happens in
transformImagenResponse()at L203.Expected behavior
The adapter should parse
usageMetadatafrom the Gemini response and return it in theusagefield, similar to how the Gemini text/summarize adapters already do.Example Gemini API response (from
gemini-3-pro-image-preview:generateContent):{ "candidates": [{ "content": { "parts": [{ "inlineData": { "mimeType": "image/jpeg", "data": "..." } }] } }], "usageMetadata": { "promptTokenCount": 36, "candidatesTokenCount": 1211, "totalTokenCount": 1405, "promptTokensDetails": [{ "modality": "TEXT", "tokenCount": 36 }], "candidatesTokensDetails": [{ "modality": "IMAGE", "tokenCount": 1120 }], "thoughtsTokenCount": 158 } }The fix would map
usageMetadatato theImageGenerationResult.usagefield:This is consistent with how the OpenAI image adapter already handles usage (
ai-openai/src/adapters/image.ts#L109-L115).