Context window, tokens і рахунок: виміряно
40-turn розмова коштує у 22 рази більше за власну довжину в input tokens. Caching зменшує це на 68 %; timestamp не там додає 20 %.
На цій сторінці
Ось forty-turn розмова підтримки, виставлена в рахунку turn за turn. У ній немає нічого незвичного: розробник питає про API, assistant відповідає одним-двома абзацами. Увесь обмін — 5 090 tokens тексту, приблизно вісім сторінок.
| turn | prompt tokens | new text | output | cost of this turn | running total |
|---|---|---|---|---|---|
| 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 |
Читайте другий і третій стовпці разом. На turn 40 користувач набрав сімнадцять tokens, а плату взяли за 4 947. Запитання було не складнішим за перше; воно було коротшим. Змінилося те, що request знову ніс із собою всю розмову — уже в сороковий раз.
Загальна кількість input tokens, виставлених у рахунку за ці сорок calls: 112 617. Довжина розмови — 5 090 tokens. Ви заплатили за неї двадцять два рази.
Цей розділ пояснює, чому так відбувається, як це називається в invoice кожного provider і з якими з пʼяти речей, за які з вас беруть плату, ви можете щось зробити.
Показати подробиці
Що цьому розділу потрібно з Part II.
- Chapter 7 побудував tokenizer. token — це одиниця й тут: та сама одиниця, тепер із ціною.
- Chapter 9 вивів self-attention і її вартість у блоці asymptotic notation. Саме через цю вартість limit узагалі існує; тут ми на неї посилаємося, а не пояснюємо заново.
- Chapter 13 виміряв prefill проти decode і порахував, скільки займає KV cache. Саме ці дві фази насправді купують input і output стовпці вище.
Усе інше — TypeScript, бо це accounting для remote call, а не математика про model.
Window — це не памʼять
Посилання на розділ: Window — це не памʼятьНайдорожче хибне уявлення в цьому бізнесі — що model памʼятає розмову.
Не памʼятає, і механізм із Chapter 13 точно пояснює чому. Стан transformer під час generation — це KV cache: keys і values, обчислені для кожного token у sequence. Цей cache живе протягом одного request. Коли request завершується, процес, який його тримав, може обслуговувати когось іншого, а cache зникає. На іншому боці немає ні per-user store, ні session.
Тому наступний request має прийти з усім, що model має знати, і model відбудовує цей стан, виконуючи forward pass через увесь prompt, перш ніж видати бодай один новий token. Chapter 15 назвав prompt «the entire state». Фізична причина така: prompt є повним станом, бо ніщо інше не переживає call.
context window — це максимальна довжина цього prompt плюс його відповідь. Це стеля для того, скільки стану ви можете відбудувати, а не контейнер, який щось утримує між requests. Називати її «памʼяттю model» — означає переплутати напрям причинності: ви не заповнюєте памʼять, ви платите, щоб відновити її.
Звідси й береться двадцять два. Turn несе всі попередні turns, тому загальний input у розмові з turns — це сума зростального ряду, тобто квадратична величина:
де — system prompt, а — history на turn . Підгонка виміряного cumulative input до за сорок turns дає , що прогнозує 113 645 tokens на turn 40 проти 112 617 виміряних. Квадратичний член домінує, а лінійний — це те, що користувач фактично набрав.
Наслідок і головна фраза цього розділу: ваш рахунок зростає з квадратом розмови, а не з останнім запитанням. Ті самі сорок запитань без жодної history коштували б $0.066036. Зберігання history коштувало $0.274386. History помножила рахунок на 4,2 і продовжуватиме множити, бо multiplier — це довжина розмови.
Чому limit узагалі існує
Посилання на розділ: Чому limit узагалі існуєWindow скінченна з двох причин, які тягнуть в один бік. Перша — з Chapter 9: attention порівнює кожен token із кожним іншим token, тому робота цього шару зростає з квадратом довжини sequence. Друга — памʼять: KV cache зростає лінійно з довжиною sequence, і Chapter 13 уже робив цю арифметику — на довгих sequences він більший за weights.
Обидва limits атакували, але жоден не зник. FlashAttention1 реорганізує обчислення так, що воно значно менше читає й записує в high-bandwidth memory; це робить довгі sequences практичними, не змінюючи asymptotic cost. Position Interpolation2 і YaRN3 розширюють usable window навченої model, масштабуючи positional encodings із Chapter 9, а не перенавчаючи її. Разом саме вони пояснюють, чому windows за пʼять років виросли з 2K до 1M.
Чого вони не зробили — не зробили довгі contexts безкоштовними. Вони підняли стелю й помʼякшили схил. Але схил усе ще є, і саме його вимірюють price tiers далі в цьому розділі.
Пʼять кошиків, а не два
Посилання на розділ: Пʼять кошиків, а не дваМайже кожен cost calculator в інтернеті моделює API call як input tokens, помножені на input price, плюс output tokens, помножені на output price. Це було правдою у 2023 році. Тепер це хибно так, що рахунки можуть відрізнятися вдвічі або більше в обидва боки.
Є пʼять billable token categories:
| bucket | what it is | typical price, relative to input |
|---|---|---|
| uncached input | prompt tokens, які model мала обробити з нуля | 1× |
| cache read | prompt tokens, отримані зі збереженого prefix | 0,1× |
| cache write | prompt tokens, збережені в cache під час цього call | 1,25× до 2× |
| output | tokens, які model згенерувала й надіслала вам | 5× до 6× |
| reasoning | tokens, які model згенерувала й не надіслала вам | output rate |
Три з цих пʼяти ще два роки тому не існували як окремі рядки, а два cache-рядки — саме ті, у яких люди найчастіше помиляються, бо cache write коштує дорожче за звичайний input, а не дешевше. Ви платите premium, щоб щось зберегти, і потім платите зі знижкою, щоб прочитати це назад; чи вигідна така угода, повністю залежить від того, скільки разів ви це прочитаєте.
Reasoning bucket — це bucket із Chapter 12, тепер із ціною, і в ньому є деталь, яку варто сказати прямо: документація Google каже, що pricing «is based on the full thought tokens the model needs to generate, despite only the summary being output from the API».4 Вам виставляють рахунок за tokens, які ніколи вам не передаються. Це єдиний bucket, вміст якого ви не можете порахувати, перевірити чи переглянути.
Той самий call, три dialects
Посилання на розділ: Той самий call, три dialectsТепер частина, яка робить це проблемою normalization, а не множення. Кожен provider повідомляє ці buckets під різними назвами, і — ось пастка — двоє з них використовують одне й те саме слово для двох різних величин.
Візьмімо один call: 4 837 tokens прочитано з cache, 110 fresh, 142 visible 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 token count для того самого 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 в окреме поле. Chapter 12 позначив це як несумісність між двома способами рахувати ту саму роботу; тут видно, у що це обходиться.
Normalizer займає тридцять рядків, і він не є 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
};
};Пропустіть три payloads вище через три readers, і всі три дадуть той самий Usage, а отже й те саме число: $0.006491. У цьому збігу й полягає весь сенс такого шару.
Помиліться — і ось скільки це коштує на тому самому call:
| mistake | billed | error |
|---|---|---|
вважати cached_tokens додатковим до prompt_tokens | $0.016165 | 2,49× — ви рахуєте prompt двічі |
| вважати cache reads безкоштовними замість 0,1× | $0.005524 | 0,85× — ви зʼїдаєте 15 % |
читати candidatesTokenCount й ігнорувати thoughtsTokenCount | $0.002891 | 55 % call зникає |
Третя помилка найнебезпечніша, бо вона тихо провалюється в бік хороших новин. Ваш dashboard показує reasoning model, яка коштує менш ніж половину реальної ціни, і ніде нічого не сигналізує про помилку.
Обчислення cost
Посилання на розділ: Обчислення costКоли buckets normalized, cost function коротка. Єдина неочевидна частина — tier lookup, який пояснює наступний розділ:
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);
}Два design decisions тут варто захистити. Fallbacks — cache prices falling back to input, reasoning to output — кодують, що означає відсутня таблиця: reasoning tokens у Gemini billed за output rate, тож відсутня ціна reasoning — це не нуль, а output price. А contextSize підсумовує всі три input buckets, а не лише fresh, бо tier обирається за довжиною prompt, а не за тим, за яку його частину з вас взяли full price.
Prompt caching і скільки коштує запис
Посилання на розділ: Prompt caching і скільки коштує записprompt cache зберігає обчислений стан model для prefix вашого prompt, тож пізніший request із тим самим prefix пропускає повторне обчислення. Зі слова «prefix» випливають чотири властивості, і всі чотири дивують людей.
Це prefix, а не множина
Посилання на розділ: Це prefix, а не множинаCache зіставляє від початку rendered prompt уперед і зупиняється на першому byte, який відрізняється. Немає часткового credit за content, який зʼявляється далі в іншому порядку. OpenAI формулює це прямо: «cache reuse requires the entire rendered prefix to match».6
Є minimum length
Посилання на розділ: Є minimum lengthНижче неї нічого не cached і жодна error не повертається. В OpenAI minimum — 1 024 tokens для GPT-5.6 і пізніших та 2 048 для старіших models. В Anthropic діапазон — від 512 до 4 096 залежно від model: 1 024 для Claude Sonnet 4.5, 4 096 для Claude Haiku 4.5. Якщо обидва cache fields повертаються нульовими, зазвичай причина саме в цьому.
Запис коштує дорожче за читання і дорожче, ніж не caching
Посилання на розділ: Запис коштує дорожче за читання і дорожче, ніж не cachingВ OpenAI та Anthropic cache write — це 1,25× uncached input rate для short-lived cache, а one-hour cache Anthropic — 2×. Read — 0,1×. Google не бере плату за write, але здає storage в оренду: $4.50 за million tokens per hour на Gemini 2.5 Pro.
Він спливає і живе на одній машині
Посилання на розділ: Він спливає і живе на одній машиніDefault entry Anthropic живе пʼять хвилин, безкоштовно оновлюючись при кожному hit. OpenAI — щонайменше тридцять хвилин після останнього write або reuse. І OpenAI зазначає, що cached states живуть на окремих machines, тому request має hit лише якщо його routed до machine, яка тримає entry — саме на це впливає prompt_cache_key, але не гарантує.
Break-even достатньо малий, щоб тримати його в голові, і документація OpenAI робить арифметику: записати prefix один раз і повторно використати його один раз коштує 1,35× його звичайної input cost проти 2× за дві uncached обробки; для десяти requests один write і девʼять reads коштують 2,15× проти 10×. Один reuse окупає write. Anthropic приходить туди ж: один read для five-minute cache, два для one-hour cache.
Тепер знову forty-turn розмова, з caching увімкненим і stable prefix:
| uncached input | cache reads | cache writes | total | |
|---|---|---|---|---|
| no cache | 112 617 | — | — | $0.274386 |
| caching | 2 887 | 104 783 | 4 947 | $0.088250 |
На шістдесят вісім відсотків дешевше, і три числа в цій таблиці заслуговують уваги.
Cache не вмикається до turn 6. prompt не досягає 1 024 tokens до цього моменту, тож перші пʼять turns billed точно як раніше — а шостий billed гірше, з premium 1,25× за write, бо саме цей turn заповнює cache. Перший read приходить на turn 7. 2 887 uncached tokens у таблиці — це арифметика: пʼять turns, не шість. Caching — це знижка на довгі prompts, і коротка розмова не отримує від нього нічого.
Write premium — $0.002474, тобто 2,8 % cached bill. Кожен turn записує свій новий tail, сорок разів, і весь write premium — похибка округлення порівняно з тим, що заощадили reads. Write charge варто точно розуміти саме для того, щоб перестати через нього хвилюватися.
Лише 2 887 tokens були charged за full input price із 112 617. Ось форма working cache: майже все — read.
Порядок prompt вирішує, чи станеться бодай щось із цього
Посилання на розділ: Порядок prompt вирішує, чи станеться бодай щось із цьогоОсь збій, який коштує реальних грошей, і це one-line bug.
Поставте щось, що змінюється на кожному call, близько до початку prompt — timestamp, request id, імʼя користувача, рядок «today is», щойно retrieved document — і prefix відрізняється з першого byte. Нічого не збігається. Кожен call — miss. І оскільки кожен call подає novel prefix, кожен call також writes.
Та сама розмова, ті самі сорок turns, caching enabled, із per-call 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 і не прочитали назад нічого. Немає error, немає warning, а feature увімкнена.
Отже правило — і це весь prompt caching в одному рядку: stable content попереду, variable content позаду. System instructions, tool definitions і reference material спершу; timestamps, user identity і current question — в кінці. Anthropic явно задає hierarchy: cache йде tools → system → messages, і зміна на будь-якому level invalidates цей level і все після нього, тому редагування одного tool description invalidates увесь cache.5
Два наслідки, об які часто спотикаються. Зміна того, які tools enabled, змінює tool definitions, тож feature flag, який додає tool для частини користувачів, ділить ваш cache надвоє. А в Anthropic перемикання web search або citations модифікує system prompt, що invalidates system і message caches, навіть якщо ви не торкалися жодного рядка власного тексту.
Truncating history — не виправлення
Посилання на розділ: Truncating history — не виправленняОчевидна відповідь на квадратичний рахунок — перестати надсилати всю history: лишити останній десяток messages і відкинути решту. Це справді зменшує рахунок, але зазвичай це хибний хід, і вимірювання показує чому.
| 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 % |
Truncating до twelve-message window на 57 % дешевше, ніж надсилати все uncached — саме це порівняння всі роблять, і тому техніка популярна. Але це на 39 % дорожче, ніж надсилати все з working cache, а вмикання caching разом із truncation робить трохи гірше, а не краще.
Механізм знову prefix. Sliding window на кожному turn відкидає найстаріше message, тому prompt більше не починається там, де починався минулого разу, і кожен turn подає новий prefix. Настанова OpenAI каже саме це: «summarisation, compaction, or context truncation can change the prefix and reset cache reuse».6 На turn 40 windowed prompt має 813 tokens, нижче за minimum 1 024 tokens, тому його взагалі не можна cached.
І гроші — дешевша половина cost. Те, що ви відкинули, — це instruction, яку користувач дав на turn 2 і яка model була потрібна на turn 40. Truncation міняє рахунок, який ви бачите, на збій, якого не бачите, а правильне виконання — compaction, structured notes поза window, retrieving history on demand — це тема Chapter 24.
Перетин tier переоцінює весь request
Посилання на розділ: Перетин tier переоцінює весь requestLong contexts дорожчі не лише тому, що вони довші. Після threshold вони дорожчі per token, і threshold застосовується retroactively до всього prompt.
Сторінка model OpenAI для gpt-5.6-terra формулює це одним реченням: «Prompts with >272K input tokens are priced at 2x input and 1.5x output for the full request».7 Не для excess. Для всього.
prompt 271,999 + 500 output -> $0.5500
prompt 272,000 + 500 output -> $0.5500
prompt 272,001 + 500 output -> $1.0970Один token — пʼятдесят пʼять центів. Якщо ваш service будує prompts із retrieved documents, розмір яких ви не контролюєте, у вашій cost model є урвище на межі, яку ніхто у вашій команді не записав.
Pricing Google працює так само з threshold 200 000 tokens: Gemini 2.5 Pro коштує $1.25 за million input tokens для prompts до 200K і $2.50 вище, а output зростає з $10.00 до $15.00.8 Anthropic пішов іншим шляхом — станом на 6 вересня 2026 року його документація стверджує, що Claude 4.6 і пізніші включають повне one-million-token window за standard pricing, тож «a 900k-token request is billed at the same per-token rate as a 9k-token request».9 Раніші models зберігали surcharge.
Ось чому price — це не число. Price — це table of tiers, keyed by prompt length; саме для цього в cost function існує Tier[], і саме тому computeCost обирає tier за whole prompt, а не за кожним bucket окремо.
Prefill, decode і чому output коштує вшестеро більше за input
Посилання на розділ: Prefill, decode і чому output коштує вшестеро більше за inputПʼять buckets відображаються на дві фази з Chapter 13, і щойно ви бачите це відображення, price ratios перестають виглядати довільними.
Input tokens — це prefill. Увесь prompt проходить через model за один pass, обробляючись паралельно: великі matrix multiplications, compute-bound. Cost per token низька, і саме ця фаза визначає time to first token: prompt на 4 947 tokens має виконати prefill для 4 947 tokens, перш ніж зʼявиться перше слово.
Output tokens — це decode. Вони створюються по одному, кожен — full forward pass, який читає весь KV cache, і GPU здебільшого чекає на memory, а не обчислює. Саме ця фаза визначає tokens per second, її не можна parallelized в межах однієї response, і саме тому output коштує приблизно вшестеро дорожче за input на model, priced тут: $12.00 проти $2.00 за million tokens.
Звідси прямо випливають три наслідки. Cache read замінює prefill work, тож купує latency і гроші одночасно: та сама знижка проявляється як нижчий bill і коротше очікування першого token. Reasoning tokens — це decode, який ви не бачите, тому reasoning model кілька секунд нічого не streams, а потім швидко відповідає: Chapter 12 попереджав про interface consequence, а це invoice consequence. І aborting a stream не зупиняє generation — Chapter 14 побудував cancellation і залишив price для цього розділу, а price — це повний output count, бо tokens produced і billed незалежно від того, чи хтось слухає. Те саме стосується відповіді, яку ніхто не зберігає: regenerate відповіді turn 40 пʼять разів коштує $0.057990 за одну, що лишилася на екрані.
Counting tokens перед відправленням
Посилання на розділ: Counting tokens перед відправленнямTokenizer із Chapter 7 був Python і там залишився. Budgeting відбувається на server, який будує request, тож має відбуватися тут, і є рівно три levels accuracy.
Level one: count locally. js-tiktoken постачає ті самі BPE merge tables, що й Python tiktoken, тож дає byte-for-byte identical count для OpenAI encodings без network call:
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);
}Дві constants важливі, і саме на них local counts розʼїжджаються. Ваш text — не те, що tokenized: chat template із Chapter 11 спершу обгортає кожне message в role markers, і це tokens, за які ви платите. Чотири на message і три для reply priming — conventional approximation для OpenAI chat models; у вісімдесяти одному message розмови вище вони додають 324 tokens, 6,4 % її довжини. Ці counts були cross-checked із Python tiktoken з Chapter 7 на всіх вісімдесяти одному рядку й збігаються.
Level two: ask the provider. Anthropic надає /v1/messages/count_tokens, а Google — count_tokens; обидва приймають ту саму request shape, що й real call, і безкоштовно повертають input token count. Використовуйте їх, коли не можете count locally — а для Anthropic ви не можете count locally, бо його tokenizer не published. Документація Anthropic обережно пояснює, що саме дає: count «is an estimate», і він «may include tokens added automatically by Anthropic for system optimizations», за які «you are not billed».10
Level three: read usage in the response. Це правда, і вона приходить після того, як гроші вже витрачено. Саме тому існують перші два levels — щоб вирішити, чи надсилати request, а не щоб виставляти bill.
Речі, за які ви платите, але яких вам ніхто не показує
Посилання на розділ: Речі, за які ви платите, але яких вам ніхто не показуєЧотири line items, які не зʼявляються як line items.
System prompt, оплачений на кожному call. Наведений вище має 192 tokens із template overhead. За сорок calls це 7 680 tokens — 5,6 % усього bill цієї розмови, за вісім рядків, написаних один раз. Це також найкращий можливий cache candidate, бо він і stable, і first.
Tool definitions. Name, description і JSON schema кожного tool виходять у кожному request, а providers додають scaffolding зверху. Anthropic публікує число: саме вмикання tools додає hidden system prompt на 496 tokens у Claude Sonnet 4.5 з tool_choice, установленим у auto, або 588 із any чи named tool.9 І це ще до ваших schemas. Chapter 18 будує catalogue; Chapter 24 вимірює, що він зʼїдає.
Кожна generation, включно з тими, які ви відкидаєте. Пʼять regenerations коштують упʼятеро. Chat показує одну.
Thoughts, яких вам не показують. Billing based on full thought tokens, хоча повертається лише summary, і жоден ваш accounting не може audit це число.
Мати 200K tokens — не означає використовувати їх
Посилання на розділ: Мати 200K tokens — не означає використовувати їхОдне попередження на завершення, бо це природна наступна думка, а відповідь не очевидна.
Million-token window не означає million usable tokens. Retrieval accuracy погіршується залежно від position: Liu et al. виявили, що models надійно знаходять information на початку й у кінці long input і значно гірше — посередині.11 Bigger window купує можливість надіслати більше, а не certainty of being read.
Це phenomenon вимірюється в course один раз — retrieval rate у девʼяти positions у тому самому 853-token prompt — і належить до Chapter 24, де воно змінює те, що робить agent. Тут його наведено, бо воно змінює те, що вам варто купувати: найдешевший token — той, який ви не надіслали.
Куди далі
Посилання на розділ: Куди даліТепер ви можете передбачити, скільки коштуватиме call до його виконання, прочитати, скільки він коштував після, і відрізнити одне від іншого. Це покриває все про request, крім частини, якої ви ще не торкалися: knobs.
Chapter 17 — це sampling: temperature, top-p, top-k, penalties і determinism, якого у вас немає. Він починається з демонтажу найпоширенішої помилки в галузі: що temperature — це регулятор creativity. Ні: temperature ділить logits із Chapter 4 перед softmax, і її підвищення не робить model imaginative, а підвищує ймовірність tokens, які сама model оцінила як гірші. Далі — чому greedy decoding produces measurably worse text than sampling, чому top-k і top-p fail на протилежних формах distribution, і experiment, яким завершується chapter: двадцять identical forward passes at temperature 0 повертаються bit-for-bit identical, коли model runs alone, а розміщення того самого prompt у batch поруч із чужими requests зсуває 97 % його logits.
Вони не всі збігаються. Причина починається з floating-point box із Chapter 2.
Sources and method
Посилання на розділ: Sources and methodУсі prices, thresholds і multipliers у цьому розділі були прочитані з власних сторінок providers 6 вересня 2026 року і подані з цією датою, бо вони зміняться. Method важливіший за numbers: buckets, prefix rule і tier arithmetic були stable два роки, тоді як кожна figure всередині них рухалася.
Stanford CS336 lecture 2, Resource accounting, — найближчий academic treatment цього матеріалу й правильне next read: вона робить ту саму арифметику на training side, яку цей chapter робить на inference side. Token counts тут produced with js-tiktoken 1.0.21 using the o200k_base and cl100k_base encodings, over a forty-turn conversation of 5 090 tokens; per-message template overhead — conventional four-plus-three approximation і stated wherever it is included. Cache, tier і truncation figures — це documented pricing rules, applied to those measured token counts, not observations of live API responses — жоден paid call не був made to produce this chapter, що також є чесною причиною, чому latency claims qualitative, а cost 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). Чому ceiling moved without the asymptotic cost changing. ↩
-
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.» The usage object reportstotal_input_tokens,total_output_tokens,total_thought_tokens,total_cached_tokens,total_tool_use_tokensandtotal_tokens— six buckets, with thoughts and tool use outside the output count. Earlier field name for the same quantity, still returned by the generateContent surface, isthoughtsTokenCount, documented on a third page,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і її table; per-model minimum cacheable lengths; identitytotal_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens; і five-minute default lifetime refreshed at no charge on each hit. ↩ ↩2 -
OpenAI, Prompt caching,
platform.openai.com/docs/guides/prompt-caching, accessed 2026-09-06. Джерело: the entire-rendered-prefix rule; 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 і раніших; 30-minute lifetime; limits four-writes-per-request і fifty-breakpoint; machine-affinity note іprompt_cache_key; worked examples break-even 1,35×, 2,15× і 10×; а також statement, що summarisation, compaction або truncation resets cache reuse. ↩ ↩2 -
OpenAI, Pricing (
platform.openai.com/docs/pricing) і model page дляgpt-5.6-terra, обидві accessed 2026-09-06.gpt-5.6-terra, standard service tier, per million 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 with a maximum of 922 000 input tokens. Та сама table listsgpt-6-astraat $10.00/$1.00/$12.50/$50.00 andgpt-5.6-lunaat $0.20/$0.02/$0.25/$1.20. Every worked cost in this chapter uses thegpt-5.6-terrastandard short-context rates. ↩ -
Google, Gemini Developer API pricing,
ai.google.dev/gemini-api/docs/pricing, accessed 2026-09-06. Gemini 2.5 Pro, per million tokens: input $1.25 для prompts up to 200K і $2.50 above; output $10.00 і $15.00, в обох випадках labelled «including thinking tokens»; context caching $0.125 і $0.25, плюс storage charge $4.50 per million tokens per hour. Gemini 3.1 Pro Preview uses the same 200K threshold at $2.00/$4.00 input and $12.00/$18.00 output. ↩ -
Anthropic, Pricing,
docs.anthropic.com/en/docs/about-claude/pricing, accessed 2026-09-06. Per million 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 statement («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_choiceofautoабоnone, 588 зanyабо named tool), і note, що Claude 4.7 і пізніші use a 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_tokenstakes the same inputs as a message and returns an input token count; documentation states that the count is an estimate, that it may include tokens Anthropic adds for system optimisations, and that those 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). Cited here, measured in Chapter 24. ↩