codex-island-model-catalog
September 8, 2026 · View on GitHub
Model prices for CodexIsland, published as a plain JSON file so a new model does not require an app release.
Endpoint: https://ericjypark.github.io/codex-island-model-catalog/v1/models.json
{
"schemaVersion": 1,
"generatedAt": "2026-07-26T04:16:19Z",
"source": "litellm + overrides",
"models": {
"claude-opus-4-8": {
"displayName": "Opus 4.8",
"inputPerMillion": 5,
"outputPerMillion": 25,
"cacheCreationPerMillion": 6.25,
"cacheReadPerMillion": 0.5
}
}
}
Prices are US dollars per million tokens. Keys are canonical model ids with
any 8-digit date suffix stripped (claude-haiku-4-5-20251001 →
claude-haiku-4-5), matching how the app normalizes the ids it reads out of
local CLI session logs. Ids carrying a dashed date (gpt-5-2025-08-07) are
published as-is, because the app does not strip those either — collapsing them
would make the app look up an id this file never publishes and silently price
it at $0.
schemaVersion is 1 and will stay 1. A breaking change to this shape ships at
/v2/models.json so installed apps keep working.
How a price gets here
A bot refreshes this file every six hours. You do not need its source to check a value — both inputs are public and the rules are below.
- Fetch LiteLLM's price table.
- Keep entries whose
modeischatorresponses, whose id contains no/(that dropsazure/,bedrock/,vertex_ai/re-listings of the same model), and whose id matches a pattern inconfig.json. Thegpt-[0-9]*pattern covers numbered GPT generations, including GPT-6 and future generations, so a major-version launch needs no filter update. - Convert per-token prices to per-million by multiplying by 1,000,000, then
round to 8 decimal places. The rounding exists so a price reads as
0.2rather than0.19999999999999998— binary floating point leaves residue that would otherwise be published verbatim into a file meant to be read. - Where LiteLLM lists no cache-write rate, use the input rate: OpenAI bills cache writes at the standard input rate. Where it lists no cache-read rate, use 0.
- Apply
overrides.jsonon top, field by field. - Generate
displayNamefrom the id unless an override supplies one.
Correcting a price
Open a PR against overrides.json. An override beats
whatever upstream says, and only the fields you list are replaced:
{ "gpt-5.6": { "cacheCreationPerMillion": 6.25 } }
An override can also introduce a model LiteLLM does not list at all — supply
all four rates and a displayName in that case.
The entries there now are deliberate: OpenAI began billing cache writes at 1.25× input starting with 5.6, and LiteLLM lists no cache-read rate for the pro tier because those models have no prompt caching.
Why you can trust the numbers
The app's release cycle used to be a human review gate on every price change. This file removes that gate, so the bot carries its own:
- If the merged model count falls below half of what is already published, the whole run is rejected and nothing is committed.
- A negative rate, or any rate above $1000 per million, is rejected.
- A rate that moved by 10× or more from its published value is rejected.
- A rejected model keeps its previously published value rather than disappearing. A missing model prices to $0 in the app, which is the failure this whole arrangement exists to prevent.
- Models are never removed. If LiteLLM drops an entry, the published value stays until a human removes it deliberately.
- The file is committed only when a price actually changes, so
generatedAtmarks the last real change rather than the last time the bot ran.
Override values deliberately skip the absolute ceiling — that is what lets a genuinely expensive model exceed it — so review of the PR is the control on those. Negative values are still rejected.
Repository contents
| Path | What it is |
|---|---|
v1/models.json | Generated. The only file the app reads. |
overrides.json | Hand-maintained. Beats LiteLLM. Open a PR here. |
config.json | Which model id patterns are tracked. |