2 graded endpoints serving gemma-4-31b · back to the matrix
A vendor is graded once per API it speaks, because a shim and a native protocol routinely behave differently - Google speaks 2.
| Endpoint | Inference | Billing | Probed |
|---|---|---|---|
| Google (native)reference generateContent - Google's own protocol | B | ✓ | 2026-08-25 |
| Google (OpenAI-compat) OpenAI chat/completions shim over generateContent | F | ✓ | 2026-08-25 |
Billing
Footnote (customer-favoring, not flagged): completion_tokens under-counts its own delivered content - under-bills in the customer's favor.
Findings affecting Google
-
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... -
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... -
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... -
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... -
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.