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.
| fotografia | gpt-5.6-luna | gemini-3.1-flash-lite | claude-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 × 600 | koszt uruchomienia | oszczędność | |
|---|---|---|---|
gpt-5.6-luna | 2,942 → 570 | $0.3220 → $0.0848 | 73.7 % |
claude-haiku-4.5 | 1,564 → 638 | $0.9010 → $0.4380 | 51.4 % |
gemini-3.1-flash-lite | 1,032 → 1,032 | $0.1638 → $0.1638 | 0.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 tokenTransformer 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 liczb; projekcja zamienia go w jeden -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 samaKaż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:
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 .6
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:
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 MATCHWydrukowanych 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 razyPrzepuść tę samą fotografię 4:3 przez wszystkie trzy reguły w sześciu rozmiarach:
| rozmiar | OpenAI, high | Anthropic, standard | Anthropic, high-res | Gemini |
|---|---|---|---|---|
| 384 × 288 | 130 | 154 | 154 | 258 |
| 640 × 480 | 360 | 414 | 414 | 1,032 |
| 800 × 600 | 570 | 638 | 638 | 1,032 |
| 1600 × 1200 | 2,280 | 1,564 | 2,494 | 1,032 |
| 3200 × 2400 | 2,942 | 1,564 | 4,740 | 1,032 |
| 4000 × 3000 | 2,942 | 1,564 | 4,740 | 1,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:
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":
1600x1200 low = 2280 high = 2280 ratio 1.00
3200x2400 low = 3687 high = 2942 ratio 1.25Proś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 maszynaWszystko 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 tokenDostawcy 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 × 1024 | 1024 × 1536 | 1536 × 1024 |
|---|---|---|---|
| low | 272 tok → $0.0109 ($0.011) | 408 tok → $0.0163 ($0.016) | 400 tok → $0.0160 ($0.016) |
| medium | 1,056 tok → $0.0422 ($0.042) | 1,584 tok → $0.0634 ($0.063) | 1,568 tok → $0.0627 ($0.063) |
| high | 4,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:
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 tokWię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 tokenPoproś 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:
| model | jednostka | cena |
|---|---|---|
tts-1 | za znak | $15.00 za milion znaków → $0.007785 |
tts-1-hd | za znak | $30.00 za milion znaków → $0.015570 |
gemini-3.1-flash-tts | za 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:
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 pozycjeTeraz 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.
| tura | użytkownik | assistant | świeże audio in | cached audio in | audio out | koszt |
|---|---|---|---|---|---|---|
| 1 | 4.4 s | 9.2 s | 44 | 0 | 184 | $0.013224 |
| 2 | 5.6 s | 9.6 s | 56 | 228 | 192 | $0.014211 |
| 3 | 5.2 s | 9.2 s | 52 | 476 | 184 | $0.013670 |
| 4 | 4.0 s | 4.8 s | 40 | 712 | 96 | $0.007749 |
| 5 | 2.0 s | 5.6 s | 20 | 848 | 112 | $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.131259 | 37.9× |
gpt-realtime-2.1, historia w cache | $0.057425 | 16.6× |
gemini-3.1-flash-live, bez cache | $0.023965 | 6.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ą.
| model | 1 s | 2 s | 5 s | 10 s | 20 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.
Normalizator
Link do sekcji: NormalizatorA 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:
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:
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.0000Nic 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:
duration recorded -> $0.45
duration missing -> $0.27Czterdzieś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ć:
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.
Dokąd to prowadzi dalej
Link do sekcji: Dokąd to prowadzi dalejMoż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ą.
Źródła i metoda
Link do sekcji: Źródła i metodaKaż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.
Przypisy
Link do sekcji: Przypisy-
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. ↩
-
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. ↩
-
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. ↩
-
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. ↩
-
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. ↩ -
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). ↩ -
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órshrink_factori jego korekta całkowitoliczbowa, limit odrzucenia 30,000 patchy); tabela rozmiarów modeli, w tym informacja, żelownagpt-5.4używa limitu 2048 pikseli i budżetu 6,144 patchy „so it can use more tokens thanhigh”, wobec budżetu 2,500 patchy dlahigh; tabela mnożników (1.2 dla rodzin GPT-5.x, 1.62 dlagpt-4.1-mini, 2.46 dlagpt-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 nagpt-4o); oraz lista ograniczeń cytowana w ramce vision. ↩ ↩2 -
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. ↩
-
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. ↩
-
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. ↩
-
OpenAI, Image generation,
developers.openai.com/api/docs/guides/image-generation, Pricing,developers.openai.com/api/docs/pricing, oraz strona modelu dlagpt-image-1, wszystkie dostęp 2026-09-07. Strona modelu dlagpt-image-2nie 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-terrapo $2.00 input, $0.20 cached input i $12.00 output,gpt-5.6-lunapo $0.20 i $1.20, standard tier, krótki context. Wideo:sora-2po $0.10 za sekundę przy 720p isora-2-propo $0.30, $0.50 i $0.70 przy 720p, 1024p i 1080p. Transkrypcja: $0.006, $0.0045, $0.003 i $0.017 za minutę dlagpt-4o-transcribe,gpt-transcribe,gpt-4o-mini-transcribeigpt-live-transcribe. ↩ ↩2 -
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 -
Strony modeli OpenAI dla
tts-1,tts-1-hdigpt-4o-mini-tts,developers.openai.com/api/docs/models, dostęp 2026-09-07.tts-1po $15.00 itts-1-hdpo $30.00 za milion znaków;gpt-4o-mini-ttspo $0.60 za milion text input tokens i $12.00 za milion audio output tokens — ten sam dostawca, ta sama operacja, dwie jednostki. ↩ -
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życiaresponse.donez podziałamiinput_token_detailsioutput_token_details. Stawki ze strony z cenami, ta sama data: audiogpt-realtime-2.1po $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 -
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ę. ↩