Company research on free LLMs: 2.6 billion tokens for $23.85 in 14 days

Fourteen days of router logs from a research workload running on nine free or near-free LLM providers: 83,497 requests, 2.6 billion tokens, a 29.9% failure rate, and the eleven changes that made it usable.

ai-infrastructurellm-routingfree-modelsresearch-automation

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.

interactive (auto, smart, deep, vision, fast)long-form writerfallback groupsfailed
05,00010,00015,00020,0002728293031010203040506070809
Table
Dayinteractive (auto, smart, deep, vision, fast)long-form writerfallback groupsfailed
272,74202,2621,576
282,21003,9783,561
293,02601,034856
303,85401,3311,431
314,6040315796
017,413042203
023,36802055
031,7410245139
043,00001,6051,327
051,9199,7864,8567,497
061,9776,2182,7853,722
076523,1288231,347
081,5992,6909801,565
091,5393,092673976

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.

Groq (1,176 calls)0.1%
Z.ai (2,965)6.9%
OpenRouter (27,435)15.8%
B.ai (21,306)26.0%
NVIDIA NIM (20,855)38.2%
Cerebras (5,073)51.1%
Cloudflare Workers AI (601)70.9%
Google Gemini (1,406)86.3%

Tokens served by provider

Prompt plus completion tokens on successful calls, in millions.

B.ai1,133M
OpenRouter968M
NVIDIA NIM457M
Cerebras35M
Z.ai10M
Groq9M
Google Gemini1M
Cloudflare0.3M

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.

median95th 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

high

11,022 attempts (44.2%). Per-model minute limits on OpenRouter, the shared account budget on NVIDIA, the daily cap on Gemini.

Router bench

high

8,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

medium

2,646 attempts (10.6%). Cerebras after its credit ran out, plus OpenRouter insufficient-balance errors on free slugs.

Timeouts and hangs

medium

458 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

medium

636 attempts asked for a model ID the provider had deleted since the config was written.

5xx and bad requests

low

Roughly 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.

0%15%30%45%60%14-day mean 29.9%2757.5%282930312.7%0102030445.2%0506070809
Table
DayValue
2731.5%
2857.5%
2921.1%
3027.6%
3116.2%
012.7%
021.6%
037%
0428.8%
0545.2%
0633.9%
0729.3%
0829.7%
0918.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.

Building something like this?

30 minutes, no pitch.

More writing