Context window, tokens и счет: измерено
40-ходовый диалог стоит 22× своей длины в input tokens. Caching снижает это на 68 %, timestamp не там добавляет 20 %.
На этой странице
Вот сорок ходов разговора с поддержкой, посчитанные ход за ходом. В нем нет ничего необычного: разработчик спрашивает об API, assistant отвечает одним-двумя абзацами. Весь обмен занимает 5 090 tokens текста — примерно восемь страниц.
| ход | prompt tokens | новый текст | output | стоимость этого хода | накопительный итог |
|---|---|---|---|---|---|
| 1 | 213 | 18 | 183 | $0.002622 | $0.002622 |
| 5 | 892 | 14 | 123 | $0.003260 | $0.014354 |
| 10 | 1,656 | 19 | 114 | $0.004680 | $0.035530 |
| 20 | 2,868 | 18 | 103 | $0.006972 | $0.094426 |
| 30 | 3,941 | 20 | 99 | $0.009070 | $0.174170 |
| 40 | 4,947 | 17 | 142 | $0.011598 | $0.274386 |
Читайте второй и третий столбцы вместе. На 40-м ходе пользователь ввел семнадцать tokens, а счет выставили за 4 947. Вопрос не был сложнее первого; он был короче. Изменилось то, что запрос снова нес с собой весь разговор — уже в сороковой раз.
Всего input tokens, выставленных к оплате за эти сорок вызовов: 112 617. Длина разговора — 5 090 tokens. Вы заплатили за него двадцать два раза.
Эта глава о том, почему так происходит, как это называется в счетах разных провайдеров и с какими из пяти вещей, за которые вы платите, можно что-то сделать.
Показать детали
Что этой главе нужно из части II.
- Глава 7 построила tokenizer. token здесь — та же единица, теперь с ценой.
- Глава 9 вывела self-attention и ее стоимость в блоке с асимптотической нотацией. Из-за этой стоимости вообще существует предел, поэтому здесь мы ссылаемся на нее, а не объясняем заново.
- Глава 13 измерила prefill относительно decode и посчитала, сколько занимает KV cache. Именно эти две фазы на самом деле покупают столбцы input и output выше.
Все остальное — TypeScript, потому что это учет удаленного вызова, а не математика модели.
The window is not memory
Ссылка на раздел: The window is not memoryСамое дорогое заблуждение в этой области — что модель помнит разговор.
Не помнит, и механизм из главы 13 точно объясняет почему. Состояние transformer во время генерации — это KV cache: keys и values, вычисленные для каждого token в последовательности. Этот cache живет только в течение одного запроса. Когда запрос заканчивается, процесс, который его держал, свободен обслуживать кого-то еще, а cache исчезает. На другой стороне нет хранилища на пользователя и нет сессии.
Поэтому следующий запрос должен прийти со всем, что модель должна знать, а модель заново строит это состояние, выполняя forward pass по всему prompt, прежде чем выпустить хотя бы один новый token. Глава 15 называла prompt «всем состоянием». Физическая причина такая: prompt — это полное состояние, потому что после вызова больше ничего не сохраняется.
context window — это максимальная длина этого prompt плюс его ответ. Это потолок объема состояния, которое вы можете восстановить, а не контейнер, который что-то хранит между запросами. Называть его «памятью модели» — значит перепутать направление причинности: вы не заполняете память, вы платите за ее повторное восстановление.
Вот откуда берется двадцать два. Ход несет все предыдущих ходов, поэтому общий input за разговор из ходов — это сумма растущего ряда, то есть квадратичная величина:
где — system prompt, а — история на ходе . Подгонка измеренного накопительного input к на сорока ходах дает , что предсказывает 113 645 tokens на 40-м ходе против 112 617 измеренных. Квадратичный член доминирует, а линейный член — это то, что пользователь действительно набрал.
Главный вывод этой главы: ваш счет растет с квадратом длины разговора, а не с последним вопросом. Те же сорок вопросов без какой-либо истории стоили бы $0.066036. С сохранением истории они стоили $0.274386. История умножила счет на 4,2 и продолжит умножать, потому что множитель — длина разговора.
Почему вообще есть предел
Ссылка на раздел: Почему вообще есть пределОкно конечно по двум причинам, которые тянут в одну сторону. Первая — из главы 9: attention сравнивает каждый token с каждым другим token, поэтому работа этого слоя растет с квадратом длины последовательности. Вторая — память: KV cache растет линейно с длиной последовательности, и глава 13 уже сделала эту арифметику — на длинных последовательностях он больше весов.
Обе границы пытались сдвинуть, но ни одну не убрали. FlashAttention1 переорганизует вычисление так, чтобы гораздо меньше читать из высокоскоростной памяти и писать в нее; это делает длинные последовательности практичными, не меняя асимптотическую стоимость. Position Interpolation2 и YaRN3 расширяют usable window обученной модели, масштабируя positional encodings из главы 9 вместо переобучения. Вместе они объясняют, почему окна выросли с 2K до 1M за пять лет.
Чего они не сделали — так это не сделали длинные contexts бесплатными. Они подняли потолок и смягчили наклон. Наклон все еще есть, и именно его измеряют тарифные уровни далее в этой главе.
Five buckets, not two
Ссылка на раздел: Five buckets, not twoПочти каждый калькулятор стоимости в интернете моделирует API-вызов как input tokens, умноженные на цену input, плюс output tokens, умноженные на цену output. В 2023 году это было верно. Сейчас это неверно так, что счета могут отличаться в два раза и больше в обе стороны.
Есть пять оплачиваемых категорий tokens:
| bucket | что это | типичная цена относительно input |
|---|---|---|
| uncached input | prompt tokens, которые модель должна была обработать заново | 1× |
| cache read | prompt tokens, отданные из сохраненного prefix | 0.1× |
| cache write | prompt tokens, сохраненные в cache в этом вызове | 1.25× to 2× |
| output | tokens, которые модель сгенерировала и отправила вам | 5× to 6× |
| reasoning | tokens, которые модель сгенерировала и не отправила вам | ставка output |
Трех из этих пяти еще два года назад не было отдельными строками, а две строки cache — те, в которых чаще всего ошибаются, потому что cache write стоит дороже обычного input, а не дешевле. Вы платите премию за хранение чего-то, чтобы потом платить со скидкой за чтение обратно, и выгодна ли эта сделка, целиком зависит от того, сколько раз вы это прочитаете.
Bucket reasoning — из главы 12, теперь с ценой, и у него есть деталь, которую стоит сказать прямо: в документации Google сказано, что pricing «основан на полном количестве thought tokens, которые модели нужно сгенерировать, хотя через API выводится только summary».4 Вам выставляют счет за tokens, которые вам никогда не передают. Это единственный bucket, содержимое которого вы не можете посчитать, проверить или увидеть.
Тот же вызов, три диалекта
Ссылка на раздел: Тот же вызов, три диалектаТеперь часть, которая делает это задачей нормализации, а не умножения. Каждый провайдер сообщает эти buckets под разными именами, и — вот ловушка — двое из них используют одно и то же слово для двух разных величин.
Возьмем один вызов: 4 837 tokens прочитаны из cache, 110 свежих, 142 видимых output tokens, 300 reasoning tokens.
// OpenAI-compatible
{ "usage": { "prompt_tokens": 4947,
"prompt_tokens_details": { "cached_tokens": 4837 },
"completion_tokens": 442,
"completion_tokens_details": { "reasoning_tokens": 300 } } }
// Anthropic
{ "usage": { "input_tokens": 110,
"cache_read_input_tokens": 4837,
"cache_creation_input_tokens": 0,
"output_tokens": 442 } }
// Gemini
{ "usageMetadata": { "promptTokenCount": 4947,
"cachedContentTokenCount": 4837,
"candidatesTokenCount": 142,
"thoughtsTokenCount": 300 } }Посмотрите на prompt_tokens: 4947 и input_tokens: 110. Оба поля — это количество input tokens для одного и того же prompt. У OpenAI оно включает cached tokens; у Anthropic — исключает их: документация явно задает тождество total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens.5 Anthropic input_tokens означает «tokens после вашей последней cache breakpoint».
И посмотрите на output. OpenAI и Anthropic оба сообщают 442, куда уже входят 300 reasoning tokens. Gemini сообщает 142 и кладет 300 в отдельное поле. Глава 12 отметила это как несовместимость двух способов считать одну и ту же работу; здесь видно, сколько это стоит.
Нормализатор — это тридцать строк, и он не optional:
export interface Usage {
promptTokens?: number; // input, NOT cached
cachedInputTokens?: number; // read from cache
cacheWriteTokens?: number; // written to cache on this call
completionTokens?: number; // output
reasoningTokens?: number; // billed apart from output (Gemini only)
}
const num = (v: unknown) => (typeof v === "number" && isFinite(v) ? v : 0);
export const fromOpenAI = (raw: any): Usage => {
const u = raw.usage ?? {}, d = u.prompt_tokens_details ?? {};
const cached = num(d.cached_tokens), write = num(d.cache_write_tokens);
return {
promptTokens: Math.max(0, num(u.prompt_tokens) - cached - write),
cachedInputTokens: cached,
cacheWriteTokens: write,
completionTokens: num(u.completion_tokens), // reasoning already inside
reasoningTokens: 0,
};
};
export const fromAnthropic = (raw: any): Usage => {
const u = raw.usage ?? {};
return {
promptTokens: num(u.input_tokens), // already excludes cache
cachedInputTokens: num(u.cache_read_input_tokens),
cacheWriteTokens: num(u.cache_creation_input_tokens),
completionTokens: num(u.output_tokens),
reasoningTokens: 0,
};
};
export const fromGemini = (raw: any): Usage => {
const m = raw.usageMetadata ?? {}, cached = num(m.cachedContentTokenCount);
return {
promptTokens: Math.max(0, num(m.promptTokenCount) - cached),
cachedInputTokens: cached,
cacheWriteTokens: 0,
completionTokens: num(m.candidatesTokenCount), // EXCLUDES thinking
reasoningTokens: num(m.thoughtsTokenCount), // billed at output rate
};
};Пропустите три payload выше через три reader, и все три дадут один и тот же Usage, а значит одно и то же число: $0.006491. Именно ради этого согласия и пишется слой.
Если ошибиться, вот цена на том же вызове:
| ошибка | выставлено | погрешность |
|---|---|---|
считать cached_tokens дополнительным к prompt_tokens | $0.016165 | 2.49× — вы берете плату за prompt дважды |
| считать cache reads бесплатными вместо 0.1× | $0.005524 | 0.85× — вы теряете 15 % |
прочитать candidatesTokenCount и проигнорировать thoughtsTokenCount | $0.002891 | 55 % вызова исчезает |
Третья ошибка опасна тем, что молча дает хорошие новости. Dashboard показывает, что reasoning model стоит меньше половины реальной цены, и нигде ничего не падает с ошибкой.
Вычисляем стоимость
Ссылка на раздел: Вычисляем стоимостьКогда buckets нормализованы, cost function короткая. Единственная неочевидная часть — поиск tier, который объясняет следующий раздел:
export interface Tier { maxPromptTokens: number | null; price: number }
export interface Pricing {
input: Tier[]; output: Tier[];
cachedInput?: Tier[]; cacheWrite?: Tier[]; reasoning?: Tier[];
}
const tierPrice = (tiers: Tier[] | undefined, contextSize: number, fallback?: Tier[]) => {
const table = tiers ?? fallback;
if (!table?.length) return 0;
const sorted = [...table].sort(
(a, b) => (a.maxPromptTokens ?? Infinity) - (b.maxPromptTokens ?? Infinity));
for (const t of sorted)
if (t.maxPromptTokens === null || contextSize <= t.maxPromptTokens) return t.price;
return sorted[sorted.length - 1].price;
};
export function computeCost(pricing: Pricing, usage: Usage): number {
const fresh = usage.promptTokens ?? 0;
const read = usage.cachedInputTokens ?? 0;
const write = usage.cacheWriteTokens ?? 0;
const out = usage.completionTokens ?? 0;
const think = usage.reasoningTokens ?? 0;
const contextSize = fresh + read + write; // the tier depends on the WHOLE prompt
return fresh * tierPrice(pricing.input, contextSize)
+ read * tierPrice(pricing.cachedInput, contextSize, pricing.input)
+ write * tierPrice(pricing.cacheWrite, contextSize, pricing.input)
+ out * tierPrice(pricing.output, contextSize)
+ think * tierPrice(pricing.reasoning, contextSize, pricing.output);
}Два проектных решения здесь стоит защитить. Fallbacks — cache prices падают обратно к input, reasoning к output — кодируют смысл отсутствующей таблицы: reasoning tokens в Gemini оплачиваются по ставке output, поэтому отсутствующая цена reasoning не равна нулю, она равна цене output. А contextSize суммирует все три input buckets, а не только свежие, потому что tier выбирается по длине prompt, а не по тому, за какую его часть с вас взяли полную цену.
Prompt caching, и сколько стоит запись
Ссылка на раздел: Prompt caching, и сколько стоит записьprompt cache хранит вычисленное состояние модели для prefix вашего prompt, чтобы последующий запрос с тем же prefix пропустил повторное вычисление. Из слова «prefix» следуют четыре свойства, и все четыре удивляют людей.
Это prefix, а не множество
Ссылка на раздел: Это prefix, а не множествоCache сопоставляет от начала отрендеренного prompt вперед и останавливается на первом отличающемся byte. Нет частичного зачета за контент, который появляется позже в другом порядке. OpenAI формулирует прямо: «cache reuse requires the entire rendered prefix to match».6
Есть минимальная длина
Ссылка на раздел: Есть минимальная длинаНиже нее ничего не кэшируется, и ошибка не возвращается. У OpenAI минимум — 1 024 tokens для GPT-5.6 и новее и 2 048 для более старых моделей. У Anthropic он колеблется от 512 до 4 096 в зависимости от модели — 1 024 для Claude Sonnet 4.5, 4 096 для Claude Haiku 4.5. Если оба cache fields вернулись нулями, обычно причина в этом.
Запись стоит дороже чтения и дороже отсутствия caching
Ссылка на раздел: Запись стоит дороже чтения и дороже отсутствия cachingУ OpenAI и Anthropic cache write стоит 1.25× ставки uncached input для краткоживущего cache, а одночасовой cache Anthropic — 2×. Read стоит 0.1×. Google не берет плату за запись, но сдает storage в аренду: $4.50 за миллион tokens в час на Gemini 2.5 Pro.
Он истекает и живет на одной машине
Ссылка на раздел: Он истекает и живет на одной машинеЗапись Anthropic по умолчанию живет пять минут, бесплатно обновляясь при каждом hit. У OpenAI — минимум тридцать минут после последней записи или reuse. И OpenAI отмечает, что cached states живут на отдельных машинах, поэтому запрос попадает в cache только если routed к машине, на которой хранится entry — именно на это влияет prompt_cache_key, не гарантируя результата.
Точку безубыточности достаточно легко держать в голове, и документация OpenAI делает арифметику: записать prefix один раз и переиспользовать его один раз стоит 1.35× обычной стоимости input против 2× за двукратную обработку без cache; на десяти запросах одна запись и девять чтений стоят 2.15× против 10×. Одно reuse окупает запись. У Anthropic результат тот же: одно чтение для пятиминутного cache, два — для одночасового.
Теперь снова сорок ходов разговора, с включенным caching и стабильным prefix:
| uncached input | cache reads | cache writes | total | |
|---|---|---|---|---|
| no cache | 112,617 | — | — | $0.274386 |
| caching | 2,887 | 104,783 | 4,947 | $0.088250 |
На шестьдесят восемь процентов дешевле, и три числа в этой таблице заслуживают внимания.
Cache не включается до 6-го хода. Prompt не достигает 1 024 tokens до этого момента, поэтому первые пять ходов оплачиваются ровно как раньше — а шестой оплачивается хуже, с write premium 1.25\u00d7, потому что именно этот ход заполняет cache. Первое read приходит на 7-м ходе. 2 887 uncached tokens в таблице — это арифметика: стоимость пяти ходов, а не шести. Caching — скидка на длинные prompts, и короткий разговор ничего от него не получает.
Write premium — $0.002474, то есть 2,8 % cached bill. Каждый ход записывает свой новый tail, сорок раз, и вся премия за запись — погрешность округления по сравнению с тем, что сэкономили reads. Плату за запись стоит точно понимать, чтобы перестать о ней беспокоиться.
Только 2 887 tokens были оплачены по полной цене input из 112 617. Так выглядит работающий cache: почти все — read.
Порядок prompt решает, произойдет ли вообще что-то из этого
Ссылка на раздел: Порядок prompt решает, произойдет ли вообще что-то из этогоВот сбой, который стоит реальных денег, и это bug в одну строку.
Поместите в начало prompt что-то, что меняется при каждом вызове, — timestamp, request id, имя пользователя, строку «сегодня», свежедоставленный документ — и prefix отличается с первого byte. Ничего не совпадает. Каждый вызов — miss. И поскольку каждый вызов предъявляет новый prefix, каждый вызов также пишет.
Тот же разговор, те же сорок ходов, caching включен, но с timestamp для каждого вызова вверху system prompt:
| total | versus | |
|---|---|---|
| no caching at all | $0.274386 | — |
| caching, stable prefix | $0.088250 | −67.8 % |
| caching, volatile prefix | $0.329251 | +20.0 % |
Включение prompt caching сделало разговор на двадцать процентов дороже, чем если бы его не включали. Вы заплатили write premium 1.25× за 109 730 tokens и не прочитали обратно ничего. Нет ошибки, нет предупреждения, feature включена.
Итак, правило — весь prompt caching в одну строку: стабильный контент впереди, переменный позади. Сначала system instructions, tool definitions и reference material; timestamp, user identity и текущий вопрос — в конце. Anthropic делает иерархию явной: cache следует tools → system → messages, и изменение на любом уровне инвалидирует этот уровень и все после него, так что правка одного tool description инвалидирует весь cache.5
Два последствия, на которых часто спотыкаются. Изменение того, какие tools enabled, меняет tool definitions, поэтому feature flag, добавляющий tool для части пользователей, делит ваш cache надвое. А у Anthropic переключение web search или citations меняет system prompt, что инвалидирует system и message caches, даже если вы не трогали ни одной строки своего текста.
Усечение истории — не решение
Ссылка на раздел: Усечение истории — не решениеОчевидный ответ на квадратичный счет — перестать отправлять всю историю: оставить последние дюжину сообщений и выбросить остальное. Это снижает счет, обычно это неверный ход, и измерение показывает почему.
| strategy | total | versus full history + cache |
|---|---|---|
| full history, no cache | $0.274386 | +211 % |
| full history, caching | $0.088250 | — |
| last 12 messages, no cache | $0.118712 | +35 % |
| last 12 messages, caching on | $0.122546 | +39 % |
Усечение до окна в двенадцать сообщений на 57 % дешевле, чем отправлять все без cache, — именно это сравнение делают все, и поэтому техника популярна. Но это на 39 % дороже, чем отправлять все с работающим cache, а включение caching вместе с усечением делает результат чуть хуже, а не лучше.
Механизм снова в prefix. Sliding window выбрасывает самое старое сообщение на каждом ходе, поэтому prompt уже не начинается там, где начинался в прошлый раз, и каждый ход предъявляет новый prefix. Руководство OpenAI говорит именно это: «summarisation, compaction, or context truncation can change the prefix and reset cache reuse».6 К 40-му ходу windowed prompt имеет 813 tokens, ниже минимума 1 024 tokens, поэтому вообще не может быть cached.
И деньги — дешевая половина цены. То, что вы выбросили, — инструкция, которую пользователь дал на 2-м ходе и которая понадобилась модели на 40-м. Усечение меняет видимый счет на невидимый сбой, а правильная реализация — compaction, структурированные notes вне window, retrieval истории по запросу — тема главы 24.
Переход через tier переоценивает весь запрос
Ссылка на раздел: Переход через tier переоценивает весь запросДлинные contexts дороже не только потому, что они длиннее. После порога они дороже за token, и порог применяется задним числом ко всему prompt.
Страница модели OpenAI для gpt-5.6-terra говорит это одной фразой: «Prompts with >272K input tokens are priced at 2x input and 1.5x output for the full request».7 Не для избытка. Для всего запроса.
prompt 271,999 + 500 output -> $0.5500
prompt 272,000 + 500 output -> $0.5500
prompt 272,001 + 500 output -> $1.0970Один token, пятьдесят пять центов. Если ваш сервис строит prompts из retrieved documents, размер которых вы не контролируете, в вашей модели затрат есть обрыв на границе, которую никто в команде не записал.
Ценообразование Google работает так же с порогом 200 000 tokens: Gemini 2.5 Pro стоит $1.25 за миллион input tokens для prompts до 200K и $2.50 выше, а output растет с $10.00 до $15.00.8 Anthropic пошла в другую сторону: по состоянию на 6 сентября 2026 года ее документация говорит, что Claude 4.6 и новее включают full one-million-token window по standard pricing, так что «a 900k-token request is billed at the same per-token rate as a 9k-token request».9 Более ранние модели сохраняли surcharge.
Вот почему price — не число. Price — это таблица tiers с ключом по длине prompt, именно для этого в cost function есть Tier[], и поэтому computeCost выбирает tier по всему prompt, а не по каждому bucket отдельно.
Prefill, decode, и почему output стоит в шесть раз дороже input
Ссылка на раздел: Prefill, decode, и почему output стоит в шесть раз дороже inputПять buckets сопоставляются с двумя фазами из главы 13, и как только вы видите это сопоставление, ценовые соотношения перестают выглядеть произвольными.
Input tokens — это prefill. Весь prompt проходит через модель за один проход, обрабатывается параллельно — большие matrix multiplications, compute-bound. Стоимость за token низкая, и именно эта фаза задает time to first token: у prompt из 4 947 tokens есть 4 947 tokens prefill, которые нужно сделать до появления первого слова.
Output tokens — это decode. Они создаются по одному, каждый — полный forward pass, читающий весь KV cache, при этом GPU в основном ждет память, а не вычисляет. Эта фаза задает tokens per second, ее нельзя распараллелить внутри одного ответа, и поэтому output стоит примерно в шесть раз дороже input на модели, оцененной здесь: $12.00 против $2.00 за миллион tokens.
Из этого напрямую следуют три последствия. Cache read заменяет prefill work, поэтому одновременно покупает latency и деньги — та же скидка проявляется как меньший счет и меньшее ожидание первого token. Reasoning tokens — это decode, который вы не видите, поэтому reasoning model несколько секунд ничего не streams, а затем быстро отвечает: глава 12 предупреждала об интерфейсном последствии, а это последствие для счета. И aborting stream не останавливает генерацию — глава 14 построила cancellation и оставила цену этой главе, а цена — полный output count, потому что tokens произведены и оплачены независимо от того, слушает ли кто-то. То же верно для ответа, который никто не сохраняет: пять regenerations ответа на 40-м ходе стоят $0.057990 за один, оставшийся на экране.
Подсчет tokens до отправки
Ссылка на раздел: Подсчет tokens до отправкиTokenizer из главы 7 был на Python и там остался. Бюджетирование происходит на сервере, который строит запрос, поэтому должно происходить здесь, и есть ровно три уровня точности.
Уровень один: считать локально. js-tiktoken поставляет те же BPE merge tables, что и Python tiktoken, поэтому дает byte-for-byte идентичный счетчик для OpenAI encodings, без сетевого вызова:
import { getEncoding } from "js-tiktoken";
const enc = getEncoding("o200k_base");
const PER_MESSAGE = 4; // role and delimiters added by the chat template
const PER_REPLY = 3; // priming for the assistant turn
export function promptTokens(messages: { role: string; content: string }[]) {
return messages.reduce(
(sum, m) => sum + enc.encode(m.content).length + PER_MESSAGE, PER_REPLY);
}Две константы важны, и именно на них локальные подсчеты начинают расходиться. Ваш текст — не то, что tokenized: chat template из главы 11 сначала оборачивает каждое сообщение role markers, и это tokens, за которые вы платите. Четыре на сообщение и три на priming ответа — обычное приближение для OpenAI chat models; на восьмидесяти одном сообщении разговора выше они дают 324 tokens, 6,4 % его длины. Подсчеты здесь были сверены с Python tiktoken из главы 7 на всех восьмидесяти одной строке и совпали.
Уровень два: спросить провайдера. Anthropic предоставляет /v1/messages/count_tokens, а Google — count_tokens; оба принимают ту же форму запроса, что реальный вызов, и бесплатно возвращают input token count. Используйте их, когда не можете считать локально — а для Anthropic вы не можете считать локально, потому что ее tokenizer не опубликован. Документация Anthropic аккуратно уточняет, что именно она дает: count «is an estimate» и «may include tokens added automatically by Anthropic for system optimizations», за которые «you are not billed».10
Уровень три: читать usage в ответе. Это истина, и она приходит после того, как деньги потрачены. Именно поэтому существуют первые два уровня — чтобы решить, отправлять ли запрос, а не чтобы выставлять счет.
То, за что вы платите, но что никто не показывает
Ссылка на раздел: То, за что вы платите, но что никто не показываетЧетыре статьи, которые не появляются как статьи.
System prompt, оплачиваемый в каждом вызове. Тот, что выше, занимает 192 tokens с учетом template overhead. За сорок вызовов это 7 680 tokens — 5,6 % всего счета за этот разговор, за восемь строк, написанных один раз. Он также лучший возможный кандидат для cache: стабильный и первый.
Tool definitions. Имя, описание и JSON schema каждого tool отправляются в каждом запросе, а провайдеры добавляют сверху scaffolding. Anthropic публикует число: само включение tools добавляет hidden system prompt в 496 tokens на Claude Sonnet 4.5 с tool_choice, установленным в auto, или 588 с any либо named tool.9 И это до ваших собственных schemas. Глава 18 строит каталог; глава 24 измеряет, сколько он съедает.
Каждая generation, включая те, которые вы отбрасываете. Пять regenerations стоят в пять раз больше. Chat показывает одну.
Thoughts, которые вам не показывают. Billing основан на full thought tokens, хотя возвращается только summary, и никакой ваш учет не может audit это число.
Иметь 200K tokens — не значит использовать их
Ссылка на раздел: Иметь 200K tokens — не значит использовать ихВ завершение — одно предупреждение, потому что это естественная следующая мысль, а ответ не очевиден.
Окно в миллион tokens не означает миллион usable tokens. Retrieval accuracy ухудшается с позицией: Liu et al. обнаружили, что модели надежно находят информацию в начале и конце длинного input и гораздо хуже — в середине.11 Bigger window покупает возможность отправить больше, а не уверенность, что это будет прочитано.
Это явление измеряется в курсе один раз — retrieval rate в девяти позициях одного и того же prompt на 853 tokens — и относится к главе 24, где оно меняет поведение agent. Здесь оно процитировано потому, что меняет то, что вам стоит покупать: самый дешевый token — тот, который вы не отправили.
Куда дальше
Ссылка на раздел: Куда дальшеТеперь вы можете предсказать стоимость вызова до его выполнения, прочитать фактическую стоимость после и отличить одно от другого. Это покрывает все в запросе, кроме части, которой вы еще не касались: ручек настройки.
Глава 17 — о sampling: temperature, top-p, top-k, penalties и детерминизме, которого у вас нет. Она начинается с разбора самой распространенной ошибки в отрасли: будто temperature — это регулятор креативности. Это не так: temperature делит logits из главы 4 перед softmax, и повышение не делает модель изобретательной, а повышает вероятность tokens, которые сама модель оценила как худшие. Затем — почему greedy decoding дает измеримо худший текст, чем sampling, почему top-k и top-p ломаются на противоположных формах распределения, и эксперимент в конце главы: двадцать одинаковых forward passes при temperature 0 возвращаются bit-for-bit идентичными, когда модель работает одна, а помещение того же prompt в batch рядом с чужими запросами сдвигает 97 % его logits.
Они не все совпадают. Причина начинается с блока о floating-point из главы 2.
Sources and method
Ссылка на раздел: Sources and methodВсе цены, thresholds и multipliers в этой главе были прочитаны на собственных страницах провайдеров 6 сентября 2026 года и указаны с этой датой, потому что они изменятся. Метод важнее чисел: buckets, prefix rule и tier arithmetic остаются стабильными два года, тогда как каждое число внутри них двигалось.
Stanford CS336 lecture 2, Resource accounting, — ближайшая академическая трактовка этого материала и правильное следующее чтение: она делает ту же арифметику на стороне training, какую эта глава делает на стороне inference. Token counts здесь были получены с js-tiktoken 1.0.21 с использованием encodings o200k_base и cl100k_base на разговоре из сорока ходов длиной 5 090 tokens; per-message template overhead — обычное приближение four-plus-three, и оно указано везде, где включено. Figures для cache, tier и truncation — это документированные pricing rules, примененные к измеренным token counts, а не наблюдения live API responses: для этой главы не было сделано ни одного платного вызова, и это также честная причина, по которой claims о latency качественные, а claims о стоимости — нет.
Сноски
Ссылка на раздел: Сноски-
Dao, T., Fu, D. Y., Ermon, S., Rudra, A. and Ré, C. FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness. arXiv:2205.14135 (2022). Почему потолок сдвинулся без изменения asymptotic cost. ↩
-
Chen, S., Wong, S., Chen, L. and Tian, Y. Extending Context Window of Large Language Models via Positional Interpolation. arXiv:2306.15595 (2023). ↩
-
Peng, B., Quesnelle, J., Fan, H. and Shippole, E. YaRN: Efficient Context Window Extension of Large Language Models. arXiv:2309.00071 (2023). ↩
-
Google, Thinking,
ai.google.dev/gemini-api/docs/thinking, и Token counting,ai.google.dev/gemini-api/docs/tokens, обе accessed 2026-09-06. «Pricing is based on the full thought tokens the model needs to generate, despite only the summary being output from the API.» Usage object сообщаетtotal_input_tokens,total_output_tokens,total_thought_tokens,total_cached_tokens,total_tool_use_tokensиtotal_tokens— шесть buckets, с thoughts и tool use вне output count. Более раннее field name для той же величины, все еще возвращаемое поверхностью generateContent, —thoughtsTokenCount, документированное на третьей странице,ai.google.dev/gemini-api/docs/generate-content/thinking. ↩ -
Anthropic, Prompt caching,
docs.anthropic.com/en/docs/build-with-claude/prompt-caching, accessed 2026-09-06. Источник invalidation hierarchytools→system→messagesи ее таблицы; per-model minimum cacheable lengths; тождестваtotal_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens; и five-minute default lifetime, бесплатно refreshed на каждом hit. ↩ ↩2 -
OpenAI, Prompt caching,
platform.openai.com/docs/guides/prompt-caching, accessed 2026-09-06. Источник: правило entire-rendered-prefix; minimum cacheable prefix (1 024 visible input tokens на GPT-5.6 и новее, 2 048 раньше); multipliers 1.25× write и 0.1× read, а также отсутствие write charge на GPT-5.5 и раньше; lifetime 30 минут; limits four-writes-per-request и fifty-breakpoint; machine-affinity note иprompt_cache_key; worked examples безубыточности 1.35×, 2.15× и 10×; и утверждение, что summarisation, compaction или truncation сбрасывают cache reuse. ↩ ↩2 -
OpenAI, Pricing (
platform.openai.com/docs/pricing) и страница модели дляgpt-5.6-terra, обе accessed 2026-09-06.gpt-5.6-terra, standard service tier, за миллион tokens: input $2.00, cached input $0.20, cache writes $2.50, output $12.00; long context input $4.00, cached $0.40, writes $5.00, output $18.00; «prompts with >272K input tokens are priced at 2x input and 1.5x output for the full request»; context window 1 050 000 tokens с максимумом 922 000 input tokens. В той же таблицеgpt-6-astraуказана как $10.00/$1.00/$12.50/$50.00, аgpt-5.6-luna— как $0.20/$0.02/$0.25/$1.20. Каждый worked cost в этой главе использует standard short-context ratesgpt-5.6-terra. ↩ -
Google, Gemini Developer API pricing,
ai.google.dev/gemini-api/docs/pricing, accessed 2026-09-06. Gemini 2.5 Pro, за миллион tokens: input $1.25 для prompts до 200K и $2.50 выше; output $10.00 и $15.00, в обоих случаях помечено «including thinking tokens»; context caching $0.125 и $0.25, плюс storage charge $4.50 за миллион tokens в час. Gemini 3.1 Pro Preview использует тот же threshold 200K при $2.00/$4.00 input и $12.00/$18.00 output. ↩ -
Anthropic, Pricing,
docs.anthropic.com/en/docs/about-claude/pricing, accessed 2026-09-06. За миллион tokens, base input / 5-minute cache write / 1-hour cache write / cache read / output: Claude Sonnet 4.5 $3 / $3.75 / $6 / $0.30 / $15; Claude Haiku 4.5 $1 / $1.25 / $2 / $0.10 / $5; Claude Opus 5 $5 / $6.25 / $10 / $0.50 / $25. Multipliers: 1.25× для five-minute write, 2× для one-hour write, 0.1× для read. Также источник заявления о long-context («Claude 4.6 and later models... include the full 1M token context window at standard pricing»), tool-use system prompt token counts (496 tokens на Claude Sonnet 4.5 сtool_choiceofautoornone, 588 сanyили named tool) и примечания, что Claude 4.7 и новее используют newer tokenizer, producing «approximately 30 % more tokens for the same text». ↩ ↩2 ↩3 -
Anthropic, Token counting,
docs.anthropic.com/en/docs/build-with-claude/token-counting, accessed 2026-09-06. Endpoint/v1/messages/count_tokensпринимает те же inputs, что и message, и возвращает input token count; документация говорит, что count — estimate, что он может include tokens, которые Anthropic adds for system optimisations, и что они are not billed. ↩ -
Liu, N. F., Lin, K., Hewitt, J., Paranjape, A., Bevilacqua, M., Petroni, F. and Liang, P. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (2023). Процитировано здесь, измерено в главе 24. ↩