# SambaNova — gemma-4-31b grade card

OpenAI chat/completions · serves `gemma-4-31B-it` as gemma-4-31b · probed live 2026-07-27

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

## Grades


| Axis | Grade | Basis |
|---|---|---|
| Harness | C− | A − 2 red − 1 yellow, per the published ladder |
| Billing | RED | Identical requests billed inflated token counts — 2.18× average overcharge across three 40-call batteries. |
| 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 | 29/29 | Agreement with the reference provider over the 29-cell deterministic battery (temperature 0, thinking disabled). |

## Flags

- **[red · billing] SambaNova bills identical requests inflated token counts — 2.18× average overcharge** — The same 35-token request body, sent 40 times in sequence, was billed ten distinct values between 27 and 2478 tokens. Across three independent batteries, 9,176 tokens were charged for 4,200 actually sent — 2.18× on average, carried in total_tokens, the field an invoice sees. A closed pair of co-fired requests (74 and 1,197 tokens) was billed 1,197 on both members: the totals do not conserve, so this is extra billing, not counts shuffled between requests. A standalone single-loop repro is in the suite. (details: [/sambanova-overbilling/index.md](https://inferencecanary.com/sambanova-overbilling/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))
- **[red · harness] SambaNova enforces tool_choice by post-hoc 400, not constrained decoding** — The knob is accepted, generation runs unconstrained, and when the output violates the constraint the request fails with a provider-level 400. Whether a request succeeds depends on what the model happened to emit: forced-tool workflows that pass in testing throw unrecoverable runtime errors in production, with no tool call in the error body to repair from. (details: [/findings/index.md](https://inferencecanary.com/findings/index.md#sambanova-tool-choice-400))
- **[yellow · harness] Tool results replayed out of order are mis-paired on most providers** — The chat dialect's contract is that a tool message is matched to its call by tool_call_id, in any order. After two parallel calls, replaying the results reversed swaps the data between them on these providers — the template renders by name, and these providers render positionally, dropping their own dialect's id contract. An async harness that appends results in completion order silently swaps payloads. One provider pairs correctly, proving the fix is implementable provider-side. (details: [/findings/index.md](https://inferencecanary.com/findings/index.md#tool-results-out-of-order))

