Przejdź do treści
21/30Rozdział 21 z 30

Cennik multimodalny: za co naprawdę płacisz przy obrazach, audio i wideo

Te same 500 zdjęć potrafi kosztować 5,5× więcej zależnie od modelu — a najtańsza opcja zmienia się po zmianie rozmiaru.

Na tej stronie

Oto jedno zadanie wycenione na trzy sposoby: opisz pięćset zdjęć produktów, po jednym krótkim podpisie każde. Te same zdjęcia, ta sama instrukcja, ta sama długość odpowiedzi. Zmienia się tylko model, który je czyta.

fotografiagpt-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

Przy tej tabeli warto zatrzymać się na trzech rzeczach.

Najtańszy model zmienia się między trzecim a czwartym wierszem, przy tym samym zadaniu, bo ktoś zmienił rozmiar fotografii. Poproś o akapit zamiast podpisu, a punkt przecięcia znów się przesunie: przy 1280 × 960 zwycięzcą jest Gemini dla podpisu na czterdzieści tokens i OpenAI dla akapitu na czterysta tokens.

Kolumna Gemini w ogóle się nie rusza, w żadnym wierszu: fotografia 4000 \u00d7 3000 kosztuje dokładnie tyle samo co 640 \u00d7 480. Fotografia 4000 × 3000 kosztuje dokładnie tyle samo co fotografia 640 × 480. To nie jest limit. To konsekwencja tego, jak model liczy, i oznacza, że najczęstsza optymalizacja kosztów w tej branży — zmniejsz rozdzielczość przed wysłaniem — opłaca się tak:

image tokens, 4000 × 3000 → 800 × 600koszt uruchomieniaoszczędność
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 %

Żadna z tych liczb nie jest ceną publikowaną przez dostawcę. Wszystkie trzy trzeba było obliczyć z trzech różnych reguł, bo fotografia nigdzie nie jest jednostką rozliczeniową: najpierw zostaje przeliczona na tokens, według arytmetyki zapisanej w trzech niekompatybilnych miejscach.

Rozdział 16 zbudował rachunek dla tekstu i zatrzymał się tam, gdzie kończy się tekst. Ten rozdział to reszta faktury: obrazy, mowa, transkrypcja, wideo i surowy compute, które łącznie są rozliczane w ośmiu różnych jednostkach, oraz metoda porównywania rzeczy, których nie sprzedaje się tą samą miarą.

Pokaż szczegóły

Czego ten rozdział potrzebuje z wcześniejszych.

  • Rozdział 7 zbudował tokenizer i jednostkę. Wszystko tutaj jest próbą zamiany czegoś, co nie jest tekstem, na tę jednostkę.
  • Rozdział 8 ustalił, co konsumuje model: nie symbole, lecz wektory w embedding space. Dlatego obraz w ogóle może być wyceniony w tokens.
  • Rozdział 16 zbudował computeCost, jego progi cenowe i pięć koszyków token. Ten rozdział rozszerza tę funkcję, zamiast ją zastępować.
  • Rozdział 11 wprowadził LoRA jako technikę fine-tuning, a Rozdział 20 wycenił ją jako decyzję budżetową. Tutaj pojawia się w modelu, który nie jest modelem językowym.

Bez tensorów, zgodnie z regułą z Rozdziału 14: to taryfy, konwersje i księgowość, więc będzie TypeScript.

Dlaczego fotografia ma cenę w token

Link do sekcji: Dlaczego fotografia ma cenę w token

Transformer przyjmuje sekwencję wektorów. Nie interesuje go, skąd pochodzą. Rozdział 8 podawał mu embeddings pobierane z identyfikatora token; nic w architekturze nie wymaga tego lookupu.

A więc: potnij obraz na stałe kwadraty, spłaszcz każdy kwadrat do listy liczb i przepuść każdą listę przez jedną wyuczoną warstwę liniową, żeby dostać wektor o szerokości modelu. Patch 32 × 32 kolorowych pikseli to 32×32×3=307232 \times 32 \times 3 = 3072 liczb; projekcja ERd×3072E \in \mathbb{R}^{d \times 3072} zamienia go w jeden dd-wymiarowy wektor, dokładnie o takim kształcie, w jakim przychodzi text token. To cała sztuka, i to mówi już tytuł pracy: obraz jest wart 16 × 16 słów.1 Dodaj positional encoding, żeby model wiedział, który kwadrat był gdzie, przepleć wyniki z text embeddings, a sekwencja czytana przez model będzie częściowo obrazem i częściowo zdaniem.

Trzy prace zmieniły to w produkt. CLIP wytrenował image encoder i text encoder tak, by uzgadniały — na czterystu milionach zeskrobanych par — co sprawiło, że pomysł wspólnej przestrzeni dla pikseli i słów przestał być hipotezą.2 Flamingo przykręciło zamrożony vision encoder do zamrożonego language model za pomocą kilku trenowanych warstw pomostowych.3 LLaVA pokazała, że pomostem może być pojedyncza projekcja liniowa, a instruction-following da się nauczyć na wygenerowanych danych, dlatego każdy otwarty vision-language model od tamtej pory wygląda z grubsza tak samo.4

Konsekwencja dla faktury jest natychmiastowa i mało efektowna: patches są pozycjami w sekwencji, więc są input tokens, więc płacisz za nie według stawki input. Ile ich jest, wynika z arytmetyki, a każdy dostawca robi ją inaczej.

Trzy reguły, wszystkie opublikowane, żadna taka sama

Link do sekcji: Trzy reguły, wszystkie opublikowane, żadna taka sama

Każda reguła poniżej jest zaimplementowana na podstawie własnej dokumentacji dostawcy i sprawdzona na przykładach obliczeniowych z tej samej dokumentacji.

OpenAI pokrywa obraz patchami 32 × 32 i mnoży ich liczbę przez współczynnik zależny od modelu. Jeśli liczba patchy przekracza budżet dla tego modelu i poziomu szczegółowości, obraz jest skalowany w dół, aż się zmieści:

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 pokrywa go patchami 28 × 28, po jednym visual token każdy, i ogranicza zarówno dłuższą krawędź, jak i liczbę token — 1,568 pikseli i 1,568 tokens w modelach standard-tier, 2,576 i 4,784 w high-resolution tier. Zbyt duże obrazy są skalowane do największego rozmiaru, który mieści się w obu limitach.5

Google w ogóle nie liczy pikseli. Obraz, którego oba boki mają co najwyżej 384 piksele, kosztuje stałe 258 tokens. Wszystko większe jest cięte na kafelki po 258 tokens każdy, a siatka kafelków wynika z jednostki kadrowania 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;      
}

Uruchom każdą regułę na liczbach, które drukuje jej własny dostawca:

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

Wydrukowanych jest dziewięć zgodności; pełne uruchomienie sprawdza piętnaście, ponieważ tabela Anthropic podaje oba tiers dla wszystkich sześciu rozmiarów. Reguły są teraz twoje do uruchomienia na dowolnej fotografii, którą masz, i o to chodzi: to jedyne trzy funkcje w tym rozdziale, których nie dostaniesz ze strony z cenami.

Co znaczy „większy”, trzy razy

Link do sekcji: Co znaczy „większy”, trzy razy

Przepuść tę samą fotografię 4:3 przez wszystkie trzy reguły w sześciu rozmiarach:

rozmiarOpenAI, 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

Czytaj ostatnią kolumnę w dół. Gdy obraz przekroczy 384 piksele, liczba już nigdy się nie zmienia, i nie jest to przypadek ani limit. Podstaw jednostkę kadrowania z powrotem do wzoru na kafelki, dla obrazu co najmniej tak szerokiego jak wysokiego:

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

Rozmiar się skraca. Google image tokens zależą od proporcji obrazu i od niczego więcej. Fotografia 4:3 ma cztery kafelki, niezależnie od tego, czy jest miniaturą, czy plakatem. Ten jeden fakt algebraiczny jest całym wyjaśnieniem zera w tabeli oszczędności powyżej, a żadna strona z cenami nigdzie go nie podaje.

Pozostałe dwie kolumny zamiast tego dochodzą do limitu, na innych wysokościach i z innych powodów — Anthropic przy zadeklarowanym suficie token, OpenAI przy budżecie patchy po limicie pikseli — dlatego trzy krzywe przecinają się przy różnych rozmiarach.

Teraz to zepsuj. Oczywisty sposób, żeby wydać mniej na vision model, to poprosić o mniej szczegółów, więc wyślij 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

Prośba o mniej szczegółów kosztowała 25 % więcej. To nie bug, a OpenAI mówi o tym w jednym wierszu tabeli rozmiarów: w tej rodzinie modeli low używa limitu 2048 pikseli i budżetu 6,144 patchy, podczas gdy high używa tego samego limitu pikseli z budżetem 2,500 patchy, „so it can use more tokens than high”.7 Słowo low nazywa ustawienie wierności, nie ceny: w dwóch z pięciu udokumentowanych rodzin modeli nie daje żadnej oszczędności, a w jednej z tych dwóch kosztuje więcej.

Generowanie obrazu to inna maszyna

Link do sekcji: Generowanie obrazu to inna maszyna

Wszystko do tej pory dotyczyło modelu czytającego obraz. Tworzenie obrazu działa na mechanizmie, w którym nie ma tokens w ogóle, i dlatego sprzedaje się je za obraz, a nie za słowo.

Tworzenie obrazu: cena za obraz jest ceną za token

Link do sekcji: Tworzenie obrazu: cena za obraz jest ceną za token

Dostawcy publikują generowanie obrazów jako cenę za obraz. To nie jest jedna cena. Modele GPT Image emitują wyspecjalizowane image tokens, których liczba zależy od żądanego rozmiaru i jakości; pomnóż opublikowane liczby przez opublikowaną stawkę image output GPT Image 1, czyli $40 za milion, i porównaj z cenami za obraz na tej samej stronie:

jakość1024 × 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)

Dziewięć liczb wyprowadzonych wobec dziewięciu opublikowanych, każda para zgodna w granicach $0.002.11 Google jest jeszcze bardziej dosłowne i wykonuje konwersję za ciebie na samej stronie z cenami: image output po $60 za milion tokens, „output images at 1K (1024x1024px) consume 1120 tokens and are equivalent to $0.067 per image”.12

Cena za obraz jest więc ceną za token z wliczoną liczbą token. To w porządku, ale coś ukrywa. Weź tabelę bieżącej generacji i podziel wstecz:

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

Większy obraz jest tańszy przy każdej jakości. Canvas 1024 × 1536 ma o 50 % więcej pikseli niż 1024 × 1024 i kosztuje o 23 % mniej tokens przy medium. OpenAI zaznacza to w zdaniu, które byś pominął — „a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting” — a w poprzedniej generacji modeli działało to odwrotnie: portret kosztował 50 % więcej niż kwadrat.11 Każde domyślne 1024x1024 zapisane przed tą zmianą jest teraz drogą opcją.

Dźwięk, rozliczany za sekundę, znak i token

Link do sekcji: Dźwięk, rozliczany za sekundę, znak i token

Poproś trzy produkty, żeby wypowiedziały te same 519 znaków — około 38 sekund audio — a dostaniesz trzy systemy jednostek od dwóch dostawców:

modeljednostkacena
tts-1za znak$15.00 za milion znaków → $0.007785
tts-1-hdza znak$30.00 za milion znaków → $0.015570
gemini-3.1-flash-ttsza audio token, 25 na sekundę$20.00 za milion → $0.019319

Ten sam dostawca sprzedaje obie jednostki: tts-1 od OpenAI jest wyceniany za milion znaków, a gpt-4o-mini-tts za milion tokens, $0.60 wejścia i $12.00 wyjścia.13 Dlatego „najtańszy text-to-speech” nie jest pytaniem z odpowiedzią, dopóki nie powiesz, co ma być wypowiedziane.

A te dwie jednostki są ślepe na przeciwne rzeczy. Cena za znak nie widzi czasu trwania: wybierz powolny, staranny głos albo dodaj pauzy, a rachunek się nie ruszy, choć audio będzie dłuższe. Cena za sekundę nie widzi treści: trzydzieści sekund kosztuje tyle samo, niezależnie od tego, czy to gęsty akapit techniczny, czy ktoś liczący do dziesięciu. Zmień głos, a dokładnie jeden z dwóch dostawców przeliczy cenę.

Transkrypcja działa odwrotnie i jest najprostszą pozycją na całej fakturze — płasko za minutę audio:

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)

Zwróć uwagę na ostatni wiersz wobec trzeciego: zrobienie tego na żywo, w miarę napływania słów, kosztuje 5,7 raza więcej niż praca na gotowym pliku. Ta różnica jest ceną za brak możliwości batch, i to ona sprawia, że następna sekcja jest droga.

Jedna minuta głosu, rozbita na pozycje

Link do sekcji: Jedna minuta głosu, rozbita na pozycje

Teraz liczba, która decyduje, czy głos jest funkcją, czy produktem.

Rozmowa: dziesięcioturowa konwersacja support, 149 słów, co przy zadeklarowanych 150 słowach na minutę daje 59,6 sekundy mowy — 21,2 wypowiedziane przez dzwoniącego, 38,4 wypowiedziane w odpowiedzi. Konwersje token są własne dla dostawców. 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 na sekundę, w obie strony, co jego strona z cenami potwierdza, publikując $12.00 za milion i $0.018 za minutę w tym samym wierszu.12

Konwersacja narasta dokładnie tak, jak mówił Rozdział 16, bo to ten sam mechanizm: „the entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive”.14 Tyle że teraz historia jest mierzona w audio tokens.

turaużytkownikassistantświeże audio incached audio inaudio outkoszt
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

Teraz porównanie, które decyduje o produkcie, wszystkie cztery znormalizowane do minuty:

za minutęwzględem tekstu
gpt-realtime-2.1, bez cache$0.13125937.9×
gpt-realtime-2.1, historia w cache$0.05742516.6×
gemini-3.1-flash-live, bez cache$0.0239656.9×
te same słowa wpisane, gpt-5.6-terra$0.003461

Trzydzieści osiem razy. Nie trzydzieści osiem procent. Ta sama wymiana, przeprowadzona dźwiękiem zamiast tekstem, jest prawie o dwa rzędy wielkości droższa, i żadna część tej różnicy nie jest marżą, którą ktoś postanowił naliczyć — to kurs konwersji. Jedna sekunda audio assistant to dwadzieścia tokens. Ta sama sekunda niesie 2,5 słowa przy zadeklarowanej szybkości, a zmierzony transkrypt ma 1,26 tokens na słowo, więc jako tekst to 3,15 tokens. Dźwięk jest 6,3 raza bardziej masywnym opakowaniem dla tego samego znaczenia, a każdy jego token jest rozliczany po 5,3 raza wyższej stawce niż text output i 16 razy wyższej niż text input. Pomnóż współczynnik objętości przez współczynnik ceny, a rząd wielkości jest widoczny jeszcze przed rozpoczęciem księgowości.

Z tabeli wynikają wprost dwie konsekwencje operacyjne.

Audio caching nie jest optymalizacją, tylko modelem biznesowym. Cached audio input kosztuje $0.40 za milion wobec $32.00 świeżego — rabat 98,75 %, który obniża koszt rozmowy o połowę. Reguła jest ta sama co w Rozdziale 16: cache dopasowuje prefix, więc cokolwiek wstawione na początku konwersacji w trakcie rozmowy niszczy go, a naturalne miejsce na „caller is now verified” jest dokładnie tam.

I nic, co zrobisz w kliencie, nie cofnie naliczenia za dźwięk. Użytkownik mówi na głos assistant, twój kod zatrzymuje odtwarzanie, głośnik milknie. Wszystko, co zostało już wygenerowane, zostało już naliczone, bo rozliczenie narasta, gdy Response jest tworzony; a według reguły z Rozdziału 16 wszystko, co zostaje w konwersacji, jest ponownie wysyłane jako input audio w każdej kolejnej turze. Rozdział 14 mówił to o przerywaniu text stream. W głosie kosztuje to trzydzieści razy więcej.

Wideo, GPU-sekundy i cena, która nie jest ceną

Link do sekcji: Wideo, GPU-sekundy i cena, która nie jest ceną

Wideo bywa sprzedawane za sekundę przez jednych dostawców i za klip przez innych, z tier dla rozdzielczości, a czasem też czasu trwania. Te dwa kształty nie różnią się tylko wygodą; one się przecinają.

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

Dostawca rozliczany za klip jest droższy niż rozliczany za sekundę poniżej 1,2 sekundy i 16,7 raza tańszy przy dwudziestu. Żadne uporządkowanie tych dwóch modeli nie przetrwa zmiany długości klipu, więc „który video model jest najtańszy” nie jest pytaniem o modele.

Ostatni wiersz jest gorszy, i jest uczciwym sercem rozdziału. mochi jest rozliczany według rzeczywistych GPU seconds — zmierzonego czasu predykcji zadania — po $0.001400 za sekundę na A100 i $0.001525 na H100, czyli wyłącznie według stawek wynajętej maszyny.15 To idealnie precyzyjna taryfa i nie jest ceną, bo wielkość, którą mnoży, jest nieznana aż do chwili, gdy zobowiążesz się za nią zapłacić. Wiersz powyżej zakłada dwanaście GPU-sekund na sekundę output; poczwórz to założenie, a wypada z najtańszego pasma, i dopiero przy sześciokrotności ląduje w środku tabeli. To jedyna taryfa na tej stronie, której nie da się wstawić do oferty.

A więc: tokens, image tokens, znaki, minuty, sekundy wideo, całe klipy, GPU seconds, jednostki stałe. Osiem wielkości, a jedyny sposób, by położyć je na jednej osi, to zadeklarować workload i go wycenić.

To rozszerzenie computeCost z Rozdziału 16 — ta sama maszyneria tier, teraz z kryteriami, które nie są długością prompt:

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;
}

Dwie oznaczone linie pokazują, gdzie się psuje. Taryfa podana za jednostkę mnoży u.images ?? 1; taryfa podana za token mnoży coś, co domyślnie wynosi zero. Podaj obu pusty usage — kształt, który dostajesz, gdy pomiar się nie udał — i patrz:

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

Nic się nie wydarzyło, sześć razy, a raz kosztowało trzy dolary i pięć razy nic. To nie różnica zaokrągleń; to decyzja o tym, co znaczy brak liczby, podjęta osobno dla każdej jednostki i nigdy niezapisana. Rozsądna reguła mówi, że pole, którego nikt nie zmierzył, pozostaje nieobecne, bo „nie zmierzono” i „zmierzono i wyszło zero” to różne rzeczy. Ta funkcja po cichu się z tym nie zgadza.

Druga awaria to czas trwania. Taryfa za klip wybiera swój tier przez maxDurationSeconds wobec u.videoSeconds ?? 0, więc usage, który nigdy nie zapisał czasu trwania, trafia do najkrótszego tier:

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

Czterdzieści procent rabatu za niewiedzę, jak długi był film. Oba bugi mają ten sam korzeń: domyślna wartość wybrana dla wygody wewnątrz funkcji, której całym zadaniem jest bycie dokładną.

Jak uczynić liczbę porównywalną

Link do sekcji: Jak uczynić liczbę porównywalną

Gdy koszty da się obliczyć, porównanie potrzebuje drugiej połowy — zadeklarowanego reprezentatywnego workload, po jednym na engine, publicznie opisanego, żeby czytelnik mógł się z nim nie zgodzić:

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 },
};

Każdy z tych wierszy jest argumentem. Tekst miesza ćwierć input i trzy czwarte output, bo realne użycie przechyla się ku output; mieszanka pół na pół ustawi modele inaczej. Workload dla obrazu zakłada 1,500 output tokens, między 1,056 OpenAI dla średniego kwadratu a 1,584 dla średniego portretu. Wideo zakłada pięć sekund w 1080p, a przed chwilą widzieliśmy, jak dwóch dostawców zamienia się miejscami przy 1,2 sekundy. Wpis compute zakłada sześćdziesiąt GPU-sekund, bo nie ma czego innego założyć.

Taka jest metoda, i to jedyna uczciwa dostępna metoda: nie możesz porównywać cen w różnych jednostkach; możesz porównywać tylko koszt workload, który zapisałeś. Każda tabela, która szereguje modele multimodalne bez wydrukowania swojego workload, szereguje własne założenia.

Możesz teraz wycenić wszystko, co model potrafi wyprodukować, w dowolnej jednostce, w której jest sprzedawane, i powiedzieć na głos, jaki workload założyło twoje porównanie. To zamyka fakturę otwartą w Rozdziale 16 i zamyka Część III: wszystko od Rozdziału 14 do tego miejsca dotyczyło jednego call — jak go wykonać, co do niego włożyć, jak go samplować, co zwraca, ile kosztuje.

Rozdział 22 zmienia jednostkę analizy, a ta zmiana jest droga. Agent to nie jeden call; to pętla, która sama decyduje, ile calls wykonać, a arytmetyka z ostatnich dwóch rozdziałów zmienia ją z diagramu architektury w budżet. Zaczyna od zadania temu samemu modelowi tego samego pytania dwa razy, z jednym tool dodanym do katalogu za drugim razem, i zmierzenia, co zrobiło to jedno tool: jeden call stał się dwoma, trzydzieści dziewięć input tokens stało się 420.

Czy to czyni z niego agent, zależy od tego, którą z dwóch opublikowanych definicji otworzysz, a one się nie zgadzają. Jedna z nich nie zgadza się sama ze sobą.


Każda cena, wzór i kurs konwersji w tym rozdziale zostały odczytane z własnej strony dostawcy 7 września 2026 i są cytowane z tą datą, bo wszystkie się zmienią. Liczby token, koszty i porównania obliczono na tych danych kodem wydrukowanym wyżej, na jednej maszynie, bez żadnego płatnego API call — co jest też uczciwym powodem, dla którego w tym rozdziale nie ma ani jednej tezy o latency.

Funkcje image-token, tabele kosztów, rozbicie rozmowy głosowej i wyniki empty-usage zostały wyprodukowane przez TypeScript wydrukowany w tym rozdziale, uruchomiony na Node 22. Dialog użyty do porównania głosu ma 149 słów i został tokenized z tiktoken pod encoding o200k_base do 188 tokens; jego czas trwania wynika z zadeklarowanej szybkości 150 słów na minutę, która jest parametrem porównania, a nie pomiarem. Każda liczba od dostawcy ma przypis wskazujący stronę, z której pochodzi.

  1. Dosovitskiy, A. et al. An Image Is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv:2010.11929 (2020). Patches, projekcja liniowa do wymiaru embedding oraz position embeddings, które czynią siatkę czytelną dla modelu sekwencyjnego.

  2. Radford, A. et al. Learning Transferable Visual Models From Natural Language Supervision. arXiv:2103.00020 (2021). Contrastive training image encoder i text encoder na 400 milionach par oraz wspólna przestrzeń, którą zakłada wszystko późniejsze.

  3. Alayrac, J.-B. et al. Flamingo: a Visual Language Model for Few-Shot Learning. arXiv:2204.14198 (2022). Zamrożony vision encoder, zamrożony language model, trenowane warstwy pomostowe — architektura, która zmieniła rozumienie obrazów w chat capability.

  4. Liu, H., Li, C., Wu, Q. and Lee, Y. J. Visual Instruction Tuning. arXiv:2304.08485 (2023). Pojedyncza projekcja liniowa jako pomost i wygenerowane dane instrukcyjne jako zbiór treningowy; powód, dla którego otwarte vision-language models zbiegły do jednego kształtu.

  5. Anthropic, Vision, platform.claude.com/docs/en/build-with-claude/vision, dostęp 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.” Także dwa resolution tiers (standard: dłuższa krawędź 1568 pikseli, 1568 visual tokens; high-resolution, na Claude 4.7 i nowszych: 2576 pikseli i 4784 tokens), reguła zmniejszania oraz sześciowierszowa tabela rozmiarów i liczby token odtworzona powyżej. Stawki modeli z Anthropic, Pricing, platform.claude.com/docs/en/about-claude/pricing, ta sama data: Claude Haiku 4.5 po $1 i $5 za milion input i output tokens.

  6. Google, Image understanding, ai.google.dev/gemini-api/docs/image-understanding, dostęp 2026-09-07. „258 tokens if both dimensions <= 384 pixels. Larger images are tiled into 768x768 pixel tiles, each costing 258 tokens”, z wzorem jednostki kadrowania — floor(min(width, height) / 1.5), wymiary podzielone przez nią i pomnożone przez siebie — oraz przykładem obliczeniowym 960 × 540 dającym 3 × 2 = 6 kafelków. Google nazywa to „a rough formula”; niezmienniczość skali wyprowadzona wyżej jest własnością wzoru w opublikowanej postaci. Audio input w tej samej rodzinie to 32 tokens na sekundę audio (ai.google.dev/gemini-api/docs/audio, ta sama data).

  7. OpenAI, Images and vision, developers.openai.com/api/docs/guides/images-vision, dostęp 2026-09-07. Źródło reguły opartej na patchach (patche 32 × 32, patch_count = ceil(width/32)×ceil(height/32), wzór shrink_factor i jego korekta całkowitoliczbowa, limit odrzucenia 30,000 patchy); tabela rozmiarów modeli, w tym informacja, że low na gpt-5.4 używa limitu 2048 pikseli i budżetu 6,144 patchy „so it can use more tokens than high”, wobec budżetu 2,500 patchy dla high; tabela mnożników (1.2 dla rodzin GPT-5.x, 1.62 dla gpt-4.1-mini, 2.46 dla gpt-4.1-nano); dwa przykłady obliczeniowe odtworzone powyżej (1024 × 1024 → 1229 tokens, 2048 × 2048 → 3000 tokens); reguły kafelkowe dla starszych modeli (base plus kafelki 512-pikselowe, 85 + 170 na gpt-4o); oraz lista ograniczeń cytowana w ramce vision. 2

  8. Ho, J., Jain, A. and Abbeel, P. Denoising Diffusion Probabilistic Models. arXiv:2006.11239 (2020). Forward noising schedule, reparametryzacja, która zamienia cel w przewidywanie dodanego szumu, oraz pętla sampling.

  9. Rombach, R., Blattmann, A., Lorenz, D., Esser, P. and Ommer, B. High-Resolution Image Synthesis with Latent Diffusion Models. arXiv:2112.10752 (2022). Uruchamianie procesu diffusion w skompresowanej latent space, co uczyniło stałą liczbę kroków wystarczająco tanią, by sprzedawać ją za obraz.

  10. Prince, S. J. D. Understanding Deep Learning (MIT Press, 2023), rozdział 18. Zadeklarowana delegacja wszystkiego, co ten rozdział pominął o diffusion — variational bound, harmonogramy szumu, classifier-free guidance i rodziny sampler. Hu, E. et al., LoRA: Low-Rank Adaptation of Large Language Models, arXiv:2106.09685 (2021), to sam adapter, wprowadzony w Rozdziale 11 na language model i użyty tutaj na image model bez zmiany matematyki. Radford, A. et al., Robust Speech Recognition via Large-Scale Weak Supervision (Whisper), arXiv:2212.04356 (2022), to transcription model, którego cena za minutę pojawia się powyżej.

  11. OpenAI, Image generation, developers.openai.com/api/docs/guides/image-generation, Pricing, developers.openai.com/api/docs/pricing, oraz strona modelu dla gpt-image-1, wszystkie dostęp 2026-09-07. Strona modelu dla gpt-image-2 nie ma sekcji cenowej; jego stawki pochodzą ze strony z cenami powyżej. Strona GPT Image 1 publikuje text input po $5.00, image input po $10.00 i image output po $40.00 za milion tokens obok tabeli cen za obraz użytej w wyprowadzeniu powyżej. Także: tabela output-token dla modeli sprzed gpt-image-2 (272 / 408 / 400 low, 1056 / 1584 / 1568 medium, 4160 / 6240 / 6208 high, dla kwadratu, portretu i krajobrazu); tabele cen za obraz dla GPT Image 2, 1.5, 1 i 1 Mini użyte w wyprowadzeniach powyżej; zdanie „a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting”; uwaga, że każdy streamed partial image kosztuje dodatkowe 100 image output tokens; oraz stawki gpt-image-2: $8.00 image input, $2.00 cached image input, $30.00 image output i $5.00 text input za milion tokens. Stawki text model użyte do porównań: gpt-5.6-terra po $2.00 input, $0.20 cached input i $12.00 output, gpt-5.6-luna po $0.20 i $1.20, standard tier, krótki context. Wideo: sora-2 po $0.10 za sekundę przy 720p i sora-2-pro po $0.30, $0.50 i $0.70 przy 720p, 1024p i 1080p. Transkrypcja: $0.006, $0.0045, $0.003 i $0.017 za minutę dla gpt-4o-transcribe, gpt-transcribe, gpt-4o-mini-transcribe i gpt-live-transcribe. 2

  12. Google, Gemini Developer API pricing, ai.google.dev/gemini-api/docs/pricing, dostęp 2026-09-07. Gemini 3.1 Flash-Lite po $0.25 za milion input tokens (text, image i video) oraz $1.50 output. Gemini 3.1 Flash Image: image output po $60 za milion tokens, z opublikowanymi ekwiwalentami 747, 1120, 1680 i 2520 tokens dla obrazów 0.5K, 1K, 2K i 4K oraz cenami za obraz $0.045, $0.067, $0.101 i $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 i „$3.00 or $0.005/min” audio input, „$4.50 (text) $12.00 or $0.018/min (audio)” output. Veo 3.1 za sekundę z audio: $0.40 przy 720p i 1080p oraz $0.60 przy 4K standard; $0.10, $0.12 i $0.30 fast. Gemini Omni Flash rozlicza video output „at a rate of 5,792 tokens per second of 720p video”, co ta sama przypisowa nota przelicza na około $0.10 za sekundę — najjaśniejsze opublikowane gdziekolwiek stwierdzenie, że cena za sekundę media jest ceną token. 2

  13. Strony modeli OpenAI dla tts-1, tts-1-hd i gpt-4o-mini-tts, developers.openai.com/api/docs/models, dostęp 2026-09-07. tts-1 po $15.00 i tts-1-hd po $30.00 za milion znaków; gpt-4o-mini-tts po $0.60 za milion text input tokens i $12.00 za milion audio output tokens — ten sam dostawca, ta sama operacja, dwie jednostki.

  14. OpenAI, Managing costs (Realtime API), developers.openai.com/api/docs/guides/realtime-costs, dostęp 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.” Także: „The entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive”; koszty narastają, gdy Response jest tworzony; dwuturowy przykład obliczeniowy, którego akumulację odtwarza tabela powyżej; oraz payload użycia response.done z podziałami input_token_details i output_token_details. Stawki ze strony z cenami, ta sama data: audio gpt-realtime-2.1 po $32.00 input, $0.40 cached input i $64.00 output za milion tokens, text po $4.00, $0.40 i $24.00, image input po $5.00. 2

  15. Replicate, Pricing, replicate.com/pricing, dostęp 2026-09-07. Nvidia A100 (80GB) po $0.001400 za sekundę i $5.04 za godzinę; Nvidia H100 po $0.001525 za sekundę i $5.49 za godzinę.

Gotowy, żeby to LIA wybierała za Ciebie?

Twórz ze wszystkimi modelami AI w jednym miejscu — zacznij dziś za darmo.