Guides / llm model mix drift
LLM model mix drift, and why the bill moved without a deploy
Model mix drift is traffic shifting toward pricier models without anyone changing the code, through fallbacks, routing rules or a default that moved. Volume holds and the bill climbs. Culpa, a local-first LLM cost, margin, and forecast ledger, records the model that served every call, so a mix shift separates cleanly from a price change.
Why this happens
Mix drifts for mundane reasons. A cheap model rate-limits and your fallback quietly routes to the expensive one. A routing rule keyed on input length starts matching more often because prompts grew. A provider changes which model an alias points at. None of these appear in a diff, none fire an alert, and all of them move the bill. The blended rate rises identically whether prices changed or traffic moved, which is why it can't diagnose this.
What this usually looks like
- Spend rose with no deploy in the window, which rules out most of the obvious explanations.
- Your blended rate moved while every published list price stayed the same.
- A model you thought handled a small slice of traffic turns out to be handling much more.
- Cost rises during peak hours by more than volume does, which is the signature of rate-limit fallbacks.
Free, no card, no account
Run the free Cost Leak Scan
It shows your most expensive conversation before you install anything.
Mistakes that cost the most
| Mistake | Why it hurts | Do instead |
|---|---|---|
| Routing to an expensive model as the fallback for rate limits. | Your fallback fires exactly when volume is highest, so the premium applies to your busiest traffic. | Fall back to a peer-priced model, or queue and retry, and alert when the fallback path carries real volume. |
| Pinning to a floating model alias. | The alias can point somewhere else, and both the behaviour and the rate change without a deploy on your side. | Pin explicit model versions, and treat a version change as a release with a cost review. |
| Tracking only the blended rate. | A mix shift and a price change look identical in one averaged number, so it can't tell you which happened. | Track token share per model over time. The shift is obvious there and invisible in the blend. |
Run this check tonight
- List token share by model for this month and last. Any share that moved by a few points is your candidate.
- Check every fallback path in code and write down which model it routes to and at what rate.
- Confirm whether you pin explicit model versions or floating aliases.
- Compare your model mix at peak hour against your quietest hour. A gap points at rate-limit fallbacks.
- Recompute last month's bill using this month's mix. That difference is the drift, priced.
Ten percent of traffic moves, and the bill rises seventeen percent
Illustrative example
10 million input and 2 million output tokens a month, unchanged. Real rates: Gemini 2.5 Flash at $0.0003 and $0.0025 per 1k, Gemini 2.5 Pro at $0.00125 and $0.010 per 1k. A rate-limit fallback moves a tenth of traffic to Pro.
A tenth of traffic moving raised the bill by thirty percent, with no deploy, no price change and no extra tokens. Only the per-model split shows it.
Every number, with its confidence and source
| Figure | What it means | Confidence | Source |
|---|---|---|---|
| 30.6% | modelled bill increase from a tenth of traffic moving to a pricier model at identical volume | calculated | ($10.45 - $8.00) / $8.00, using real Gemini 2.5 Flash and Gemini 2.5 Pro rates per 1k tokens from the price book, effective 2026-07-02. Token volumes are modelled. |
| $8.00 to $10.45 | modelled monthly spend before and after the mix shift, same token volume | estimated | Both endpoints from the teardown arithmetic at real Gemini rates. A range because the traffic split is modelled. |
What a generic answer can’t know
A provider dashboard does show a model breakdown, which is more than it shows for features or customers. What it can't show is why the mix moved, because your fallback logic and routing rules live in your code. Culpa records the model and the routing reason per call on your infrastructure, where your prompts and responses stay, and counts the calls to run your plan.
Questions founders ask next
How do I tell a mix shift from a price change?
Recompute last month's spend using this month's model mix and last month's rates. If the result matches this month's bill, the mix moved. If it doesn't, prices did. Both can happen at once, and this separates them.
Why would my model mix change without a deploy?
Rate-limit fallbacks, routing rules keyed on input length or content, floating model aliases repointed by the provider, and retries that escalate to a stronger model. All four change behaviour without changing your code.
Is a floating model alias ever a good idea?
For experiments, yes. For production traffic you're billed for, a floating alias means the rate you pay and the behaviour you get can both change without warning, which makes forecasting and incident analysis much harder.
On your infrastructure
Culpa runs on your infrastructure. Your prompts and responses never leave it. Culpa counts calls to run your plan, and it fails open, so if it ever breaks your app keeps running.
Free, no card, no account
Run the free Cost Leak Scan
It shows your most expensive conversation before you install anything.
Keep reading
Sources: Gemini API pricing. Last reviewed 2026-08-01. Plain text version.