İçeriğe geç
21/3030 bölümden 21. bölüm

Multimodal fiyatlandırma: Görsel, ses ve video gerçekte neyi faturalar

Aynı 500 fotoğraf üç modelde 5,5 kata varan fark yaratır; biri görselleri yeniden boyutlandırınca en ucuz seçenek değişir.

Bu sayfada

İşte tek bir iş, üç farklı fiyatla: beş yüz ürün fotoğrafını betimle, her biri için kısa bir caption. Aynı fotoğraflar, aynı instruction, aynı cevap uzunluğu. Değişen tek şey onları hangi modelin okuduğu.

fotoğrafgpt-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

Bu tabloda durup bakmaya değer üç şey var.

En ucuz model, aynı işte üçüncü satırla dördüncü satır arasında değişiyor, çünkü biri fotoğrafları yeniden boyutlandırmış. Caption yerine bir paragraf iste, kesişim noktası yine yer değiştirir: 1280 × 960’ta kazanan kırk token’lık caption için Gemini, dört yüz token’lık paragraf için OpenAI olur.

Gemini sütunu hiçbir satırda hiç oynamıyor: 4000 × 3000 fotoğraf ona tam olarak 640 × 480 fotoğraf kadar maliyet çıkarıyor. 4000 × 3000 fotoğraf, 640 × 480 fotoğrafla tam olarak aynı maliyette. Bu bir cap değil. Nasıl saydığının sonucu; ve bu sektördeki en yaygın maliyet optimizasyonunun — yüklemeden önce downsample et — getirisi şöyle oluyor:

image tokens, 4000 × 3000 → 800 × 600çalıştırma maliyetitasarruf
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 %

Bu sayıların hiçbiri vendor’ın yayımladığı bir fiyat değil. Üçü de üç farklı kuraldan hesaplanmak zorunda kaldı, çünkü fotoğraf hiçbir yerde faturalandırılabilir birim değil: önce token’a dönüştürülür; üstelik aritmetiği üç uyumsuz yerde yazılıdır.

Chapter 16 metin için faturayı kurdu ve metnin bittiği yerde durdu. Bu chapter faturanın geri kalanı: görseller, konuşma, transcription, video ve raw compute. Bunlar birlikte sekiz farklı birimde faturalanıyor; aynı ölçüyle satılmayan şeyleri karşılaştırmanın yöntemi de burada.

Ayrıntıları göster

Bu chapter’ın öncekilerden istediği şey.

  • Chapter 7 tokenizer’ı ve birimi kurdu. Buradaki her şey, metin olmayan bir şeyi o birime dönüştürme girişimi.
  • Chapter 8 modelin ne tükettiğini belirledi: semboller değil, embedding uzayındaki vektörler. Bir görselin token cinsinden fiyatlanabilmesinin nedeni bu.
  • Chapter 16 computeCost’i, fiyat katmanlarını ve beş token bucket’ını kurdu. Bu chapter o function’ı değiştirmek yerine genişletiyor.
  • Chapter 11 LoRA’yı bir fine-tuning tekniği olarak tanıttı ve Chapter 20 onu bir bütçe kararı olarak fiyatladı. Burada language model olmayan bir modelde karşımıza çıkıyor.

Chapter 14’teki kurala göre tensor yok: konu tarifeler, dönüşümler ve muhasebe; bu yüzden TypeScript.

Bir transformer vektör dizisi alır. Bu vektörlerin nereden geldiği konusunda fikri yoktur. Chapter 8 ona bir token id’den bakılan embeddings verdi; mimaride bu lookup’ın zorunlu olduğu hiçbir şey yok.

Yani: resmi sabit karelere böl, her kareyi sayı listesine düzleştir ve her listeyi öğrenilmiş tek bir linear layer’dan geçirerek model genişliğinde bir vektör elde et. Renkli piksellerden oluşan 32 × 32 patch 32×32×3=307232 \times 32 \times 3 = 3072 sayıdır; projection ERd×3072E \in \mathbb{R}^{d \times 3072} onu tek bir dd boyutlu vektöre çevirir; bu da bir text token’ın geldiği şeklin aynısıdır. Hepsi bu; başlığı da bunu söyleyen makale: bir görsel 16 × 16 kelime değerindedir.1 Model hangi karenin nerede olduğunu bilsin diye positional encoding ekle, sonuçları text embeddings ile iç içe geçir; modelin okuduğu sequence artık kısmen resim, kısmen cümledir.

Üç makale bunu ürüne dönüştürdü. CLIP, dört yüz milyon scraped pair üzerinde bir image encoder ile text encoder’ı aynı şeyi söylemeye eğitti; piksellerin ve kelimelerin ortak bir uzayı paylaşabileceği fikri hipotez olmaktan orada çıktı.2 Flamingo, frozen vision encoder’ı frozen language model’e birkaç eğitilmiş bridging layer ile bağladı.3 LLaVA, köprünün tek bir linear projection olabileceğini ve instruction-following’in generated data ile öğretilebileceğini gösterdi; bu yüzden o zamandan beri her open vision-language model kabaca aynı görünüyor.4

Faturan için sonuç anında ve gösterişsizdir: patch’ler sequence içindeki position’lardır; yani input token’dır; yani bunları input rate üzerinden ödersin. Kaç tane olduğu aritmetiktir ve her provider bunu farklı yapar.

Üç kural, hepsi yayımlanmış, hiçbiri aynı değil

Bölüme bağlantı: Üç kural, hepsi yayımlanmış, hiçbiri aynı değil

Aşağıdaki her kural provider’ın kendi dokümantasyonundan uygulanmış ve aynı dokümantasyondaki worked example’lara karşı kontrol edilmiştir.

OpenAI görseli 32 × 32 patch’lerle kaplar ve sayıyı model başına bir katsayıyla çarpar. Patch sayısı o model ve detail level için bütçeyi aşarsa, görsel sığana kadar küçültülür:

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 görseli 28 × 28 patch’lerle kaplar, her biri bir visual token’dır, ayrıca hem long edge’i hem token count’u cap’ler — standard-tier modellerde 1.568 piksel ve 1.568 token, high-resolution tier’da 2.576 ve 4.784. Fazla büyük görseller, ikisine de sığan en büyük boyuta ölçeklenir.5

Google piksel saymaz. İki kenarı da 384 piksel veya altında olan görsel flat 258 token tutar. Daha büyük her şey, her biri 258 token olan tile’lara bölünür ve tile grid’i min(w,h)/1.5\lfloor \min(w,h) / 1.5 \rfloor crop unit’inden gelir.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;      
}

Her birini kendi vendor’ının yayımladığı sayılarla çalıştır:

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

Dokuz eşleşme basılır; tam run on beşini kontrol eder, çünkü Anthropic’in tablosu altı boyutun tamamı için iki tier’ı da verir. Kurallar artık herhangi bir fotoğrafın üzerinde çalıştırman için sende; mesele de bu: bu chapter’daki, price page’den alamayacağın tek üç function bunlar.

“Daha büyük” ne demek, üç ayrı cevap

Bölüme bağlantı: “Daha büyük” ne demek, üç ayrı cevap

Aynı 4:3 fotoğrafı altı boyutta üçünün de içinden geçir:

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

Son sütunu aşağı doğru oku. Resim 384 pikseli aştığı anda sayı bir daha değişmiyor; bu tesadüf de değil, cap de değil. En az genişliği kadar yüksek olmayan bir görsel için crop unit’i tile formülüne geri koy:

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

Boyut sadeleşir. Google’ın image tokens’ı aspect ratio’ya bağlıdır, başka hiçbir şeye değil. 4:3 fotoğraf ister thumbnail ister poster olsun dört tile’dır. Yukarıdaki tasarruf tablosundaki sıfırın tüm açıklaması bu tek cebirsel gerçek; bunu hiçbir price page açıkça söylemez.

Diğer iki sütun ise cap’ler; farklı yüksekliklerde ve farklı sebeplerle — Anthropic beyan edilmiş token ceiling’de, OpenAI pixel limit sonrasında patch budget’ta — bu yüzden üç eğri farklı boyutlarda kesişir.

Şimdi boz. Vision modelde daha az harcamak için bariz yol daha az detail istemektir; o yüzden detail: "low" gönder:

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

Daha az detail istemek %25 daha pahalıya çıktı. Bu bug değil; OpenAI sizing table’da bunu tek satırda söylüyor: o model family’de low 2048-pixel limit ile 6.144-patch budget kullanırken high aynı pixel limit’i 2.500-patch budget ile kullanıyor, “so it can use more tokens than high”.7 low kelimesi price değil fidelity setting adıdır: belgelenmiş beş model family’nin ikisinde hiç tasarruf sağlamaz, o ikisinden birinde daha pahalıya gelir.

Buraya kadar her şey bir modelin görsel okumasıydı. Bir görsel yapmak içinde hiç token olmayan bir mekanizmada çalışır; bu yüzden kelime başına değil, resim başına satılır.

Görsel yapmak: resim başı fiyat, token başı fiyattır

Bölüme bağlantı: Görsel yapmak: resim başı fiyat, token başı fiyattır

Vendor’lar image generation’ı resim başına fiyat olarak yayımlar. Aslında değildir. GPT Image modelleri, sayısı istenen size ve quality’ye bağlı specialised image tokens üretir; yayımlanan count’ları GPT Image 1’in yayımlanmış image output rate’i olan milyon başına $40 ile çarp ve aynı sayfadaki per-image prices ile karşılaştır:

quality1024 × 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)

Dokuz türetilmiş rakam, dokuz yayımlanmış rakama karşı; her çift $0.002 içinde uyuşuyor.11 Google daha da açık davranıyor ve conversion’ı price page’de senin için yapıyor: image output milyon token başına $60, “output images at 1K (1024x1024px) consume 1120 tokens and are equivalent to $0.067 per image”.12

Yani per-image price, count’u içine katlanmış per-token price’tır. Bunda sorun yok; ama bir şeyi saklar. Güncel generation’ın tablosunu al ve geriye doğru böl:

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

Daha büyük görsel her quality’de daha ucuz. 1024 × 1536 canvas, 1024 × 1024’ten %50 daha fazla piksel içeriyor ve medium’da %23 daha az token tutuyor. OpenAI bunu atlayacağın bir cümlede işaretliyor — “a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting” — ve önceki model generation’da tam tersi çalışıyordu: portrait, square’den %50 daha pahalıydı.11 Bu değişiklikten önce yazılmış her 1024x1024 default’u artık pahalı seçenek.

Ses; saniye, karakter ve token ile faturalanır

Bölüme bağlantı: Ses; saniye, karakter ve token ile faturalanır

Üç üründen aynı 519 karakteri — yaklaşık 38 saniye audio — konuştur; iki vendor’dan üç unit system çıkar:

modelbirimfiyat
tts-1karakter başınamilyon karakter başına $15.00 → $0.007785
tts-1-hdkarakter başınamilyon karakter başına $30.00 → $0.015570
gemini-3.1-flash-ttsaudio token başına, saniyede 25milyon başına $20.00 → $0.019319

Aynı vendor iki birimi de satıyor: OpenAI’ın tts-1’i milyon karakter başına fiyatlanırken gpt-4o-mini-tts milyon token başına, $0.60 input ve $12.00 output olarak fiyatlanıyor.13 Yani “en ucuz text-to-speech” ne konuşturduğunu söylemeden cevaplanabilecek bir soru değil.

Ve iki birim zıt şeylere kör. Karakter başına fiyat duration’ı göremez: yavaş, tane tane bir voice seç veya pause ekle; audio uzarken fatura oynamaz. Saniye başına fiyat content’i göremez: otuz saniye ister yoğun bir teknik paragraf olsun ister birinin ona kadar sayması, aynı tutar. Voice’u değiştir, iki vendor’ından tam biri yeniden fiyatlar.

Transcription ters yönde çalışır ve tüm faturanın en basit satırıdır — audio dakika başına, flat:

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)

Son satırı üçüncüye karşı not et: işi kelimeler gelirken live yapmak, bitmiş dosyada yapmanın 5,7 katı. Bu fark batch yapamamanın fiyatıdır ve sonraki bölümü pahalı kılan da budur.

Şimdi voice’un özellik mi ürün mü olduğunu belirleyen sayı.

Call: on turn’lük bir support conversation, 149 kelime; beyan edilen 150 words per minute ile 59,6 saniye speech — 21,2’si caller’dan, 38,4’ü geri konuşulmuş. Token dönüşümleri provider’ların kendi dönüşümleri. 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: iki yönde de saniyede 25 token; bunu price page’i aynı satırda $12.00 per million ve $0.018 per minute yayımlayarak doğruluyor.12

Conversation tam Chapter 16’nın söylediği gibi birikir, çünkü mekanizma aynıdır: “the entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive”.14 Tek fark, history’nin artık audio tokens ile ölçülmesi.

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

Şimdi ürünü belirleyen karşılaştırma; dört satır da bir dakikaya normalize edilmiş:

dakika başınametne göre
gpt-realtime-2.1, caching yok$0.13125937.9×
gpt-realtime-2.1, history cached$0.05742516.6×
gemini-3.1-flash-live, caching yok$0.0239656.9×
aynı kelimeler typed, gpt-5.6-terra$0.003461

Otuz sekiz kat. Otuz sekiz per cent değil. Ses yerine metinle yapılan aynı exchange neredeyse iki order of magnitude daha pahalı ve bu farkın hiçbiri birinin koymayı seçtiği margin değil — conversion rate. Bir saniye assistant audio yirmi token’dır. Aynı saniye beyan edilen rate’te 2,5 kelime taşır ve measured transcript kelime başına 1,26 token’dır; yani text olarak 3,15 token. Sound aynı meaning için 6,3 kat daha hacimli bir paket; ayrıca token’larının her biri text output rate’in 5,3 katı ve text input rate’in 16 katı üzerinden faturalandırılır. Bulk ratio’yu price ratio ile çarp; muhasebe başlamadan order of magnitude zaten oradadır.

Tablodan iki operational sonuç doğrudan çıkar.

Audio caching optimizasyon değil, business model’dir. Cached audio input milyon başına $0.40, fresh ise $32.00 — call’u yarıya indiren %98,75 discount. Kural Chapter 16’nınkiyle aynı: cache bir prefix eşleşmesi arar; dolayısıyla call ortasında conversation’ın başına eklenen her şey onu bozar ve “caller artık verified” bilgisini koymanın doğal yeri tam da orasıdır.

Client’ta yaptığın hiçbir şey sesi faturadan düşürmez. User assistant’ın üstüne konuşur, kodun playback’i durdurur, speaker susar. Üretilmiş olan ne varsa zaten charge edilmiştir, çünkü billing response oluşturulduğunda accrue eder; Chapter 16’nın kuralıyla, conversation’da kalan her şey sonraki her turn’de input audio olarak yeniden gönderilir. Chapter 14 bunu text stream’i abort etmek için söyledi. Voice’ta otuz kat daha pahalıdır.

Video bazı vendor’larda saniye başına, bazılarında clip başına satılır; resolution ve bazen duration için tier’lar vardır. Bu iki shape yalnızca convenience açısından farklı değildir; kesişirler.

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

Clip başına satan vendor, 1,2 saniyenin altında saniye başına satandan pahalı; yirmi saniyede 16,7 kat ucuz. Bu iki modelin sıralaması clip length değişince ayakta kalmaz; yani “hangi video modeli en ucuz” model hakkında bir soru değildir.

Son satır daha kötü ve bu chapter’ın dürüst kalbi orası. mochi real GPU seconds üzerinden faturalanır — job’ın measured prediction time’ı — A100’de saniye başına $0.001400, H100’de $0.001525; bunlar kiralanan makinenin rate’leridir, başka bir şey değil.15 Bu tamamen precise bir tariff’tır ve price değildir, çünkü çarptığı quantity ödemeyi kabul ettikten sonra belli olur. Yukarıdaki satır output’un her saniyesi için on iki GPU-second varsayar; bu varsayımı dörtle çarp, en ucuz band’dan çıkar; ancak altı katında tablonun ortasına iner. Bu sayfadaki, quote’a koyamayacağın tek tariff budur.

Yani: tokens, image tokens, characters, minutes, video seconds, whole clips, GPU seconds, flat units. Sekiz quantity ve bunları tek eksene koymanın tek yolu bir workload beyan edip onu fiyatlamaktır.

Bu, Chapter 16’nın computeCost uzantısıdır — aynı tier machinery, artık prompt length olmayan criteria ile:

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

İşaretli iki satır kırıldığı yer. Unit başına quoted tariff u.images ?? 1 ile çarpılır; token başına quoted tariff default’u sıfır olan bir şeyle çarpılır. İkisine de empty usage ver — measurement fail olduğunda aldığın shape — ve izle:

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

Altı kez hiçbir şey olmadı; birinde üç dolar tuttu, beşinde hiçbir şey tutmadı. Bu rounding difference değil; eksik bir sayının ne anlama geldiği hakkında, her unit için ayrı alınmış ve hiçbir yerde yazılmamış bir karar. Sağlam kural, kimsenin ölçmediği bir field’ın absent kalmasıdır, çünkü “ölçülmedi” ile “ölçüldü ve sıfır çıktı” farklı şeylerdir. Bu fonksiyon sessizce buna katılmıyor.

İkinci failure duration. Clip-priced tariff tier’ını maxDurationSeconds ile u.videoSeconds ?? 0’ye karşı seçiyor; yani duration kaydetmemiş usage en kısa tier ile eşleşiyor:

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

Videonun ne kadar sürdüğünü bilmediğin için yüzde kırk indirim. İki bug’ın root’u aynı: işi exact olmak olan bir function’ın içinde convenience için seçilmiş default.

Cost’lar computable olduğuna göre karşılaştırmanın diğer yarısı gerekir — engine başına bir tane, kamuya açık ifade edilen, okuyucunun itiraz edebileceği declared representative workload:

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

Bu satırların her biri bir argümandır. Text dörtte bir input, dörtte üç output karıştırır çünkü gerçek usage output’a kayar; fifty-fifty blend modelleri farklı sıralar. Image workload, OpenAI’ın medium square için 1.056’sı ile medium portrait için 1.584’ü arasında, 1.500 output token varsayar. Video beş saniye 1080p varsayar; az önce iki vendor’ın 1,2 saniyede yer değiştirdiğini gördük. Compute entry altmış GPU-second varsayar çünkü varsayacak başka hiçbir şey yok.

Yöntem budur ve eldeki tek dürüst yöntem de budur: farklı unit’lerdeki price’ları karşılaştıramazsın; yalnızca yazıya döktüğün bir workload’un cost’unu karşılaştırabilirsin. Workload’unu basmadan multimodal modelleri sıralayan her tablo, kendi assumptions’ını sıralıyordur.

Artık bir modelin üretebildiği her şeyi, hangi unit’te satılırsa satılsın fiyatlayabilir ve comparison’ın hangi workload’u varsaydığını yüksek sesle söyleyebilirsin. Bu, Chapter 16’nın açtığı faturayı kapatır ve Part III’ü kapatır: Chapter 14’ten buraya kadar her şey one call hakkındaydı — onu nasıl yaparsın, içine ne koyarsın, nasıl sample edersin, ne döndürür, ne tutar.

Chapter 22 analysis unit’ini değiştiriyor ve değişiklik pahalı. Bir agent tek call değildir; kaç call yapacağına kendi karar veren bir loop’tur ve son iki chapter’ın aritmetiği onu architecture diagram’dan bütçeye dönüştürür. Aynı modele aynı soruyu iki kez sorarak açılır; ikinci sefer catalogue’a bir tool eklenir ve o tek tool’un ne yaptığı ölçülür: bir call iki oldu, otuz dokuz input token 420 oldu.

Bunun agent sayılıp sayılmayacağı, yayımlanmış iki definition’dan hangisini açtığına bağlı; onlar da aynı fikirde değil. Bir tanesi kendi içinde de aynı fikirde değil.


Bu chapter’daki her price, formula ve conversion rate provider’ın kendi sayfasından 7 Eylül 2026 tarihinde okundu ve o tarihle quoted edildi; çünkü hepsi değişecek. Token count’ları, cost’lar ve comparison’lar yukarıda basılan code ile, tek bir makinede, paid API call yapılmadan hesaplandı — bu chapter’da tek bir latency claim olmamasının dürüst nedeni de budur.

Image-token function’ları, cost table’ları, voice-call breakdown ve empty-usage results bu chapter’da basılan TypeScript ile, Node 22 üzerinde çalıştırılarak üretildi. Voice comparison’da kullanılan dialogue 149 kelimedir ve o200k_base encoding altında tiktoken ile 188 token olarak tokenized edildi; duration’ı, comparison’ın parameter’ı olan ve measurement olmayan 150 words per minute declared rate’ten gelir. Her provider figure, geldiği page’i adlandıran footnote’u taşır.

  1. Dosovitskiy, A. et al. An Image Is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv:2010.11929 (2020). Patch’ler, embedding dimension’a linear projection ve grid’i sequence model için legible yapan position embeddings.

  2. Radford, A. et al. Learning Transferable Visual Models From Natural Language Supervision. arXiv:2103.00020 (2021). Image encoder ve text encoder’ın 400 milyon pair üzerinde contrastive training’i ve downstream’deki her şeyin varsaydığı shared space.

  3. Alayrac, J.-B. et al. Flamingo: a Visual Language Model for Few-Shot Learning. arXiv:2204.14198 (2022). Frozen vision encoder, frozen language model, trained bridging layers — image understanding’i chat capability’ye dönüştüren architecture.

  4. Liu, H., Li, C., Wu, Q. and Lee, Y. J. Visual Instruction Tuning. arXiv:2304.08485 (2023). Bridge olarak tek linear projection ve training set olarak generated instruction data; open vision-language modellerin tek bir shape’te birleşmesinin nedeni.

  5. Anthropic, Vision, platform.claude.com/docs/en/build-with-claude/vision, erişim 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.” Ayrıca iki resolution tier (standard: 1568-pixel long edge, 1568 visual tokens; high-resolution, Claude 4.7 ve sonrası: 2576 pixels ve 4784 tokens), downsizing rule ve yukarıda yeniden üretilen altı satırlık size/token count table. Model rates: Anthropic, Pricing, platform.claude.com/docs/en/about-claude/pricing, aynı tarih: Claude Haiku 4.5 milyon input ve output token başına $1 ve $5.

  6. Google, Image understanding, ai.google.dev/gemini-api/docs/image-understanding, erişim 2026-09-07. “258 tokens if both dimensions <= 384 pixels. Larger images are tiled into 768x768 pixel tiles, each costing 258 tokens”, crop-unit formula ile — floor(min(width, height) / 1.5), dimensions’ın buna bölünüp birbirleriyle çarpılması — ve 960 × 540’ın 3 × 2 = 6 tile verdiği worked example. Google buna “a rough formula” diyor; yukarıda türetilen scale-invariance, formula’nın yayımlandığı haliyle bir property’si. Aynı family’de audio input saniye başına 32 audio token’dır (ai.google.dev/gemini-api/docs/audio, aynı tarih).

  7. OpenAI, Images and vision, developers.openai.com/api/docs/guides/images-vision, erişim 2026-09-07. Patch-based rule’un kaynağı (32 × 32 patches, patch_count = ceil(width/32)×ceil(height/32), shrink_factor formula’sı ve integer adjustment’ı, 30.000-patch rejection limit); low’nın gpt-5.4 üzerinde 2048-pixel limit ve 6.144-patch budget kullandığını, “so it can use more tokens than high” dediğini içeren model sizing table; high’un 2.500-patch budget’ına karşı; multiplier table (GPT-5.x family’leri için 1.2, gpt-4.1-mini için 1.62, gpt-4.1-nano için 2.46); yukarıda yeniden üretilen iki worked example (1024 × 1024 → 1229 tokens, 2048 × 2048 → 3000 tokens); eski modeller için tile-based rules (base plus 512-pixel tiles, gpt-4o üzerinde 85 + 170); ve vision kutusunda quoted limitations list. 2

  8. Ho, J., Jain, A. and Abbeel, P. Denoising Diffusion Probabilistic Models. arXiv:2006.11239 (2020). Forward noising schedule, objective’i eklenen noise’u tahmin etmeye çeviren reparameterisation ve sampling loop.

  9. Rombach, R., Blattmann, A., Lorenz, D., Esser, P. and Ommer, B. High-Resolution Image Synthesis with Latent Diffusion Models. arXiv:2112.10752 (2022). Diffusion process’i compressed latent space’te çalıştırmak; sabit step count’u image başına satılacak kadar affordable yapan şey.

  10. Prince, S. J. D. Understanding Deep Learning (MIT Press, 2023), chapter 18. Bu chapter’ın diffusion hakkında atladığı her şey için declared delegation — variational bound, noise schedules, classifier-free guidance ve sampler family’leri. Hu, E. et al., LoRA: Low-Rank Adaptation of Large Language Models, arXiv:2106.09685 (2021), adapter’ın kendisidir; Chapter 11’de language model üzerinde tanıtıldı ve burada matematiği değişmeden image model üzerinde kullanıldı. Radford, A. et al., Robust Speech Recognition via Large-Scale Weak Supervision (Whisper), arXiv:2212.04356 (2022), per-minute price’ı yukarıda görünen transcription model’dir.

  11. OpenAI, Image generation, developers.openai.com/api/docs/guides/image-generation, Pricing, developers.openai.com/api/docs/pricing, ve gpt-image-1 model page’i, hepsine erişim 2026-09-07. gpt-image-2 model page’inde pricing section yok; rate’leri yukarıdaki pricing page’den geliyor. GPT Image 1’in page’i yukarıdaki derivation’da kullanılan per-image table’ın yanında text input’u $5.00, image input’u $10.00 ve image output’u milyon token başına $40.00 olarak yayımlar. Ayrıca: gpt-image-2 öncesi modeller için output-token table (square, portrait ve landscape için low’da 272 / 408 / 400, medium’da 1056 / 1584 / 1568, high’da 4160 / 6240 / 6208); yukarıdaki derivation’larda kullanılan GPT Image 2, 1.5, 1 ve 1 Mini per-image price table’ları; “a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting” cümlesi; her streamed partial image’ın ekstra 100 image output token tuttuğu notu; ve gpt-image-2’nin milyon token başına $8.00 image input, $2.00 cached image input, $30.00 image output ve $5.00 text input rate’leri. Comparison’larda kullanılan text model rates: gpt-5.6-terra $2.00 input, $0.20 cached input ve $12.00 output; gpt-5.6-luna $0.20 ve $1.20, standard tier, short context. Video: sora-2 720p’de saniye başına $0.10 ve sora-2-pro 720p, 1024p ve 1080p’de $0.30, $0.50 ve $0.70. Transcription: gpt-4o-transcribe, gpt-transcribe, gpt-4o-mini-transcribe ve gpt-live-transcribe için dakika başına $0.006, $0.0045, $0.003 ve $0.017. 2

  12. Google, Gemini Developer API pricing, ai.google.dev/gemini-api/docs/pricing, erişim 2026-09-07. Gemini 3.1 Flash-Lite milyon input token başına $0.25 (text, image ve video) ve output için $1.50. Gemini 3.1 Flash Image: image output milyon token başına $60; 0.5K, 1K, 2K ve 4K images için yayımlanmış 747, 1120, 1680 ve 2520 token equivalence’ları ve per-image prices olarak $0.045, $0.067, $0.101 ve $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 ve “$3.00 or $0.005/min” audio input, “$4.50 (text) $12.00 or $0.018/min (audio)” output. Veo 3.1 audio ile saniye başına: 720p ve 1080p’de $0.40, 4K standard’da $0.60; fast’te $0.10, $0.12 ve $0.30. Gemini Omni Flash video output’u “at a rate of 5,792 tokens per second of 720p video” ile bill eder; aynı footnote bunu yaklaşık $0.10 per second’a çevirir — per-second media price’ın token price olduğuna dair herhangi bir yerdeki en net published statement. 2

  13. tts-1, tts-1-hd ve gpt-4o-mini-tts için OpenAI model page’leri, developers.openai.com/api/docs/models, erişim 2026-09-07. tts-1 milyon karakter başına $15.00 ve tts-1-hd $30.00; gpt-4o-mini-tts milyon text input token başına $0.60 ve milyon audio output token başına $12.00 — aynı vendor, aynı operation, iki unit.

  14. OpenAI, Managing costs (Realtime API), developers.openai.com/api/docs/guides/realtime-costs, erişim 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.” Ayrıca: “The entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive”; costs accrue when a Response is created; yukarıdaki table’ın accumulation’ını yeniden ürettiği worked two-turn example; ve input_token_details ve output_token_details split’leriyle response.done usage payload. Rates pricing page’den, aynı tarih: gpt-realtime-2.1 audio milyon token başına $32.00 input, $0.40 cached input ve $64.00 output; text $4.00, $0.40 ve $24.00; image input $5.00. 2

  15. Replicate, Pricing, replicate.com/pricing, erişim 2026-09-07. Nvidia A100 (80GB) saniye başına $0.001400 ve saat başına $5.04; Nvidia H100 saniye başına $0.001525 ve saat başına $5.49.


Hazırlayan

David Vicente Campos

NeuraLIA Labs kurucusu ve MyRealFood kurucu ortağı

León Üniversitesinden mezun bir bilgisayar mühendisiyim. MyRealFood’un kurucu ortaklarındanım; orada CTO olarak milyonlarca insanın daha iyi beslenmek için kullandığı uygulamayı geliştirdim. Ayrıca NeuraLIA Labs’i kurdum ve burada AI ürünleri geliştiriyorum. Bu sitede yol boyunca anlamak zorunda kaldığım şeyleri, keşke biri bana böyle anlatsaydı dediğim şekilde yazıyorum.

Yazar hakkında daha fazla

Yayımlayan: NeuraLIA Labs.

Yeni yazılar gelen kutuna gelsin

AI haberleri, rehberler ve ürün güncellemeleri — zamanına değecek bir şey yayımladığımızda kısa bir e-posta.

Mesajlaşmayı mı tercih ediyorsun? Aynı yazılar, burada:WhatsApp topluluğu (yeni sekmede açılır)Telegram kanalı (yeni sekmede açılır)

Kurs dizini

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev10 dk okuma

Jev AI modeli düzyazı için değil, kararlar için tasarlandı

TypeSafe AI’ın Jev’i dikkat çekiyor çünkü yazılım zekâsını bir olasılık problemi olarak ele alıyor: doğru dalı seç, güven düzeyini ekle ve kodun bir karara ihtiyacı varken bir LLM’ye metin yazdırmak için ödeme yapma.

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering10 dk okuma

Uzun süreli AI ajanları için bağlam mühendisliği

Uzun süre çalışan ajanlar yalnızca pencere küçük olduğu için başarısız olmaz. Dosyalar, araç çıktıları ve bayatlamış geçmiş, ajanın tamamlaması gereken görevi arka plana ittiğinde başarısız olurlar.

Seçimi LIA'ya bırakmaya hazır mısın?

Tüm yapay zeka modelleriyle tek yerde üret — bugün ücretsiz başla.