Spring til indhold
16/30Kapitel 16 af 30

Context window, tokens og regningen — målt

En målt samtale på 40 ture koster 22 gange sin egen længde i input tokens. Caching skærer 68 %; et forkert timestamp lægger 20 % til.

På denne side

Her er en support-samtale på fyrre ture, faktureret tur for tur. Der er ikke noget usædvanligt i den: en udvikler spørger om en API, en assistant svarer med et afsnit eller to. Hele udvekslingen er 5.090 tokens tekst — cirka otte sider.

turprompt tokensny tekstoutputpris for denne turløbende total
121318183$0.002622$0.002622
589214123$0.003260$0.014354
101,65619114$0.004680$0.035530
202,86818103$0.006972$0.094426
303,9412099$0.009070$0.174170
404,94717142$0.011598$0.274386

Læs anden og tredje kolonne sammen. Ved tur 40 skrev brugeren sytten tokens og blev opkrævet for 4.947. Spørgsmålet var ikke sværere end det første; det var kortere. Det, der ændrede sig, er, at anmodningen bar hele samtalen med sig, igen, for fyrretyvende gang.

Samlet antal input tokens faktureret på tværs af de fyrre kald: 112.617. Samtalen er 5.090 tokens lang. Du betalte for den toogtyve gange.

Dette kapitel handler om, hvorfor det sker, hvad det kaldes på hver udbyders faktura, og hvilke af de fem ting, du bliver opkrævet for, du faktisk kan gøre noget ved.

Vis detaljer

Hvad dette kapitel behøver fra del II.

  • Kapitel 7 byggede tokenizer’en. En token er også enheden her — den samme enhed, nu med pris på.
  • Kapitel 9 udledte self-attention og dens O(n2)O(n^2)-omkostning i boksen om asymptotisk notation. Den omkostning er grunden til, at der overhovedet findes en grænse, og den linkes her i stedet for at blive forklaret igen.
  • Kapitel 13 målte prefill mod decode og beregnede, hvad en KV cache fylder. De to faser er det, input- og outputkolonnerne ovenfor faktisk køber.

Alt andet er TypeScript, fordi dette er regnskab for et fjernkald og ikke matematik om en model.

Den dyreste misforståelse i denne branche er, at en model husker en samtale.

Det gør den ikke, og mekanismen fra kapitel 13 siger præcis hvorfor. En transformers tilstand under generering er KV cache: de keys og values, der beregnes for hver token i sekvensen. Den cache lever i varigheden af én anmodning. Når anmodningen slutter, er processen, der holdt den, fri til at betjene en anden, og cachen er væk. Der er ikke noget lager pr. bruger på den anden side, og ingen session.

Så den næste anmodning skal ankomme med alt det, modellen skal vide, og modellen genopbygger den tilstand ved at køre et forward pass over hele prompt, før den udsender en eneste ny token. Kapitel 15 kaldte prompt’en ”hele tilstanden”. Dette er den fysiske grund: prompt’en er den komplette tilstand, fordi intet andet overlever kaldet.

Context window er den maksimale længde af den prompt plus dens svar. Det er et loft over, hvor meget tilstand du kan genopbygge, ikke en beholder, der holder på noget mellem anmodninger. At kalde det ”modellens hukommelse” vender årsagssammenhængen baglæns — du fylder ikke en hukommelse, du betaler for at genetablere en.

Det er der, de toogtyve kommer fra. Tur nn bærer alle n1n-1 tidligere ture, så det samlede input på tværs af en samtale på nn ture er summen af en voksende række, som er kvadratisk:

total input  =  i=1n(s+hi)  =  Θ(n2)\text{total input} \;=\; \sum_{i=1}^{n} \big(s + h_i\big) \;=\; \Theta(n^2)

hvor ss er system prompt, og hih_i er historikken ved tur ii. Tilpasning af det målte kumulative input til an2+bnan^2 + bn over de fyrre ture giver 60.22n2+432.25n60.22\,n^2 + 432.25\,n, hvilket forudsiger 113.645 tokens ved tur 40 mod 112.617 målte. Det kvadratiske led dominerer, og det lineære led er det, brugeren faktisk skrev.

Konsekvensen er den sætning, du skal tage med fra kapitlet: din regning vokser med kvadratet på samtalen, ikke med det sidste spørgsmål. De samme fyrre spørgsmål stillet helt uden historik kostede $0.066036. At beholde historikken kostede $0.274386. Historik gangede regningen med 4,2, og den vil blive ved med at gange, fordi multiplikatoren er samtalelængden.

Vinduet er endeligt af to grunde, der trækker i samme retning. Den første er kapitel 9’s: attention sammenligner hver token med hver anden token, så lagets arbejde vokser med kvadratet på sekvenslængden. Den anden er hukommelse: KV cache vokser lineært med sekvenslængden, og kapitel 13 lavede den aritmetik — ved lange sekvenser er den større end vægtene.

Begge grænser er blevet angrebet, og ingen af dem er blevet fjernet. FlashAttention1 omorganiserer beregningen, så den læser og skriver langt mindre til high-bandwidth memory, hvilket gør lange sekvenser praktiske uden at ændre den asymptotiske omkostning. Position Interpolation2 og YaRN3 udvider en trænet models brugbare vindue ved at reskalere de positionelle encodings fra kapitel 9 i stedet for at træne på ny. Tilsammen er de grunden til, at vinduer gik fra 2K til 1M på fem år.

Det, de ikke gjorde, var at gøre lange contexts gratis. De hævede loftet og gjorde hældningen mildere. Hældningen er der stadig, og det er den, pristiers senere i kapitlet måler.

Næsten alle cost calculators på internettet modellerer et API-kald som input tokens gange en inputpris plus output tokens gange en outputpris. Det var sandt i 2023. Nu er det forkert på en måde, der giver regninger, som kan ramme ved siden af med en faktor to eller mere i begge retninger.

Der er fem fakturerbare token-kategorier:

buckethvad det ertypisk pris, relativt til input
uncached inputprompt tokens modellen måtte behandle fra ny
cache readprompt tokens leveret fra et gemt præfiks0,1×
cache writeprompt tokens gemt i cachen på dette kald1,25× til 2×
outputtokens modellen genererede og sendte til dig5× til 6×
reasoningtokens modellen genererede og ikke sendte til digoutput-sats

Tre af de fem fandtes ikke som separate linjer for to år siden, og de to cache-linjer er dem, folk tager fejl af, fordi et cache write koster mere end almindeligt input, ikke mindre. Du betaler en præmie for at gemme noget, så du kan betale rabat for at læse det tilbage, og om den handel er god, afhænger helt af, hvor mange gange du læser det.

Reasoning-bucket’en er kapitel 12’s, nu med pris på, og den har en detalje, der er værd at sige tydeligt: Googles dokumentation siger, at pricing ”is based on the full thought tokens the model needs to generate, despite only the summary being output from the API.”4 Du bliver faktureret for tokens, der aldrig bliver transmitteret til dig. Det er den eneste bucket, hvis indhold du ikke kan tælle, inspicere eller verificere.

Nu den del, der gør dette til et normaliseringsproblem i stedet for et multiplikationsproblem. Hver udbyder rapporterer disse buckets under forskellige navne, og — dette er fælden — to af dem bruger det samme ord om to forskellige størrelser.

Tag ét kald: 4.837 tokens læst fra cache, 110 friske, 142 synlige output tokens, 300 reasoning tokens.

three usage payloads, one callJSON
// 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 } }

Se på prompt_tokens: 4947 og input_tokens: 110. Begge felter er input token-antallet for den samme prompt. OpenAI’s inkluderer de cached tokens; Anthropic’s udelukker dem — deres dokumentation angiver identiteten eksplicit, total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens.5 Anthropic’s input_tokens betyder ”tokens efter dit sidste cache-breakpoint”.

Og se på output. OpenAI og Anthropic rapporterer begge 442, som allerede indeholder de 300 reasoning tokens. Gemini rapporterer 142 og lægger de 300 i et felt for sig. Kapitel 12 pegede på dette som en inkompatibilitet mellem to måder at tælle det samme arbejde på; her er, hvad det koster.

En normalizer er tredive linjer, og den er ikke valgfri:

normalise.tsTS
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
  };
};

Kør de tre payloads ovenfor gennem de tre readers, og alle tre producerer den samme Usage og derfor det samme tal: $0.006491. Den enighed er hele pointen med at skrive laget.

Tag fejl, og her er, hvad det koster, på samme kald:

fejlfaktureretafvigelse
at behandle cached_tokens som yderligere til prompt_tokens$0.0161652,49× — du opkræver prompt’en to gange
at behandle cache reads som gratis i stedet for 0,1×$0.0055240,85× — du æder 15 %
at læse candidatesTokenCount og ignorere thoughtsTokenCount$0.00289155 % af kaldet forsvinder

Den tredje er den farlige, fordi den fejler stille i retning af gode nyheder. Dit dashboard viser en reasoning model, der koster mindre end halvdelen af, hvad den koster, og intet nogen steder rejser en fejl.

Når buckets er normaliseret, er cost-funktionen kort. Den eneste ikke-oplagte del er tier-opslaget, som næste afsnit forklarer:

cost.tsTS
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);
}

To designbeslutninger dér er værd at argumentere for. Fallbacks — cache-priser, der falder tilbage til input, reasoning til output — indkoder, hvad en manglende tabel betyder: reasoning tokens på Gemini faktureres til output-satsen, så en fraværende reasoning-pris er ikke nul, den er outputprisen. Og contextSize summerer alle tre input-buckets i stedet for de friske, fordi tier vælges efter, hvor lang prompt’en er, ikke efter hvor meget af den du blev opkrævet fuld pris for.

Prompt caching, og hvad det koster at skrive

Link til afsnittet: Prompt caching, og hvad det koster at skrive

En prompt cache gemmer modellens beregnede tilstand for et præfiks af din prompt, så en senere anmodning med samme præfiks springer genberegningen over. Fire egenskaber følger af ordet ”præfiks”, og alle fire overrasker folk.

Cachen matcher fra begyndelsen af den renderede prompt og fremad og stopper ved den første byte, der afviger. Der er ingen delvis kredit for indhold, der optræder senere i en anden rækkefølge. OpenAI siger det direkte: ”cache reuse requires the entire rendered prefix to match.”6

Under den caches intet, og der returneres ingen fejl. Hos OpenAI er minimum 1.024 tokens for GPT-5.6 og senere og 2.048 for ældre modeller. Hos Anthropic spænder det fra 512 til 4.096 afhængigt af modellen — 1.024 for Claude Sonnet 4.5, 4.096 for Claude Haiku 4.5. Hvis begge cache-felter kommer tilbage som nul, er det som regel derfor.

Skrivning koster mere end læsning og mere end ikke at cache

Link til afsnittet: Skrivning koster mere end læsning og mere end ikke at cache

Hos OpenAI og Anthropic koster et cache write 1,25× den uncached input-sats for den kortlivede cache, og Anthropic’s en-times-cache koster 2×. Et read koster 0,1×. Google tager intet for at skrive, men udlejer lageret: $4.50 pr. million tokens pr. time på Gemini 2.5 Pro.

Den udløber, og den lever på én maskine

Link til afsnittet: Den udløber, og den lever på én maskine

Anthropic’s standardentry lever fem minutter, opdateret gratis ved hvert hit. OpenAI’s er mindst tredive minutter efter seneste write eller reuse. Og OpenAI bemærker, at cached tilstande lever på individuelle maskiner, så en anmodning rammer kun, hvis den routes til maskinen, der holder entry’en — hvilket er det, prompt_cache_key påvirker, uden at garantere.

Break-even er lille nok til at holde i hovedet, og OpenAI’s dokumentation laver aritmetikken: at skrive et præfiks én gang og genbruge det én gang koster 1,35× dets almindelige inputpris, mod 2× for at behandle det to gange uncached; over ti anmodninger koster ét write og ni reads 2,15× mod 10×. Én reuse betaler for write’et. Anthropic lander samme sted: ét read for fem-minutters-cachen, to for en-times-cachen.

Nu samtalen på fyrre ture igen, med caching slået til og stabilt præfiks:

uncached inputcache readscache writestotal
ingen cache112,617$0.274386
caching2,887104,7834,947$0.088250

Otteogtres procent billigere, og tre tal i tabellen fortjener opmærksomhed.

Cachen aktiveres først ved tur 6. Prompt’en når ikke 1.024 tokens før da, så de første fem ture faktureres præcis som før — og den sjette faktureres værre, med 1,25× write-præmien, fordi det er turen, der fylder cachen. Det første read kommer ved tur 7. De 2.887 uncached tokens i tabellen er aritmetikken: fem tures værdi, ikke seks. Caching er en rabat på lange prompts, og en kort samtale får intet ud af den.

Write-præmien er $0.002474, hvilket er 2,8 % af den cached regning. Hver tur skriver sin nye hale, fyrre gange, og hele write-præmien er en afrundingsfejl i forhold til, hvad reads sparede. Write-opkrævningen er værd at forstå præcist, så du holder op med at bekymre dig om den.

Kun 2.887 tokens blev opkrævet til fuld inputpris ud af 112.617. Det er formen på en fungerende cache: næsten alt er et read.

Rækkefølgen i prompt’en afgør, om noget af dette sker

Link til afsnittet: Rækkefølgen i prompt’en afgør, om noget af dette sker

Her er fejlen, der koster rigtige penge, og det er en bug på én linje.

Læg noget, der ændrer sig ved hvert kald, nær starten af prompt’en — et timestamp, et request id, brugerens navn, en ”i dag er”-linje, et frisk hentet dokument — og præfikset afviger fra byte ét. Intet matcher. Hvert kald er et miss. Og fordi hvert kald præsenterer et nyt præfiks, skriver hvert kald også.

Samme samtale, samme fyrre ture, caching slået til, med et timestamp pr. kald øverst i system prompt:

totalversus
slet ingen caching$0.274386
caching, stabilt præfiks$0.088250−67,8 %
caching, volatilt præfiks$0.329251+20,0 %

At slå prompt caching til gjorde samtalen tyve procent dyrere end ikke at slå det til. Du betalte 1,25× write-præmien på 109.730 tokens og læste nul tilbage. Der er ingen fejl, ingen advarsel, og funktionen er slået til.

Så reglen, og det er hele prompt caching på én linje: stabilt indhold forrest, variabelt indhold bagerst. Systeminstruktioner, tool-definitioner og referencemateriale først; timestamps, brugeridentitet og det aktuelle spørgsmål sidst. Anthropic gør hierarkiet eksplicit — cachen følger toolssystemmessages, og en ændring på ethvert niveau invaliderer det niveau og alt efter det, så redigering af en enkelt tool-beskrivelse invaliderer hele cachen.5

To konsekvenser folk snubler over. At ændre hvilke tools der er enabled, ændrer tool-definitionerne, så en feature flag, der tilføjer et tool for nogle brugere, deler din cache i to. Og hos Anthropic ændrer toggling af web search eller citations system prompt, hvilket invaliderer system- og message-caches uden at du rører en linje af din egen tekst.

At trunkere historikken er ikke løsningen

Link til afsnittet: At trunkere historikken er ikke løsningen

Den oplagte reaktion på en kvadratisk regning er at stoppe med at sende hele historikken: behold de sidste dusin beskeder og drop resten. Det reducerer regningen, og det er som regel det forkerte træk, og målingen siger hvorfor.

strategitotalversus fuld historik + cache
fuld historik, ingen cache$0.274386+211 %
fuld historik, caching$0.088250
sidste 12 beskeder, ingen cache$0.118712+35 %
sidste 12 beskeder, caching slået til$0.122546+39 %

At trunkere til et vindue på tolv beskeder er 57 % billigere end at sende alt uncached — den sammenligning alle laver, og grunden til at teknikken er populær. Men det er 39 % dyrere end at sende alt med en fungerende cache, og at slå caching til sammen med trunkering gør det en smule værre i stedet for bedre.

Mekanismen er igen præfikset. Et glidende vindue dropper den ældste besked ved hver tur, så prompt’en starter ikke længere, hvor den startede sidste gang, og hver tur præsenterer et nyt præfiks. OpenAI’s vejledning siger præcis dette: ”summarisation, compaction, or context truncation can change the prefix and reset cache reuse.”6 Ved tur 40 er den vinduede prompt 813 tokens, under minimum på 1.024 tokens, så den kan slet ikke caches.

Og pengene er den billige halvdel af omkostningen. Det, du droppede, er instruktionen, brugeren gav ved tur 2, som modellen havde brug for ved tur 40. Trunkering bytter en regning, du kan se, for en fejl, du ikke kan, og at gøre det ordentligt — komprimering, strukturerede noter holdt uden for vinduet, hente historik on demand — er kapitel 24’s emne.

At krydse en tier omprissætter hele anmodningen

Link til afsnittet: At krydse en tier omprissætter hele anmodningen

Lange contexts er ikke blot dyrere, fordi de er længere. Efter en tærskel er de dyrere pr. token, og tærsklen gælder retroaktivt for hele prompt’en.

OpenAI’s modelside for gpt-5.6-terra siger det i én sætning: ”Prompts with >272K input tokens are priced at 2x input and 1.5x output for the full request.”7 Ikke for overskuddet. For det hele.

the most expensive token you will ever sendTEXT
prompt 271,999 + 500 output  ->  $0.5500
prompt 272,000 + 500 output  ->  $0.5500
prompt 272,001 + 500 output  ->  $1.0970

Én token, femoghalvtreds cent. Hvis din service bygger prompts fra hentede dokumenter, hvis størrelse du ikke kontrollerer, har du en klippe i din cost-model ved en grænse, ingen på dit team har skrevet ned.

Googles pricing fungerer på samme måde med en tærskel på 200.000 tokens: Gemini 2.5 Pro koster $1.25 pr. million input tokens for prompts op til 200K og $2.50 over den, hvor output går fra $10.00 til $15.00.8 Anthropic gik den anden vej — pr. 6. september 2026 angiver deres dokumentation, at Claude 4.6 og senere inkluderer hele vinduet på én million tokens til standardpris, så ”a 900k-token request is billed at the same per-token rate as a 9k-token request.”9 Tidligere modeller beholdt tillægget.

Derfor er en pris ikke et tal. En pris er en tabel af tiers nøgleført efter prompt-længde, hvilket er, hvad Tier[] i cost-funktionen er til, og det er derfor, computeCost vælger tier ved hjælp af hele prompt’en i stedet for hver bucket separat.

Prefill, decode, og hvorfor output koster seks gange input

Link til afsnittet: Prefill, decode, og hvorfor output koster seks gange input

De fem buckets mapper til kapitel 13’s to faser, og når du først ser mappingen, holder prisforholdene op med at se vilkårlige ud.

Input tokens er prefill. Hele prompt’en går gennem modellen i ét pass, behandlet parallelt — store matrixmultiplikationer, compute-bound. Pris pr. token er lav, og dette er fasen, der sætter time to first token: en prompt på 4.947 tokens har 4.947 tokens prefill at udføre, før det første ord dukker op.

Output tokens er decode. De produceres én ad gangen, hver som et fuldt forward pass, der læser hele KV cache, mens GPU’en mest venter på hukommelse i stedet for at beregne. Dette er fasen, der sætter tokens per second, den kan ikke paralleliseres inden for ét svar, og det er derfor, output koster cirka seks gange input på modellen prissat her: $12.00 mod $2.00 pr. million tokens.

Tre konsekvenser følger direkte. Et cache read erstatter prefill-arbejde, så det køber latency og penge på én gang — den samme rabat viser sig som en lavere regning og en kortere ventetid på den første token. Reasoning tokens er decode, du aldrig ser, og derfor streamer en reasoning model ingenting i flere sekunder og svarer så hurtigt: Kapitel 12 advarede om interface-konsekvensen, og dette er fakturakonsekvensen. Og at afbryde en stream stopper ikke genereringenkapitel 14 byggede cancellation og lod prisen vente til dette kapitel, og prisen er det fulde output-antal, fordi tokens produceres og faktureres, uanset om nogen lytter. Det samme gælder svaret, ingen beholder: at regenerere et tur 40-svar fem gange koster $0.057990 for det ene, der bliver stående på skærmen.

Tokenizer’en fra kapitel 7 var Python og blev dér. Budgettering sker på den server, der bygger anmodningen, så det skal ske her, og der er præcis tre niveauer af nøjagtighed til rådighed.

Niveau ét: tæl lokalt. js-tiktoken leverer de samme BPE merge-tabeller som Python-tiktoken, så du får en byte-for-byte identisk optælling for OpenAI encodings uden netværkskald:

count.tsTS
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);
}

De to konstanter betyder noget, og det er dér lokale optællinger driver. Din tekst er ikke det, der tokenizes — chat-skabelonen fra kapitel 11 pakker først hver besked ind i role markers, og de er tokens, du betaler for. Fire pr. besked og tre for reply priming er den konventionelle approksimation for OpenAI chat-modeller; på tværs af de enogfirs beskeder i samtalen ovenfor løber de op i 324 tokens, 6,4 % af dens længde. Optællingerne her blev krydstjekket mod Python-tiktoken fra kapitel 7 på alle enogfirs strenge og er identiske.

Niveau to: spørg udbyderen. Anthropic eksponerer /v1/messages/count_tokens, og Google eksponerer count_tokens, begge accepterer den samme request shape som et rigtigt kald og returnerer et input token-antal gratis. Brug dem, når du ikke kan tælle lokalt — og du kan ikke tælle lokalt for Anthropic, hvis tokenizer ikke er offentliggjort. Anthropic’s dokumentation er omhyggelig med, hvad den giver dig: optællingen ”is an estimate”, og den ”may include tokens added automatically by Anthropic for system optimizations”, som ”you are not billed” for.10

Niveau tre: læs usage i svaret. Det er sandheden, og den ankommer, efter pengene er brugt. Det er præcis derfor, de første to niveauer findes — for at beslutte, om anmodningen skal sendes, ikke for at fakturere den.

De ting, du betaler for, som ingen viser dig

Link til afsnittet: De ting, du betaler for, som ingen viser dig

Fire line items, der ikke optræder som line items.

System prompt, betalt ved hvert kald. Den ovenfor er 192 tokens med sit template-overhead. Over fyrre kald er det 7.680 tokens — 5,6 % af hele samtalens regning, for otte linjer skrevet én gang. Den er også den bedst mulige cache-kandidat, fordi den både er stabil og først.

Tool-definitioner. Hvert tools navn, beskrivelse og JSON schema sendes ud på hver anmodning, og udbydere lægger scaffolding ovenpå. Anthropic offentliggør tallet: at enable tools overhovedet tilføjer en skjult system prompt på 496 tokens på Claude Sonnet 4.5 med tool_choice sat til auto, eller 588 med any eller et navngivet tool.9 Det er før dine egne schemas. Kapitel 18 bygger kataloget; kapitel 24 måler, hvad det æder.

Hver generation, inklusive dem du kasserer. Fem regenereringer koster fem gange. Chatten viser én.

Tanker, du ikke får vist. Fakturering er baseret på de fulde thought tokens, selv om kun et summary returneres, og intet af dit eget regnskab kan auditere det tal.

Én advarsel at slutte på, fordi det er den naturlige næste tanke, og svaret er ikke det oplagte.

Et vindue på en million tokens betyder ikke en million brugbare tokens. Retrieval-nøjagtighed forringes med position: Liu et al. fandt, at modeller finder information pålideligt i begyndelsen og slutningen af et langt input og langt mindre pålideligt i midten.11 Et større vindue køber evnen til at sende mere, ikke sikkerheden for at blive læst.

Det fænomen måles én gang i dette kursus — retrieval-rate ved ni positioner i den samme 853-token prompt — og det hører hjemme i kapitel 24, hvor det ændrer, hvad en agent gør. Det citeres her, fordi det ændrer, hvad du bør købe: den billigste token er den, du ikke sendte.

Du kan nu forudsige, hvad et kald vil koste, før du laver det, læse hvad det faktisk kostede bagefter, og kende forskel på de to. Det dækker alt om anmodningen bortset fra den del, du ikke har rørt: knapperne.

Kapitel 17 er sampling — temperature, top-p, top-k, penalties og den determinisme, du ikke har. Det starter med at pille den mest udbredte fejl i feltet fra hinanden: at temperature er en kreativitetsskyder. Det er det ikke: temperature dividerer logits fra kapitel 4 før softmax, og at hæve den gør ikke modellen fantasifuld, det hæver sandsynligheden for tokens, modellen selv scorede som dårligere. Derfra: hvorfor greedy decoding giver målbart dårligere tekst end sampling, hvorfor top-k og top-p fejler på modsatte distributionsformer, og eksperimentet, der slutter kapitlet: tyve identiske forward passes ved temperature 0 kommer tilbage bit-for-bit identiske, når modellen kører alene, og at lægge den samme prompt i en batch sammen med andres anmodninger flytter 97 % af dens logits.

De matcher ikke alle. Årsagen begynder med floating-point-boksen fra kapitel 2.


Alle priser, thresholds og multiplikatorer i dette kapitel blev læst fra udbydernes egne sider den 6. september 2026 og angives med den dato, fordi de vil ændre sig. Metoden betyder mere end tallene: buckets, præfiksreglen og tier-aritmetikken har været stabile i to år, mens hver figur i dem har flyttet sig.

Stanford CS336 lecture 2, Resource accounting, er den nærmeste akademiske behandling af dette materiale og den rigtige næste læsning: den laver den samme aritmetik på træningssiden, som dette kapitel laver på inference-siden. Token-antallene her blev produceret med js-tiktoken 1.0.21 ved hjælp af o200k_base- og cl100k_base-encodings over en fyrre-tures samtale på 5.090 tokens; template-overhead pr. besked er den konventionelle fire-plus-tre-approksimation og angives, hvor den er inkluderet. Cache-, tier- og truncation-tallene er de dokumenterede pricing-regler anvendt på de målte token-antal, ikke observationer af live API-svar — der blev ikke lavet noget betalt kald for at producere dette kapitel, hvilket også er den ærlige grund til, at latency-påstandene er kvalitative, og cost-påstandene ikke er det.

  1. Dao, T., Fu, D. Y., Ermon, S., Rudra, A. og Ré, C. FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness. arXiv:2205.14135 (2022). Hvorfor loftet flyttede sig, uden at den asymptotiske omkostning ændrede sig.

  2. Chen, S., Wong, S., Chen, L. og Tian, Y. Extending Context Window of Large Language Models via Positional Interpolation. arXiv:2306.15595 (2023).

  3. Peng, B., Quesnelle, J., Fan, H. og Shippole, E. YaRN: Efficient Context Window Extension of Large Language Models. arXiv:2309.00071 (2023).

  4. Google, Thinking, ai.google.dev/gemini-api/docs/thinking, og Token counting, ai.google.dev/gemini-api/docs/tokens, begge tilgået 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-objektet rapporterer total_input_tokens, total_output_tokens, total_thought_tokens, total_cached_tokens, total_tool_use_tokens og total_tokens — seks buckets, med thoughts og tool use uden for output-antallet. Det tidligere feltnavn for samme størrelse, som stadig returneres af generateContent-surface, er thoughtsTokenCount, dokumenteret på en tredje side, ai.google.dev/gemini-api/docs/generate-content/thinking.

  5. Anthropic, Prompt caching, docs.anthropic.com/en/docs/build-with-claude/prompt-caching, tilgået 2026-09-06. Kilde til invalidationshierarkiet toolssystemmessages og dets tabel; minimum cachebare længder pr. model; identiteten total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens; og den fem minutter lange standardlevetid, der opdateres gratis ved hvert hit. 2

  6. OpenAI, Prompt caching, platform.openai.com/docs/guides/prompt-caching, tilgået 2026-09-06. Kilde til: reglen om hele det renderede præfiks; minimum for cachebart præfiks (1.024 synlige input tokens på GPT-5.6 og senere, 2.048 tidligere); 1,25× write- og 0,1× read-multiplikatorerne samt fraværet af enhver write-opkrævning på GPT-5.5 og tidligere; 30-minutters-levetiden; grænserne på fire writes pr. request og halvtreds breakpoints; noten om machine affinity og prompt_cache_key; de gennemregnede break-even-eksempler på 1,35×, 2,15× og 10×; og udsagnet om, at summarisation, compaction eller truncation nulstiller cache reuse. 2

  7. OpenAI, Pricing (platform.openai.com/docs/pricing) og modelsiden for gpt-5.6-terra, begge tilgået 2026-09-06. gpt-5.6-terra, standard service tier, pr. 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 med et maksimum på 922.000 input tokens. Den samme tabel angiver gpt-6-astra til $10.00/$1.00/$12.50/$50.00 og gpt-5.6-luna til $0.20/$0.02/$0.25/$1.20. Hver gennemregnet cost i dette kapitel bruger gpt-5.6-terra standard short-context-satserne.

  8. Google, Gemini Developer API pricing, ai.google.dev/gemini-api/docs/pricing, tilgået 2026-09-06. Gemini 2.5 Pro, pr. million tokens: input $1.25 for prompts op til 200K og $2.50 over; output $10.00 og $15.00, i begge tilfælde mærket ”including thinking tokens”; context caching $0.125 og $0.25 plus en storage-opkrævning på $4.50 pr. million tokens pr. time. Gemini 3.1 Pro Preview bruger den samme 200K-threshold ved $2.00/$4.00 input og $12.00/$18.00 output.

  9. Anthropic, Pricing, docs.anthropic.com/en/docs/about-claude/pricing, tilgået 2026-09-06. Pr. 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. Multiplikatorer: 1,25× for fem-minutters-write, 2× for en-times-write, 0,1× for et read. Også kilden til long-context-udsagnet (”Claude 4.6 and later models... include the full 1M token context window at standard pricing”), token-antallene for tool-use system prompt (496 tokens på Claude Sonnet 4.5 med tool_choiceauto eller none, 588 med any eller et navngivet tool), og noten om, at Claude 4.7 og senere bruger en nyere tokenizer, der producerer ”approximately 30 % more tokens for the same text”. 2 3

  10. Anthropic, Token counting, docs.anthropic.com/en/docs/build-with-claude/token-counting, tilgået 2026-09-06. /v1/messages/count_tokens-endpointet tager de samme inputs som en message og returnerer et input token-antal; dokumentationen angiver, at optællingen er et estimat, at den kan inkludere tokens, Anthropic tilføjer for systemoptimeringer, og at de ikke faktureres.

  11. Liu, N. F., Lin, K., Hewitt, J., Paranjape, A., Bevilacqua, M., Petroni, F. og Liang, P. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (2023). Citeret her, målt i kapitel 24.


Skabt af

David Vicente Campos

Grundlægger af NeuraLIA Labs og medstifter af MyRealFood

Jeg er dataingeniør fra Universitetet i León. Jeg var med til at stifte MyRealFood, hvor jeg som CTO byggede den app, som millioner af mennesker har brugt til at spise bedre, og jeg grundlagde NeuraLIA Labs, hvor jeg bygger AI-produkter. Her skriver jeg om det, jeg har måttet forstå undervejs, sådan som jeg ville ønske, nogen havde forklaret det for mig.

Mere om forfatteren

Udgivet af NeuraLIA Labs.

Få nye indlæg i din indbakke

AI-nyheder, guides og produktopdateringer — en kort mail, når vi udgiver noget, der er værd at bruge tid på.

Vil du hellere have beskeder? De samme indlæg, her:WhatsApp-fællesskab (åbnes i en ny fane)Telegram-kanal (åbnes i en ny fane)

Kursusindeks

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev11 min læsning

Jev AI-modellen er bygget til beslutninger, ikke prosa

TypeSafe AI’s Jev får opmærksomhed, fordi den behandler softwareintelligens som et sandsynlighedsproblem: vælg den rigtige gren, tilføj tillid, og undgå at betale en LLM for at skrive tekst, når kode har brug for en beslutning.

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering11 min læsning

Kontekstteknik til langsigtede AI-agenter

Langvarige agenter fejler ikke kun, fordi vinduet er lille. De fejler, når filer, tool-outputs og forældet historik fortrænger den opgave, agenten skulle færdiggøre.

Klar til at lade LIA vælge for dig?

Byg med alle AI-modeller ét sted — kom gratis i gang i dag.