# 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-07-28

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 |
|---|---|---|
| Harness | F | A − 4 red − 1 yellow, 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/index.md](https://inferencecanary.com/speed/index.md) |
| Faithfulness | 29/29 | Agreement with the reference provider over the 29-cell deterministic battery (temperature 0, thinking disabled). |

## Flags

- **[red · 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/index.md](https://inferencecanary.com/findings/index.md#google-no-paid-tier))
- **[red · harness] Four 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 four 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/index.md](https://inferencecanary.com/replayed-reasoning-dropped/index.md))
- **[red · harness] Google's OpenAI-compat shim has no reasoning channel; thought text leaks into content** — The shim never populates reasoning or reasoning_content. With thinking on — its default when no knob is sent — 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: [/findings/index.md](https://inferencecanary.com/findings/index.md#google-openai-no-reasoning-channel))
- **[red · harness] Images in tool results: rejected, 500'd, or silently blinded on 7 of 11 providers** — The model reads images returned by tools — the reference provider delivers them, perception-judged, and three OpenAI-compat providers prove the standard shape works. Seven providers fail on schema choice, not model limits: four reject the request (400/422), SambaNova returns a deterministic 500, 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. (details: [/findings/index.md](https://inferencecanary.com/findings/index.md#tool-result-images))
- **[yellow · harness] 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. A harness that dispatches on finish_reason behaves differently depending on transport. (details: [/findings/index.md](https://inferencecanary.com/findings/index.md#google-openai-finish-reason))

