v0.32.2 — the free tier throws away everything past 128 KiB and returns 200 as if it hadn't
Two leftovers from the #61 review, both settled with measurements.
The free tier truncates silently at 128 KiB
usage.prompt_tokens is the only tell, and it flatlines:
| sent | prompt_tokens |
|---|---|
| 110,000 B | 22,065 |
| 125,000 B | 25,065 |
| 130,000 B | 26,065 |
| 135,000 B | 26,266 ← capped |
| 150,000 B | 26,266 ← identical, 15 KB discarded |
Identical on gpt-oss-120b and deepseek-v4-flash, so this is a property of the free path, not of any one model's context window.
It is not a gateway-wide body cap. Paid models scale linearly straight past it — the 402 quote for gpt-5.6-terra reads ~12,016 input tokens at 25 KB and ~192,016 at 400 KB, no ceiling. (Readable from the payment-required header, so measuring it cost nothing.) Paid models are therefore deliberately never warned about.
Consequence worth stating: the "1M context" noted against deepseek-v4-flash is unreachable on the free tier.
Why this warranted a release
No error, no warning, no finish_reason signal — the reply comes back confident and well-formed. That makes it the worst failure shape available: indistinguishable from success. An agent summarising a large document over mode:"free" would present an answer about the first 128 KiB as an answer about the whole thing, and nothing downstream could tell.
The gateway's behaviour can't be changed from here, so the tool says it out loud, plus truncated: true in structuredContent. Verified end to end — on a 176 KiB prompt the warning predicts 73% kept and the gateway counted 73%:
⚠️ TRUNCATED: the prompt was 176 KiB, but the free NVIDIA path silently caps
input at 128 KiB. Roughly 27% of it never reached the model, so the answer
above covers only the first ~73%. Paid models do not truncate — pass an
explicit model (or a paid mode) to send the whole prompt.
Sizing is in bytes, not characters: 128 KiB is only ~43K CJK characters, so a character count would under-report by 3x and miss exactly the prompts that need warning.
nemotron-3-nano-omni — documented, unrouted, now explained
0.32.1 listed it as healthy and free while leaving it out of free[] with no reason. It is healthy — and on Base it is aliased: it answers 200 in 2.0s while reporting "model": "nvidia/gpt-oss-120b". On sol it serves itself (3.8s). Routing to it on Base would be a slower path to gpt-oss-120b, which is already free[0].
The aliasing trap described at the top of constants.ts, caught in the act.
185 tests, typecheck, build and verify:prices (20/20 exact) green.