Very cheap is basically free: pricing a coding model per step
A free model id in my config silently had no hosts, and the real price of a cheap coding model depends on which hosts you will accept. The per-step arithmetic, and why I want a price ceiling instead of a free switch.
Mullet’s ladder starts with free models. On 1 November I found that my free rung had nothing behind it, and Mullet had given no warning. While I was checking that, I worked out what the cheap rung costs per step. The answer is small enough that I question where I draw the line between free and paid.
A free model with no hosts
My config named a free model: nvidia/nemotron-3-super-120b-a12b:free. OpenRouter’s endpoint API still answered HTTP 200 for that id, but it listed 0 endpoints. The live model list had 14 free-suffixed ids, and this was not one of them. The paid id of the same model had 3 hosts.
So the id resolved and there was nothing behind it: the free rung had no host to send to, and Mullet gave no warning. Check model ids against the live list, not against a config that has not complained.
A caution on free endpoints: they may log prompts. Mullet uses them only on public repositories.
What a cheap host costs
GLM-5.3-Flash on OpenRouter has 40 hosts. The cheapest is $0.0285 per million tokens in and $0.0923 out. The next lists $0.03 and $0.16. Both of those are 4-bit (fp4) hosts, which Mullet leaves out by default because 4-bit copies code noticeably worse (my judgement).
The cheapest 8-bit hosts, per million tokens in and out:
- $0.042 and $0.30
- $0.075 and $0.25
- $0.08 and $0.50
- $0.084 and $0.28
- $0.0885 and $0.295
The vendor’s own host (Z.AI) is $0.15 and $0.50, and so are several other 8-bit hosts.
On its paid OpenRouter rungs Mullet also asks only for hosts that do not keep or train on prompts. The price list does not show that policy, so a host that looks cheap may not qualify. The free rung is the exception, which is why it only runs on public repositories.
A step, priced
My Strata run used 1.14 million tokens in and 30 thousand out. Input is about 38 times output (arithmetic), so the input price matters most.
At the cheapest 8-bit host a step that size comes to about $0.057 (1.14 times 0.042, plus 0.03 times 0.30). At the vendor’s own prices it is about $0.19 (1.14 times 0.15, plus 0.03 times 0.50). So $0.06 to $0.19 across the 8-bit hosts listed. At the cheapest 4-bit host it would be about $0.035.
All of that is my arithmetic from listed prices on 1 November. It is not billed. I made no paid call, and prices change. It also prices every input token at the full rate, though the ledger counts 1,038,284 of those 1,141,486 as cache reads, and the listed hosts show a cache-read price that is lower at some of them, so a real bill could be lower.
A small bug
The same Strata run showed up in a Mullet report as “$2.52 estimated” for a model that costs me nothing per token. Mullet did not recognise the provider as local, so it priced the tokens at a fallback of $2 in and $8 out per million. The sum matches: 1.14 times 2 plus 0.03 times 8 is 2.52 (arithmetic).
Mullet 2.5.0 adds a setting, ladder.local_providers. Listing strata there makes a model from that provider count as the local rung, and local attempts are reported as costing nothing. The ledger rows for that earlier run still say $2.52.
What I want next
Mullet’s ladder treats free and paid as two kinds of rung. At these prices the gap between them is about six to nineteen cents a step (my arithmetic above), while a free endpoint can cost something else: it may log prompts.
What I want is for the user to set a price ceiling, per million tokens, and for “free” to mean at or below it. Zero would mean free only. Budgets differ, so the ceiling should be a setting, not a decision made for everyone. It is not built yet.
The code is at https://github.com/tomgould/mullet-public.
More on Mullet
-
Where Mullet goes next
Mullet 2.5.0 is out. What I plan next: a guard that checks a step fits a model’s window, a price ceiling instead of a free switch, more settings and…
-
Eight rules from a game framework’s agent prompts, for web and print design
On 1 November I read the agent prompts of VibeGame, a framework that builds 2D web games, and kept the eight techniques that carry over to web and…
-
What I tried and binned, and what each one cost
Three local-model options I stopped using, with what each cost and the verdict: a 25 GB model that timed out in a job, a Blackwell-only fork ruled…
-
When your plan has no five-hour limit
Mullet 2.5.0 copes with a Claude plan whose usage data has no five-hour window: the HUD drops the five-hour figures and the budget guard paces on…
-
Why a ‘mechanical’ step failed the risk gate
Mullet’s risk gate fails a step labelled mechanical when its diff changes a literal or a call. A small prompt edit that has to change both failed it…
-
Thirty-four lines of shell to keep a local model alive
Strata’s server belongs to its launcher, so a plain systemd unit does not work. A one-shot unit plus a small watchdog on a timer had the model…
-
Half a 125-billion-parameter coding model, running on a 12 GB laptop GPU
On 1 November a pruned, quantised coding model ran on my laptop’s 12 GB GPU, split across VRAM, RAM and the CPU. What it is, the speeds I can and…
-
Two local-model failures that point at the context window
On 1 November a local model failed one Mullet step and had two attempts aborted on another, and both point at the context window. What the harness…
Featured projects
-
Solar Calendar
A calendar of 13 identical 28-day months, with each year starting on the first Monday on or after the spring equinox.
-
Where Should I Live
Rank cities around the world by what you’d keep after tax, what a month costs, which visas you can get and how each place fits the way you live.
-
Apple News API
A PHP client for publishing articles to Apple News, with a document builder for the whole Apple News Format.
More writing
-
A Markdown version of every page, for AI agents
Why every page on this site now has a Markdown version for coding agents, the three ways an agent finds it, what goes into it, and how each version…
-
A TV remote from the command line
Pairing a Linux computer with a Google TV over the protocol phone remotes use, what the six-character code on the screen really checks, and why a…
-
The packages I kept on a Google TV
The other half of decluttering a TCL Google TV: a keep-list of 35 packages that debloat lists remove or that only look disposable, how each one got…
-
Letting an agent drive the TV
The rules a coding agent worked under while it changed a TV we were still watching: only changes that can be undone, small batches with a person…