Most of my research and synthesis work runs on free LLM tiers. On 2026-08-27 I put a local router in front of every free provider I could verify, logged every attempt to SQLite, and let the research pipeline hit it as hard as it wanted. This is the ledger for the first fourteen days, 2026-08-27 to 2026-09-09.
2.61B
tokens through the router: 2.58B in, 32M out, plus 26M tokens of reasoning
llm-usage.db, 2026-08-27 to 2026-09-09
83,497
requests across 1,549 sessions, 40 served models and 9 providers
llm-usage.db
$23.85
list-price cost of the whole fortnight. 50,640 of the 58,540 successful calls billed zero
LiteLLM cost estimate
29.9%
of requests failed: 24,957 attempts hit a rate limit, a paywall, a dead model or a hang
llm-usage.db
A third of the calls failed, eight of the 27 deployments I started with were gone or unreachable by the end, and two "free" providers billed a real card. Eleven config changes came out of reading the log; they are dated below with the measurement behind each one.
What the router runs
The workload is research. A script collects public evidence on a company (two web searches, the top result pages, the company's own site), then makes one router call that returns three files: a news summary, an insights sheet and an analysis. Reader agents check the output. A contact-resolution step guesses and verifies naming patterns. A vision tier reads screenshots. Interactive agents in opencode do the deck, summary and code work on top of that.
Every one of those clients talks to one endpoint: a LiteLLM proxy on 127.0.0.1:4000 with 27 deployments in 20 model groups across nine providers. Clients ask for a tier (auto, smart, deep, vision, fast, or the long-form writer) and the router picks a deployment, fails over on error, and writes one row per attempt to llm-usage.db. Failures get a row too, and every change below cites that table.
A daily probe, alphawatch, hits every provider's model list, makes one real call per deployment, diffs the catalogs against yesterday and flags dead model IDs. In fourteen days it reported red on seven mornings, amber on six, green on two.
Requests per day by tier
Every attempt through the router, 27 August to 9 September, stacked by the tier the client asked for. The bar on the baseline is the day's failures.
Table
| Day | interactive (auto, smart, deep, vision, fast) | long-form writer | fallback groups | failed |
|---|---|---|---|---|
| 27 | 2,742 | 0 | 2,262 | 1,576 |
| 28 | 2,210 | 0 | 3,978 | 3,561 |
| 29 | 3,026 | 0 | 1,034 | 856 |
| 30 | 3,854 | 0 | 1,331 | 1,431 |
| 31 | 4,604 | 0 | 315 | 796 |
| 01 | 7,413 | 0 | 42 | 203 |
| 02 | 3,368 | 0 | 20 | 55 |
| 03 | 1,741 | 0 | 245 | 139 |
| 04 | 3,000 | 0 | 1,605 | 1,327 |
| 05 | 1,919 | 9,786 | 4,856 | 7,497 |
| 06 | 1,977 | 6,218 | 2,785 | 3,722 |
| 07 | 652 | 3,128 | 823 | 1,347 |
| 08 | 1,599 | 2,690 | 980 | 1,565 |
| 09 | 1,539 | 3,092 | 673 | 976 |
llm-usage.db, one row per attempt
The writer tier is the shape of the second week: it came online on 5 September at 9,786 calls in a day and has run at 2,000 to 10,000 a day since. The interactive tiers never went above 7,410 in a day, and the fallback groups are what the router reached for when a primary was benched or throttled.
Nine providers and what each one did
Failure rate by provider
Share of attempts that returned an error, 2026-08-27 to 2026-09-09. Providers with fewer than 500 attempts omitted except Cloudflare.
Tokens served by provider
Prompt plus completion tokens on successful calls, in millions.
Latency by model
Median and 95th percentile seconds to a complete answer, models with at least 500 successful calls. Bar is the median; the tick is the 95th percentile.
glm-5.3-flash
z.ai · 3,809 calls
2.5 s · 61.3 s
gpt-oss-120b
cerebras · 2,419 calls
2.5 s · 18.5 s
minimax-m3:free
openrouter · 22,879 calls
4.8 s · 29.8 s
gpt-oss-120b
groq · 1,174 calls
7.4 s · 19.7 s
glm-5.3-flash
b.ai · 11,392 calls
8 s · 235 s
nemotron-3-super-120b-a12b
nvidia_nim · 3,864 calls
8.2 s · 78.1 s
deepseek-v4-flash
b.ai · 4,911 calls
10.7 s · 43.4 s
deepseek-v4-pro-0813
nvidia_nim · 1,617 calls
23.9 s · 111.8 s
minimax-m3
nvidia_nim · 1,483 calls
29.2 s · 172.6 s
kimi-k3
nvidia_nim · 677 calls
40.4 s · 218.9 s
deepseek-v4-flash-0731
nvidia_nim · 5,425 calls
50.8 s · 334.2 s
llm-usage.db, successful calls only
The medians are livable everywhere except NVIDIA. The 95th percentiles are the story: GLM on B.ai answers in 8 seconds half the time and 235 seconds one call in twenty, and DeepSeek-V4-Flash on NVIDIA reaches 334. Those tails are what the stream timeout and the reach-based chain order are for.
OpenRouter carried the volume. One model, MiniMax-M3 on the :free slug, took 24,702 calls at a 7.4% failure rate, a median of 4.8 seconds, and a 94% prompt-cache hit rate. None of its successful calls came back as reasoning with no answer. OpenRouter removed the slug on 2026-09-07, and the second free model I had wired there, GLM-5.2, failed 95.8% of the time from day one. OpenRouter's own limit on free models is 20 requests a minute per model, and the account also threw 402 insufficient-balance errors on free calls.
B.ai served the most tokens. It's an OpenAI-compatible reseller with a blockchain billing layer, and on a zero-balance account GLM-5.3-Flash and DeepSeek-V4-Flash answered anyway. GLM wrote the best long-form prose of anything in the free set and took 41.7 seconds on average to do it, with a 28.1% failure rate under load. B.ai paywalled DeepSeek-V4-Flash overnight on 2026-09-03: 339 of 350 calls fine one day, every call a 400 the next.
NVIDIA NIM has the biggest catalog and the smallest budget. Ten models were wired and all of them share one account-wide limit of about 40 requests a minute, so adding a model splits the budget instead of adding capacity. Median latency was 29 seconds, the 90th percentile 130 seconds, and the worst calls sat 400 to 478 seconds before the first token arrived. Kimi K3, the smartest model in the whole stack by index, answered 39 of 316 attempts one morning at 183 seconds each. NVIDIA retired MiniMax-M3 on 2026-09-09.
Cerebras is the fastest provider here at a 2.2-second median. It also billed $12.77 of prepaid credit against a tier I had filed as free, then returned 402 Payment Required on every call from 2026-09-05. All three Cerebras models are out of the config.
Z.ai is the one paid escape hatch I kept: a $5 top-up that runs GLM-5.3-Flash at a 6.9% failure rate and a 2.5-second median. It sits at the head of most fallback chains now because it's the same model as the B.ai primary, so a B.ai paywall degrades to the same quality instead of a weaker model.
Google Gemini gives 20 requests a day per model on the free tier. The 429 body says so in plain text. In a fallback chain that produced an 86.3% failure rate over 1,406 attempts.
Groq answered 1,175 of 1,176 calls. It was also a developer-tier account with a card on file, and it billed the moment Cerebras died and the fast tier fell through to it. I removed it and set a one-cent budget cap so a re-added entry cannot bill.
Cloudflare Workers AI allows 10,000 neurons a day and caps input plus output at 24,000 tokens combined, so a reasoning model with a 32,000-token budget fails before it starts. 70.9% failure. Its neurons are reserved for the fast tier.
Where the failures came from
Anatomy of 24,957 failed attempts
Every failure row in the ledger, grouped by what the provider or the router returned.
429 rate limit
high11,022 attempts (44.2%). Per-model minute limits on OpenRouter, the shared account budget on NVIDIA, the daily cap on Gemini.
Router bench
high8,745 attempts (35.0%) never reached a provider: the router refused because every deployment in the chain was cooling down from an earlier failure.
402 payment required
medium2,646 attempts (10.6%). Cerebras after its credit ran out, plus OpenRouter insufficient-balance errors on free slugs.
Timeouts and hangs
medium458 attempts hit the 408 cut. The real damage was the calls that streamed nothing for seven minutes before the cut existed.
404 and 410 model gone
medium636 attempts asked for a model ID the provider had deleted since the config was written.
5xx and bad requests
lowRoughly 1,400 attempts: provider 500s and 503s, a 24,000-token combined cap on Cloudflare, and a B.ai 400 on replayed reasoning fields.
llm-usage.db error_code and error_class
The second row is the router's own doing. More than a third of all failures were requests bouncing off deployments the router had already benched. LiteLLM's default cooldown after a few failures is an hour. The limits I was tripping reset in about a minute. So one blip demoted a chain to its weakest tail for the rest of the hour, and every request in that hour that wanted the benched model got an instant router error. Seven days of logs showed about 4,700 of 5,600 failures in that class. Cooldown went from 3,600 seconds to 300, then to 60 on the deployments with minute-level limits.
What changed and when
Eleven config changes and the log line behind each one
Each row is a change to the router, the research script or the harness, dated, with the measurement that forced it.
2026-08-27 · one endpoint and a log
Agents hit providers directly. No record of which model answered, how long it took or why it failed.
before
LiteLLM proxy with five tiers. One SQLite row per attempt, including failures. Every later change cites this table.
after
2026-08-27 · chains ordered by intelligence
Fallback order was whatever got wired first.
before
Every chain ordered smartest-first by the Artificial Analysis index, so a failover degrades one step, not to the floor.
after
2026-08-30 · then re-ordered by reach
Second-smartest deployment served 3 of 366 attempts over 7 days. Nemotron-Super reached 582 of 3,682 (15.8%).
before
Both demoted to chain tails. The deployment that answered 94% of its attempts moved to second.
after
2026-08-31 · stream timeout
NVIDIA calls hung 400 to 478 seconds to first token. The request timeout does not cut a slow stream.
before
stream_timeout 200 seconds. Legitimate reasoning maxed at 173 seconds, so 200 kills the hangs and nothing else. Request timeout 600 to 180.
after
2026-09-03 · paid copy of the primary
B.ai paywalled DeepSeek-V4-Flash overnight; the auto tier fell to a weaker model.
before
auto moved to GLM-5.3-Flash on B.ai, with the same GLM on Z.ai ($5 top-up) as first fallback so a paywall keeps quality.
after
2026-09-05 · writer chain fails closed
When the writer tier exhausted its chain it fell through to gpt-oss, which produced text that passed every gate and read like a machine.
before
The writer's fallback points at a group that does not exist. LiteLLM raises and the worker retries instead of shipping the weaker model's text.
after
2026-09-06 · retry on empty content
One reasoning-only answer failed the whole company folder as a bad response.
before
Research script retries up to three times and doubles max_tokens to 24,000 when finish_reason is length.
after
2026-09-06 · budget caps on cards
Cerebras consumed $12.77 of credit and Groq billed $1.03 in two days when the fast tier fell through.
before
Both removed. Groq capped at $0.01 per 30 days, DeepSeek direct capped at $10, so no chain can bill more than that if every free provider dies.
after
2026-09-06 · cooldown 3,600 to 300
About 4,700 of 5,600 failures in a week were requests bouncing off already-benched deployments.
before
300-second cooldown, 60 on minute-limited deployments. Router-bench failures dropped from the majority to a minority of the daily count.
after
2026-09-07 · reasoning fields stripped on replay
gpt-oss emits reasoning_content; Cerebras and B.ai 400 when the next turn replays it. Multi-turn chats stalled.
before
A proxy hook strips reasoning fields from replayed messages and reroutes any request carrying an image to the vision tier.
after
2026-09-09 · dead IDs pruned daily
Three OpenRouter and NVIDIA model IDs disappeared inside a week and stayed in the config.
before
alphawatch flags every wired ID missing from the live catalog and suggests the nearest replacement each morning.
after
The failure rate followed those changes. On 2026-08-28 it was 57.5%. By 2026-09-01 it was 2.7%, and 1.6% the day after. Then on 2026-09-05 the writer tier came online at 9,786 calls in a day, Cerebras stopped answering, and OpenRouter began killing free slugs; the daily rate went back to 45.2% and the interactive tiers had their worst day at 59%. By 2026-09-07 interactive calls were back to a 9% failure rate while the writer tier kept hammering at 25% to 50%. The two tiers share no chain, so the two numbers move independently.
Daily failure rate
Share of all attempts that failed, per day. The dashed line is the fourteen-day mean.
Table
| Day | Value |
|---|---|
| 27 | 31.5% |
| 28 | 57.5% |
| 29 | 21.1% |
| 30 | 27.6% |
| 31 | 16.2% |
| 01 | 2.7% |
| 02 | 1.6% |
| 03 | 7% |
| 04 | 28.8% |
| 05 | 45.2% |
| 06 | 33.9% |
| 07 | 29.3% |
| 08 | 29.7% |
| 09 | 18.4% |
llm-usage.db
Reasoning models eat budgets
Everything the models wrote in fourteen days came to 58 million tokens. 26 million of those were reasoning: 44.8% of the output was the model thinking rather than answering. GLM-5.3-Flash spent 2.18 reasoning tokens for every token of answer. DeepSeek-V4-Flash on NVIDIA spent 1.92.
The ratio sets the completion budget a call needs. The research script started with a 6,000-token completion budget and got empty answers back, because the model spent the whole budget thinking and hit the length limit before writing a word. At 12,000 tokens it truncated 44 of 98 three-file drafts. The working default is 16,000, doubling to 24,000 when the finish reason is length. Across the whole ledger, 603 successful calls came back as reasoning with no answer at all; 415 of those were DeepSeek-V4-Flash on NVIDIA, 7.8% of everything it returned. One call spent 5,058 reasoning tokens per token of output.
gpt-oss-120b has the opposite problem. It thinks briefly, writes fluently, and hyphenates with U+2011, the non-breaking hyphen. A search for that character finds its output wherever a fallback let it through.
What the research stage produced
2,487
three-file company dossiers written since 2026-08-27
files on disk, mtime
3,610
router calls to write them, 13.1% failed and retried
llm-usage.db, session research-deep
7.5K
tokens in per dossier call, 3.6K out, 43.8 seconds each
llm-usage.db
$0.04
list-price cost of the entire research stage
LiteLLM cost estimate
The tradeoff inside that stage is between the two models that did most of the work. MiniMax-M3 on OpenRouter wrote 2,230 dossiers at a 4% failure rate, 22 seconds a call, about 2,240 output tokens each. GLM-5.3-Flash on B.ai wrote 698 at a 15% failure rate, 116 seconds a call, about 8,470 output tokens each. GLM writes four times as much per call and reads better, at five times the latency and four times the failure rate. The fast model runs the first pass across two thousand companies, and the fifty worth a second look get a GLM call.
The reader agents that check the output run on the same router. Two independent readers score each draft and a flag only counts when both raise it on the same span, because single-reader flags turned out to be noise. That gate has caught drafts that passed every regex rule.
Free tier moves under you
Eight of the 27 deployments I wired on 2026-08-27 were gone or unreachable by 2026-09-09. OpenRouter removed both of its free slugs: MiniMax-M3 on 2026-09-07, and GLM-5.2, which had failed 95.8% of calls from the start. NVIDIA retired MiniMax-M3 on 2026-09-09. Cerebras put all three of its models behind a paywall on 2026-09-05. B.ai paywalled DeepSeek-V4-Flash on 2026-09-03. Groq billed a card on 2026-09-05 and 2026-09-06. Two new free models appeared on OpenRouter on 2026-09-09 and went to the ends of the chains until they have a week of log behind them.
Tracking that takes one scheduled script. alphawatch runs at 08:00, pulls each provider's model list, makes one real call per deployment, diffs the catalogs against the previous day, and writes a report naming every wired model ID the provider no longer serves, with the closest replacement in the catalog. The config carries a dated comment beside every chain change with the log line that caused it. Between the two, I can say why any deployment sits where it does.
What I'd set up on day one
1. One endpoint and one log, with failure rows. Put a proxy in front of every provider and write one row per attempt, including the attempts that fail. Each config change above cites a query on that table.
2. One tier per workload. Interactive, long-form writing, vision and fast requests each get their own model group. On 2026-09-07 the writer tier failed 25% of its calls and the interactive tiers failed 9%, because the two never share a chain.
3. Order chains by measured reach, with the intelligence index as the tiebreaker. After four days of log, compute the share of attempts each deployment answered. Two of the smartest models in this stack answered under 16% of theirs and moved to the tails.
4. Set cooldowns to the limit that trips. The per-model and per-account limits here reset within a minute. 300 seconds is the default now, 60 on the minute-limited deployments. At an hour, one 429 turned into an hour of instant router errors.
5. Set a stream timeout as well as a request timeout. The request timeout does not cut a stream that sends nothing. The longest legitimate reasoning in this log was 173 seconds, so the stream cut is 200.
6. Give reasoning models a 16,000-token completion budget, and retry with double on a length finish. At 6,000 the research script got empty answers. At 12,000 it truncated 44 of 98 drafts.
7. Cap spend on every provider that has a card on file. Groq and Cerebras both billed inside two weeks. Groq's cap is now $0.01 per 30 days; the paid DeepSeek escape hatch is $10.
8. Fund a paid copy of the primary model and put it first in the fallbacks. A $5 Z.ai balance runs the same GLM-5.3-Flash as the B.ai primary, so a B.ai paywall keeps the same model answering.
9. Let quality chains fail closed. If the last fallback is a model whose output you would reject, point the chain at a group that does not exist. LiteLLM raises and the worker retries.
10. Probe daily with one real call per deployment. Model lists kept showing IDs that returned 404 on a completion, and a health endpoint reports on the proxy, not the provider. alphawatch's one call per deployment is the check that caught every removal in this log.
If you run research or synthesis agents and want the router, the log schema and the probe set up against your own providers, book a call.