Harga Multimodal: Tagihan Nyata untuk Gambar, Audio, dan Video
Tiga model untuk 500 foto yang sama bisa berbeda 5,5×, dan yang termurah berubah saat ukuran gambar diubah.
Di halaman ini
Ini satu tugas, dihargai dengan tiga cara: jelaskan lima ratus foto produk, satu caption pendek untuk masing-masing. Foto yang sama, instruksi yang sama, panjang jawaban yang sama. Satu-satunya hal yang berubah adalah model mana yang membacanya.
| foto | 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 |
Ada tiga hal dalam tabel itu yang layak dihentikan sejenak.
Model termurah berubah antara baris ketiga dan keempat, pada tugas yang sama, karena seseorang mengubah ukuran foto. Minta paragraf alih-alih caption dan titik perpotongannya bergerak lagi: pada 1280 × 960 pemenangnya Gemini untuk caption empat puluh token dan OpenAI untuk paragraf empat ratus token.
Kolom Gemini tidak bergerak sama sekali, di baris mana pun: foto 4000 \u00d7 3000 biayanya persis sama dengan foto 640 \u00d7 480. Foto 4000 × 3000 biayanya persis sama dengan foto 640 × 480. Itu bukan cap. Itu konsekuensi dari cara ia menghitung, dan artinya optimisasi biaya paling umum di bisnis ini — turunkan resolusi sebelum upload — hasilnya seperti ini:
| image tokens, 4000 × 3000 → 800 × 600 | biaya run | penghematan | |
|---|---|---|---|
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 % |
Tidak satu pun angka itu adalah harga yang dipublikasikan vendor. Ketiganya harus dihitung, dari tiga aturan berbeda, karena foto bukan unit yang ditagihkan di mana pun: foto lebih dulu dikonversi menjadi tokens, lewat aritmetika yang ditulis di tiga tempat yang tidak kompatibel.
Bab 16 membangun tagihan untuk teks dan berhenti di batas teks. Bab ini adalah sisa invoicenya: gambar, ujaran, transkripsi, video, dan compute mentah, yang di antara semuanya ditagihkan dalam delapan unit berbeda, serta metode untuk membandingkan hal-hal yang tidak dijual dengan ukuran yang sama.
Tampilkan detail
Yang dibutuhkan bab ini dari bab-bab sebelumnya.
- Bab 7 membangun tokenizer dan unitnya. Semua di sini adalah upaya mengubah sesuatu yang bukan teks menjadi unit itu.
- Bab 8 menetapkan apa yang dikonsumsi model: bukan simbol, melainkan vektor dalam ruang embedding. Itulah mengapa gambar bisa dihargai dalam tokens sama sekali.
- Bab 16 membangun
computeCost, tier harga, dan lima bucket token-nya. Bab ini memperluas function itu, bukan menggantinya. - Bab 11 memperkenalkan LoRA sebagai teknik fine-tuning dan Bab 20 menghargainya sebagai keputusan anggaran. Di sini ia muncul pada model yang bukan language model.
Tidak ada tensor, mengikuti aturan dari Bab 14: ini soal tarif, konversi, dan akuntansi, jadi ini TypeScript.
Mengapa foto punya harga token
Tautan ke bagian: Mengapa foto punya harga tokenTransformer menerima urutan vektor. Ia tidak peduli dari mana vektor itu berasal. Bab 8 memberinya embeddings yang diambil dari token id; tidak ada dalam arsitektur yang mengharuskan lookup itu.
Jadi: potong gambar menjadi kotak-kotak tetap, ratakan tiap kotak menjadi daftar angka, lalu dorong tiap daftar melalui satu layer linear terpelajar untuk mendapatkan vektor selebar model. Patch piksel warna 32 × 32 adalah angka; proyeksi mengubahnya menjadi satu vektor berdimensi , persis bentuk sebuah text token saat masuk. Itu saja seluruhnya, dan paper yang judulnya mengatakannya: sebuah gambar bernilai 16 × 16 kata.1 Tambahkan positional encoding agar model tahu kotak mana berada di mana, selang-selingkan hasilnya dengan text embeddings, dan urutan yang dibaca model menjadi sebagian gambar dan sebagian kalimat.
Tiga paper membuatnya menjadi produk. CLIP melatih image encoder dan text encoder agar sepakat, pada empat ratus juta pasangan hasil scrape, dan di sanalah gagasan bahwa piksel dan kata bisa berbagi ruang berhenti menjadi hipotesis.2 Flamingo memasang vision encoder beku ke language model beku dengan beberapa bridging layer terlatih.3 LLaVA menunjukkan bridge itu bisa berupa satu proyeksi linear dan instruction-following bisa diajarkan dengan data yang dihasilkan, sebab itu setiap open vision-language model sejak saat itu terlihat kira-kira sama.4
Konsekuensinya untuk invoice kamu langsung dan tidak glamor: patch adalah posisi dalam urutan, jadi patch adalah input tokens, jadi kamu membayarnya dengan tarif input. Berapa banyaknya adalah aritmetika, dan tiap provider melakukannya secara berbeda.
Tiga aturan, semuanya dipublikasikan, tidak ada yang sama
Tautan ke bagian: Tiga aturan, semuanya dipublikasikan, tidak ada yang samaSetiap aturan di bawah diimplementasikan dari dokumentasi provider sendiri dan dicek terhadap contoh kerja di dokumentasi yang sama.
OpenAI menutupi gambar dengan patch 32 × 32 dan mengalikan hitungannya dengan faktor per model. Jika jumlah patch melampaui anggaran untuk model dan level detail itu, gambar diperkecil sampai muat:
Anthropic menutupinya dengan patch 28 × 28, satu visual token masing-masing, dan memberi cap pada sisi panjang serta jumlah token — 1.568 piksel dan 1.568 tokens pada model standard-tier, 2.576 dan 4.784 pada high-resolution tier. Gambar yang terlalu besar diskalakan ke ukuran terbesar yang memenuhi keduanya.5
Google sama sekali tidak menghitung piksel. Gambar dengan kedua sisi 384 piksel atau kurang dikenai tarif datar 258 tokens. Apa pun yang lebih besar dipotong menjadi tile masing-masing 258 tokens, dan grid tile berasal dari crop unit sebesar .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;
}Jalankan masing-masing terhadap angka yang dicetak vendornya sendiri:
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 MATCHSembilan kecocokan dicetak; run penuh mengecek lima belas, karena tabel Anthropic memberi kedua tier untuk keenam ukuran. Aturan itu sekarang bisa kamu jalankan pada foto apa pun yang kamu punya, dan itulah intinya: inilah satu-satunya tiga functions dalam bab ini yang tidak bisa kamu dapatkan dari halaman harga.
Arti "lebih besar", tiga kali
Tautan ke bagian: Arti "lebih besar", tiga kaliMasukkan foto 4:3 yang sama melalui ketiganya pada enam ukuran:
| ukuran | 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 |
Baca kolom terakhir ke bawah. Begitu gambar melewati 384 piksel, angkanya tidak pernah berubah lagi, dan itu bukan kebetulan atau cap. Substitusikan crop unit kembali ke formula tile, untuk gambar yang setidaknya selebar tingginya:
Ukurannya saling hapus. Image tokens Google bergantung pada aspect ratio dan tidak pada yang lain. Foto 4:3 adalah empat tile, entah ia thumbnail atau poster. Fakta aljabar tunggal itu adalah seluruh penjelasan untuk angka nol di tabel penghematan di atas, dan tidak ada halaman harga mana pun yang menyatakannya.
Dua kolom lain justru melakukan cap, pada tinggi berbeda dan dengan alasan berbeda — Anthropic pada ceiling token yang dinyatakan, OpenAI pada patch budget setelah limit piksel — dan itulah mengapa tiga kurva berpotongan pada ukuran yang berbeda.
Sekarang rusakkan. Cara yang jelas untuk membayar lebih sedikit pada vision model adalah meminta detail lebih sedikit, jadi kirim detail: "low":
1600x1200 low = 2280 high = 2280 ratio 1.00
3200x2400 low = 3687 high = 2942 ratio 1.25Meminta detail lebih sedikit malah berbiaya 25 % lebih mahal. Ini bukan bug dan OpenAI mengatakannya dalam satu baris tabel sizing: pada keluarga model itu, low menggunakan limit 2048-piksel dengan budget 6.144-patch sementara high menggunakan limit piksel yang sama dengan budget 2.500-patch, “so it can use more tokens than high”.7 Kata low menamai pengaturan fidelity, bukan harga: pada dua dari lima keluarga model yang didokumentasikan ia tidak memberi penghematan sama sekali, dan pada salah satu dari dua itu biayanya lebih mahal.
Membuat gambar adalah mesin yang berbeda
Tautan ke bagian: Membuat gambar adalah mesin yang berbedaSemua sejauh ini adalah model yang membaca gambar. Membuat gambar berjalan pada mekanisme yang sama sekali tidak memiliki tokens, dan itulah alasan ia dijual per gambar, bukan per kata.
Membuat gambar: harga per gambar adalah harga per token
Tautan ke bagian: Membuat gambar: harga per gambar adalah harga per tokenVendor mempublikasikan image generation sebagai harga per gambar. Itu bukan satu harga tunggal. Model GPT Image mengeluarkan image tokens khusus yang jumlahnya bergantung pada ukuran dan kualitas yang diminta; kalikan jumlah yang dipublikasikan dengan tarif output gambar GPT Image 1 yang dipublikasikan sebesar $40 per juta dan bandingkan dengan harga per gambar di halaman yang sama:
| quality | 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) |
Sembilan angka turunan melawan sembilan angka yang dipublikasikan, setiap pasangan cocok dalam selisih $0.002.11 Google bahkan lebih eksplisit dan melakukan konversinya untukmu di halaman harga itu sendiri: output gambar pada $60 per juta tokens, “output images at 1K (1024x1024px) consume 1120 tokens and are equivalent to $0.067 per image”.12
Jadi harga per gambar adalah harga per token dengan hitungannya dilipat masuk. Itu baik-baik saja, dan menyembunyikan sesuatu. Ambil tabel generasi saat ini dan bagi mundur:
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 tokGambar yang lebih besar adalah yang lebih murah pada setiap quality. Canvas 1024 × 1536 memiliki 50 % lebih banyak piksel daripada 1024 × 1024 dan berbiaya 23 % lebih sedikit tokens pada medium. OpenAI menandainya dalam satu kalimat yang mungkin kamu lewati — “a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting” — dan pada generasi model sebelumnya arahnya terbalik, portrait berbiaya 50 % lebih mahal daripada square.11 Setiap default 1024x1024 yang ditulis sebelum perubahan itu sekarang menjadi opsi mahal.
Suara, ditagihkan per detik, karakter, dan token
Tautan ke bagian: Suara, ditagihkan per detik, karakter, dan tokenMinta tiga produk mengucapkan 519 karakter yang sama — sekitar 38 detik audio — dan kamu mendapat tiga sistem unit dari dua vendor:
| model | unit | harga |
|---|---|---|
tts-1 | per karakter | $15.00 per juta karakter → $0.007785 |
tts-1-hd | per karakter | $30.00 per juta karakter → $0.015570 |
gemini-3.1-flash-tts | per audio token, 25 per detik | $20.00 per juta → $0.019319 |
Vendor yang sama menjual kedua unit: tts-1 milik OpenAI dihargai per juta karakter sementara gpt-4o-mini-tts dihargai per juta tokens, $0.60 masuk dan $12.00 keluar.13 Jadi “text-to-speech termurah” bukan pertanyaan yang punya jawaban sampai kamu mengatakan apa yang diucapkan.
Dan kedua unit itu buta terhadap hal yang berlawanan. Harga per karakter tidak bisa melihat durasi: pilih suara yang lambat dan deliberatif, atau tambahkan jeda, dan tagihannya tidak bergerak sementara audionya makin panjang. Harga per detik tidak bisa melihat konten: tiga puluh detik biayanya sama entah itu paragraf teknis yang padat atau seseorang menghitung sampai sepuluh. Ganti suaranya dan tepat satu dari dua vendormu menghitung ulang harga.
Transkripsi berjalan sebaliknya dan menjadi baris paling sederhana di seluruh invoice — per menit audio, datar:
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)Perhatikan baris terakhir dibanding baris ketiga: melakukannya live, saat kata-kata datang, biayanya 5,7 kali dibanding melakukannya pada file yang sudah selesai. Selisih itu adalah harga karena tidak bisa melakukan batch, dan itulah yang membuat bagian berikutnya mahal.
Satu menit suara, dirinci
Tautan ke bagian: Satu menit suara, dirinciSekarang angka yang menentukan apakah voice adalah fitur atau produk.
Panggilannya: percakapan dukungan sepuluh turn, 149 kata, yang pada 150 kata per menit yang dinyatakan adalah 59,6 detik ujaran — 21,2 diucapkan oleh penelepon, 38,4 diucapkan kembali. Konversi token adalah milik provider sendiri. 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 per detik, dua arah, yang dikonfirmasi halaman harganya dengan mempublikasikan $12.00 per juta dan $0.018 per menit pada baris yang sama.12
Percakapan terakumulasi persis seperti yang dikatakan Bab 16, karena mekanismenya sama: “the entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive”.14 Hanya saja sekarang history diukur dalam audio tokens.
| turn | user | assistant | fresh audio in | cached audio in | audio out | cost |
|---|---|---|---|---|---|---|
| 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 |
Sekarang perbandingan yang menentukan produk, keempatnya dinormalisasi ke satu menit:
| per menit | dibanding teks | |
|---|---|---|
gpt-realtime-2.1, tanpa caching | $0.131259 | 37.9× |
gpt-realtime-2.1, history cached | $0.057425 | 16.6× |
gemini-3.1-flash-live, tanpa caching | $0.023965 | 6.9× |
kata yang sama diketik, gpt-5.6-terra | $0.003461 | — |
Tiga puluh delapan kali. Bukan tiga puluh delapan persen. Pertukaran yang identik, dilakukan dalam suara alih-alih teks, hampir dua orde magnitudo lebih mahal, dan tidak satu pun dari selisih itu adalah margin yang sengaja dikenakan seseorang — itu adalah rasio konversi. Satu detik audio assistant adalah dua puluh tokens. Detik yang sama membawa 2,5 kata pada laju yang dinyatakan, dan transkrip terukur berjalan pada 1,26 tokens per kata, jadi sebagai teks ia 3,15 tokens. Suara adalah paket 6,3 kali lebih besar untuk makna yang sama, dan setiap token-nya ditagihkan pada 5,3 kali tarif output teks dan 16 kali tarif input teks. Kalikan rasio bulk dengan rasio harga dan orde magnitudonya sudah muncul bahkan sebelum akuntansi dimulai.
Dua konsekuensi operasional langsung keluar dari tabel.
Audio caching bukan optimisasi, melainkan business model. Cached audio input adalah $0.40 per juta melawan $32.00 fresh — diskon 98,75 % yang memangkas panggilan menjadi separuh. Aturannya sama seperti Bab 16, tidak berubah: cache mencocokkan prefix, jadi apa pun yang disisipkan di depan percakapan di tengah panggilan menghancurkannya, dan tempat alami untuk menaruh “penelepon sekarang terverifikasi” persis di sana.
Dan tidak ada yang kamu lakukan di client yang membatalkan tagihan suara. User berbicara menindih assistant, kode kamu menghentikan playback, speaker menjadi senyap. Apa pun yang sudah dihasilkan sudah ditagihkan, karena billing bertambah saat response dibuat; dan menurut aturan Bab 16, apa pun yang tetap berada dalam percakapan dikirim ulang, sebagai input audio, di setiap turn setelahnya. Bab 14 membuat poin ini tentang membatalkan text stream. Dalam voice, biayanya tiga puluh kali lebih mahal.
Video, GPU-seconds, dan harga yang bukan harga
Tautan ke bagian: Video, GPU-seconds, dan harga yang bukan hargaVideo dijual per detik oleh sebagian vendor dan per clip oleh yang lain, dengan tier untuk resolusi dan kadang untuk durasi. Dua bentuk itu bukan sekadar berbeda dalam kenyamanan; keduanya berpotongan.
| model | 1 s | 2 s | 5 s | 10 s | 20 s |
|---|---|---|---|---|---|
veo-3.1, per detik, 1080p | $0.400 | $0.800 | $2.000 | $4.000 | $8.000 |
veo-3.1-fast, per detik, 1080p | $0.120 | $0.240 | $0.600 | $1.200 | $2.400 |
sora-2, per detik, 720p | $0.100 | $0.200 | $0.500 | $1.000 | $2.000 |
hailuo-02, per clip, 1080p | $0.480 | $0.480 | $0.480 | $0.480 | $0.480 |
mochi, per GPU-second | $0.018 | $0.037 | $0.092 | $0.183 | $0.366 |
Vendor per-clip lebih mahal daripada vendor per-second di bawah 1,2 detik dan 16,7 kali lebih murah pada dua puluh detik. Tidak ada urutan dari dua model itu yang bertahan setelah panjang clip berubah, jadi “model video mana yang termurah” bukan pertanyaan tentang model.
Baris terakhir lebih buruk, dan itulah inti jujur bab ini. mochi ditagihkan terhadap detik GPU nyata — waktu prediksi terukur dari job — pada $0.001400 per detik di A100 dan $0.001525 di H100, yang merupakan tarif mesin sewaan dan tidak lebih.15 Itu tarif yang sepenuhnya presisi dan bukan harga, karena kuantitas yang dikalikannya tidak diketahui sampai setelah kamu berkomitmen untuk membayarnya. Baris di atas mengasumsikan dua belas GPU-seconds per detik output; lipatgandakan asumsi itu empat kali dan ia keluar dari band termurah, dan baru pada enam kali ia mendarat di tengah tabel. Itu satu-satunya tarif di halaman ini yang tidak bisa kamu masukkan ke quote.
Normalizer
Tautan ke bagian: NormalizerJadi: tokens, image tokens, karakter, menit, detik video, seluruh clip, GPU seconds, unit datar. Delapan kuantitas, dan satu-satunya cara menaruhnya pada satu sumbu adalah menyatakan workload lalu menghargainya.
Itulah ekstensi untuk computeCost dari Bab 16 — machinery tier yang sama, sekarang dengan criteria yang bukan panjang 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;
}Dua baris yang ditandai adalah tempat ia pecah. Tarif yang dikutip per unit mengalikan u.images ?? 1; tarif yang dikutip per token mengalikan sesuatu yang default-nya nol. Beri keduanya usage kosong — bentuk yang kamu dapat saat measurement gagal — dan lihat:
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.0000Tidak terjadi apa-apa, enam kali, dan biayanya tiga dolar sekali serta nol lima kali. Itu bukan selisih pembulatan; itu keputusan tentang arti angka yang absen, diambil terpisah untuk tiap unit dan tidak pernah dituliskan. Aturan yang benar adalah field yang tidak diukur siapa pun tetap absen, karena “not measured” dan “measured and came out zero” adalah hal berbeda. Fungsi ini diam-diam tidak setuju.
Kegagalan kedua adalah durasi. Tarif clip-priced memilih tier-nya dengan maxDurationSeconds terhadap u.videoSeconds ?? 0, jadi usage yang tidak pernah mencatat durasi cocok dengan tier terpendek:
duration recorded -> $0.45
duration missing -> $0.27Diskon empat puluh persen karena tidak tahu berapa lama videonya. Kedua bug punya akar yang sama: default yang dipilih demi kenyamanan di dalam function yang seluruh tugasnya adalah presisi.
Membuat angkanya bisa dibandingkan
Tautan ke bagian: Membuat angkanya bisa dibandingkanDengan biaya bisa dihitung, perbandingan membutuhkan separuh lainnya — declared representative workload, satu per engine, dinyatakan di publik agar pembaca bisa tidak setuju dengannya:
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 },
};Setiap baris itu adalah argumen. Teks mencampur seperempat input dan tiga perempat output karena pemakaian nyata condong ke output; blend lima puluh-lima puluh akan memberi ranking model berbeda. Workload gambar mengasumsikan 1.500 output tokens, di antara 1.056 milik OpenAI untuk medium square dan 1.584 untuk medium portrait. Video mengasumsikan lima detik pada 1080p, dan kita baru saja melihat dua vendor bertukar tempat pada 1,2 detik. Entri compute mengasumsikan enam puluh GPU-seconds karena tidak ada hal lain untuk diasumsikan.
Itulah metodenya, dan itu satu-satunya metode jujur yang tersedia: kamu tidak bisa membandingkan harga dalam unit berbeda; kamu hanya bisa membandingkan biaya workload yang sudah kamu tuliskan. Tabel apa pun yang memberi ranking model multimodal tanpa mencetak workload-nya sedang memberi ranking pada asumsi-asumsinya sendiri.
Ke mana selanjutnya
Tautan ke bagian: Ke mana selanjutnyaSekarang kamu bisa menghargai apa pun yang bisa dihasilkan model, dalam unit apa pun yang dijual, dan menyebutkan dengan jelas workload mana yang diasumsikan perbandinganmu. Itu menutup invoice yang dibuka Bab 16, dan menutup Part III: semua dari Bab 14 sampai sini membahas satu call — cara membuatnya, apa yang dimasukkan, cara melakukan sample, apa yang dikembalikan, berapa biayanya.
Bab 22 mengubah unit analisis, dan perubahan itu mahal. Agent bukan satu call; ia adalah loop yang memutuskan sendiri berapa banyak call yang akan dibuat, dan aritmetika dua bab terakhir adalah yang mengubahnya dari diagram arsitektur menjadi anggaran. Bab itu dibuka dengan mengajukan pertanyaan yang sama kepada model yang sama dua kali, dengan satu tool ditambahkan ke katalog pada kali kedua, dan mengukur apa yang dilakukan satu tool itu: satu call menjadi dua, tiga puluh sembilan input tokens menjadi 420.
Apakah itu menjadikannya agent bergantung pada definisi terpublikasi mana dari dua definisi yang kamu buka, dan keduanya tidak sepakat. Salah satunya bahkan tidak sepakat dengan dirinya sendiri.
Sumber dan metode
Tautan ke bagian: Sumber dan metodeSetiap harga, formula, dan conversion rate dalam bab ini dibaca dari halaman provider sendiri pada 7 September 2026 dan dikutip dengan tanggal itu, karena semuanya akan berubah. Hitungan token, biaya, dan perbandingan dihitung pada data itu oleh kode yang dicetak di atas, pada satu mesin, tanpa paid API call — yang juga menjadi alasan jujur mengapa tidak ada satu pun klaim latency dalam bab ini.
Functions image-token, tabel biaya, rincian voice-call, dan hasil empty-usage dihasilkan oleh TypeScript yang dicetak dalam bab ini, dijalankan di Node 22. Dialog yang digunakan untuk perbandingan voice berjumlah 149 kata dan di-tokenize dengan tiktoken di bawah encoding o200k_base pada 188 tokens; durasinya berasal dari laju yang dinyatakan sebesar 150 kata per menit, yang merupakan parameter perbandingan dan bukan measurement. Setiap angka provider membawa footnote yang menamai halaman asalnya.
Referensi
Tautan ke bagian: Referensi-
Dosovitskiy, A. et al. An Image Is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv:2010.11929 (2020). Patch, proyeksi linear ke dimensi embedding, dan position embeddings yang membuat grid dapat dibaca oleh sequence model. ↩
-
Radford, A. et al. Learning Transferable Visual Models From Natural Language Supervision. arXiv:2103.00020 (2021). Contrastive training pada image encoder dan text encoder atas 400 juta pasangan, serta ruang bersama yang diasumsikan semua yang downstream. ↩
-
Alayrac, J.-B. et al. Flamingo: a Visual Language Model for Few-Shot Learning. arXiv:2204.14198 (2022). Vision encoder beku, language model beku, bridging layer terlatih — arsitektur yang mengubah image understanding menjadi kemampuan chat. ↩
-
Liu, H., Li, C., Wu, Q. and Lee, Y. J. Visual Instruction Tuning. arXiv:2304.08485 (2023). Satu proyeksi linear sebagai bridge dan data instruksi yang dihasilkan sebagai training set; alasan open vision-language models berkumpul pada satu bentuk. ↩
-
Anthropic, Vision,
platform.claude.com/docs/en/build-with-claude/vision, diakses 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.” Juga dua resolution tier (standard: long edge 1568-piksel, 1568 visual tokens; high-resolution, pada Claude 4.7 dan setelahnya: 2576 piksel dan 4784 tokens), aturan downsizing, dan tabel enam baris ukuran serta hitungan token yang direproduksi di atas. Tarif model dari Anthropic, Pricing,platform.claude.com/docs/en/about-claude/pricing, tanggal yang sama: Claude Haiku 4.5 pada $1 dan $5 per juta input dan output tokens. ↩ -
Google, Image understanding,
ai.google.dev/gemini-api/docs/image-understanding, diakses 2026-09-07. “258 tokens if both dimensions <= 384 pixels. Larger images are tiled into 768x768 pixel tiles, each costing 258 tokens”, dengan formula crop-unit —floor(min(width, height) / 1.5), dimensi dibagi olehnya dan dikalikan bersama — dan contoh kerja 960 × 540 yang menghasilkan 3 × 2 = 6 tiles. Google menyebutnya “a rough formula”; scale-invariance yang diturunkan di atas adalah properti formula sebagaimana dipublikasikan. Audio input pada keluarga yang sama adalah 32 tokens per detik audio (ai.google.dev/gemini-api/docs/audio, tanggal yang sama). ↩ -
OpenAI, Images and vision,
developers.openai.com/api/docs/guides/images-vision, diakses 2026-09-07. Sumber aturan berbasis patch (patch 32 × 32,patch_count = ceil(width/32)×ceil(height/32), formulashrink_factordan penyesuaian integer-nya, rejection limit 30.000-patch); tabel sizing model, termasuk bahwalowpadagpt-5.4menggunakan limit 2048-piksel dan budget 6.144-patch “so it can use more tokens thanhigh”, dibanding budget 2.500-patch milikhigh; tabel multiplier (1,2 untuk keluarga GPT-5.x, 1,62 untukgpt-4.1-mini, 2,46 untukgpt-4.1-nano); dua contoh kerja yang direproduksi di atas (1024 × 1024 → 1229 tokens, 2048 × 2048 → 3000 tokens); aturan berbasis tile untuk model lama (base plus tile 512-piksel, 85 + 170 padagpt-4o); dan daftar batasan yang dikutip dalam kotak vision. ↩ ↩2 -
Ho, J., Jain, A. and Abbeel, P. Denoising Diffusion Probabilistic Models. arXiv:2006.11239 (2020). Forward noising schedule, reparameterization yang mengubah objective menjadi prediksi noise yang ditambahkan, dan sampling loop. ↩
-
Rombach, R., Blattmann, A., Lorenz, D., Esser, P. and Ommer, B. High-Resolution Image Synthesis with Latent Diffusion Models. arXiv:2112.10752 (2022). Menjalankan proses diffusion dalam compressed latent space, yang membuat jumlah langkah tetap cukup terjangkau untuk dijual per gambar. ↩
-
Prince, S. J. D. Understanding Deep Learning (MIT Press, 2023), bab 18. Delegasi yang dinyatakan untuk semua yang dilewati bab ini tentang diffusion — variational bound, noise schedules, classifier-free guidance dan keluarga sampler. Hu, E. et al., LoRA: Low-Rank Adaptation of Large Language Models, arXiv:2106.09685 (2021), adalah adapter itu sendiri, diperkenalkan di Bab 11 pada language model dan digunakan di sini pada image model tanpa perubahan matematika. Radford, A. et al., Robust Speech Recognition via Large-Scale Weak Supervision (Whisper), arXiv:2212.04356 (2022), adalah model transkripsi yang harga per menitnya muncul di atas. ↩
-
OpenAI, Image generation,
developers.openai.com/api/docs/guides/image-generation, Pricing,developers.openai.com/api/docs/pricing, dan halaman model untukgpt-image-1, semuanya diakses 2026-09-07. Halaman model untukgpt-image-2tidak memuat bagian pricing; tarifnya berasal dari halaman pricing di atas. Halaman GPT Image 1 mempublikasikan text input pada $5.00, image input pada $10.00 dan image output pada $40.00 per juta tokens di samping tabel per-gambar yang digunakan dalam derivasi di atas. Juga: tabel output-token untuk model sebelum gpt-image-2 (272 / 408 / 400 low, 1056 / 1584 / 1568 medium, 4160 / 6240 / 6208 high, untuk square, portrait dan landscape); tabel harga per gambar untuk GPT Image 2, 1.5, 1 dan 1 Mini yang digunakan dalam derivasi di atas; kalimat “a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting”; catatan bahwa setiap partial image yang di-stream berbiaya ekstra 100 image output tokens; dan tarif gpt-image-2 sebesar $8.00 image input, $2.00 cached image input, $30.00 image output dan $5.00 text input per juta tokens. Tarif text model yang digunakan untuk perbandingan:gpt-5.6-terrapada $2.00 input, $0.20 cached input dan $12.00 output,gpt-5.6-lunapada $0.20 dan $1.20, standard tier, short context. Video:sora-2pada $0.10 per detik di 720p dansora-2-propada $0.30, $0.50 dan $0.70 di 720p, 1024p dan 1080p. Transkripsi: $0.006, $0.0045, $0.003 dan $0.017 per menit untukgpt-4o-transcribe,gpt-transcribe,gpt-4o-mini-transcribedangpt-live-transcribe. ↩ ↩2 -
Google, Gemini Developer API pricing,
ai.google.dev/gemini-api/docs/pricing, diakses 2026-09-07. Gemini 3.1 Flash-Lite pada $0.25 per juta input tokens (teks, gambar, dan video) dan $1.50 output. Gemini 3.1 Flash Image: output gambar pada $60 per juta tokens, dengan ekuivalensi yang dipublikasikan sebesar 747, 1120, 1680, dan 2520 tokens untuk gambar 0.5K, 1K, 2K, dan 4K serta harga per gambar $0.045, $0.067, $0.101, dan $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 teks dan “$3.00 or $0.005/min” audio input, “$4.50 (text) $12.00 or $0.018/min (audio)” output. Veo 3.1 per detik dengan audio: $0.40 pada 720p dan 1080p serta $0.60 pada 4K standard; $0.10, $0.12 dan $0.30 fast. Gemini Omni Flash menagih output video “at a rate of 5,792 tokens per second of 720p video”, yang footnote yang sama konversikan menjadi sekitar $0.10 per detik — pernyataan terpublikasi paling jelas di mana pun bahwa harga media per detik adalah harga token. ↩ ↩2 -
Halaman model OpenAI untuk
tts-1,tts-1-hddangpt-4o-mini-tts,developers.openai.com/api/docs/models, diakses 2026-09-07.tts-1pada $15.00 dantts-1-hdpada $30.00 per juta karakter;gpt-4o-mini-ttspada $0.60 per juta text input tokens dan $12.00 per juta audio output tokens — vendor yang sama, operasi yang sama, dua unit. ↩ -
OpenAI, Managing costs (Realtime API),
developers.openai.com/api/docs/guides/realtime-costs, diakses 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.” Juga: “The entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive”; biaya bertambah saat Response dibuat; contoh kerja dua turn yang akumulasinya direproduksi tabel di atas; dan payload usageresponse.donedengan pemisahaninput_token_detailsdanoutput_token_details. Tarif dari halaman pricing, tanggal yang sama: audiogpt-realtime-2.1pada $32.00 input, $0.40 cached input dan $64.00 output per juta tokens, teks pada $4.00, $0.40 dan $24.00, image input pada $5.00. ↩ ↩2 -
Replicate, Pricing,
replicate.com/pricing, diakses 2026-09-07. Nvidia A100 (80GB) pada $0.001400 per detik dan $5.04 per jam; Nvidia H100 pada $0.001525 per detik dan $5.49 per jam. ↩