PRICE_PER_MTOK (src/cli/analyzeSession.ts:50) is keyed by model family only (priceFamily() → parseModelString().family); the model version is ignored. Current models are priced very differently from the table, so est. cost / --breakdown are wrong for most recent sessions. Tests pin numbers derived from the same table, so they cannot catch it.
Расхождения (USD / MTok: input / output / cache read)
| family |
в таблице |
реально |
| opus |
15 / 75 / 1.5 |
верно только для Opus ≤4.1. Opus 4.6–5: 5 / 25; Opus 5.5: 4 / 20 / 0.20 |
| sonnet |
3 / 15 / 0.3 |
верно для 4.x. Sonnet 5 / 5.5: 2 / 10 / 0.20 |
| haiku |
1 / 5 / 0.1 |
верно для 4.5. Haiku 5.5: 0.10 / 0.50 (промпт ≤100K; выше — 0.50 / 2.50) |
| fable |
— |
Fable 5 / 5.1: 10 / 50, cache read 0.25 — сейчас unpriced → costPartial |
Дополнительно:
- Cache read неявно = 0.1× input, но у Opus 5.5 это 0.05×, у Fable 5.1 — 0.025×. Нужна явная колонка, а не множитель.
- Cache write считается только по 5-минутной ставке (1.25× input). 1-часовая запись стоит 2×, а
UsageMetadata (src/main/types/jsonl.ts:82) не читает usage.cache_creation.ephemeral_5m_input_tokens / ephemeral_1h_input_tokens — разбивка теряется при парсинге.
- Тесты (
test/main/cli/analyzeSession.test.ts, ~352–484, напр. toBeCloseTo(0.00087) для sonnet) сверяют результат с той же таблицей.
Что сделать
- Таблица цен по
(family, major, minor) с явными колонками: input, output, cache read, cache write 5m, cache write 1h + комментарий с датой сверки и ссылкой на прайс Anthropic.
- Версию брать из
parseModelString (src/shared/utils/modelParser.ts уже отдаёт major/minor); fallback для не-Claude моделей (glm) сохранить.
- Добавить
cache_creation.{ephemeral_5m_input_tokens, ephemeral_1h_input_tokens} в UsageMetadata и парсер; при отсутствии разбивки — считать весь cache_creation_input_tokens как 5m.
- Учесть ступенчатую цену Haiku 5.5 (>100K промпта) или явно задокументировать упрощение.
- Тесты: эталонные значения выписаны вручную из официального прайса, а не вычислены из таблицы.
Acceptance
PRICE_PER_MTOK(src/cli/analyzeSession.ts:50) is keyed by model family only (priceFamily()→parseModelString().family); the model version is ignored. Current models are priced very differently from the table, soest. cost/--breakdownare wrong for most recent sessions. Tests pin numbers derived from the same table, so they cannot catch it.Расхождения (USD / MTok: input / output / cache read)
costPartialДополнительно:
UsageMetadata(src/main/types/jsonl.ts:82) не читаетusage.cache_creation.ephemeral_5m_input_tokens/ephemeral_1h_input_tokens— разбивка теряется при парсинге.test/main/cli/analyzeSession.test.ts, ~352–484, напр.toBeCloseTo(0.00087)для sonnet) сверяют результат с той же таблицей.Что сделать
(family, major, minor)с явными колонками: input, output, cache read, cache write 5m, cache write 1h + комментарий с датой сверки и ссылкой на прайс Anthropic.parseModelString(src/shared/utils/modelParser.tsуже отдаёт major/minor); fallback для не-Claude моделей (glm) сохранить.cache_creation.{ephemeral_5m_input_tokens, ephemeral_1h_input_tokens}вUsageMetadataи парсер; при отсутствии разбивки — считать весьcache_creation_input_tokensкак 5m.Acceptance
est. costдля Opus 4.8 / Opus 5.5 / Sonnet 5.5 / Haiku 5.5 / Fable 5.1 соответствует прайсуpnpm typecheck && pnpm testзелёные