# AWS Bedrock (Chat Completions) — gemma-4-31b grade card

OpenAI chat/completions on Bedrock Mantle · serves `google.gemma-4-31b` as gemma-4-31b · probed live 2026-07-27

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

## Grades


| Axis | Grade | Basis |
|---|---|---|
| Harness | D | A − 2 red − 2 yellow, per the published ladder |
| Billing | OK | Reported usage consistent with bytes on the wire. Footnote: Reports reasoning_tokens: 0 beside delivered reasoning — under-counts in the customer's favor. |
| Caching | No (0/8 hits) | No cold→warm trial hit — every call re-reads (and re-bills) the full context. Speed numbers: [https://inferencecanary.com/speed/index.md](https://inferencecanary.com/speed/index.md) |
| Faithfulness | 28/29 | Agreement with the reference provider over the 29-cell deterministic battery (temperature 0, thinking disabled). |

## Flags

- **[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] 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] 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. (details: [/findings/index.md](https://inferencecanary.com/findings/index.md#bedrock-single-tool-call))
- **[yellow · harness] AWS Bedrock un-escapes tool-call arguments in transit** — At temperature 0, nine providers agree 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 — plus a stray one-word content beside the call. Any argument whose bytes matter (embedded JSON, code, regexes) is corrupted. (details: [/findings/index.md](https://inferencecanary.com/findings/index.md#bedrock-argument-corruption))

