Problem
The /usage table currently shows:
Tokens = input + output
↑In = input
Cache = cacheRead + cacheWrite
This is mechanically correct, but the ↑In column is misleading across providers.
Why it looks wrong
For Anthropic, prompt caching is reported roughly as:
input = small non-cached remainder
cacheWrite = new prompt tokens entering cache
cacheRead = prompt tokens served from cache
For OpenAI/Codex, input tends to contain much more of the fresh prompt tail, and cacheWrite is often 0 in practice.
That makes the current UI look like:
- Anthropic: tiny
↑In, huge ↓Out
- OpenAI: large
↑In, moderate ↓Out
Even when the underlying prompt behavior is more similar.
What to decide
We should decide what ↑In is supposed to mean:
- raw uncached input only (
input) — current behavior
- fresh input sent this turn (
input + cacheWrite)
- total prompt seen by the model (
input + cacheRead + cacheWrite)
- split the concept into separate columns / labels
Constraints
cacheRead should not be folded into Tokens, because that double-counts repeated cache hits over time.
cacheWrite is new input and may belong in ↑In, depending on the intended semantics.
- Labels should make cross-provider comparisons intuitive.
Suggested next step
Review a few real session examples from Anthropic and OpenAI/Codex, then choose the least surprising display model and update column labels/tooltips/help text accordingly.
Problem
The
/usagetable currently shows:Tokens = input + output↑In = inputCache = cacheRead + cacheWriteThis is mechanically correct, but the
↑Incolumn is misleading across providers.Why it looks wrong
For Anthropic, prompt caching is reported roughly as:
input= small non-cached remaindercacheWrite= new prompt tokens entering cachecacheRead= prompt tokens served from cacheFor OpenAI/Codex,
inputtends to contain much more of the fresh prompt tail, andcacheWriteis often 0 in practice.That makes the current UI look like:
↑In, huge↓Out↑In, moderate↓OutEven when the underlying prompt behavior is more similar.
What to decide
We should decide what
↑Inis supposed to mean:input) — current behaviorinput + cacheWrite)input + cacheRead + cacheWrite)Constraints
cacheReadshould not be folded intoTokens, because that double-counts repeated cache hits over time.cacheWriteis new input and may belong in↑In, depending on the intended semantics.Suggested next step
Review a few real session examples from Anthropic and OpenAI/Codex, then choose the least surprising display model and update column labels/tooltips/help text accordingly.