El context window, els tokens i la factura, mesurats
Una conversa de 40 torns costa 22 vegades la seva llargada en tokens d’entrada. La cache ho retalla un 68 %; un timestamp mal posat hi afegeix un 20 %.
En aquesta pàgina
Aquí tens una conversa de suport de quaranta torns, facturada torn a torn. No hi ha res d’estrany: un desenvolupador pregunta sobre una API, un assistant respon en un paràgraf o dos. Tot l’intercanvi suma 5.090 tokens de text: unes vuit pàgines.
| torn | prompt tokens | text nou | output | cost d’aquest torn | total acumulat |
|---|---|---|---|---|---|
| 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 |
Llegeix la segona i la tercera columna juntes. Al torn 40, l’usuari va escriure disset tokens i se li’n van cobrar 4.947. La pregunta no era més difícil que la primera; era més curta. El que va canviar és que la request portava tota la conversa al damunt, una altra vegada, per quarantena vegada.
Total d’input tokens facturats en aquelles quaranta calls: 112.617. La conversa té 5.090 tokens. L’has pagada vint-i-dues vegades.
Aquest capítol tracta de per què passa això, com s’anomena a la factura de cada provider i sobre quines de les cinc coses que se’t cobren pots fer alguna cosa.
Mostra els detalls
Què necessita aquest capítol de la part II.
- Capítol 7 va construir el tokenizer. Un token també és la unitat aquí: la mateixa unitat, ara amb preu.
- Capítol 9 va derivar el self-attention i el seu cost , al requadre de notació asimptòtica. Aquest cost és el motiu pel qual existeix un límit, i aquí s’enllaça en lloc de tornar-lo a explicar.
- Capítol 13 va mesurar prefill contra decode i va calcular què ocupa una KV cache. Aquestes dues fases són el que realment compren les columnes d’input i output de dalt.
Tota la resta és TypeScript, perquè això és comptabilitat d’una call remota i no matemàtiques sobre un model.
La window no és memòria
Enllaç a la secció: La window no és memòriaEl malentès més car d’aquest negoci és pensar que un model recorda una conversa.
No ho fa, i el mecanisme del capítol 13 explica exactament per què. L’estat d’un transformer durant la generació és la KV cache: les claus i els valors calculats per a cada token de la seqüència. Aquesta cache viu durant una sola request. Quan la request acaba, el procés que la mantenia queda lliure per servir algú altre, i la cache desapareix. A l’altra banda no hi ha cap magatzem per usuari, ni cap sessió.
Per tant, la request següent ha d’arribar portant tot el que se suposa que el model ha de saber, i el model reconstrueix aquest estat executant un forward pass sobre tot el prompt abans d’emetre un sol token nou. El capítol 15 anomenava el prompt «tot l’estat». Aquesta n’és la raó física: el prompt és l’estat complet perquè res més no sobreviu a la call.
El context window és la llargada màxima d’aquest prompt més la seva resposta. És un sostre sobre quant estat pots reconstruir, no un contenidor que guardi res entre requests. Anomenar-lo «la memòria del model» inverteix la direcció de la causalitat: no estàs omplint una memòria, estàs pagant per restablir-ne una.
D’aquí surt el vint-i-dos. El torn porta tots els torns anteriors, de manera que l’input total al llarg d’una conversa de torns és la suma d’una sèrie creixent, que és quadràtica:
on és el system prompt i l’historial al torn . Ajustar l’input acumulat mesurat a al llarg dels quaranta torns dona , que prediu 113.645 tokens al torn 40 contra 112.617 de mesurats. El terme quadràtic domina, i el terme lineal és el que l’usuari ha escrit realment.
La conseqüència és la frase que cal endur-se d’aquest capítol: la teva factura creix amb el quadrat de la conversa, no amb l’última pregunta. Les mateixes quaranta preguntes fetes sense cap historial costen $0.066036. Mantenir l’historial costa $0.274386. L’historial va multiplicar la factura per 4,2, i la continuarà multiplicant, perquè el multiplicador és la llargada de la conversa.
Per què hi ha un límit
Enllaç a la secció: Per què hi ha un límitLa window és finita per dos motius que empenyen en la mateixa direcció. El primer és el del capítol 9: attention compara cada token amb tots els altres tokens, de manera que la feina d’aquesta capa creix amb el quadrat de la llargada de la seqüència. El segon és la memòria: la KV cache creix linealment amb la llargada de la seqüència, i el capítol 13 en va fer l’aritmètica; en seqüències llargues és més gran que els pesos.
S’ha atacat tots dos límits i no se n’ha eliminat cap. FlashAttention1 reorganitza el càlcul perquè llegeixi i escrigui molt menys a la memòria d’alta amplada de banda, cosa que fa pràctiques les seqüències llargues sense canviar el cost asimptòtic. Position Interpolation2 i YaRN3 estenen la window usable d’un model entrenat reescalant els positional encodings del capítol 9 en lloc de reentrenar-lo. Junts expliquen per què les windows han passat de 2K a 1M en cinc anys.
El que no han fet és tornar gratuïts els contexts llargs. Han apujat el sostre i han suavitzat el pendent. El pendent encara hi és, i és el que mesuren els tiers de preu més endavant en aquest capítol.
Cinc compartiments, no dos
Enllaç a la secció: Cinc compartiments, no dosGairebé totes les calculadores de costos d’internet modelen una API call com input tokens multiplicats per un preu d’input més output tokens multiplicats per un preu d’output. Això era cert el 2023. Ara és incorrecte d’una manera que produeix factures desviades per un factor de dos o més en totes dues direccions.
Hi ha cinc categories de tokens facturables:
| compartiment | què és | preu típic, relatiu a l’input |
|---|---|---|
| input no cachejat | prompt tokens que el model ha hagut de processar de nou | 1× |
| lectura de cache | prompt tokens servits des d’un prefix emmagatzemat | 0,1× |
| escriptura de cache | prompt tokens emmagatzemats a la cache en aquesta call | 1,25× a 2× |
| output | tokens que el model ha generat i t’ha enviat | 5× a 6× |
| reasoning | tokens que el model ha generat i no t’ha enviat | tarifa d’output |
Tres d’aquests cinc no existien com a línies separades fa dos anys, i les dues línies de cache són les que la gent entén malament, perquè una escriptura de cache costa més que l’input ordinari, no menys. Pagues una prima per emmagatzemar una cosa per poder pagar un descompte quan la tornes a llegir, i si surt a compte depèn completament de quantes vegades la llegeixes.
El compartiment de reasoning és el del capítol 12, ara amb un preu, i porta un detall que val la pena dir clarament: la documentació de Google diu que el preu «es basa en tots els thought tokens que el model necessita generar, tot i que només el resum surt de l’API».4 Se’t facturen tokens que no se’t transmeten mai. És l’únic compartiment el contingut del qual no pots comptar, inspeccionar ni verificar.
La mateixa call, tres dialectes
Enllaç a la secció: La mateixa call, tres dialectesAra ve la part que converteix això en un problema de normalització i no de multiplicació. Cada provider informa d’aquests compartiments amb noms diferents i —aquest és el parany— dos fan servir la mateixa paraula per a dues quantitats diferents.
Agafa una call: 4.837 tokens llegits de cache, 110 de nous, 142 output tokens visibles, 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 } }Mira prompt_tokens: 4947 i input_tokens: 110. Tots dos camps són el recompte d’input tokens del mateix prompt. El d’OpenAI inclou els cached tokens; el d’Anthropic els exclou: la seva documentació declara la identitat explícitament, total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens.5 input_tokens d’Anthropic vol dir «els tokens després del teu darrer punt de ruptura de cache».
I mira l’output. OpenAI i Anthropic informen tots dos de 442, que ja conté els 300 reasoning tokens. Gemini informa de 142 i posa els 300 en un camp propi. El capítol 12 assenyalava això com una incompatibilitat entre dues maneres de comptar la mateixa feina; aquí tens el que costa.
Un normalitzador són trenta línies i no és opcional:
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
};
};Passa els tres payloads anteriors pels tres readers i tots tres produeixen el mateix Usage i, per tant, el mateix número: $0.006491. Aquest acord és tot el sentit d’escriure la capa.
Si t’equivoques, això és el que costa, en la mateixa call:
| error | facturat | desviació |
|---|---|---|
tractar cached_tokens com a addicional a prompt_tokens | $0.016165 | 2,49× — cobres el prompt dues vegades |
| tractar les lectures de cache com a gratuïtes en lloc de 0,1× | $0.005524 | 0,85× — t’empasses un 15 % |
llegir candidatesTokenCount i ignorar thoughtsTokenCount | $0.002891 | desapareix el 55 % de la call |
El tercer és el perillós, perquè falla en silenci en la direcció de les bones notícies. El teu dashboard mostra un model de reasoning que costa menys de la meitat del que costa, i enlloc no salta cap error.
Calcular el cost
Enllaç a la secció: Calcular el costAmb els compartiments normalitzats, la funció de cost és curta. L’única part no òbvia és la cerca del tier, que explica la secció següent:
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);
}Hi ha dues decisions de disseny que val la pena defensar. Els fallbacks —els preus de cache que tornen a input, reasoning que torna a output— codifiquen què vol dir que falti una taula: els reasoning tokens a Gemini es facturen a la tarifa d’output, així que un preu reasoning absent no és zero, és el preu d’output. I contextSize suma tots tres compartiments d’input, no només els frescos, perquè el tier es tria per la llargada del prompt, no per quina part se t’ha cobrat a preu complet.
Prompt caching, i què costa escriure-hi
Enllaç a la secció: Prompt caching, i què costa escriure-hiUna prompt cache emmagatzema l’estat calculat del model per a un prefix del teu prompt, de manera que una request posterior amb el mateix prefix salta el recàlcul. De la paraula «prefix» se’n desprenen quatre propietats, i totes quatre sorprenen.
És un prefix, no un conjunt
Enllaç a la secció: És un prefix, no un conjuntLa cache compara des del començament del prompt renderitzat cap endavant, i s’atura al primer byte que difereix. No hi ha crèdit parcial per contingut que apareix més tard en un ordre diferent. OpenAI ho diu planerament: «la reutilització de cache requereix que coincideixi tot el prefix renderitzat».6
Hi ha una llargada mínima
Enllaç a la secció: Hi ha una llargada mínimaPer sota, no es cacheja res i no es retorna cap error. A OpenAI el mínim és de 1.024 tokens per a GPT-5.6 i posteriors, i de 2.048 per a models anteriors. A Anthropic va de 512 a 4.096 segons el model: 1.024 per a Claude Sonnet 4.5, 4.096 per a Claude Haiku 4.5. Si tots dos camps de cache tornen a zero, normalment és per això.
Escriure costa més que llegir, i més que no cachejar
Enllaç a la secció: Escriure costa més que llegir, i més que no cachejarA OpenAI i Anthropic, una escriptura de cache és 1,25× la tarifa d’input no cachejat per a la cache de vida curta, i la cache d’una hora d’Anthropic és 2×. Una lectura és 0,1×. Google no cobra per escriure, però lloga l’emmagatzematge: $4.50 per milió de tokens per hora a Gemini 2.5 Pro.
Caduca, i viu en una sola màquina
Enllaç a la secció: Caduca, i viu en una sola màquinaL’entrada per defecte d’Anthropic viu cinc minuts, renovada gratis a cada encert. La d’OpenAI dura com a mínim trenta minuts després de l’última escriptura o reutilització. I OpenAI assenyala que els estats cachejats viuen en màquines individuals, així que una request només encerta si s’encamina a la màquina que conté l’entrada; això és el que influeix prompt_cache_key, sense garantir-ho.
El punt d’equilibri és prou petit per tenir-lo al cap, i la documentació d’OpenAI en fa l’aritmètica: escriure un prefix una vegada i reutilitzar-lo una vegada costa 1,35× el seu cost d’input ordinari, contra 2× de processar-lo dues vegades sense cache; en deu requests, una escriptura i nou lectures costen 2,15× contra 10×. Una sola reutilització paga l’escriptura. Anthropic arriba al mateix lloc: una lectura per a la cache de cinc minuts, dues per a la cache d’una hora.
Ara la conversa de quaranta torns una altra vegada, amb caching activat i el prefix estable:
| input no cachejat | lectures de cache | escriptures de cache | total | |
|---|---|---|---|---|
| sense cache | 112.617 | — | — | $0.274386 |
| caching | 2.887 | 104.783 | 4.947 | $0.088250 |
Un seixanta-vuit per cent més barat, i tres números d’aquesta taula mereixen atenció.
La cache no entra en joc fins al torn 6. El prompt no arriba als 1.024 tokens fins aleshores, de manera que els primers cinc torns es facturen exactament com abans, i el sisè es factura pitjor, amb la prima d’escriptura d’1,25×, perquè és el torn que omple la cache. La primera lectura arriba al torn 7. Els 2.887 tokens no cachejats de la taula són l’aritmètica: cinc torns, no sis. El caching és un descompte sobre prompts llargs, i una conversa curta no en treu res.
La prima d’escriptura és $0.002474, que és el 2,8 % de la factura cachejada. Cada torn escriu la seva cua nova, quaranta vegades, i tota la prima d’escriptura és un arrodoniment al costat del que han estalviat les lectures. Val la pena entendre la càrrega d’escriptura amb precisió perquè deixis de preocupar-te’n.
Només 2.887 tokens s’han cobrat a preu d’input complet dels 112.617. Aquesta és la forma d’una cache que funciona: gairebé tot és una lectura.
L’ordre del prompt decideix si tot això passa
Enllaç a la secció: L’ordre del prompt decideix si tot això passaAquí tens la fallada que costa diners de debò, i és un bug d’una línia.
Posa alguna cosa que canvia a cada call prop del principi del prompt —un timestamp, un request id, el nom de l’usuari, una línia «avui és», un document acabat de recuperar— i el prefix difereix des del primer byte. Res no coincideix. Cada call és un miss. I com que cada call presenta un prefix nou, cada call també escriu.
La mateixa conversa, els mateixos quaranta torns, caching activat, amb un timestamp per call al capdamunt del system prompt:
| total | contra | |
|---|---|---|
| sense caching | $0.274386 | — |
| caching, prefix estable | $0.088250 | −67,8 % |
| caching, prefix volàtil | $0.329251 | +20,0 % |
Activar prompt caching va fer que la conversa fos un vint per cent més cara que no activar-lo. Vas pagar la prima d’escriptura d’1,25× sobre 109.730 tokens i no vas llegir res. No hi ha error, no hi ha avís, i la funció està activada.
Així que la regla, i és tot el prompt caching en una línia: contingut estable davant, contingut variable darrere. Instruccions de sistema, definicions d’eines i material de referència primer; timestamps, identitat de l’usuari i la pregunta actual al final. Anthropic fa explícita la jerarquia: la cache segueix tools → system → messages, i un canvi a qualsevol nivell invalida aquell nivell i tot el que ve després, de manera que editar una sola descripció d’eina invalida tota la cache.5
Dues conseqüències fan entrebancar la gent. Canviar quines eines estan activades canvia les definicions d’eines, així que un feature flag que afegeix una eina per a alguns usuaris parteix la cache en dues. I a Anthropic, activar o desactivar la cerca web o les cites modifica el system prompt, cosa que invalida les caches de sistema i de missatges sense que hagis tocat ni una línia del teu propi text.
Retallar l’historial no és la solució
Enllaç a la secció: Retallar l’historial no és la solucióLa resposta òbvia a una factura quadràtica és deixar d’enviar tot l’historial: conservar la darrera dotzena de missatges i descartar la resta. Redueix la factura, i normalment és el moviment equivocat, i la mesura explica per què.
| estratègia | total | contra historial complet + cache |
|---|---|---|
| historial complet, sense cache | $0.274386 | +211 % |
| historial complet, caching | $0.088250 | — |
| últims 12 missatges, sense cache | $0.118712 | +35 % |
| últims 12 missatges, caching activat | $0.122546 | +39 % |
Retallar a una window de dotze missatges és un 57 % més barat que enviar-ho tot sense cache: la comparació que fa tothom i el motiu pel qual la tècnica és popular. Però és un 39 % més car que enviar-ho tot amb una cache que funciona, i activar caching juntament amb truncation ho empitjora lleugerament en lloc de millorar-ho.
El mecanisme torna a ser el prefix. Una sliding window elimina el missatge més antic a cada torn, de manera que el prompt ja no comença on començava l’última vegada i cada torn presenta un prefix nou. La guia d’OpenAI diu exactament això: «la summarisation, la compaction o la context truncation poden canviar el prefix i reiniciar la reutilització de cache».6 Al torn 40, el prompt en window és de 813 tokens, per sota del mínim de 1.024 tokens, així que no es pot cachejar gens.
I els diners són la meitat barata del cost. El que has descartat és la instrucció que l’usuari va donar al torn 2 i que el model necessitava al torn 40. Truncation intercanvia una factura que pots veure per una fallada que no pots veure, i fer-ho bé —compaction, notes estructurades fora de la window, recuperar historial sota demanda— és el tema del capítol 24.
Travessar un tier repricia tota la request
Enllaç a la secció: Travessar un tier repricia tota la requestEls contexts llargs no són més cars només perquè són més llargs. Passat un llindar, són més cars per token, i el llindar s’aplica retroactivament a tot el prompt.
La pàgina de model d’OpenAI per a gpt-5.6-terra ho diu en una frase: «Els prompts amb >272K input tokens tenen un preu de 2× input i 1,5× output per a tota la request».7 No per l’excés. Per tot.
prompt 271,999 + 500 output -> $0.5500
prompt 272,000 + 500 output -> $0.5500
prompt 272,001 + 500 output -> $1.0970Un token, cinquanta-cinc cèntims. Si el teu servei construeix prompts a partir de documents recuperats que no controles en mida, tens un precipici al teu model de costos en una frontera que ningú del teu equip no ha escrit.
El preu de Google funciona de la mateixa manera amb un llindar de 200.000 tokens: Gemini 2.5 Pro costa $1.25 per milió d’input tokens per a prompts fins a 200K i $2.50 per sobre, amb l’output passant de $10.00 a $15.00.8 Anthropic va anar en sentit contrari: a 6 de setembre de 2026, la seva documentació afirma que Claude 4.6 i posteriors inclouen tota la window d’un milió de tokens al preu estàndard, així que «una request de 900k tokens es factura a la mateixa tarifa per token que una request de 9k tokens».9 Els models anteriors mantenien el recàrrec.
Per això un preu no és un número. Un preu és una taula de tiers indexada per la llargada del prompt, que és per a què serveix Tier[] a la funció de cost, i per això computeCost selecciona el tier fent servir tot el prompt en lloc de cada compartiment per separat.
Prefill, decode, i per què l’output costa sis vegades l’input
Enllaç a la secció: Prefill, decode, i per què l’output costa sis vegades l’inputEls cinc compartiments es corresponen amb les dues fases del capítol 13, i quan veus la correspondència les ràtios de preu deixen de semblar arbitràries.
Els input tokens són prefill. Tot el prompt passa pel model en una sola passada, processat en paral·lel: grans multiplicacions de matrius, limitades pel càlcul. El cost per token és baix, i aquesta és la fase que fixa el temps fins al primer token: un prompt de 4.947 tokens té 4.947 tokens de prefill per fer abans que aparegui la primera paraula.
Els output tokens són decode. Es produeixen d’un en un, cadascun amb un forward pass complet que llegeix tota la KV cache, amb la GPU sobretot esperant la memòria en lloc de calcular. Aquesta és la fase que fixa els tokens per segon, no es pot paral·lelitzar dins d’una sola resposta, i és per això que l’output costa aproximadament sis vegades l’input al model valorat aquí: $12.00 contra $2.00 per milió de tokens.
D’això se’n desprenen directament tres conseqüències. Una lectura de cache substitueix feina de prefill, així que compra latència i diners alhora: el mateix descompte apareix com una factura més baixa i una espera més curta fins al primer token. Els reasoning tokens són decode que no veus, i per això un model de reasoning no stream res durant uns segons i després respon ràpidament: el capítol 12 avisava de la conseqüència d’interfície, i aquesta és la conseqüència a la factura. I aturar un stream no atura la generació: el capítol 14 va construir la cancel·lació i va deixar el preu per a aquest capítol, i el preu és el recompte complet d’output, perquè els tokens es produeixen i es facturen tant si algú escolta com si no. El mateix passa amb la resposta que ningú conserva: regenerar cinc vegades una resposta del torn 40 costa $0.057990 per la que queda a la pantalla.
Comptar tokens abans d’enviar-los
Enllaç a la secció: Comptar tokens abans d’enviar-losEl tokenizer del capítol 7 era Python i s’hi va quedar. El pressupost es fa al servidor que construeix la request, així que ha de passar aquí, i hi ha exactament tres nivells de precisió disponibles.
Nivell u: comptar localment. js-tiktoken porta les mateixes taules de BPE merge que el tiktoken de Python, així que dona un recompte byte per byte idèntic per als encodings d’OpenAI, sense cap call de xarxa:
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);
}Les dues constants importen i són el lloc on els recomptes locals deriven. El teu text no és el que es tokenitza: el chat template del capítol 11 embolcalla cada missatge amb marcadors de rol abans, i aquests són tokens que pagues. Quatre per missatge i tres per preparar la resposta és l’aproximació convencional per als models de chat d’OpenAI; al llarg dels vuitanta-un missatges de la conversa anterior sumen 324 tokens, el 6,4 % de la seva llargada. Els recomptes d’aquí s’han contrastat amb el tiktoken de Python del capítol 7 en totes vuitanta-una cadenes i són idèntics.
Nivell dos: preguntar al provider. Anthropic exposa /v1/messages/count_tokens i Google exposa count_tokens, tots dos acceptant la mateixa forma de request que una call real i retornant gratuïtament un recompte d’input tokens. Fes-los servir quan no puguis comptar localment, i no pots comptar localment per Anthropic, que no publica el tokenizer. La documentació d’Anthropic és curosa sobre què t’està donant: el recompte «és una estimació», i «pot incloure tokens afegits automàticament per Anthropic per a optimitzacions de sistema», pels quals «no se’t factura».10
Nivell tres: llegir usage a la resposta. Aquesta és la veritat, i arriba després que els diners ja s’hagin gastat. Precisament per això existeixen els dos primers nivells: per decidir si envies la request, no per facturar-la.
Les coses que pagues i que ningú no et mostra
Enllaç a la secció: Les coses que pagues i que ningú no et mostraQuatre partides que no apareixen com a partides.
El system prompt, pagat a cada call. El d’aquí dalt són 192 tokens amb el seu overhead de plantilla. En quaranta calls són 7.680 tokens: el 5,6 % de tota la factura d’aquesta conversa, per vuit línies escrites una vegada. També és el millor candidat possible per a cache, perquè és estable i va primer.
Definicions d’eines. El nom, la descripció i el JSON schema de cada eina surten a cada request, i els providers hi afegeixen bastida a sobre. Anthropic publica el número: activar eines ja afegeix un system prompt ocult de 496 tokens a Claude Sonnet 4.5 amb tool_choice configurat a auto, o 588 amb any o una eina amb nom.9 Això és abans dels teus propis schemas. El capítol 18 construeix el catàleg; el capítol 24 mesura què es menja.
Cada generació, incloses les que descartes. Cinc regeneracions costen cinc vegades. El chat en mostra una.
Pensaments que no se’t mostren. La facturació es basa en tots els thought tokens encara que només es retorni un resum, i cap comptabilitat teva no pot auditar aquest número.
Tenir 200K tokens no és fer-los servir
Enllaç a la secció: Tenir 200K tokens no és fer-los servirUn avís per tancar, perquè és el pensament natural següent i la resposta no és l’òbvia.
Una window d’un milió de tokens no vol dir un milió de tokens usables. La precisió de retrieval es degrada amb la posició: Liu et al. van trobar que els models localitzen informació de manera fiable al començament i al final d’un input llarg, i molt menys al mig.11 Una window més gran compra la capacitat d’enviar més, no la certesa de ser llegit.
Aquest fenomen es mesura una vegada en aquest curs —la taxa de retrieval en nou posicions dins el mateix prompt de 853 tokens— i pertany al capítol 24, on canvia el que fa un agent. Se cita aquí perquè canvia el que hauries de comprar: el token més barat és el que no has enviat.
Cap on va això ara
Enllaç a la secció: Cap on va això araAra pots predir què costarà una call abans de fer-la, llegir què ha costat després, i distingir una cosa de l’altra. Això cobreix tot sobre la request excepte la part que encara no has tocat: els controls.
El capítol 17 és sampling: temperature, top-p, top-k, les penalitzacions i el determinisme que no tens. Comença desmuntant l’error més estès del sector, que temperature és un dial de creativitat. No ho és: temperature divideix els logits del capítol 4 abans de la softmax, i apujar-la no fa imaginatiu el model, sinó que augmenta la probabilitat de tokens que el mateix model ha puntuat com a pitjors. A partir d’aquí, per què greedy decoding produeix text mesuradament pitjor que sampling, per què top-k i top-p fallen en formes oposades de distribució, i l’experiment amb què acaba el capítol: vint forward passes idèntics a temperature 0 tornen idèntics bit a bit quan el model s’executa sol, i posar el mateix prompt en un batch al costat de les requests d’algú altre mou el 97 % dels seus logits.
No coincideixen tots. El motiu comença amb el requadre de coma flotant del capítol 2.
Fonts i mètode
Enllaç a la secció: Fonts i mètodeTots els preus, llindars i multiplicadors d’aquest capítol es van llegir a les pàgines pròpies dels providers el 6 de setembre de 2026 i s’indiquen amb aquesta data perquè canviaran. El mètode importa més que els números: els compartiments, la regla de prefix i l’aritmètica de tiers han estat estables durant dos anys mentre que totes les xifres que contenen s’han mogut.
La classe 2 de Stanford CS336, Resource accounting, és el tractament acadèmic més proper d’aquest material i la lectura següent adequada: fa la mateixa aritmètica al costat de training que aquest capítol fa al costat d’inference. Els recomptes de tokens d’aquí s’han produït amb js-tiktoken 1.0.21 fent servir els encodings o200k_base i cl100k_base, sobre una conversa de quaranta torns de 5.090 tokens; l’overhead de plantilla per missatge és l’aproximació convencional de quatre més tres i s’indica sempre que s’hi inclou. Les xifres de cache, tier i truncation són les regles de preus documentades aplicades a aquells recomptes de tokens mesurats, no observacions de respostes d’API en viu: no s’ha fet cap call de pagament per produir aquest capítol, que també és la raó honesta per la qual les afirmacions de latència són qualitatives i les afirmacions de cost no.
Referències
Enllaç a la secció: Referències-
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). Per què el sostre es va moure sense que canviés el cost asimptòtic. ↩
-
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, i Token counting,ai.google.dev/gemini-api/docs/tokens, totes dues consultades el 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.» L’objecte d’ús informa detotal_input_tokens,total_output_tokens,total_thought_tokens,total_cached_tokens,total_tool_use_tokensitotal_tokens: sis compartiments, amb pensaments i ús d’eines fora del recompte d’output. El nom de camp anterior per a la mateixa quantitat, que encara retorna la superfície generateContent, ésthoughtsTokenCount, documentat en una tercera pàgina,ai.google.dev/gemini-api/docs/generate-content/thinking. ↩ -
Anthropic, Prompt caching,
docs.anthropic.com/en/docs/build-with-claude/prompt-caching, consultat el 2026-09-06. Font de la jerarquia d’invalidaciótools→system→messagesi la seva taula; les llargades mínimes cachejables per model; la identitattotal_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens; i la vida per defecte de cinc minuts renovada sense càrrec a cada encert. ↩ ↩2 -
OpenAI, Prompt caching,
platform.openai.com/docs/guides/prompt-caching, consultat el 2026-09-06. Font de: la regla del prefix renderitzat sencer; el prefix mínim cachejable (1.024 input tokens visibles a GPT-5.6 i posteriors, 2.048 anteriors); els multiplicadors d’escriptura 1,25× i de lectura 0,1×, i l’absència de qualsevol càrrega d’escriptura a GPT-5.5 i anteriors; la vida de 30 minuts; els límits de quatre escriptures per request i cinquanta punts de ruptura; la nota d’afinitat de màquina iprompt_cache_key; els exemples treballats de punt d’equilibri 1,35×, 2,15× i 10×; i l’afirmació que summarisation, compaction o truncation reinicien la reutilització de cache. ↩ ↩2 -
OpenAI, Pricing (
platform.openai.com/docs/pricing) i la pàgina de model per agpt-5.6-terra, totes dues consultades el 2026-09-06.gpt-5.6-terra, tier de servei estàndard, per milió de tokens: input $2.00, cached input $0.20, escriptures de cache $2.50, output $12.00; long context input $4.00, cached $0.40, escriptures $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 de 1.050.000 tokens amb un màxim de 922.000 input tokens. La mateixa taula llistagpt-6-astraa $10.00/$1.00/$12.50/$50.00 igpt-5.6-lunaa $0.20/$0.02/$0.25/$1.20. Tots els costos treballats en aquest capítol fan servir les tarifes estàndard de short-context degpt-5.6-terra. ↩ -
Google, Gemini Developer API pricing,
ai.google.dev/gemini-api/docs/pricing, consultat el 2026-09-06. Gemini 2.5 Pro, per milió de tokens: input $1.25 per a prompts fins a 200K i $2.50 per sobre; output $10.00 i $15.00, en tots dos casos etiquetat «including thinking tokens»; context caching $0.125 i $0.25, més una càrrega d’emmagatzematge de $4.50 per milió de tokens per hora. Gemini 3.1 Pro Preview fa servir el mateix llindar de 200K a $2.00/$4.00 d’input i $12.00/$18.00 d’output. ↩ -
Anthropic, Pricing,
docs.anthropic.com/en/docs/about-claude/pricing, consultat el 2026-09-06. Per milió de tokens, input base / escriptura de cache de 5 minuts / escriptura de cache d’1 hora / lectura de cache / 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. Multiplicadors: 1,25× per a l’escriptura de cinc minuts, 2× per a l’escriptura d’una hora, 0,1× per a una lectura. També és la font de l’afirmació sobre long context («Claude 4.6 and later models... include the full 1M token context window at standard pricing»), dels recomptes de tokens del system prompt d’ús d’eines (496 tokens a Claude Sonnet 4.5 ambtool_choicedeautoonone, 588 ambanyo una eina amb nom), i de la nota que Claude 4.7 i posteriors fan servir un tokenizer més nou que produeix «aproximadament un 30 % més de tokens per al mateix text». ↩ ↩2 ↩3 -
Anthropic, Token counting,
docs.anthropic.com/en/docs/build-with-claude/token-counting, consultat el 2026-09-06. L’endpoint/v1/messages/count_tokensrep els mateixos inputs que un missatge i retorna un recompte d’input tokens; la documentació afirma que el recompte és una estimació, que pot incloure tokens que Anthropic afegeix per a optimitzacions de sistema, i que aquests no es facturen. ↩ -
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). Citat aquí, mesurat al capítol 24. ↩