# Findings - inferencecanary

Dated defects with live evidence and a stated repro. Severity "high" breaks or corrupts a real
application; "medium" degrades one or violates the dialect contract with a workaround.
Where a defect was reported to the provider, the disclosure and its outcome are part
of the record. HTML version: [https://inferencecanary.com/findings](https://inferencecanary.com/findings)

<a id="google-no-paid-tier"></a>
## Google sells no paid tier for gemma-4: every request is used to improve their products, and quota gates agentic work

**high · pricing · 2026-07-28** · affects: google, google-openai

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.

<a id="replayed-reasoning-dropped"></a>
## Several providers drop replayed reasoning: the model never sees its own prior thinking

**high · inference · 2026-07-26** · affects: togetherai, novita, aws, aws-responses, google-openai

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.

Full writeup and repro: [https://inferencecanary.com/replayed-reasoning-dropped.md](https://inferencecanary.com/replayed-reasoning-dropped.md)

<a id="google-openai-no-reasoning-channel"></a>
## Google's OpenAI-compat shim has no reasoning channel; thought text leaks into content

**high · inference · 2026-07-26** · affects: google-openai

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.

Full writeup and repro: [https://inferencecanary.com/google-openai-no-reasoning-channel.md](https://inferencecanary.com/google-openai-no-reasoning-channel.md)

<a id="tool-result-images"></a>
## Images in tool results: rejected or silently blinded on several providers

**high · inference · 2026-07-26** · affects: cerebras, deepinfra, aws, aws-responses, google-openai

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.

Full writeup and repro: [https://inferencecanary.com/tool-result-images.md](https://inferencecanary.com/tool-result-images.md)

<a id="tool-choice-unenforced"></a>
## DeepInfra and Parasail validate tool_choice but do not enforce it

**high · inference · 2026-07-26** · affects: deepinfra, parasail

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.

Full writeup and repro: [https://inferencecanary.com/tool-choice-unenforced.md](https://inferencecanary.com/tool-choice-unenforced.md)

<a id="bedrock-parallel-tool-call"></a>
## AWS Bedrock never emits parallel tool calls

**medium · inference · 2026-07-26** · affects: aws, aws-responses

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.

Full writeup and repro: [https://inferencecanary.com/bedrock-parallel-tool-call.md](https://inferencecanary.com/bedrock-parallel-tool-call.md)

<a id="bedrock-argument-corruption"></a>
## AWS Bedrock un-escapes tool-call arguments in transit

**medium · inference · 2026-07-26** · affects: aws, aws-responses

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.

Full writeup and repro: [https://inferencecanary.com/bedrock-argument-corruption.md](https://inferencecanary.com/bedrock-argument-corruption.md)

<a id="google-openai-finish-reason"></a>
## Google's shim mislabels streamed tool calls finish_reason: "stop"

**medium · inference · 2026-07-26** · affects: google-openai

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.

Full writeup and repro: [https://inferencecanary.com/google-openai-finish-reason.md](https://inferencecanary.com/google-openai-finish-reason.md)

<a id="lightning-marker-leak"></a>
## Lightning leaks template reasoning markers into content

**medium · inference · 2026-07-26** · affects: lightning

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.

Full writeup and repro: [https://inferencecanary.com/lightning-marker-leak.md](https://inferencecanary.com/lightning-marker-leak.md)

<a id="sambanova-truncation-leak"></a>
## SambaNova ships raw chain-of-thought as the answer when truncation lands mid-thought

**medium · inference · 2026-08-02** · affects: sambanova

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.

Full writeup and repro: [https://inferencecanary.com/sambanova-truncation-leak.md](https://inferencecanary.com/sambanova-truncation-leak.md)

<a id="aws-responses-temperature"></a>
## AWS Bedrock (Responses) rejects temperature

**medium · inference · 2026-07-26** · affects: aws-responses

temperature returns 400 unsupported_parameter, so deterministic sampling is unreachable on this provider: every run is stochastic, degrading reproducibility for applications and evals alike.

Full writeup and repro: [https://inferencecanary.com/aws-responses-temperature.md](https://inferencecanary.com/aws-responses-temperature.md)


