Skip to content

Conversation

@thisisryanswift
Copy link

feat: display Google Gemini cached token stats

Closes #6851

What

One-line fix to read cached token counts from Google's metadata so they show up in session stats.

Why

Google returns cached token counts in a different spot than Anthropic:

  • Anthropic: usage.cachedInputTokens
  • Google: providerMetadata.google.usageMetadata.cachedContentTokenCount

Implicit caching was already working server-side (and saving money), we just weren't displaying it.

The fix

- const cachedInputTokens = input.usage.cachedInputTokens ?? 0
+ const cachedInputTokens = input.usage.cachedInputTokens ?? 
+   (input.metadata?.["google"] as any)?.usageMetadata?.cachedContentTokenCount ?? 0

Tested

Verified locally with a couple of gemini conversations.


Future: Explicit Caching

Google has two caching modes:

  • Implicit (what we're using): Automatic, server-side, probabilistic
  • Explicit: Guaranteed cache hits, requires managing cache objects

For explicit caching, we'd need:

  1. Add @google/generative-ai dependency
  2. Use GoogleAICacheManager to create/update/delete caches with TTL
  3. Pass cache name via providerOptions.google.cachedContent

This is a bigger lift but would give guaranteed savings. See:

Extract cached token counts from Google's response metadata so they're
visible in OpenCode's usage display.

Gemini 2.5+ models use implicit caching (automatic, server-side). However,
OpenCode wasn't reading the cached token counts from Google's metadata
location (usageMetadata.cachedContentTokenCount) rather than the standard
location.

This enables users to see their Gemini cache hits in the session context
usage display, and cost calculations will correctly account for cached
tokens.

Verified working: tested with gemini-3-flash-preview, observed cache.read
values of 16K, 49K, and 107K tokens in a multi-turn conversation.

Future opportunity: For guaranteed cache hits, explicit caching could be
implemented using GoogleAICacheManager + providerOptions.google.cachedContent.
See: https://ai.google.dev/gemini-api/docs/caching
@rekram1-node
Copy link
Collaborator

so the google ai sdk provider doesnt track it?

@thisisryanswift
Copy link
Author

Doesn't seem like it locally. Before and after of this change is that I can go back to sessions and actually see a cached token amount.

Could be something upstream in Vercel's AI SDK?

Transparently I mostly vibe coded here. I did try to be intentional though. Ultimately rolled back from my initial issue. I thought it wasn't caching at all. But really it's just not reporting/recording caching

@rekram1-node
Copy link
Collaborator

what provider are u using? google directly? any plugins?

@thisisryanswift
Copy link
Author

Google via apikey. Only plugin is a notifier I vibe coded. None of the antigravity or gemini cli auth provider plugins.

@rekram1-node
Copy link
Collaborator

Hmm I tested this several times and couldnt get any difference in token counting but it could just be happenstance..

@thisisryanswift
Copy link
Author

So I don't think it will change your total token count in the TUI. But, this change will correctly identify cached tokens. So it impacts the price displayed in the TUI and also would have those cached token counts if someone went back and analyzed their sessions. Previously, Gemini was showing zero cached tokens (at least it was for me locally) when you went back and looked at old sessions. Was just never recording the implicit/automatic caching.

@danchurko
Copy link

Do you think this change will apply the fix to the Vertex AI connections, too?

@thisisryanswift
Copy link
Author

Do you think this change will apply the fix to the Vertex AI connections, too?

Iirc, the caching is by model not by provider generally. But there is a mix of both. If you use anthropic claude models via vertex I think current system will already cache correctly. But I didn't test this myself. If you use Gemini via vertex my assumption would be that server side implicit caching is working automatically (already). But it like suffers the same fate that this fixes where OpenCode doesn't record that. Not 100% sure.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE]: Google/VertexAI Context Caching

3 participants