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.
How Culpa works
Find the culprit. Not just the total.
Your dashboard shows what you spent. It stops short of who spent it. Culpa shows the conversation, the user and the feature behind it.
Your prompts stay local.
Culpa runs on your own infrastructure. What you send to a model reaches us at no point.
Every dollar has a name.
Follow any charge to the conversation, the user, the feature and the customer behind it.
See the bill before it lands.
Cost your next feature before you ship it. You get the likely bill and the worst case, at best, median, p90 and p99.
Three steps to your first answer.
Change one base URL.
Or drop in the Python or TypeScript library.
Find your most expensive conversation.
In the first session, not the first week.
Cost your next feature before you ship it.
Why the bill went up
Example dashboardCalls traced
418,209
across 3 projects
Spend this week
$378.41
+ $182 vs last week
Failed calls
312
74% retried, and you paid for all of them
+ $182 this week traced to one culprit
Spend over 14 days
Most expensive users
Next week forecast
Graded against reality. Accuracy shown as results land.
Keep reading
Sources: Gemini API pricing. Last reviewed 2026-08-01. Plain text version.