# Google (OpenAI-compat) - gemma-4-31b grade card

OpenAI chat/completions shim over generateContent · serves `gemma-4-31b-it` as gemma-4-31b · probed live 2026-08-25

Google's OpenAI-compatibility shim, serving the same model as the native provider - graded on what the shim delivers.

HTML version: [https://inferencecanary.com/google-openai/gemma-4-31b](https://inferencecanary.com/google-openai/gemma-4-31b) · matrix: [https://inferencecanary.com/index.md](https://inferencecanary.com/index.md)

## Grades


| Axis | Grade | Basis |
|---|---|---|
| Inference | F | A − 4 high − 1 medium severity, per the published ladder |
| Billing | OK | Reported usage consistent with bytes on the wire. Footnote: completion_tokens under-counts its own delivered content - under-bills in the customer's favor. |
| Caching | Fail | A repeat 20K-token submission waits out the free tier's per-minute token quota (~46s of 429 retries) before it is served - and gemma-4 has no paid tier, so there is no quota to buy. Whether context is reused is unobservable behind the wait. Speed numbers: [https://inferencecanary.com/speed.md](https://inferencecanary.com/speed.md) |


## Flags

- **[high · pricing] Google sells no paid tier for gemma-4: every request is used to improve their products, and quota gates agentic work** - Google's own price sheet lists gemma-4's paid tier as "Not available" on every line - the free tier is the only tier - and carries the row "Used to improve our products: Yes" with no paid alternative. The Gemini API terms spell out what that means: content submitted to unpaid services is used to develop Google's products and machine-learning technologies, and human reviewers may read and annotate inputs and outputs. No amount of money opts gemma-4 traffic out. The free tier's per-minute token quota also gates agentic work: a 20K-token request completes in ~2 seconds, but submitting a second one waited 46-49 seconds in 429 retries before being served (measured 2026-07-28 on both Google API dialects, 3-minute retry ceiling) - and with no paid tier, there is no way to buy that wait down. Ironic footnote: the same price sheet advertises context caching "free of charge" for gemma-4, but the quota makes any cache benefit unobservable - the retry wait dwarfs it. (details: [/findings.md](https://inferencecanary.com/findings.md#google-no-paid-tier))
- **[high · inference] Several providers drop replayed reasoning: the model never sees its own prior thinking** - The gemma-4 chat template renders reasoning replayed on model turns, and the model card mandates preserving thinking across tool-call turns - the reference provider reproduces this live. These providers delete it before templating: on a continuation after a tool call, the model re-derives or invents instead of recalling, and no error is raised. AWS Bedrock's Responses dialect is the sharpest case: it defines an explicit input item for replayed reasoning, accepts it without error, and never renders it to the model. (details: [/replayed-reasoning-dropped.md](https://inferencecanary.com/replayed-reasoning-dropped.md))
- **[high · inference] Google's OpenAI-compat shim has no reasoning channel; thought text leaks into content** - The shim never populates reasoning or reasoning_content - even with reasoning_effort explicitly sent and accepted. The model's thought text arrives inside literal <thought> tags in the answer field, with no structured way to separate them. Google's native protocol serves the same model with a proper thought channel; the shim discards it. (details: [/google-openai-no-reasoning-channel.md](https://inferencecanary.com/google-openai-no-reasoning-channel.md))
- **[high · inference] Images in tool results: rejected or silently blinded on several providers** - The model reads images returned by tools - the reference provider delivers them, perception-judged, and several OpenAI-compat providers prove the standard shape works. The failing providers fail on schema choice, not model limits: several reject the request (400/422), and AWS Bedrock (Responses) is the worst class - it returns 200 and the model never sees the image, answering confidently about content it never saw. Google's own shim rejects a capability Google's native protocol serves. SambaNova and Novita, which rejected these requests through July, deliver tool-result images since 2026-08-25. (details: [/tool-result-images.md](https://inferencecanary.com/tool-result-images.md))
- **[medium · inference] Google's shim mislabels streamed tool calls finish_reason: "stop"** - The same deterministic tool prompt yields finish_reason "tool_calls" non-streaming but "stop" streaming. An agent harness that dispatches on finish_reason behaves differently depending on transport. (details: [/google-openai-finish-reason.md](https://inferencecanary.com/google-openai-finish-reason.md))

