Chuyển đến nội dung
21/30Chương 21 trên 30

Định giá multimodal: hình ảnh, âm thanh và video thực sự tính phí gì

Cùng 500 ảnh, ba model chênh nhau 5,5 lần; model rẻ nhất đổi ngay khi ảnh bị resize.

Trên trang này

Đây là một tác vụ, được tính giá theo ba cách: mô tả năm trăm ảnh sản phẩm, mỗi ảnh một caption ngắn. Cùng ảnh, cùng chỉ dẫn, cùng độ dài câu trả lời. Điều duy nhất thay đổi là model nào đọc chúng.

ảnhgpt-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

Có ba điều trong bảng đó đáng để dừng lại.

Model rẻ nhất thay đổi giữa hàng thứ ba và hàng thứ tư, trên cùng một tác vụ, chỉ vì ai đó đã resize ảnh. Yêu cầu một đoạn văn thay vì một caption, điểm giao lại dịch chuyển: ở 1280 × 960, Gemini thắng với caption bốn mươi token, còn OpenAI thắng với đoạn văn bốn trăm token.

Cột Gemini không hề nhúc nhích ở bất kỳ hàng nào: một ảnh 4000 × 3000 tốn đúng bằng một ảnh 640 × 480. Một ảnh 4000 × 3000 tốn đúng bằng một ảnh 640 × 480. Đó không phải là trần. Đó là hệ quả của cách nó đếm, và điều đó có nghĩa là tối ưu chi phí phổ biến nhất trong ngành này — downsample trước khi upload — sinh lời như sau:

image tokens, 4000 × 3000 → 800 × 600chi phí lượt chạytiết kiệm
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 %

Không con số nào trong đó là mức giá nhà cung cấp công bố. Cả ba đều phải được tính ra, từ ba quy tắc khác nhau, vì ảnh không phải là đơn vị tính phí ở bất cứ đâu: trước hết nó được chuyển thành token, bằng một phép số học được viết ở ba nơi không tương thích.

Chương 16 đã dựng hóa đơn cho văn bản và dừng lại nơi văn bản kết thúc. Chương này là phần còn lại của hóa đơn: hình ảnh, giọng nói, transcription, video và compute thô, vốn cộng lại được tính phí bằng tám đơn vị khác nhau, cùng phương pháp để so sánh những thứ không được bán theo cùng một thước đo.

Hiện chi tiết

Chương này cần gì từ các chương trước.

  • Chương 7 đã dựng tokenizer và đơn vị. Mọi thứ ở đây là một nỗ lực biến thứ không phải văn bản thành đơn vị đó.
  • Chương 8 đã xác lập thứ một model tiêu thụ: không phải ký hiệu, mà là vector trong một không gian embedding. Đó là lý do hình ảnh có thể được định giá bằng token.
  • Chương 16 đã dựng computeCost, các bậc giá của nó và năm bucket token. Chương này mở rộng function đó thay vì thay thế nó.
  • Chương 11 đã giới thiệu LoRA như một kỹ thuật fine-tuning và Chương 20 đã định giá nó như một quyết định ngân sách. Ở đây nó xuất hiện trên một model không phải language model.

Không có tensor, theo quy tắc từ Chương 14: đây là biểu phí, chuyển đổi và kế toán, nên dùng TypeScript.

Một transformer nhận một chuỗi vector. Nó không quan tâm chúng đến từ đâu. Chương 8 đã đưa vào nó các embedding tra từ token id; không có gì trong kiến trúc bắt buộc phải có bước tra cứu đó.

Vậy nên: cắt ảnh thành các ô vuông cố định, làm phẳng mỗi ô thành một danh sách số, rồi đẩy từng danh sách qua một lớp tuyến tính đã học để nhận một vector có chiều rộng của model. Một patch pixel màu 32 × 32 là 32×32×3=307232 \times 32 \times 3 = 3072 số; phép chiếu ERd×3072E \in \mathbb{R}^{d \times 3072} biến nó thành một vector dd chiều, đúng hình dạng mà một text token đi vào. Toàn bộ chỉ có vậy, và bài báo đã nói ngay trong tiêu đề: một hình ảnh đáng giá 16 × 16 từ.1 Thêm positional encoding để model biết ô nào ở đâu, xen kẽ kết quả với text embeddings, và chuỗi model đọc là một phần ảnh, một phần câu.

Ba bài báo đã biến nó thành sản phẩm. CLIP huấn luyện một image encoder và một text encoder để đồng thuận, trên bốn trăm triệu cặp thu thập được, và đó là nơi ý tưởng pixel và từ có thể chia sẻ một không gian thôi còn là giả thuyết.2 Flamingo gắn một vision encoder đóng băng vào một language model đóng băng bằng vài lớp cầu nối được huấn luyện.3 LLaVA cho thấy cầu nối có thể chỉ là một phép chiếu tuyến tính và khả năng làm theo chỉ dẫn có thể được dạy bằng dữ liệu sinh ra, đó là lý do mọi open vision-language model kể từ đó trông đại khái giống nhau.4

Hệ quả trên hóa đơn của bạn là tức thì và chẳng hào nhoáng: các patch là vị trí trong chuỗi, nên chúng là input tokens, nên bạn trả tiền cho chúng theo mức input. Bao nhiêu là phép số học, và mỗi provider làm khác nhau.

Ba quy tắc, đều công bố, không cái nào giống cái nào

Liên kết đến mục: Ba quy tắc, đều công bố, không cái nào giống cái nào

Mỗi quy tắc bên dưới được triển khai từ chính tài liệu của provider và được kiểm lại bằng các ví dụ đã tính trong cùng tài liệu đó.

OpenAI phủ ảnh bằng các patch 32 × 32 và nhân số lượng với một hệ số theo model. Nếu số patch vượt ngân sách cho model và mức detail đó, ảnh được scale down cho đến khi vừa:

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 phủ ảnh bằng các patch 28 × 28, mỗi patch là một visual token, và đặt trần cả cạnh dài lẫn số token — 1.568 pixel và 1.568 token trên các model tier tiêu chuẩn, 2.576 và 4.784 trên tier độ phân giải cao. Ảnh quá lớn được scale xuống kích thước lớn nhất thỏa cả hai.5

Google không đếm pixel chút nào. Một ảnh có cả hai cạnh từ 384 pixel trở xuống tốn cố định 258 token. Bất cứ ảnh nào lớn hơn được cắt thành các tile 258 token mỗi tile, và lưới tile đến từ một crop unit là min(w,h)/1.5\lfloor \min(w,h) / 1.5 \rfloor.6

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

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

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

Chạy từng quy tắc với những con số chính vendor của nó in ra:

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

Chín kết quả khớp được in ra; lượt chạy đầy đủ kiểm tra mười lăm, vì bảng của Anthropic đưa cả hai tier cho cả sáu kích thước. Giờ các quy tắc đã là của bạn để chạy trên bất kỳ ảnh nào bạn có, đó chính là điểm mấu chốt: đây là ba function duy nhất trong chương này bạn không thể lấy từ một trang giá.

Đưa cùng một ảnh 4:3 qua cả ba ở sáu kích thước:

kích thướcOpenAI, highAnthropic, tiêu chuẩnAnthropic, 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

Đọc cột cuối từ trên xuống. Khi ảnh vượt 384 pixel, con số không bao giờ đổi nữa, và đó không phải trùng hợp hay trần. Thay crop unit ngược vào công thức tile, với một ảnh ít nhất rộng bằng cao:

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

Kích thước triệt tiêu. image tokens của Google phụ thuộc vào aspect ratio và không gì khác. Một ảnh 4:3 là bốn tile dù nó là thumbnail hay poster. Sự thật đại số duy nhất đó là toàn bộ lời giải thích cho số không trong bảng tiết kiệm ở trên, và không trang giá nào nói điều đó.

Hai cột còn lại thì đặt trần, ở các độ cao khác nhau và vì các lý do khác nhau — Anthropic ở trần token được tuyên bố, OpenAI ở ngân sách patch sau giới hạn pixel — nên ba đường cong cắt nhau ở những kích thước khác nhau.

Giờ hãy làm nó vỡ. Cách hiển nhiên để chi ít hơn cho một vision model là yêu cầu ít detail hơn, nên gửi detail: "low":

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

Yêu cầu ít detail hơn lại tốn nhiều hơn 25 %. Đây không phải bug và OpenAI nói vậy trong một dòng của bảng sizing: trên họ model đó, low dùng giới hạn 2048 pixel với ngân sách 6.144 patch còn high dùng cùng giới hạn pixel với ngân sách 2.500 patch, “nên nó có thể dùng nhiều token hơn high”.7 Từ low đặt tên cho một thiết lập fidelity, không phải một mức giá: trên hai trong năm họ model được ghi tài liệu, nó không mua được khoản tiết kiệm nào, và trên một trong hai họ đó nó còn tốn hơn.

Mọi thứ đến giờ là một model đọc ảnh. Tạo một ảnh chạy trên một cơ chế không có token nào trong đó, và đó là lý do nó được bán theo bức thay vì theo từ.

Tạo một ảnh: giá theo ảnh là giá theo token

Liên kết đến mục: Tạo một ảnh: giá theo ảnh là giá theo token

Vendors công bố image generation dưới dạng giá mỗi bức. Thực ra không phải. GPT Image models phát ra các image tokens chuyên biệt mà số lượng phụ thuộc vào kích thước và quality được yêu cầu; nhân số lượng đã công bố với mức image output đã công bố của GPT Image 1 là $40 mỗi triệu rồi so với giá theo ảnh trên cùng trang:

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)

Chín con số suy ra đối chiếu với chín con số công bố, mọi cặp khớp trong phạm vi $0.002.11 Google còn rõ hơn và tự làm phép chuyển đổi cho bạn ngay trên trang giá: image output ở $60 mỗi triệu token, “output images ở 1K (1024x1024px) tiêu thụ 1120 token và tương đương $0.067 mỗi ảnh”.12

Vậy giá theo ảnh là giá theo token với số lượng đã được gấp vào. Điều đó ổn, và nó che giấu một thứ. Lấy bảng của thế hệ hiện tại và chia ngược:

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

Ảnh lớn hơn lại là ảnh rẻ hơn ở mọi quality. Một canvas 1024 × 1536 có nhiều pixel hơn 50 % so với 1024 × 1024 và tốn ít token hơn 23 % ở medium. OpenAI đánh dấu điều này trong một câu bạn rất dễ bỏ qua — “một độ phân giải không vuông lớn hơn đôi khi có thể tạo ít output tokens hơn một độ phân giải nhỏ hơn hoặc vuông ở cùng quality setting” — và trên thế hệ model trước, chiều ngược lại xảy ra, portrait tốn nhiều hơn square 50 %.11 Mọi mặc định 1024x1024 được viết trước thay đổi đó giờ là lựa chọn đắt tiền.

Yêu cầu ba sản phẩm đọc cùng 519 ký tự — khoảng 38 giây âm thanh — và bạn nhận ba hệ đơn vị từ hai vendors:

modelđơn vịgiá
tts-1theo ký tự$15.00 mỗi triệu ký tự → $0.007785
tts-1-hdtheo ký tự$30.00 mỗi triệu ký tự → $0.015570
gemini-3.1-flash-ttstheo audio token, 25 mỗi giây$20.00 mỗi triệu → $0.019319

Cùng một vendor bán cả hai đơn vị: tts-1 của OpenAI được định giá theo triệu ký tự trong khi gpt-4o-mini-tts được định giá theo triệu token, $0.60 vào và $12.00 ra.13 Vậy “text-to-speech rẻ nhất” không phải câu hỏi có câu trả lời cho đến khi bạn nói rõ mình đang cho nó đọc gì.

Và hai đơn vị mù với hai thứ đối lập. Giá theo ký tự không thấy duration: chọn một giọng chậm, chậm rãi, hoặc thêm khoảng nghỉ, hóa đơn không đổi trong khi âm thanh dài hơn. Giá theo giây không thấy content: ba mươi giây tốn như nhau dù đó là một đoạn kỹ thuật dày đặc hay ai đó đếm đến mười. Đổi giọng và chính xác một trong hai vendor của bạn định giá lại.

Transcription chạy theo hướng ngược lại và là dòng đơn giản nhất trên toàn bộ hóa đơn — theo phút âm thanh, phẳng:

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)

Lưu ý hàng cuối so với hàng thứ ba: làm việc đó live, khi lời nói đang tới, tốn gấp 5,7 lần làm trên một file đã hoàn tất. Khoảng cách đó là giá của việc không thể batch, và nó là thứ làm phần tiếp theo đắt.

Giờ là con số quyết định voice là một tính năng hay một sản phẩm.

Cuộc gọi: một cuộc hội thoại hỗ trợ mười lượt, 149 từ, ở mức được tuyên bố 150 từ mỗi phút là 59,6 giây lời nói — 21,2 giây do người gọi nói, 38,4 giây nói lại. Các chuyển đổi token là của chính providers. OpenAI: “audio tokens trong user messages là 1 token mỗi 100 ms âm thanh, trong khi audio tokens trong assistant messages là 1 token mỗi 50 ms”.14 Google: 25 token mỗi giây, theo cả hai chiều, điều mà trang giá của họ xác nhận bằng cách công bố $12.00 mỗi triệu và $0.018 mỗi phút trên cùng một dòng.12

Cuộc hội thoại tích lũy đúng như Chương 16 đã nói, vì đó là cùng một cơ chế: “toàn bộ cuộc hội thoại được gửi tới model cho mỗi Response... vì vậy các lượt về sau trong session sẽ đắt hơn”.14 Chỉ khác là giờ lịch sử được đo bằng audio tokens.

lượtuserassistantaudio mới vàoaudio cached vàoaudio rachi phí
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

Giờ là phép so sánh quyết định sản phẩm, cả bốn đều chuẩn hóa theo một phút:

mỗi phútso với text
gpt-realtime-2.1, không caching$0.13125937.9×
gpt-realtime-2.1, lịch sử được cached$0.05742516.6×
gemini-3.1-flash-live, không caching$0.0239656.9×
cùng các từ đó được gõ, gpt-5.6-terra$0.003461

Ba mươi tám lần. Không phải ba mươi tám phần trăm. Cùng một trao đổi, tiến hành bằng âm thanh thay vì văn bản, đắt hơn gần hai bậc độ lớn, và không phần nào của khoảng cách đó là margin ai đó chọn thu — nó là tỷ lệ chuyển đổi. Một giây assistant audio là hai mươi token. Cũng một giây đó mang 2,5 từ ở tốc độ đã tuyên bố, và transcript đo được chạy ở 1,26 token mỗi từ, nên dưới dạng văn bản nó là 3,15 token. Âm thanh là một gói cồng kềnh hơn 6,3 lần cho cùng ý nghĩa, và mỗi token của nó được tính phí gấp 5,3 lần mức text output và 16 lần mức text input. Nhân tỷ lệ cồng kềnh với tỷ lệ giá, và bậc độ lớn đã có sẵn trước khi kế toán bắt đầu.

Hai hệ quả vận hành rơi thẳng ra từ bảng.

Audio caching không phải tối ưu hóa, nó là business model. Cached audio input là $0.40 mỗi triệu so với $32.00 fresh — chiết khấu 98,75 % làm giảm một nửa cuộc gọi. Quy tắc vẫn là của Chương 16, không đổi: cache khớp một prefix, nên bất cứ thứ gì chèn vào đầu cuộc hội thoại giữa cuộc gọi sẽ phá nó, và nơi tự nhiên để đặt “người gọi giờ đã được xác minh” lại chính xác là chỗ đó.

Và không có gì bạn làm ở client có thể bỏ tính phí một âm thanh. Người dùng nói đè lên assistant, code của bạn dừng playback, loa im. Bất cứ thứ gì đã được sinh ra thì đã bị tính phí, vì billing tích lũy khi response được tạo; và theo quy tắc của Chương 16, bất cứ thứ gì còn trong cuộc hội thoại sẽ được gửi lại, dưới dạng input audio, ở mọi lượt sau đó. Chương 14 đã nêu điểm này về việc abort một text stream. Với voice, nó đắt hơn ba mươi lần.

Video, GPU-second, và một mức giá không phải mức giá

Liên kết đến mục: Video, GPU-second, và một mức giá không phải mức giá

Video được bán theo giây bởi một số vendors và theo clip bởi số khác, với các tier cho độ phân giải và đôi khi cho duration. Hai hình dạng đó không chỉ khác nhau về tiện lợi; chúng cắt nhau.

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

Vendor tính theo clip đắt hơn vendor tính theo giây dưới 1,2 giây và rẻ hơn 16,7 lần ở hai mươi giây. Không thứ tự nào giữa hai model đó sống sót sau một thay đổi về độ dài clip, nên “video model nào rẻ nhất” không phải câu hỏi về model.

Hàng cuối còn tệ hơn, và đó là lõi trung thực của chương này. mochi được tính phí theo giây GPU thực — thời gian dự đoán đo được của job — ở $0.001400 mỗi giây trên A100 và $0.001525 trên H100, chỉ là giá thuê máy và không gì khác.15 Đó là một biểu phí hoàn toàn chính xác và không phải giá, vì đại lượng nó nhân với là ẩn số cho đến sau khi bạn đã cam kết trả tiền. Hàng ở trên giả định mười hai GPU-second cho mỗi giây output; tăng giả định đó gấp bốn lần và nó rời khỏi dải rẻ nhất, và chỉ ở mức gấp sáu lần nó mới hạ cánh giữa bảng. Đây là biểu phí duy nhất trên trang này bạn không thể đưa vào một báo giá.

Vậy: tokens, image tokens, ký tự, phút, giây video, nguyên clip, GPU seconds, đơn vị phẳng. Tám đại lượng, và cách duy nhất để đặt chúng lên một trục là khai báo một workload và định giá nó.

Đó là phần mở rộng cho computeCost của Chương 16 — cùng bộ máy tier, giờ với các criteria không phải độ dài prompt:

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

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

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

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

Hai dòng được đánh dấu là nơi nó vỡ. Một biểu phí được báo theo đơn vị nhân với u.images ?? 1; một biểu phí được báo theo token nhân với thứ mặc định là zero. Đưa cho cả hai một usage rỗng — hình dạng bạn nhận được khi phép đo thất bại — và xem:

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

Không có gì xảy ra, sáu lần, và nó tốn ba dollar một lần và không tốn gì năm lần. Đó không phải khác biệt làm tròn; đó là một quyết định về ý nghĩa của một con số vắng mặt, một quyết định được đưa ra riêng cho từng đơn vị và không bao giờ được ghi lại. Quy tắc đúng đắn là một field không ai đo thì vẫn vắng mặt, vì “không được đo” và “đã đo và ra zero” là hai việc khác nhau. Hàm này âm thầm bất đồng.

Lỗi thứ hai là duration. Biểu phí theo clip chọn tier của nó bằng maxDurationSeconds so với u.videoSeconds ?? 0, nên một usage chưa từng ghi duration khớp với tier ngắn nhất:

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

Giảm bốn mươi phần trăm vì không biết video dài bao lâu. Cả hai bug có cùng gốc: một mặc định được chọn cho tiện bên trong một function mà toàn bộ nhiệm vụ là phải chính xác.

Khi chi phí đã tính được, phép so sánh cần nửa còn lại — một workload đại diện được khai báo, mỗi engine một workload, công bố công khai để người đọc có thể không đồng ý:

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

Mỗi dòng trong đó là một luận điểm. Text trộn một phần tư input và ba phần tư output vì mức dùng thực tế lệch về output; một blend năm mươi-năm mươi sẽ xếp hạng model khác đi. Workload image giả định 1.500 output tokens, nằm giữa 1.056 của OpenAI cho square medium và 1.584 cho portrait medium. Video giả định năm giây ở 1080p, và ta vừa thấy hai vendor đổi chỗ ở 1,2 giây. Mục compute giả định sáu mươi GPU-second vì chẳng còn gì khác để giả định.

Đó là phương pháp, và là phương pháp trung thực duy nhất có được: bạn không thể so sánh giá ở các đơn vị khác nhau; bạn chỉ có thể so sánh chi phí của một workload mà bạn đã viết ra. Bất kỳ bảng nào xếp hạng multimodal models mà không in workload của nó thì đang xếp hạng chính các giả định của nó.

Giờ bạn có thể định giá bất cứ thứ gì một model có thể tạo ra, bằng bất cứ đơn vị nào nó được bán, và nói rõ workload mà phép so sánh của bạn đã giả định. Điều đó khép lại hóa đơn mà Chương 16 đã mở, và khép lại Phần III: mọi thứ từ Chương 14 đến đây đều nói về một call — cách tạo nó, đưa gì vào nó, sample nó thế nào, nó trả về gì, nó tốn bao nhiêu.

Chương 22 đổi đơn vị phân tích, và thay đổi đó đắt. Một agent không phải một call; nó là một vòng lặp tự quyết định sẽ thực hiện bao nhiêu call, và số học của hai chương vừa rồi là thứ biến nó từ một sơ đồ kiến trúc thành một ngân sách. Nó mở đầu bằng cách hỏi cùng model cùng một câu hai lần, lần thứ hai thêm một tool vào catalogue, rồi đo xem một tool đó đã làm gì: một call thành hai, ba mươi chín input tokens thành 420.

Điều đó có biến nó thành agent hay không phụ thuộc vào việc bạn mở định nghĩa đã công bố nào trong hai định nghĩa, và chúng không thống nhất. Một trong hai còn không thống nhất với chính nó.


Mọi mức giá, công thức và tỷ lệ chuyển đổi trong chương này được đọc từ trang của chính provider vào 7 September 2026 và được trích cùng ngày đó, vì tất cả chúng sẽ thay đổi. Số lượng token, chi phí và phép so sánh được tính trên dữ liệu đó bằng code in ở trên, trên một máy, không thực hiện API call trả phí nào — đó cũng là lý do trung thực vì sao chương này không có một khẳng định latency nào.

Các function image-token, bảng chi phí, phân tích voice-call và kết quả empty-usage được tạo bởi TypeScript in trong chương này, chạy trên Node 22. Đoạn hội thoại dùng cho so sánh voice có 149 từ và được tokenized bằng tiktoken dưới encoding o200k_base ở 188 token; duration của nó đến từ tốc độ đã khai báo 150 từ mỗi phút, là một tham số của phép so sánh chứ không phải phép đo. Mọi con số của provider đều mang footnote nêu trang nguồn của nó.

  1. Dosovitskiy, A. et al. An Image Is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv:2010.11929 (2020). Patches, phép chiếu tuyến tính vào embedding dimension, và position embeddings làm cho lưới đọc được với một sequence model.

  2. Radford, A. et al. Learning Transferable Visual Models From Natural Language Supervision. arXiv:2103.00020 (2021). Contrastive training một image encoder và một text encoder trên 400 triệu cặp, và không gian chung mà mọi thứ downstream giả định.

  3. Alayrac, J.-B. et al. Flamingo: a Visual Language Model for Few-Shot Learning. arXiv:2204.14198 (2022). Vision encoder đóng băng, language model đóng băng, các lớp cầu nối được huấn luyện — kiến trúc đã biến image understanding thành năng lực chat.

  4. Liu, H., Li, C., Wu, Q. and Lee, Y. J. Visual Instruction Tuning. arXiv:2304.08485 (2023). Một phép chiếu tuyến tính duy nhất làm cầu nối và dữ liệu instruction được sinh ra làm tập huấn luyện; lý do open vision-language models hội tụ về một hình dạng.

  5. Anthropic, Vision, platform.claude.com/docs/en/build-with-claude/vision, truy cập 2026-09-07. “Claude xem ảnh theo patch thay vì pixel. Mỗi patch là một khối 28×28 pixel của ảnh, được gọi là visual token. Do đó, một ảnh tốn ⌈width / 28⌉ × ⌈height / 28⌉ visual tokens.” Cũng là hai tier độ phân giải (standard: cạnh dài 1568 pixel, 1568 visual token; high-resolution, trên Claude 4.7 trở lên: 2576 pixel và 4784 token), quy tắc downsizing, và bảng sáu hàng kích thước và số token được tái hiện ở trên. Model rates từ Anthropic, Pricing, platform.claude.com/docs/en/about-claude/pricing, cùng ngày: Claude Haiku 4.5 ở $1 và $5 mỗi triệu input và output tokens.

  6. Google, Image understanding, ai.google.dev/gemini-api/docs/image-understanding, truy cập 2026-09-07. “258 token nếu cả hai chiều <= 384 pixel. Ảnh lớn hơn được tiled thành các tile 768x768 pixel, mỗi tile tốn 258 token”, với công thức crop-unit — floor(min(width, height) / 1.5), kích thước chia cho nó và nhân với nhau — và ví dụ tính sẵn 960 × 540 cho 3 × 2 = 6 tile. Google gọi đó là “một công thức xấp xỉ”; tính bất biến theo scale suy ra ở trên là một thuộc tính của công thức như đã công bố. Audio input trên cùng họ là 32 token mỗi giây âm thanh (ai.google.dev/gemini-api/docs/audio, cùng ngày).

  7. OpenAI, Images and vision, developers.openai.com/api/docs/guides/images-vision, truy cập 2026-09-07. Nguồn của quy tắc dựa trên patch (patch 32 × 32, patch_count = ceil(width/32)×ceil(height/32), công thức shrink_factor và điều chỉnh số nguyên của nó, giới hạn từ chối 30.000 patch); bảng sizing model, bao gồm việc low trên gpt-5.4 dùng giới hạn 2048 pixel và ngân sách 6.144 patch “nên nó có thể dùng nhiều token hơn high”, so với ngân sách 2.500 patch của high; bảng multiplier (1,2 cho các họ GPT-5.x, 1,62 cho gpt-4.1-mini, 2,46 cho gpt-4.1-nano); hai ví dụ tính sẵn được tái hiện ở trên (1024 × 1024 → 1229 token, 2048 × 2048 → 3000 token); các quy tắc dựa trên tile cho model cũ hơn (base cộng tile 512 pixel, 85 + 170 trên gpt-4o); và danh sách giới hạn được trích trong hộp vision. 2

  8. Ho, J., Jain, A. and Abbeel, P. Denoising Diffusion Probabilistic Models. arXiv:2006.11239 (2020). Lịch forward noising, phép reparameterisation biến objective thành dự đoán nhiễu đã thêm, và vòng lặp sampling.

  9. Rombach, R., Blattmann, A., Lorenz, D., Esser, P. and Ommer, B. High-Resolution Image Synthesis with Latent Diffusion Models. arXiv:2112.10752 (2022). Chạy quy trình diffusion trong một latent space nén, thứ làm số bước cố định đủ rẻ để bán theo ảnh.

  10. Prince, S. J. D. Understanding Deep Learning (MIT Press, 2023), chương 18. Phần ủy quyền đã tuyên bố cho mọi thứ chương này bỏ qua về diffusion — variational bound, noise schedules, classifier-free guidance và các họ sampler. Hu, E. et al., LoRA: Low-Rank Adaptation of Large Language Models, arXiv:2106.09685 (2021), là chính adapter đó, được giới thiệu trong Chương 11 trên một language model và được dùng ở đây trên một image model mà không đổi toán học. Radford, A. et al., Robust Speech Recognition via Large-Scale Weak Supervision (Whisper), arXiv:2212.04356 (2022), là transcription model có giá theo phút xuất hiện ở trên.

  11. OpenAI, Image generation, developers.openai.com/api/docs/guides/image-generation, Pricing, developers.openai.com/api/docs/pricing, và trang model cho gpt-image-1, đều truy cập 2026-09-07. Trang model cho gpt-image-2 không có phần pricing; rates của nó đến từ trang pricing ở trên. Trang của GPT Image 1 công bố text input ở $5.00, image input ở $10.00 và image output ở $40.00 mỗi triệu token bên cạnh bảng theo ảnh dùng trong suy luận ở trên. Ngoài ra: bảng output-token cho các model trước gpt-image-2 (272 / 408 / 400 low, 1056 / 1584 / 1568 medium, 4160 / 6240 / 6208 high, cho square, portrait và landscape); các bảng giá theo ảnh cho GPT Image 2, 1.5, 1 và 1 Mini dùng trong các suy luận ở trên; câu “một độ phân giải không vuông lớn hơn đôi khi có thể tạo ít output tokens hơn một độ phân giải nhỏ hơn hoặc vuông ở cùng quality setting”; ghi chú rằng mỗi streamed partial image tốn thêm 100 image output tokens; và rates của gpt-image-2 là $8.00 image input, $2.00 cached image input, $30.00 image output và $5.00 text input mỗi triệu token. Text model rates dùng cho các phép so sánh: gpt-5.6-terra ở $2.00 input, $0.20 cached input và $12.00 output, gpt-5.6-luna ở $0.20 và $1.20, standard tier, short context. Video: sora-2 ở $0.10 mỗi giây tại 720p và sora-2-pro ở $0.30, $0.50 và $0.70 tại 720p, 1024p và 1080p. Transcription: $0.006, $0.0045, $0.003 và $0.017 mỗi phút cho gpt-4o-transcribe, gpt-transcribe, gpt-4o-mini-transcribegpt-live-transcribe. 2

  12. Google, Gemini Developer API pricing, ai.google.dev/gemini-api/docs/pricing, truy cập 2026-09-07. Gemini 3.1 Flash-Lite ở $0.25 mỗi triệu input tokens (text, image và video) và $1.50 output. Gemini 3.1 Flash Image: image output ở $60 mỗi triệu token, với các tương đương đã công bố là 747, 1120, 1680 và 2520 token cho ảnh 0.5K, 1K, 2K và 4K cùng giá mỗi ảnh $0.045, $0.067, $0.101 và $0.151. Gemini 3.1 Flash TTS: $1.00 text input, $20.00 audio output, “audio tokens tương ứng với 25 token mỗi giây âm thanh”. Gemini 3.1 Flash Live Preview: $0.75 text và “$3.00 hoặc $0.005/min” audio input, “$4.50 (text) $12.00 hoặc $0.018/min (audio)” output. Veo 3.1 theo giây có audio: $0.40 ở 720p và 1080p và $0.60 ở 4K standard; $0.10, $0.12 và $0.30 fast. Gemini Omni Flash tính video output “ở mức 5.792 token mỗi giây video 720p”, điều mà cùng footnote chuyển đổi thành khoảng $0.10 mỗi giây — tuyên bố công bố rõ nhất ở bất kỳ đâu rằng một giá media theo giây là một giá token. 2

  13. Các trang model OpenAI cho tts-1, tts-1-hdgpt-4o-mini-tts, developers.openai.com/api/docs/models, truy cập 2026-09-07. tts-1 ở $15.00 và tts-1-hd ở $30.00 mỗi triệu ký tự; gpt-4o-mini-tts ở $0.60 mỗi triệu text input tokens và $12.00 mỗi triệu audio output tokens — cùng một vendor, cùng một thao tác, hai đơn vị.

  14. OpenAI, Managing costs (Realtime API), developers.openai.com/api/docs/guides/realtime-costs, truy cập 2026-09-07. “Audio tokens trong user messages là 1 token mỗi 100 ms âm thanh, trong khi audio tokens trong assistant messages là 1 token mỗi 50ms âm thanh.” Ngoài ra: “Toàn bộ cuộc hội thoại được gửi tới model cho mỗi Response... vì vậy các lượt về sau trong session sẽ đắt hơn”; chi phí tích lũy khi một Response được tạo; ví dụ hai lượt tính sẵn mà bảng ở trên tái hiện; và payload usage response.done với các split input_token_detailsoutput_token_details. Rates từ trang pricing, cùng ngày: audio gpt-realtime-2.1 ở $32.00 input, $0.40 cached input và $64.00 output mỗi triệu token, text ở $4.00, $0.40 và $24.00, image input ở $5.00. 2

  15. Replicate, Pricing, replicate.com/pricing, truy cập 2026-09-07. Nvidia A100 (80GB) ở $0.001400 mỗi giây và $5.04 mỗi giờ; Nvidia H100 ở $0.001525 mỗi giây và $5.49 mỗi giờ.

Sẵn sàng để LIA chọn giúp bạn chưa?

Xây dựng cùng mọi mô hình AI ở một nơi — bắt đầu miễn phí ngay hôm nay.