Compare LLMs by price, benchmark performance, and overall value, scored for agentic coding.
Dashboard: https://modelanalysis.xyz
-
Value rankings with a cost-sensitivity slider (
$P$ ) — watch the order change as price matters more or less - Charts — a cost-vs-performance scatter with a Pareto frontier, and a radar chart for side-by-side comparison
- Sortable table by value, performance, cost, LiveBench, or Artificial Analysis score
- Filters — search, provider pills, price range, minimum performance, open vs. closed weights, and complete vs. estimated benchmarks
- AI assistant that reads the live dashboard and can apply filters for you
- Dark and light themes, following your system preference
Built with vanilla HTML, CSS, and JavaScript plus Chart.js. No framework, no build step.
The dashboard fetches data.json, so it needs a web server rather than file://.
git clone https://github.com/isr431/model-analysis.git
cd model-analysis
python3 -m http.serverOpen http://localhost:8000.
Models live in data.json. A stored entry looks like:
{
"provider": "OpenAI",
"model": "gpt-oss-120b",
"inputPrice": 0.037,
"outputPrice": 0.17,
"cachePrice": 0.0037,
"livebench": 46.09,
"aaScore": 24,
"open": true
}Prices come from the OpenRouter models API; benchmark scores are hand-curated. So when adding a model, leave the three price fields out and let the sync script fill them in. It also updates the two other places the data is mirrored:
node scripts/update-prices.mjs # show the diff
node scripts/update-prices.mjs --write # apply itSet cachePrice or a benchmark to null when it isn't published; a model needs at least one of the two benchmark scores. AGENTS.md has the full workflow.
A built-in assistant, powered by OpenRouter, that answers questions about the current leaderboard, ranks and compares models, explains why a model is filtered out, and applies filters on request — "show me only open models under $1".
Open the chat panel, click Settings, and enter your OpenRouter API key. The key is stored in your browser and is only ever sent to OpenRouter.
Weighted for agentic coding, where an agent re-sends its whole conversation every turn, so the tokens it reads dwarf the tokens it writes and nearly all of them hit the prompt cache. Dosu measured 198 context tokens read per output token for Claude Code and 134:1 for Codex across 112 sessions; these weights use 165:1 at a 90% cache-hit rate, with cache reads billing at roughly a tenth of the input rate.
A model with no published cache price pays full input price for re-reads rather than being treated as free.
Normalizing by each benchmark's maximum pins both ceilings to 1 but leaves their spreads alone — and spread, not the ceiling, decides how much a benchmark moves the composite. Each weight therefore scales inversely to its benchmark's standard deviation,
A model listed on only one leaderboard has its missing score estimated by least-squares regression against the score it does have, fitted on the models that report both (
Both the regression and the spread weights are fitted on complete models only, so an estimate never feeds the numbers that produced it. Estimated models carry an EST badge and a muted ~72.93 cell, never win a "best" highlight, and can be hidden with the Benchmark Data filter.
Logarithmic, so a wide price range doesn't compress against the expensive end. Min and max are taken across every model rather than the filtered set, keeping the radar's shape stable as filters change. Costs are floored at $0.01.
A model sits on the frontier when no other model beats it on both price and performance at once.
MIT.