Findings
Dated defects with live evidence and a stated repro. An observation enters this list only when it would matter to someone - a developer choosing a provider, or a provider fixing it. Severity high breaks or corrupts a real application; medium degrades one or violates the dialect contract with a workaround. Where we have reported a defect to the provider, the disclosure and its outcome are part of the record. The deepest findings carry full writeup pages with complete repro payloads.
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.
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.
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.
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.
DeepInfra and Parasail validate tool_choice but do not enforce it
Invalid values are rejected with a 4xx - every surface signal says the capability exists - but a valid constraint has zero effect on decoding: "required" returns prose with zero calls, and forcing a tool by name yields a call to a different tool. An application relying on forced tool calls silently gets prose. Parasail enforced all three conditions on 2026-07-27 and stopped by 2026-08-01 - the guarantee can vanish with no signal at the API surface.
AWS Bedrock never emits parallel tool calls
parallel_tool_calls: true is accepted on both Bedrock APIs, but only a single call ever comes back; every other provider emits two for the same two-lookup prompt. A model capability suppressed at the serving layer; the workaround is sequential calling at double the turns and latency.
AWS Bedrock un-escapes tool-call arguments in transit
At temperature 0, every other provider agrees the model returns a tricky string argument with literal escape sequences. Both Bedrock APIs instead return real control characters - one extra unescape pass applied to the model's own output. Any argument whose bytes matter (embedded JSON, code, regexes) is corrupted.
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.
Lightning leaks template reasoning markers into content
On an image-bearing tool turn, the channel parse intermittently fails in both directions at once: the reasoning field comes back empty and literal template marker text leads the answer field. Two of four identical runs leak, byte-identically, with the response nowhere near its token budget; the same provider's text-tool and user-image turns parse clean every time.
SambaNova ships raw chain-of-thought as the answer when truncation lands mid-thought
With thinking on, a max_tokens cut that lands inside the thought returns the entire raw thought channel - literal template marker included - in the content field, with the reasoning field empty and no answer at all. Deterministic, three of three identical runs; a cut landing mid-answer splits cleanly, so only the mid-thought cut leaks.
AWS Bedrock (Responses) rejects temperature
temperature returns 400 unsupported_parameter, so deterministic sampling is unreachable on this provider: every run is stochastic, degrading reproducibility for applications and evals alike.