Siirry sisältöön
21/30Luku 21/30

Multimodaalinen hinnoittelu: mitä kuvat, ääni ja video todella laskuttavat

Samat 500 valokuvaa voivat maksaa 5,5× eri tavoin — ja halvin malli vaihtuu heti, kun joku muuttaa niiden kokoa.

Tällä sivulla

Tässä on yksi tehtävä, hinnoiteltuna kolmella tavalla: kuvaile viisisataa tuotevalokuvaa, yksi lyhyt kuvateksti kuhunkin. Samat valokuvat, sama ohje, saman mittainen vastaus. Ainoa asia joka vaihtuu on se, mikä model niitä lukee.

valokuvagpt-5.6-lunagemini-3.1-flash-liteclaude-haiku-4.5
800 × 600$0.0848$0.1638$0.4380
1024 × 768$0.1200$0.1638$0.6370
1280 × 960$0.1718$0.1638$0.9010
1600 × 1200$0.2558$0.1638$0.9010
4000 × 3000$0.3220$0.1638$0.9010

Tuossa taulukossa kolme asiaa ansaitsee pysähtymisen.

Halvin model vaihtuu kolmannen ja neljännen rivin välissä samassa tehtävässä, koska joku muutti valokuvien kokoa. Pyydä kuvatekstin sijaan kappale, ja leikkauspiste siirtyy taas: koossa 1280 × 960 voittaja on neljänkymmenen token kuvatekstillä Gemini ja neljänsadan token kappaleella OpenAI.

Gemini-sarake ei liiku lainkaan millään rivillä: 4000 \u00d7 3000 valokuva maksaa sille täsmälleen saman kuin 640 \u00d7 480. 4000 × 3000 valokuva maksaa sille täsmälleen saman kuin 640 × 480 valokuva. Se ei ole katto. Se on seurausta tavasta, jolla se laskee, ja se tarkoittaa, että tämän alan yleisin kustannusoptimointi — pienennä kuva ennen lataamista — tuottaa näin:

image tokens, 4000 × 3000 → 800 × 600ajon kustannussäästö
gpt-5.6-luna2,942 → 570$0.3220 → $0.084873.7 %
claude-haiku-4.51,564 → 638$0.9010 → $0.438051.4 %
gemini-3.1-flash-lite1,032 → 1,032$0.1638 → $0.16380.0 %

Mikään näistä luvuista ei ole hinta, jonka toimittaja julkaisee. Kaikki kolme piti laskea kolmesta eri säännöstä, koska valokuva ei ole missään laskutettava yksikkö: se muunnetaan ensin tokens, aritmetiikalla joka on kirjoitettu ylös kolmeen yhteensopimattomaan paikkaan.

Luku 16 rakensi laskun tekstille ja pysähtyi siihen, mihin teksti päättyy. Tämä luku on loput laskusta: kuvat, puhe, transkriptio, video ja raaka laskenta, joita laskutetaan yhteensä kahdeksassa eri yksikössä, sekä menetelmä sellaisten asioiden vertaamiseen, joita ei myydä samalla mitalla.

Näytä lisätiedot

Mitä tämä luku tarvitsee aiemmista luvuista.

  • Luku 7 rakensi tokenizerin ja yksikön. Kaikki tässä on yritystä muuttaa jokin, mikä ei ole tekstiä, tuoksi yksiköksi.
  • Luku 8 määritti, mitä model kuluttaa: ei symboleja vaan vektoreita embedding-avaruudessa. Siksi kuva voidaan ylipäätään hinnoitella tokens.
  • Luku 16 rakensi funktion computeCost, sen hintatasot ja viisi token-säiliötä. Tämä luku laajentaa tuota funktiota eikä korvaa sitä.
  • Luku 11 esitteli LoRA:n fine-tuning-tekniikkana ja Luku 20 hinnoitteli sen budjettipäätöksenä. Tässä se ilmestyy modeliin, joka ei ole kielimalli.

Ei tensoreita, luvun 14 säännön mukaan: tämä on tariffeja, muunnoksia ja kirjanpitoa, joten se on TypeScriptiä.

Miksi valokuvalla on token-hinta

Linkki osioon: Miksi valokuvalla on token-hinta

Transformer ottaa sisäänsä vektorijonon. Sillä ei ole mielipidettä siitä, mistä ne tulivat. Luku 8 syötti sille token id:n perusteella haettuja embeddings; mikään arkkitehtuurissa ei vaadi hakua.

Siis: leikkaa kuva kiinteisiin neliöihin, litistä jokainen neliö numerolistaksi ja työnnä kukin lista yhden opitun lineaarisen kerroksen läpi, jotta saat modelin leveyden mukaisen vektorin. Väripikseleistä koostuva 32 × 32 patch on 32×32×3=307232 \times 32 \times 3 = 3072 numeroa; projektio ERd×3072E \in \mathbb{R}^{d \times 3072} muuttaa sen yhdeksi dd-ulotteiseksi vektoriksi, täsmälleen samaan muotoon jossa teksti-token saapuu. Siinä kaikki, ja tästä kertoo paperi jo otsikossaan: kuva on 16 × 16 sanan arvoinen.1 Lisää sijaintikoodaus, jotta model tietää mikä neliö oli missä, lomita tulokset text embeddingsien kanssa, ja modelin lukema jono on osittain kuvaa ja osittain virkettä.

Kolme paperia teki siitä tuotteen. CLIP koulutti kuvaenkooderin ja tekstienkooderin olemaan samaa mieltä neljästäsadasta miljoonasta kerätystä parista, ja siinä kohtaa ajatus siitä, että pikselit ja sanat voivat jakaa avaruuden, lakkasi olemasta hypoteesi.2 Flamingo pulttasi jäädytetyn vision encoderin jäädytettyyn kielimalliin muutamalla koulutetulla siltakerroksella.3 LLaVA osoitti, että silta saattoi olla yksi lineaarinen projektio ja että instruction-following voitiin opettaa generoidulla datalla, minkä vuoksi jokainen avoin vision-language model sen jälkeen näyttää suunnilleen samalta.4

Seuraus laskullesi on välitön ja epäglamourinen: patchit ovat sijainteja jonossa, joten ne ovat input tokens, joten maksat niistä input-hinnalla. Kuinka monta niitä on, on aritmetiikkaa, ja jokainen provider tekee sen eri tavalla.

Kolme sääntöä, kaikki julkaistu, mikään ei sama

Linkki osioon: Kolme sääntöä, kaikki julkaistu, mikään ei sama

Jokainen alla oleva sääntö on toteutettu providerin omasta dokumentaatiosta ja tarkistettu saman dokumentaation laskettuja esimerkkejä vasten.

OpenAI peittää kuvan 32 × 32 patcheilla ja kertoo määrän model-kohtaisella kertoimella. Jos patchien määrä ylittää kyseisen modelin ja detail-tason budjetin, kuva skaalataan alas, kunnes se mahtuu:

patches=w32×h32,shrink=322budgetwh\text{patches} = \left\lceil \frac{w}{32} \right\rceil \times \left\lceil \frac{h}{32} \right\rceil, \qquad \text{shrink} = \sqrt{\frac{32^2 \cdot \text{budget}}{w \cdot h}}

Anthropic peittää sen 28 × 28 patcheilla, yksi visual token kukin, ja rajoittaa sekä pitkän sivun että token-määrän — standard-tier-malleissa 1 568 pikseliä ja 1 568 tokens, high-resolution-tierillä 2 576 ja 4 784. Ylisuuret kuvat skaalataan suurimpaan kokoon, joka mahtuu molempiin.5

Google ei laske pikseleitä lainkaan. Kuva, jonka molemmat sivut ovat enintään 384 pikseliä, maksaa kiinteät 258 tokens. Kaikki suurempi leikataan 258 tokenin tileiksi, ja tile-ruudukko tulee crop-yksiköstä min(w,h)/1.5\lfloor \min(w,h) / 1.5 \rfloor.6

imagetokens.tsTS
export function openaiImageTokens(
  w: number, h: number,
  { maxDim, patchBudget, multiplier }: { maxDim: number; patchBudget: number; multiplier: number },
) {
  const fit = Math.min(1, maxDim / Math.max(w, h));      // never enlarges
  w = Math.floor(w * fit); h = Math.floor(h * fit);
  let patches = Math.ceil(w / 32) * Math.ceil(h / 32);   
  if (patches > patchBudget) {
    const s = Math.sqrt((32 * 32 * patchBudget) / (w * h));
    const adj = s * Math.min(
      Math.floor((w * s) / 32) / ((w * s) / 32),
      Math.floor((h * s) / 32) / ((h * s) / 32));
    patches = Math.ceil(Math.floor(w * adj) / 32) * Math.ceil(Math.floor(h * adj) / 32);
  }
  return Math.ceil(patches * multiplier);                
}

export function anthropicVisualTokens(
  w: number, h: number,
  { maxLongEdge, maxTokens }: { maxLongEdge: number; maxTokens: number },
) {
  const tok = (a: number, b: number) => Math.ceil(a / 28) * Math.ceil(b / 28);
  const long = Math.max(w, h), short = Math.min(w, h);
  for (let L = Math.min(long, maxLongEdge); L >= 1; L--) {     
    const t = tok(L, Math.round((short * L) / long));
    if (t <= maxTokens) return t;                              
  }
  return 0;
}

export function geminiImageTokens(w: number, h: number) {
  if (w <= 384 && h <= 384) return 258;
  const crop = Math.floor(Math.min(w, h) / 1.5);               
  return Math.ceil(w / crop) * Math.ceil(h / crop) * 258;      
}

Aja kukin niitä lukuja vasten, jotka sen oma toimittaja julkaisee:

three implementations against three documentationsTEXT
OpenAI, gpt-5.4 at detail:high (2048 px, 2,500 patches, 1.2x)
  1024x1024 -> 1024 patches -> 1229 tokens   doc says 1229   MATCH
  2048x2048 -> 2500 patches -> 3000 tokens   doc says 3000   MATCH

Anthropic, the published table (one tier per row shown)
  200x200    std   64 @ 200x200     doc   64, not resized    OK
  1000x1000  std 1296 @ 1000x1000   doc 1296, not resized    OK
  1092x1092  std 1521 @ 1092x1092   doc 1521, not resized    OK
  1920x1080  std 1560 @ 1456x819    doc 1560, 1456x819       OK
  2000x1500  std 1564 @ 1269x952    doc 1564, 1269x952       OK
  3840x2160  hi  4784 @ 2576x1449   doc 4784, 2576x1449      OK

Google, the worked example
  960x540 -> crop 360 -> 3 x 2 = 6 tiles     doc says 6      MATCH

Tulostuu yhdeksän täsmäystä; koko ajo tarkistaa viisitoista, koska Anthropicin taulukko antaa molemmat tierit kaikille kuudelle koolle. Säännöt ovat nyt sinun ajettavissasi millä tahansa valokuvallasi, ja se on pointti: nämä ovat tämän luvun ainoat kolme funktiota, joita et saa hintasivulta.

Mitä ”suurempi” tarkoittaa kolmesti

Linkki osioon: Mitä ”suurempi” tarkoittaa kolmesti

Aja sama 4:3-valokuva kaikkien kolmen läpi kuudessa koossa:

kokoOpenAI, highAnthropic, standardAnthropic, high-resGemini
384 × 288130154154258
640 × 4803604144141,032
800 × 6005706386381,032
1600 × 12002,2801,5642,4941,032
3200 × 24002,9421,5644,7401,032
4000 × 30002,9421,5644,7401,032

Lue viimeinen sarake alaspäin. Kun kuva on yli 384 pikseliä, luku ei enää koskaan muutu, eikä se ole sattuma eikä katto. Sijoita crop-yksikkö takaisin tile-kaavaan kuvalle, joka on vähintään yhtä leveä kuin korkea:

tiles=wh/1.5×hh/1.51.5wh×2\text{tiles} = \left\lceil \frac{w}{\lfloor h/1.5 \rfloor} \right\rceil \times \left\lceil \frac{h}{\lfloor h/1.5 \rfloor} \right\rceil \approx \left\lceil \frac{1.5\,w}{h} \right\rceil \times 2

Koko supistuu pois. Googlen image tokens riippuvat kuvasuhteesta eivätkä mistään muusta. 4:3-valokuva on neljä tileä riippumatta siitä, onko se thumbnail vai juliste. Tuo yksi algebrallinen fakta selittää kokonaan yllä olevan säästötaulukon nollan, eikä yksikään hintasivu sano sitä.

Kaksi muuta saraketta taas leikkaavat kattoon, eri korkeuksissa ja eri syistä — Anthropic ilmoitetussa token-katossa, OpenAI patch-budjetissa pikselirajan jälkeen — ja siksi kolme käyrää risteävät eri kokoisina.

Riko se nyt. Ilmeinen tapa kuluttaa vähemmän vision modeliin on pyytää vähemmän yksityiskohtia, joten lähetä detail: "low":

gpt-5.4, the same photograph, two detail levelsTEXT
1600x1200   low = 2280   high = 2280   ratio 1.00
3200x2400   low = 3687   high = 2942   ratio 1.25

Vähemmän detailiä pyytäminen maksoi 25 % enemmän. Tämä ei ole bugi, ja OpenAI sanoo sen yhdellä rivillä kokotaulukossa: tuossa model-perheessä low käyttää 2048 pikselin rajaa ja 6 144 patchin budjettia, kun taas high käyttää samaa pikselirajaa ja 2 500 patchin budjettia, ”joten se voi käyttää enemmän tokens kuin high”.7 Sana low nimeää fidelity-asetuksen, ei hintaa: kahdessa viidestä dokumentoidusta model-perheestä se ei tuo säästöä lainkaan, ja toisessa niistä se maksaa enemmän.

Kaikki tähän asti on ollut modelin lukemaa kuvaa. Kuvan tekeminen pyörii mekanismilla, jossa ei ole tokens lainkaan, ja juuri siksi sitä myydään kuvittain eikä sanoittain.

Kuvan tekeminen: kuvakohtainen hinta on token-kohtainen hinta

Linkki osioon: Kuvan tekeminen: kuvakohtainen hinta on token-kohtainen hinta

Toimittajat julkaisevat kuvageneroinnin hintana per kuva. Se ei ole sitä. GPT Image -mallit tuottavat erikoistuneita image tokens, joiden määrä riippuu pyydetystä koosta ja laadusta; kerro julkaistut määrät GPT Image 1:n julkaistulla image output -hinnalla $40 per miljoona ja vertaa saman sivun kuvakohtaisiin hintoihin:

laatu1024 × 10241024 × 15361536 × 1024
low272 tok → $0.0109 ($0.011)408 tok → $0.0163 ($0.016)400 tok → $0.0160 ($0.016)
medium1,056 tok → $0.0422 ($0.042)1,584 tok → $0.0634 ($0.063)1,568 tok → $0.0627 ($0.063)
high4,160 tok → $0.1664 ($0.167)6,240 tok → $0.2496 ($0.25)6,208 tok → $0.2483 ($0.25)

Yhdeksän johdettua lukua yhdeksää julkaistua vasten, ja jokainen pari täsmää $0.002 sisään.11 Google on vielä eksplisiittisempi ja tekee muunnoksen puolestasi itse hintasivulla: image output $60 per miljoona tokens, ”output images at 1K (1024x1024px) consume 1120 tokens and are equivalent to $0.067 per image”.12

Kuvakohtainen hinta on siis token-kohtainen hinta, jossa määrä on taitettu sisään. Se on ihan ok, ja se piilottaa jotakin. Ota nykyisen sukupolven taulukko ja jaa taaksepäin:

gpt-image-2, published price -> implied output tokens at $30/MTEXT
quality   1024x1024            1024x1536
low       $0.006 -> 200 tok    $0.005 -> 167 tok
medium    $0.053 -> 1767 tok   $0.041 -> 1367 tok
high      $0.211 -> 7033 tok   $0.165 -> 5500 tok

Suurempi kuva on halvempi kaikilla laaduilla. 1024 × 1536 canvasissa on 50 % enemmän pikseleitä kuin 1024 × 1024 -kuvassa ja se maksaa medium-tasolla 23 % vähemmän tokens. OpenAI liputtaa sen lauseessa, jonka ohittaisit — ”a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting” — ja edellisessä model-sukupolvessa se meni toiseen suuntaan: pystykuva maksoi 50 % enemmän kuin neliö.11 Jokainen ennen tuota muutosta kirjoitettu 1024x1024-oletus on nyt kallis vaihtoehto.

Ääni, laskutettuna sekunnin, merkin ja tokenin mukaan

Linkki osioon: Ääni, laskutettuna sekunnin, merkin ja tokenin mukaan

Pyydä kolmea tuotetta puhumaan samat 519 merkkiä — noin 38 sekuntia ääntä — ja saat kahdelta toimittajalta kolme yksikköjärjestelmää:

modelyksikköhinta
tts-1per merkki$15.00 per miljoona merkkiä → $0.007785
tts-1-hdper merkki$30.00 per miljoona merkkiä → $0.015570
gemini-3.1-flash-ttsper audio token, 25 per sekunti$20.00 per miljoona → $0.019319

Sama toimittaja myy molempia yksiköitä: OpenAI:n tts-1 hinnoitellaan per miljoona merkkiä, kun taas gpt-4o-mini-tts hinnoitellaan per miljoona tokens, $0.60 sisään ja $12.00 ulos.13 Niinpä ”halvin text-to-speech” ei ole kysymys, jolla on vastaus, ennen kuin sanot mitä puhutaan.

Ja kaksi yksikköä ovat sokeita vastakkaisille asioille. Merkkikohtainen hinta ei näe kestoa: valitse hidas, harkitseva ääni tai lisää taukoja, eikä lasku liiku, vaikka audio pitenee. Sekuntikohtainen hinta ei näe sisältöä: kolmekymmentä sekuntia maksaa saman, olipa se tiivis tekninen kappale tai joku laskemassa kymmeneen. Vaihda ääni, ja täsmälleen yksi kahdesta toimittajastasi hinnoittelee uudelleen.

Transkriptio menee toiseen suuntaan ja on koko laskun yksinkertaisin rivi — per minuutti audiota, kiinteästi:

transcribing 59.6 secondsTEXT
whisper                  $0.005960     ($0.006 / min)
gpt-transcribe           $0.004470     ($0.0045 / min)
gpt-4o-mini-transcribe   $0.002980     ($0.003 / min)
gpt-live-transcribe      $0.016887     ($0.017 / min)

Huomaa viimeinen rivi verrattuna kolmanteen: sen tekeminen livenä, sanojen saapuessa, maksaa 5,7 kertaa enemmän kuin valmiille tiedostolle. Tuo ero on hinta siitä, ettei voi batchata, ja se tekee seuraavasta osiosta kalliin.

Yksi minuutti ääntä, eriteltynä

Linkki osioon: Yksi minuutti ääntä, eriteltynä

Nyt luku, joka päättää onko voice ominaisuus vai tuote.

Puhelu: kymmenen vuoron tukikeskustelu, 149 sanaa, mikä ilmoitetulla 150 sanan minuuttinopeudella on 59,6 sekuntia puhetta — 21,2 soittajan puhumana, 38,4 vastauksena. Token-muunnokset ovat providerien omia. OpenAI: ”audio tokens in user messages are 1 token per 100 ms of audio, while audio tokens in assistant messages are 1 token per 50 ms”.14 Google: 25 tokens sekunnissa molempiin suuntiin, minkä sen hintasivu vahvistaa julkaisemalla $12.00 per miljoona ja $0.018 per minuutti samalla rivillä.12

Keskustelu kertyy täsmälleen kuten luku 16 sanoi, koska mekanismi on sama: ”the entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive”.14 Vain nyt historia mitataan audio tokens.

vuorouserassistantfresh audio incached audio inaudio outcost
14.4 s9.2 s440184$0.013224
25.6 s9.6 s56228192$0.014211
35.2 s9.2 s52476184$0.013670
44.0 s4.8 s4071296$0.007749
52.0 s5.6 s20848112$0.008187

Nyt vertailu, joka päättää tuotteen, kaikki neljä normalisoituna minuuttiin:

per minuuttitekstiin verrattuna
gpt-realtime-2.1, ei caching$0.13125937.9×
gpt-realtime-2.1, historia cached$0.05742516.6×
gemini-3.1-flash-live, ei caching$0.0239656.9×
samat sanat kirjoitettuna, gpt-5.6-terra$0.003461

Kolmekymmentäkahdeksan kertaa. Ei kolmekymmentäkahdeksan prosenttia. Sama vaihto äänessä tekstin sijaan on lähes kaksi kertaluokkaa kalliimpi, eikä mikään tuosta erosta ole marginaali, jonka joku päätti veloittaa — se on muuntosuhde. Yksi sekunti assistant-audiota on kaksikymmentä tokens. Sama sekunti kantaa ilmoitetulla nopeudella 2,5 sanaa, ja mitattu transkripti kulkee 1,26 tokens per sana, joten tekstinä se on 3,15 tokens. Ääni on 6,3 kertaa kömpelömpi paketti samalle merkitykselle, ja jokaista sen tokenia laskutetaan 5,3 kertaa text output -hintaa ja 16 kertaa text input -hintaa enemmän. Kerro bulk-suhde hintasuhteella, ja kertaluokka on jo olemassa ennen kuin kirjanpito alkaa.

Kaksi operatiivista seurausta putoaa suoraan taulukosta.

Audio caching ei ole optimointi, se on liiketoimintamalli. Cached audio input on $0.40 per miljoona verrattuna $32.00 freshiin — 98,75 % alennus, joka puolittaa puhelun. Sääntö on luvun 16 sääntö, muuttumattomana: cache täsmää prefixiin, joten mikä tahansa keskustelun alkuun kesken puhelun lisätty asia tuhoaa sen, ja luonnollinen paikka lauseelle ”soittaja on nyt varmennettu” on juuri siellä.

Eikä mikään clientissä tekemäsi peruuta äänen laskutusta. User puhuu assistantin päälle, koodisi pysäyttää toiston, kaiutin hiljenee. Kaikki, mikä oli jo generoitu, oli jo veloitettu, koska laskutus kertyy, kun response luodaan; ja luvun 16 säännön mukaan kaikki mikä jää keskusteluun lähetetään uudelleen input audiona jokaisella seuraavalla vuorolla. Luku 14 teki tämän huomion tekstistriimin keskeyttämisestä. Äänessä se maksaa kolmekymmentä kertaa enemmän.

Video, GPU-sekunnit ja hinta joka ei ole hinta

Linkki osioon: Video, GPU-sekunnit ja hinta joka ei ole hinta

Jotkut toimittajat myyvät videota per sekunti ja toiset per klippi, resolution-tasoilla ja joskus kestotasoilla. Nämä kaksi muotoa eivät vain eroa käytännöllisyydeltään; ne risteävät.

model1 s2 s5 s10 s20 s
veo-3.1, per sekunti, 1080p$0.400$0.800$2.000$4.000$8.000
veo-3.1-fast, per sekunti, 1080p$0.120$0.240$0.600$1.200$2.400
sora-2, per sekunti, 720p$0.100$0.200$0.500$1.000$2.000
hailuo-02, per klippi, 1080p$0.480$0.480$0.480$0.480$0.480
mochi, per GPU-sekunti$0.018$0.037$0.092$0.183$0.366

Klippikohtainen toimittaja on kalliimpi kuin sekuntikohtainen alle 1,2 sekunnissa ja 16,7 kertaa halvempi kahdessakymmenessä. Näiden kahden modelin järjestys ei selviä klipin pituuden muutoksesta, joten ”mikä video model on halvin” ei ole kysymys malleista.

Viimeinen rivi on pahempi, ja se on luvun rehellinen ydin. mochi laskutetaan todellisia GPU-sekunteja vasten — työn mitattua prediction-aikaa — hintaan $0.001400 sekunnilta A100:lla ja $0.001525 H100:lla, jotka ovat vuokratun koneen hinnat eikä mitään muuta.15 Se on täysin täsmällinen tariffi eikä se ole hinta, koska määrä jota se kertoo on tuntematon, kunnes olet jo sitoutunut maksamaan sen. Yllä oleva rivi olettaa kaksitoista GPU-sekuntia per output-sekunti; nelinkertaista oletus, ja se poistuu halvimmasta kaistasta, ja vasta kuusinkertaisena se päätyy taulukon keskelle. Se on tämän sivun ainoa tariffi, jota et voi laittaa tarjoukseen.

Siis: tokens, image tokens, merkit, minuutit, videosekunnit, kokonaiset klipit, GPU-sekunnit, kiinteät yksiköt. Kahdeksan määrää, ja ainoa tapa laittaa ne samalle akselille on julistaa workload ja hinnoitella se.

Se on laajennus luvun 16 funktioon computeCost — sama tier-koneisto, nyt kriteereillä jotka eivät ole promptin pituutta:

normalise.tsTS
export interface MediaCriteria {
  resolution?: string[]; quality?: string[];
  hasAudio?: boolean; maxDurationSeconds?: number;
}
export interface MediaTier { when?: MediaCriteria; price: number }
export type MediaRate = number | MediaTier[];

const matches = (when: MediaCriteria, u: Usage) => {
  const inList = (l?: string[], v?: string) => !l || (v !== undefined && l.includes(v));
  if (!inList(when.resolution, u.resolution)) return false;
  if (!inList(when.quality, u.quality)) return false;
  if (when.hasAudio !== undefined && when.hasAudio !== (u.hasAudio ?? false)) return false;
  if (when.maxDurationSeconds !== undefined
      && (u.videoSeconds ?? 0) > when.maxDurationSeconds) return false;   
  return true;
};

const mediaPrice = (rate: MediaRate | undefined, u: Usage): number => {
  if (rate === undefined) return 0;
  if (typeof rate === "number") return rate;
  for (const t of rate.filter((t) => t.when)) if (matches(t.when!, u)) return t.price;
  return rate.find((t) => !t.when)?.price ?? 0;      // the tier with no criteria is the default
};

export function computeCost(p: Pricing, u: Usage): number {
  let c = textCost(p, u);                             // Chapter 16, unchanged
  if (p.imageInputToken || p.imageOutputToken) {
    c += (u.imageInputTokens ?? 0) * (p.imageInputToken ?? 0)
       + (u.imageOutputTokens ?? 0) * (p.imageOutputToken ?? 0);
  } else if (p.imageUnit !== undefined) c += (u.images ?? 1) * mediaPrice(p.imageUnit, u);  
  if (p.videoSecond !== undefined) c += (u.videoSeconds ?? 0) * mediaPrice(p.videoSecond, u);
  if (p.videoUnit   !== undefined) c += (u.videoCount ?? 1)   * mediaPrice(p.videoUnit, u);
  c += (u.audioInputTokens ?? 0)       * (p.audioInputToken ?? 0)
     + (u.cachedAudioInputTokens ?? 0) * (p.cachedAudioInputToken ?? p.audioInputToken ?? 0)
     + (u.audioOutputTokens ?? 0)      * (p.audioOutputToken ?? 0)
     + (u.computeSeconds ?? 0)         * (p.computeSecond ?? 0)
     + (u.chars ?? 0)                  * (p.perChar ?? 0)
     + (u.minutes ?? 0)                * (p.perMinute ?? 0);
  return c;
}

Kaksi merkittyä riviä ovat kohta, jossa se rikkoutuu. Per yksikkö noteerattu tariffi kertoo u.images ?? 1; per token noteerattu tariffi kertoo jotakin, jonka oletus on nolla. Syötä molemmille tyhjä usage — muoto, jonka saat kun mittaus epäonnistui — ja katso:

the same missing measurement, priced by unitTEXT
per image (nano-banana-pro)     empty usage => $0.1500
per clip  (hailuo-02)           empty usage => $0.1500
per unit  (a cloned voice)      empty usage => $3.0000
per token (gpt-image-2)         empty usage => $0.0000
per second (veo-3.1)            empty usage => $0.0000
per GPU-second (mochi)          empty usage => $0.0000

Mitään ei tapahtunut kuusi kertaa, ja se maksoi kerran kolme dollaria ja viidesti ei mitään. Se ei ole pyöristysero; se on päätös siitä, mitä puuttuva numero tarkoittaa, erikseen jokaiselle yksikölle tehtynä eikä koskaan ylös kirjoitettuna. Järkevä sääntö on, että kenttä, jota kukaan ei mitannut, pysyy poissa, koska ”ei mitattu” ja ”mitattu ja tulokseksi tuli nolla” ovat eri asioita. Tämä funktio on hiljaa eri mieltä.

Toinen epäonnistuminen on kesto. Klippihinnoiteltu tariffi valitsee tierinsä vertailulla maxDurationSeconds vastaan u.videoSeconds ?? 0, joten usage, joka ei koskaan kirjannut kestoa, täsmää lyhimpään tieriin:

hailuo-02, 768pTEXT
duration recorded    ->  $0.45
duration missing     ->  $0.27

Neljäkymmentä prosenttia alennusta siitä, ettei tiedä kuinka pitkä video oli. Molemmilla bugeilla on sama juuri: mukavuuden vuoksi valittu oletus funktion sisällä, jonka koko tehtävä on olla täsmällinen.

Numeron tekeminen vertailukelpoiseksi

Linkki osioon: Numeron tekeminen vertailukelpoiseksi

Kun kustannukset ovat laskettavissa, vertailu tarvitsee toisen puolikkaan — julistetun edustavan workloadin, yhden per engine, julkisesti sanottuna, jotta lukija voi olla siitä eri mieltä:

workloads.tsTS
export const representative = {
  text:   { blend: [[{ promptTokens: 1e6 }, 0.25], [{ completionTokens: 1e6 }, 0.75]] },
  image:  { images: 1, imageInputTokens: 50, imageOutputTokens: 1500 },
  video:  { videoSeconds: 5, videoCount: 1, resolution: "1080p", hasAudio: true, computeSeconds: 60 },
  voice:  { chars: 1000, computeSeconds: 10 },
  stt:    { minutes: 1 },
};

Jokainen noista riveistä on argumentti. Teksti sekoittaa neljänneksen inputia ja kolme neljännestä outputia, koska todellinen käyttö painottuu outputiin; fifty-fifty-sekoitus järjestää mallit toisin. Kuvaworkload olettaa 1 500 output tokens, OpenAI:n medium-neliön 1 056:n ja medium-pystyn 1 584:n väliin. Video olettaa viisi sekuntia 1080p:tä, ja olemme juuri nähneet kahden toimittajan vaihtavan paikkaa 1,2 sekunnissa. Compute-merkintä olettaa kuusikymmentä GPU-sekuntia, koska muuta oletettavaa ei ole.

Tämä on menetelmä, ja se on ainoa rehellinen saatavilla oleva: et voi verrata hintoja eri yksiköissä; voit verrata vain ylös kirjoittamasi workloadin kustannusta. Jokainen taulukko, joka rankkaa multimodaalisia malleja tulostamatta workloadiaan, rankkaa omia oletuksiaan.

Mihin tästä mennään seuraavaksi

Linkki osioon: Mihin tästä mennään seuraavaksi

Nyt voit hinnoitella kaiken, mitä model voi tuottaa, missä tahansa yksikössä sitä myydään, ja sanoa ääneen minkä workloadin vertailusi oletti. Se sulkee laskun, jonka luku 16 avasi, ja se sulkee osan III: kaikki luvusta 14 tähän asti on koskenut yhtä kutsua — miten se tehdään, mitä siihen laitetaan, miten sitä samplataan, mitä se palauttaa, mitä se maksaa.

Luku 22 vaihtaa analyysin yksikön, ja muutos on kallis. Agent ei ole yksi kutsu; se on silmukka, joka päättää itse montako kutsua tehdä, ja kahden viime luvun aritmetiikka muuttaa sen arkkitehtuurikaaviosta budjetiksi. Se alkaa kysymällä samalta modelilta saman kysymyksen kahdesti, lisäämällä toisella kerralla yhden toolin katalogiin ja mittaamalla mitä tuo yksi tool teki: yhdestä kutsusta tuli kaksi, kolmestakymmenestäyhdeksästä input tokenista tuli 420.

Riippuu siitä, kumman kahdesta julkaistusta määritelmästä avaat, tekeekö se siitä agentin, eivätkä ne ole samaa mieltä. Toinen niistä ei ole samaa mieltä itsensä kanssa.


Jokainen tämän luvun hinta, kaava ja muuntosuhde luettiin providerin omalta sivulta 7. syyskuuta 2026 ja siteerataan sillä päivämäärällä, koska ne kaikki liikkuvat. Token-määrät, kustannukset ja vertailut laskettiin tuosta datasta yllä tulostetulla koodilla yhdellä koneella ilman yhtäkään maksullista API-kutsua — mikä on myös rehellinen syy siihen, ettei tässä luvussa ole yhtäkään latency-väitettä.

Image-token-funktiot, kustannustaulukot, voice-call-erittely ja empty-usage-tulokset tuotettiin tässä luvussa tulostetulla TypeScriptillä, ajettuna Node 22:lla. Voice-vertailussa käytetty dialogi on 149 sanaa ja se tokenisoitiin mallilla tiktoken encodingilla o200k_base 188 tokeniksi; sen kesto seuraa julistetusta 150 sanan minuuttinopeudesta, joka on vertailun parametri eikä mittaus. Jokaisella provider-luvulla on alaviite, joka nimeää sivun jolta se tuli.

  1. Dosovitskiy, A. et al. An Image Is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv:2010.11929 (2020). Patchit, lineaarinen projektio embedding-ulottuvuuteen ja position embeddings, jotka tekevät ruudukosta luettavan sequence modelille.

  2. Radford, A. et al. Learning Transferable Visual Models From Natural Language Supervision. arXiv:2103.00020 (2021). Kuvaenkooderin ja tekstienkooderin contrastive training 400 miljoonalla parilla sekä jaettu avaruus, jonka kaikki downstream olettaa.

  3. Alayrac, J.-B. et al. Flamingo: a Visual Language Model for Few-Shot Learning. arXiv:2204.14198 (2022). Jäädytetty vision encoder, jäädytetty kielimalli, koulutetut siltakerrokset — arkkitehtuuri, joka muutti image understandingin chat-kyvykkyydeksi.

  4. Liu, H., Li, C., Wu, Q. and Lee, Y. J. Visual Instruction Tuning. arXiv:2304.08485 (2023). Yksi lineaarinen projektio siltana ja generoitu instruction-data koulutusjoukkona; syy siihen, miksi avoimet vision-language models konvergoivat yhteen muotoon.

  5. Anthropic, Vision, platform.claude.com/docs/en/build-with-claude/vision, käytetty 2026-09-07. ”Claude views images in patches instead of pixels. Each patch is a 28×28-pixel block of the image, referred to as a visual token. An image, therefore, costs ⌈width / 28⌉ × ⌈height / 28⌉ visual tokens.” Myös kaksi resolution-tieriä (standard: 1568 pikselin pitkä sivu, 1568 visual tokens; high-resolution, Claude 4.7:stä alkaen: 2576 pikseliä ja 4784 tokens), downsizing-sääntö ja yllä toistettu kuuden rivin taulukko koista ja token-määristä. Model-hinnat lähteestä Anthropic, Pricing, platform.claude.com/docs/en/about-claude/pricing, sama päivämäärä: Claude Haiku 4.5 hintaan $1 ja $5 per miljoona input ja output tokens.

  6. Google, Image understanding, ai.google.dev/gemini-api/docs/image-understanding, käytetty 2026-09-07. ”258 tokens if both dimensions <= 384 pixels. Larger images are tiled into 768x768 pixel tiles, each costing 258 tokens”, crop-unit-kaavan kanssa — floor(min(width, height) / 1.5), mitat jaettuna sillä ja kerrottuna yhteen — sekä laskettu esimerkki 960 × 540, joka antaa 3 × 2 = 6 tiles. Google kutsuu sitä ”a rough formula”; yllä johdettu skaala-invarianssi on kaavan ominaisuus sellaisena kuin se on julkaistu. Audio input samassa perheessä on 32 tokens per sekunti audiota (ai.google.dev/gemini-api/docs/audio, sama päivämäärä).

  7. OpenAI, Images and vision, developers.openai.com/api/docs/guides/images-vision, käytetty 2026-09-07. Lähde patch-pohjaiselle säännölle (32 × 32 patchit, patch_count = ceil(width/32)×ceil(height/32), shrink_factor-kaava ja sen kokonaislukusäätö, 30 000 patchin hylkäysraja); model-kokotaulukko, mukaan lukien että low mallilla gpt-5.4 käyttää 2048 pikselin rajaa ja 6 144 patchin budjettia ”so it can use more tokens than high”, verrattuna high:n 2 500 patchin budjettiin; kerrointaulukko (1.2 GPT-5.x-perheille, 1.62 mallille gpt-4.1-mini, 2.46 mallille gpt-4.1-nano); yllä toistetut kaksi laskettua esimerkkiä (1024 × 1024 → 1229 tokens, 2048 × 2048 → 3000 tokens); vanhempien mallien tile-pohjaiset säännöt (base plus 512-pikseliset tiles, 85 + 170 mallilla gpt-4o); sekä vision-laatikossa siteerattu rajoituslista. 2

  8. Ho, J., Jain, A. and Abbeel, P. Denoising Diffusion Probabilistic Models. arXiv:2006.11239 (2020). Eteenpäin kulkeva kohina-aikataulu, reparameterization joka muuttaa objectiveksi lisätyn kohinan ennustamisen, ja sampling-silmukka.

  9. Rombach, R., Blattmann, A., Lorenz, D., Esser, P. and Ommer, B. High-Resolution Image Synthesis with Latent Diffusion Models. arXiv:2112.10752 (2022). Diffusion-prosessin ajaminen pakatussa latent-avaruudessa, mikä teki kiinteästä askelmäärästä tarpeeksi edullisen myytäväksi per kuva.

  10. Prince, S. J. D. Understanding Deep Learning (MIT Press, 2023), luku 18. Ilmoitettu delegointi kaikelle, minkä tämä luku ohitti diffusionista — variational bound, noise schedules, classifier-free guidance ja sampler-perheet. Hu, E. et al., LoRA: Low-Rank Adaptation of Large Language Models, arXiv:2106.09685 (2021), on itse adapteri, esitelty luvussa 11 kielimallilla ja käytetty tässä kuvamallilla ilman matematiikan muutosta. Radford, A. et al., Robust Speech Recognition via Large-Scale Weak Supervision (Whisper), arXiv:2212.04356 (2022), on transkriptiomalli, jonka minuuttikohtainen hinta näkyy yllä.

  11. OpenAI, Image generation, developers.openai.com/api/docs/guides/image-generation, Pricing, developers.openai.com/api/docs/pricing, ja model-sivu mallille gpt-image-1, kaikki käytetty 2026-09-07. Mallin gpt-image-2 sivulla ei ole pricing-osiota; sen hinnat tulevat yllä olevalta pricing-sivulta. GPT Image 1:n sivu julkaisee text inputin hintaan $5.00, image inputin hintaan $10.00 ja image outputin hintaan $40.00 per miljoona tokens, yllä johdannassa käytetyn kuvakohtaisen taulukon vieressä. Myös: output-token-taulukko gpt-image-2:ta edeltäville malleille (272 / 408 / 400 low, 1056 / 1584 / 1568 medium, 4160 / 6240 / 6208 high, neliölle, pystylle ja vaakakuvalle); GPT Image 2:n, 1.5:n, 1:n ja 1 Minin kuvakohtaiset hintataulukot, joita yllä käytettiin johdannoissa; lause ”a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting”; huomautus, että jokainen striimattu osittaiskuva maksaa ylimääräiset 100 image output tokens; sekä gpt-image-2:n hinnat $8.00 image input, $2.00 cached image input, $30.00 image output ja $5.00 text input per miljoona tokens. Vertailuissa käytetyt text model -hinnat: gpt-5.6-terra hintaan $2.00 input, $0.20 cached input ja $12.00 output, gpt-5.6-luna hintaan $0.20 ja $1.20, standard tier, short context. Video: sora-2 hintaan $0.10 sekunnilta 720p:llä ja sora-2-pro hintaan $0.30, $0.50 ja $0.70 720p:llä, 1024p:llä ja 1080p:llä. Transkriptio: $0.006, $0.0045, $0.003 ja $0.017 per minuutti malleille gpt-4o-transcribe, gpt-transcribe, gpt-4o-mini-transcribe ja gpt-live-transcribe. 2

  12. Google, Gemini Developer API pricing, ai.google.dev/gemini-api/docs/pricing, käytetty 2026-09-07. Gemini 3.1 Flash-Lite hintaan $0.25 per miljoona input tokens (teksti, kuva ja video) ja $1.50 output. Gemini 3.1 Flash Image: image output hintaan $60 per miljoona tokens, julkaistuilla vastaavuuksilla 747, 1120, 1680 ja 2520 tokens 0.5K-, 1K-, 2K- ja 4K-kuville sekä niiden kuvakohtaisilla hinnoilla $0.045, $0.067, $0.101 ja $0.151. Gemini 3.1 Flash TTS: $1.00 text input, $20.00 audio output, ”audio tokens correspond to 25 tokens per second of audio”. Gemini 3.1 Flash Live Preview: $0.75 text ja ”$3.00 or $0.005/min” audio input, ”$4.50 (text) $12.00 or $0.018/min (audio)” output. Veo 3.1 sekunnilta audion kanssa: $0.40 720p:llä ja 1080p:llä ja $0.60 4K standard; $0.10, $0.12 ja $0.30 fast. Gemini Omni Flash laskuttaa video outputia ”at a rate of 5,792 tokens per second of 720p video”, minkä sama alaviite muuntaa noin $0.10 sekunniksi — selkein missään julkaistu lausuma siitä, että sekuntikohtainen mediahinta on token-hinta. 2

  13. OpenAI model -sivut malleille tts-1, tts-1-hd ja gpt-4o-mini-tts, developers.openai.com/api/docs/models, käytetty 2026-09-07. tts-1 hintaan $15.00 ja tts-1-hd hintaan $30.00 per miljoona merkkiä; gpt-4o-mini-tts hintaan $0.60 per miljoona text input tokens ja $12.00 per miljoona audio output tokens — sama toimittaja, sama operaatio, kaksi yksikköä.

  14. OpenAI, Managing costs (Realtime API), developers.openai.com/api/docs/guides/realtime-costs, käytetty 2026-09-07. ”Audio tokens in user messages are 1 token per 100 ms of audio, while audio tokens in assistant messages are 1 token per 50ms of audio.” Myös: ”The entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive”; kustannukset kertyvät kun Response luodaan; laskettu kahden vuoron esimerkki, jonka kertymän yllä oleva taulukko toistaa; sekä response.done usage-payload sen input_token_details- ja output_token_details-jaotteluilla. Hinnat pricing-sivulta, sama päivämäärä: gpt-realtime-2.1 audio hintaan $32.00 input, $0.40 cached input ja $64.00 output per miljoona tokens, text hintaan $4.00, $0.40 ja $24.00, image input hintaan $5.00. 2

  15. Replicate, Pricing, replicate.com/pricing, käytetty 2026-09-07. Nvidia A100 (80GB) hintaan $0.001400 sekunnilta ja $5.04 tunnilta; Nvidia H100 hintaan $0.001525 sekunnilta ja $5.49 tunnilta.

Valmis antamaan LIA:n valita puolestasi?

Rakenna kaikilla tekoälymalleilla yhdessä paikassa — aloita ilmaiseksi jo tänään.