דלג לתוכן
21/30פרק 21 מתוך 30

תמחור רב־מודלי: על מה באמת משלמים בתמונות, אודיו ווידאו

שלושה מודלים מקבלים אותן 500 תמונות ונבדלים פי 5.5; הזול ביותר מתהפך ברגע שמישהו משנה את הגודל שלהן.

בעמוד הזה

הנה משימה אחת, בשלושה תמחורים: לתאר חמש מאות תמונות מוצר, כיתוב קצר אחד לכל תמונה. אותן תמונות, אותה הנחיה, אותו אורך תשובה. הדבר היחיד שמשתנה הוא איזה מודל קורא אותן.

תצלוםgpt-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

שלושה דברים בטבלה הזאת שווים עצירה.

המודל הזול ביותר משתנה בין השורה השלישית לרביעית, באותה משימה, כי מישהו שינה את גודל התמונות. בקשו פסקה במקום כיתוב ונקודת החציה זזה שוב: ב־1280 × 960 המנצח הוא Gemini לכיתוב של ארבעים token ו־OpenAI לפסקה של ארבע מאות token.

עמודת Gemini לא זזה בכלל, בשום שורה: תמונה בגודל 4000 \u00d7 3000 עולה לה בדיוק כמו תמונה בגודל 640 \u00d7 480. תמונה בגודל 4000 × 3000 עולה לה בדיוק כמו תמונה בגודל 640 × 480. זו לא תקרה. זו תוצאה של דרך הספירה, וזה אומר שאופטימיזציית העלויות הנפוצה ביותר בתחום הזה — להקטין רזולוציה לפני שמעלים — משתלמת כך:

image tokens, 4000 × 3000 → 800 × 600עלות הריצהחיסכון
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 %

אף אחד מהמספרים האלה אינו מחיר שהספק מפרסם. את שלושתם היה צריך לחשב, מתוך שלושה כללים שונים, כי תמונה אינה יחידת חיוב בשום מקום: קודם ממירים אותה ל־token, לפי חשבון שכתוב בשלושה מקומות שאינם תואמים זה לזה.

פרק 16 בנה את החשבון לטקסט ועצר במקום שבו הטקסט נעצר. הפרק הזה הוא שאר החשבונית: תמונות, דיבור, תמלול, וידאו ו־compute גולמי, שביחד מחויבים בשמונה יחידות שונות, והשיטה להשוות דברים שלא נמכרים באותה מידה.

הצגת פרטים

מה הפרק הזה צריך מהפרקים הקודמים.

  • פרק 7 בנה את ה־tokenizer ואת היחידה. כל מה שכאן הוא ניסיון להפוך משהו שאינו טקסט ליחידה הזאת.
  • פרק 8 קבע מה מודל צורך: לא סמלים, אלא וקטורים במרחב embedding. לכן בכלל אפשר לתמחר תמונה ב־token.
  • פרק 16 בנה את computeCost, את מדרגות המחיר שלו ואת חמשת דליי ה־token שלו. הפרק הזה מרחיב את הפונקציה הזאת במקום להחליף אותה.
  • פרק 11 הציג את LoRA כטכניקת fine-tuning ו־פרק 20 תמחר אותו כהחלטת תקציב. כאן הוא מופיע על מודל שאינו מודל שפה.

בלי tensors, לפי הכלל מ־פרק 14: אלה תעריפים, המרות וחשבונאות, ולכן זה TypeScript.

transformer מקבל רצף של וקטורים. אין לו דעה מאיפה הם הגיעו. בפרק 8 האכלנו אותו ב־embeddings שנשלפו לפי token id; שום דבר בארכיטקטורה לא מחייב את השליפה הזאת.

אז: חותכים את התמונה לריבועים קבועים, משטחים כל ריבוע לרשימת מספרים, ודוחפים כל רשימה דרך שכבה ליניארית נלמדת אחת כדי לקבל וקטור ברוחב של המודל. טלאי 32 × 32 של פיקסלים צבעוניים הוא 32×32×3=307232 \times 32 \times 3 = 3072 מספרים; ההיטל ERd×3072E \in \mathbb{R}^{d \times 3072} הופך אותו לווקטור dd־ממדי אחד, בדיוק הצורה שבה מגיע text token. זה כל הסיפור, וזה גם המאמר שהכותרת שלו אומרת זאת: תמונה שווה 16 × 16 מילים.1 מוסיפים positional encoding כדי שהמודל ידע איזה ריבוע היה איפה, משלבים את התוצאות עם ה־text embeddings, והרצף שהמודל קורא הוא בחלקו תמונה ובחלקו משפט.

שלושה מאמרים הפכו את זה למוצר. CLIP אימן image encoder ו־text encoder להסכים, על ארבע מאות מיליון זוגות שנגרדו מהרשת, וזה המקום שבו הרעיון שפיקסלים ומילים יכולים לחלוק מרחב הפסיק להיות השערה.2 Flamingo חיבר vision encoder קפוא למודל שפה קפוא עם כמה שכבות גישור מאומנות.3 LLaVA הראה שהגשר יכול להיות היטל ליניארי יחיד ושאפשר ללמד instruction-following בעזרת נתונים שנוצרו, וזו הסיבה שכל מודל vision-language פתוח מאז נראה בערך אותו דבר.4

התוצאה לחשבונית שלכם מיידית ולא זוהרת: הטלאים הם מיקומים ברצף, ולכן הם input tokens, ולכן משלמים עליהם בתעריף input. כמה בדיוק זו אריתמטיקה, וכל ספק עושה אותה אחרת.

שלושה כללים, כולם פורסמו, אף אחד לא זהה

קישור למקטע: שלושה כללים, כולם פורסמו, אף אחד לא זהה

כל כלל למטה מיושם מתוך התיעוד של הספק עצמו ונבדק מול הדוגמאות המחושבות באותו תיעוד.

OpenAI מכסה את התמונה בטלאי 32 × 32 ומכפילה את הספירה בגורם לפי מודל. אם ספירת הטלאים עוברת את התקציב של אותו מודל ורמת detail, התמונה מוקטנת עד שהיא נכנסת:

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 מכסה אותה בטלאי 28 × 28, visual token אחד לכל טלאי, ומגבילה גם את הצלע הארוכה וגם את ספירת ה־token — 1,568 פיקסלים ו־1,568 token במודלים standard-tier, 2,576 ו־4,784 במדרגת high-resolution. תמונות גדולות מדי מוקטנות לגודל הגדול ביותר שעומד בשתי המגבלות.5

Google לא סופרת פיקסלים בכלל. תמונה ששתי הצלעות שלה 384 פיקסלים או פחות עולה flat 258 token. כל דבר גדול יותר נחתך לאריחים של 258 token כל אחד, ורשת האריחים מגיעה מיחידת חיתוך של 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;      
}

הריצו כל כלל מול המספרים שהספק שלו מדפיס:

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

מודפסות תשע התאמות; הריצה המלאה בודקת חמש עשרה, כי הטבלה של Anthropic נותנת את שתי המדרגות לכל ששת הגדלים. הכללים עכשיו שלכם להריץ על כל תמונה שיש לכם, וזו הנקודה: אלה שלוש הפונקציות היחידות בפרק הזה שלא ניתן לקבל מדף מחיר.

מה פירוש ״גדול יותר״, שלוש פעמים

קישור למקטע: מה פירוש ״גדול יותר״, שלוש פעמים

העבירו אותה תמונת 4:3 דרך שלושת הכללים בשישה גדלים:

גודלOpenAI, 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

קראו את העמודה האחרונה מלמעלה למטה. ברגע שהתמונה גדולה מ־384 פיקסלים המספר כבר לא משתנה, וזו לא מקריות ולא תקרה. הציבו את יחידת החיתוך בחזרה בנוסחת האריחים, לתמונה שרוחבה לפחות כגובהה:

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

הגודל מצטמצם החוצה. ה־image tokens של Google תלויים ביחס הממדים ובשום דבר אחר. תמונת 4:3 היא ארבעה אריחים בין אם היא thumbnail ובין אם היא פוסטר. העובדה האלגברית היחידה הזאת היא כל ההסבר לאפס בטבלת החיסכון למעלה, ושום דף מחיר בשום מקום לא מציין אותה.

שתי העמודות האחרות מגיעות לתקרה במקום זאת, בגבהים שונים ומסיבות שונות — Anthropic בתקרת token מוצהרת, OpenAI בתקציב טלאים אחרי מגבלת פיקסלים — ולכן שלוש העקומות חוצות זו את זו בגדלים שונים.

עכשיו נשבור את זה. הדרך הברורה להוציא פחות על vision model היא לבקש פחות detail, אז שלחו 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

בקשה ל־detail נמוך יותר עלתה 25 % יותר. זה לא באג ו־OpenAI אומרת זאת בשורה אחת בטבלת הגדלים: במשפחת המודלים הזאת, low משתמש במגבלת 2048 פיקסלים עם תקציב 6,144 טלאים, בעוד high משתמש באותה מגבלת פיקסלים עם תקציב 2,500 טלאים, ״כך שהוא יכול להשתמש ביותר token מ־high״.7 המילה low מציינת הגדרת נאמנות, לא מחיר: בשתיים מחמש משפחות המודלים המתועדות היא לא קונה שום חיסכון, ובאחת משתי אלה היא עולה יותר.

כל מה שהיה עד עכשיו עסק במודל שקורא תמונה. ליצור תמונה מריץ מנגנון שאין בו token בכלל, וזו הסיבה שהוא נמכר לפי תמונה ולא לפי מילה.

יצירת תמונה: מחיר לכל תמונה הוא מחיר לכל token

קישור למקטע: יצירת תמונה: מחיר לכל תמונה הוא מחיר לכל token

ספקים מפרסמים יצירת תמונות כמחיר לתמונה. זה לא כזה. מודלי GPT Image פולטים image tokens ייעודיים שספירתם תלויה בגודל ובאיכות המבוקשים; הכפילו את הספירות שפורסמו בתעריף image output שפורסם ל־GPT Image 1, $40 למיליון, והשוו למחירי התמונה באותו עמוד:

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)

תשעה נתונים נגזרים מול תשעה נתונים שפורסמו, וכל זוג מסכים בטווח של $0.002.11 Google מפורשת עוד יותר ועושה בשבילכם את ההמרה בדף המחיר עצמו: image output ב־$60 למיליון token, ״תמונות output ב־1K ‏(1024x1024px) צורכות 1120 token ושקולות ל־$0.067 לתמונה״.12

אז מחיר לכל תמונה הוא מחיר לכל token כשהספירה מקופלת פנימה. וזה בסדר, וזה מסתיר משהו. קחו את טבלת הדור הנוכחי וחלקו לאחור:

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

התמונה הגדולה יותר היא הזולה יותר בכל איכות. canvas של 1024 × 1536 כולל 50 % יותר פיקסלים מ־1024 × 1024 ועולה 23 % פחות token ב־medium. OpenAI מסמנת זאת במשפט שקל לדלג עליו — ״רזולוציה לא־ריבועית גדולה יותר יכולה לפעמים לייצר פחות output tokens מרזולוציה קטנה יותר או ריבועית באותה הגדרת איכות״ — ובדור המודלים הקודם זה עבד הפוך, portrait עלה 50 % יותר מ־square.11 כל ברירת מחדל של 1024x1024 שנכתבה לפני השינוי הזה היא עכשיו האפשרות היקרה.

קול, מחויב לפי שנייה, תו ו־token

קישור למקטע: קול, מחויב לפי שנייה, תו ו־token

בקשו משלושה מוצרים להקריא אותם 519 תווים — בערך 38 שניות אודיו — ותקבלו שלוש מערכות יחידות משני ספקים:

מודליחידהמחיר
tts-1לכל תו$15.00 למיליון תווים → $0.007785
tts-1-hdלכל תו$30.00 למיליון תווים → $0.015570
gemini-3.1-flash-ttsלכל audio token, 25 לשנייה$20.00 למיליון → $0.019319

אותו ספק מוכר את שתי היחידות: tts-1 של OpenAI מתומחר למיליון תווים בעוד gpt-4o-mini-tts מתומחר למיליון token, $0.60 פנימה ו־$12.00 החוצה.13 לכן ״text-to-speech הזול ביותר״ אינה שאלה שיש לה תשובה עד שאומרים מה מקריאים.

ושתי היחידות עיוורות לדברים הפוכים. מחיר לפי תו לא יכול לראות משך: בחרו קול איטי ומדוד, או הוסיפו הפסקות, והחשבון לא זז בזמן שהאודיו מתארך. מחיר לפי שנייה לא יכול לראות תוכן: שלושים שניות עולות אותו דבר בין אם מדובר בפסקה טכנית צפופה ובין אם במישהו שסופר עד עשר. החליפו קול ובדיוק אחד משני הספקים שלכם מתמחר מחדש.

תמלול פועל בכיוון השני והוא השורה הפשוטה ביותר בכל החשבונית — לכל דקת אודיו, 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)

שימו לב לשורה האחרונה מול השלישית: לעשות זאת live, בזמן שהמילים מגיעות, עולה פי 5.7 מלעשות זאת על קובץ גמור. הפער הזה הוא המחיר של אי־יכולת לעשות batch, והוא מה שהופך את הסעיף הבא ליקר.

עכשיו המספר שקובע אם קול הוא feature או מוצר.

השיחה: שיחת תמיכה בת עשרה תורים, 149 מילים, שבקצב מוצהר של 150 מילים לדקה הן 59.6 שניות דיבור — 21.2 שנאמרות על ידי המתקשר, 38.4 שנאמרות בחזרה. המרות ה־token הן של הספקים עצמם. OpenAI: ״audio tokens בהודעות משתמש הם 1 token לכל 100 ms של אודיו, בעוד audio tokens בהודעות assistant הם 1 token לכל 50 ms״.14 Google: 25 token לשנייה, בשני הכיוונים, מה שדף המחיר שלה מאשר כשהוא מפרסם $12.00 למיליון ו־$0.018 לדקה באותה שורה.12

השיחה מצטברת בדיוק כפי שפרק 16 אמר שתצטבר, כי זה אותו מנגנון: ״כל השיחה נשלחת למודל עבור כל Response... לכן תורים מאוחרים יותר בסשן יהיו יקרים יותר״.14 רק שעכשיו ההיסטוריה נמדדת ב־audio tokens.

תורמשתמשassistantfresh audio incached audio inaudio outעלות
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

עכשיו ההשוואה שקובעת את המוצר, כל הארבעה מנורמלים לדקה:

לדקהמול טקסט
gpt-realtime-2.1, בלי caching$0.13125937.9×
gpt-realtime-2.1, היסטוריה ב־cache$0.05742516.6×
gemini-3.1-flash-live, בלי caching$0.0239656.9×
אותן מילים בהקלדה, gpt-5.6-terra$0.003461

פי שלושים ושמונה. לא שלושים ושמונה אחוז. אותה החלפה בדיוק, כשהיא מתבצעת בקול במקום בטקסט, יקרה כמעט בשני סדרי גודל, ואף חלק מהפער הזה אינו מרווח שמישהו בחר לגבות — זה יחס ההמרה. שנייה אחת של אודיו assistant היא עשרים token. אותה שנייה נושאת 2.5 מילים בקצב המוצהר, והתמליל הנמדד רץ ב־1.26 token למילה, כך שכטקסט היא 3.15 token. קול הוא חבילה גדולה פי 6.3 לאותה משמעות, וכל אחד מה־token שלו מחויב פי 5.3 מתעריף text output ופי 16 מתעריף text input. הכפילו יחס נפח ביחס מחיר וסדר הגודל כבר שם לפני שהחשבונאות מתחילה.

שתי השלכות תפעוליות נובעות ישירות מהטבלה.

Audio caching הוא לא אופטימיזציה, הוא המודל העסקי. cached audio input עולה $0.40 למיליון מול $32.00 ל־fresh — הנחה של 98.75 % שמחצה את השיחה. הכלל הוא של פרק 16, ללא שינוי: ה־cache מתאים prefix, ולכן כל דבר שמוכנס בתחילת השיחה באמצע שיחה הורס אותו, והמקום הטבעי לשים ״המתקשר אומת עכשיו״ הוא בדיוק שם.

ושום דבר שתעשו בלקוח לא מבטל חיוב של צליל. המשתמש מדבר מעל ה־assistant, הקוד שלכם עוצר את הניגון, הרמקול משתתק. כל מה שכבר נוצר כבר חויב, כי החיוב נצבר כשה־response נוצר; ולפי הכלל של פרק 16 כל מה שנשאר בשיחה נשלח מחדש, כ־input audio, בכל תור שאחריו. פרק 14 אמר את זה על ביטול text stream. בקול זה עולה פי שלושים יותר.

וידאו, GPU-seconds, ומחיר שאינו מחיר

קישור למקטע: וידאו, GPU-seconds, ומחיר שאינו מחיר

וידאו נמכר לפי שנייה אצל ספקים מסוימים ולפי clip אצל אחרים, עם מדרגות לרזולוציה ולפעמים למשך. שתי הצורות האלה לא רק שונות בנוחות; הן חוצות זו את זו.

מודל1 s2 s5 s10 s20 s
veo-3.1, לשנייה, 1080p$0.400$0.800$2.000$4.000$8.000
veo-3.1-fast, לשנייה, 1080p$0.120$0.240$0.600$1.200$2.400
sora-2, לשנייה, 720p$0.100$0.200$0.500$1.000$2.000
hailuo-02, לכל clip, 1080p$0.480$0.480$0.480$0.480$0.480
mochi, לכל GPU-second$0.018$0.037$0.092$0.183$0.366

הספק לפי clip יקר יותר מהספק לפי שנייה מתחת ל־1.2 שניות וזול ממנו פי 16.7 בעשרים שניות. שום דירוג של שני המודלים האלה לא שורד שינוי באורך ה־clip, ולכן ״איזה מודל וידאו הכי זול״ אינה שאלה על מודלים.

השורה האחרונה גרועה יותר, והיא הלב הישר של הפרק. mochi מחויב לפי שניות GPU אמיתיות — זמן ה־prediction הנמדד של העבודה — ב־$0.001400 לשנייה על A100 ו־$0.001525 על H100, שהם תעריפי המכונה המושכרת ולא שום דבר אחר.15 זה תעריף מדויק לחלוטין והוא לא מחיר, כי הכמות שהוא מכפיל אינה ידועה עד אחרי שהתחייבתם לשלם עליה. השורה למעלה מניחה שתים עשרה GPU-seconds לכל שניית output; הכפילו את ההנחה הזאת בארבע והיא יוצאת מהפס הזול ביותר, ורק בפי שש היא נוחתת באמצע הטבלה. זה התעריף היחיד בעמוד הזה שאי אפשר לשים בהצעת מחיר.

אז: tokens, image tokens, תווים, דקות, שניות וידאו, clips שלמים, GPU seconds, יחידות flat. שמונה כמויות, והדרך היחידה לשים אותן על ציר אחד היא להצהיר על workload ולתמחר אותו.

זו ההרחבה ל־computeCost של פרק 16 — אותה מכונת מדרגות, עכשיו עם קריטריונים שאינם אורך 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;
}

שתי השורות המסומנות הן המקום שבו זה נשבר. תעריף שמצוטט ליחידה מכפיל את u.images ?? 1; תעריף שמצוטט ל־token מכפיל משהו שברירת המחדל שלו היא אפס. הזינו לשניהם usage ריק — הצורה שמקבלים כשמדידה נכשלה — וצפו:

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

כלום לא קרה, שש פעמים, וזה עלה שלושה דולרים פעם אחת וכלום חמש פעמים. זה לא הבדל עיגול; זו החלטה לגבי משמעות של מספר חסר, שנלקחה בנפרד לכל יחידה ואף פעם לא נכתבה. הכלל הנכון הוא ששדה שאף אחד לא מדד נשאר חסר, כי ״לא נמדד״ ו״נמדד ויצא אפס״ הם דברים שונים. הפונקציה הזו חולקת על כך בשקט.

הכשל השני הוא משך. התעריף לפי clip בוחר מדרגה עם maxDurationSeconds מול u.videoSeconds ?? 0, כך ש־usage שלא תיעד משך לעולם מתאים למדרגה הקצרה ביותר:

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

ארבעים אחוז הנחה על לא לדעת כמה זמן היה הווידאו. לשני הבאגים יש אותו שורש: ברירת מחדל שנבחרה לנוחות בתוך פונקציה שכל תפקידה להיות מדויקת.

כשאפשר לחשב עלויות, ההשוואה צריכה את החצי השני — workload מייצג מוצהר, אחד לכל engine, מפורסם כך שקורא יכול לחלוק עליו:

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

כל אחת מהשורות האלה היא טענה. טקסט מערבב רבע input ושלושה רבעים output כי שימוש אמיתי נוטה ל־output; תערובת חמישים־חמישים מדרגת את המודלים אחרת. workload התמונה מניח 1,500 output tokens, בין 1,056 של OpenAI לריבוע medium לבין 1,584 שלה ל־portrait medium. וידאו מניח חמש שניות ב־1080p, וכבר ראינו שני ספקים מחליפים מקומות ב־1.2 שניות. רשומת ה־compute מניחה שישים GPU-seconds כי אין שום דבר אחר להניח.

וזו השיטה, והיא היחידה ההוגנת שיש: אי אפשר להשוות מחירים ביחידות שונות; אפשר רק להשוות את העלות של workload שכתבתם במפורש. כל טבלה שמדרגת מודלים multimodal בלי להדפיס את ה־workload שלה מדרגת את ההנחות שלה עצמה.

עכשיו אפשר לתמחר כל דבר שמודל יכול להפיק, בכל יחידה שבה הוא נמכר, ולומר בקול איזה workload ההשוואה שלכם הניחה. זה סוגר את החשבונית שפרק 16 פתח, וזה סוגר את חלק III: כל מה שמפרק 14 ועד כאן עסק ב־קריאה אחת — איך לבצע אותה, מה לשים בה, איך לדגום אותה, מה היא מחזירה, כמה היא עולה.

פרק 22 משנה את יחידת הניתוח, והשינוי יקר. agent אינו קריאה אחת; הוא לולאה שמחליטה בעצמה כמה קריאות לבצע, והאריתמטיקה של שני הפרקים האחרונים היא מה שהופך את זה מדיאגרמת ארכיטקטורה לתקציב. הוא נפתח בשאילת אותה שאלה לאותו מודל פעמיים, עם tool אחד שנוסף לקטלוג בפעם השנייה, ובמדידה מה tool אחד עשה: קריאה אחת הפכה לשתיים, שלושים ותשעה input tokens הפכו ל־420.

האם זה הופך אותו ל־agent תלוי באיזו מבין שתי הגדרות שפורסמו אתם פותחים, והן לא מסכימות. אחת מהן לא מסכימה עם עצמה.


כל מחיר, נוסחה ויחס המרה בפרק הזה נקראו מהעמוד של הספק עצמו ב־7 בספטמבר 2026 ומצוטטים עם התאריך הזה, כי כולם יזוזו. ספירות ה־token, העלויות וההשוואות חושבו על הנתונים האלה באמצעות הקוד שמודפס למעלה, על מכונה אחת, בלי לבצע קריאת API בתשלום — וזו גם הסיבה הכנה לכך שאין בפרק הזה ולו טענת latency אחת.

פונקציות image-token, טבלאות העלות, פירוט שיחת הקול ותוצאות empty-usage הופקו על ידי ה־TypeScript שמודפס בפרק הזה, בהרצה על Node 22. הדיאלוג ששימש להשוואת הקול הוא בן 149 מילים ועבר tokenization עם tiktoken תחת קידוד o200k_base ל־188 token; משכו נובע מקצב מוצהר של 150 מילים לדקה, שהוא פרמטר של ההשוואה ולא מדידה. כל נתון ספק נושא את הערת השוליים שמציינת את העמוד שממנו הגיע.

  1. Dosovitskiy, A. et al. An Image Is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv:2010.11929 (2020). טלאים, ההיטל הליניארי אל ממד ה־embedding, ו־position embeddings שהופכים את הרשת לקריאה למודל רצף.

  2. Radford, A. et al. Learning Transferable Visual Models From Natural Language Supervision. arXiv:2103.00020 (2021). אימון contrastive של image encoder ו־text encoder על 400 מיליון זוגות, והמרחב המשותף שכל מה שבהמשך מניח.

  3. Alayrac, J.-B. et al. Flamingo: a Visual Language Model for Few-Shot Learning. arXiv:2204.14198 (2022). vision encoder קפוא, מודל שפה קפוא, שכבות גישור מאומנות — הארכיטקטורה שהפכה הבנת תמונה ליכולת chat.

  4. Liu, H., Li, C., Wu, Q. and Lee, Y. J. Visual Instruction Tuning. arXiv:2304.08485 (2023). היטל ליניארי יחיד כגשר ונתוני instruction שנוצרו כסט אימון; הסיבה שמודלי vision-language פתוחים התכנסו לצורה אחת.

  5. Anthropic, Vision, platform.claude.com/docs/en/build-with-claude/vision, נצפה 2026-09-07. ״Claude רואה תמונות בטלאים במקום בפיקסלים. כל טלאי הוא בלוק 28×28 פיקסלים של התמונה, המכונה visual token. לכן תמונה עולה ⌈width / 28⌉ × ⌈height / 28⌉ visual tokens.״ גם שתי מדרגות הרזולוציה (standard: צלע ארוכה 1568 פיקסלים, 1568 visual tokens; high-resolution, ב־Claude 4.7 ואילך: 2576 פיקסלים ו־4784 token), כלל ההקטנה, וטבלת ששת הגדלים וספירות ה־token ששוחזרה למעלה. תעריפי מודלים מתוך Anthropic, Pricing, platform.claude.com/docs/en/about-claude/pricing, אותו תאריך: Claude Haiku 4.5 ב־$1 ו־$5 למיליון input ו־output tokens.

  6. Google, Image understanding, ai.google.dev/gemini-api/docs/image-understanding, נצפה 2026-09-07. ״258 token אם שני הממדים <= 384 פיקסלים. תמונות גדולות יותר מרוצפות לאריחי 768x768 פיקסלים, כל אחד בעלות 258 token״, עם נוסחת יחידת החיתוך — floor(min(width, height) / 1.5), הממדים מחולקים בה ומוכפלים זה בזה — והדוגמה המחושבת של 960 × 540 שנותנת 3 × 2 = 6 אריחים. Google קוראת לזה ״נוסחה גסה״; אי־התלות בקנה מידה שנגזרה למעלה היא תכונה של הנוסחה כפי שפורסמה. audio input באותה משפחה הוא 32 token לשנייה של אודיו (ai.google.dev/gemini-api/docs/audio, אותו תאריך).

  7. OpenAI, Images and vision, developers.openai.com/api/docs/guides/images-vision, נצפה 2026-09-07. מקור הכלל מבוסס הטלאים (טלאי 32 × 32, patch_count = ceil(width/32)×ceil(height/32), נוסחת shrink_factor וההתאמה השלמה שלה, מגבלת הדחייה של 30,000 טלאים); טבלת גדלי המודלים, כולל העובדה ש־low על gpt-5.4 משתמש במגבלת 2048 פיקסלים ובתקציב 6,144 טלאים ״כך שהוא יכול להשתמש ביותר token מ־high״, מול תקציב 2,500 הטלאים של high; טבלת המכפילים (1.2 למשפחות GPT-5.x, 1.62 ל־gpt-4.1-mini, 2.46 ל־gpt-4.1-nano); שתי הדוגמאות המחושבות ששוחזרו למעלה (1024 × 1024 → 1229 token, ‏2048 × 2048 → 3000 token); הכללים מבוססי האריחים למודלים ישנים יותר (base ועוד אריחי 512 פיקסלים, 85 + 170 על gpt-4o); ורשימת המגבלות שצוטטה בתיבת ה־vision. 2

  8. Ho, J., Jain, A. and Abbeel, P. Denoising Diffusion Probabilistic Models. arXiv:2006.11239 (2020). לוח הזמנים של הוספת הרעש קדימה, ה־reparameterisation שהופך את המטרה לחיזוי הרעש שנוסף, ולולאת הדגימה.

  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 במרחב latent דחוס, וזה מה שהפך את מספר הצעדים הקבוע לזול מספיק כדי למכור לפי תמונה.

  10. Prince, S. J. D. Understanding Deep Learning ‏(MIT Press, 2023), פרק 18. ההאצלה המוצהרת לכל מה שהפרק הזה דילג עליו ב־diffusion — ה־variational bound, לוחות הזמנים של הרעש, classifier-free guidance ומשפחות ה־sampler. Hu, E. et al., LoRA: Low-Rank Adaptation of Large Language Models, arXiv:2106.09685 (2021), הוא ה־adapter עצמו, שהוצג בפרק 11 על מודל שפה ומשמש כאן על מודל תמונה בלי שינוי במתמטיקה. Radford, A. et al., Robust Speech Recognition via Large-Scale Weak Supervision ‏(Whisper), arXiv:2212.04356 (2022), הוא מודל התמלול שמחירו לדקה מופיע למעלה.

  11. OpenAI, Image generation, developers.openai.com/api/docs/guides/image-generation, Pricing, developers.openai.com/api/docs/pricing, ועמוד המודל עבור gpt-image-1, כולם נצפו 2026-09-07. עמוד המודל של gpt-image-2 אינו כולל סעיף תמחור; התעריפים שלו מגיעים מדף התמחור שלמעלה. עמוד GPT Image 1 מפרסם text input ב־$5.00, image input ב־$10.00 ו־image output ב־$40.00 למיליון token לצד טבלת המחיר לתמונה ששימשה בגזירה למעלה. בנוסף: טבלת output-token למודלים שלפני gpt-image-2 (272 / 408 / 400 low, ‏1056 / 1584 / 1568 medium, ‏4160 / 6240 / 6208 high, עבור square, portrait ו־landscape); טבלאות המחיר לתמונה עבור GPT Image 2, ‏1.5, ‏1 ו־1 Mini ששימשו בגזירות למעלה; המשפט ״רזולוציה לא־ריבועית גדולה יותר יכולה לפעמים לייצר פחות output tokens מרזולוציה קטנה יותר או ריבועית באותה הגדרת איכות״; ההערה שכל תמונת partial מוזרמת עולה עוד 100 image output tokens; ותעריפי gpt-image-2 של $8.00 image input, ‏$2.00 cached image input, ‏$30.00 image output ו־$5.00 text input למיליון token. תעריפי מודלי טקסט ששימשו להשוואות: gpt-5.6-terra ב־$2.00 input, ‏$0.20 cached input ו־$12.00 output, ‏gpt-5.6-luna ב־$0.20 ו־$1.20, standard tier, short context. וידאו: sora-2 ב־$0.10 לשנייה ב־720p ו־sora-2-pro ב־$0.30, ‏$0.50 ו־$0.70 ב־720p, ‏1024p ו־1080p. תמלול: $0.006, ‏$0.0045, ‏$0.003 ו־$0.017 לדקה עבור gpt-4o-transcribe, gpt-transcribe, gpt-4o-mini-transcribe ו־gpt-live-transcribe. 2

  12. Google, Gemini Developer API pricing, ai.google.dev/gemini-api/docs/pricing, נצפה 2026-09-07. Gemini 3.1 Flash-Lite ב־$0.25 למיליון input tokens (טקסט, תמונה ווידאו) ו־$1.50 output. Gemini 3.1 Flash Image: image output ב־$60 למיליון token, עם השקילויות שפורסמו של 747, 1120, 1680 ו־2520 token לתמונות 0.5K, 1K, 2K ו־4K ומחירי התמונה שלהן $0.045, $0.067, $0.101 ו־$0.151. Gemini 3.1 Flash TTS: ‏$1.00 text input, ‏$20.00 audio output, ״audio tokens תואמים ל־25 token לשנייה של אודיו״. Gemini 3.1 Flash Live Preview: ‏$0.75 טקסט ו־״$3.00 או $0.005/min״ audio input, ״$4.50 (טקסט) $12.00 או $0.018/min (אודיו)״ output. Veo 3.1 לשנייה עם אודיו: $0.40 ב־720p ו־1080p ו־$0.60 ב־4K standard; ‏$0.10, ‏$0.12 ו־$0.30 fast. Gemini Omni Flash מחייב video output ״בקצב של 5,792 token לשנייה של וידאו 720p״, והערת השוליים עצמה ממירה זאת לכ־$0.10 לשנייה — ההצהרה המפורסמת הברורה ביותר בכל מקום שמחיר מדיה לפי שנייה הוא מחיר token. 2

  13. עמודי המודל של OpenAI עבור tts-1, tts-1-hd ו־gpt-4o-mini-tts, developers.openai.com/api/docs/models, נצפו 2026-09-07. tts-1 ב־$15.00 ו־tts-1-hd ב־$30.00 למיליון תווים; gpt-4o-mini-tts ב־$0.60 למיליון text input tokens ו־$12.00 למיליון audio output tokens — אותו ספק, אותה פעולה, שתי יחידות.

  14. OpenAI, Managing costs ‏(Realtime API), developers.openai.com/api/docs/guides/realtime-costs, נצפה 2026-09-07. ״Audio tokens בהודעות משתמש הם 1 token לכל 100 ms של אודיו, בעוד audio tokens בהודעות assistant הם 1 token לכל 50ms של אודיו.״ וגם: ״כל השיחה נשלחת למודל עבור כל Response... לכן תורים מאוחרים יותר בסשן יהיו יקרים יותר״; עלויות נצברות כש־Response נוצר; הדוגמה המחושבת בת שני תורים שהטבלה למעלה משחזרת את הצטברותה; ו־usage payload של response.done עם הפיצולים input_token_details ו־output_token_details שלו. תעריפים מדף המחיר, אותו תאריך: אודיו gpt-realtime-2.1 ב־$32.00 input, ‏$0.40 cached input ו־$64.00 output למיליון token, טקסט ב־$4.00, ‏$0.40 ו־$24.00, image input ב־$5.00. 2

  15. Replicate, Pricing, replicate.com/pricing, נצפה 2026-09-07. Nvidia A100 ‏(80GB) ב־$0.001400 לשנייה ו־$5.04 לשעה; Nvidia H100 ב־$0.001525 לשנייה ו־$5.49 לשעה.


נוצר על ידי

David Vicente Campos

מייסד NeuraLIA Labs ושותף-מייסד MyRealFood

אני מהנדס מחשבים, בוגר אוניברסיטת לאון. הייתי שותף בהקמת MyRealFood, שם, כסמנכ״ל טכנולוגיות, בניתי את האפליקציה שמיליוני אנשים השתמשו בה כדי לאכול בריא יותר, והקמתי את NeuraLIA Labs, שם אני בונה מוצרי בינה מלאכותית. כאן אני כותב על מה שהייתי צריך להבין לאורך הדרך, כפי שהייתי רוצה שמישהו היה מסביר לי בזמנו.

עוד על המחבר

פורסם על ידי NeuraLIA Labs.

פוסטים חדשים ישירות לתיבת הדואר

חדשות AI, מדריכים ועדכוני מוצר — מייל קצר כשאנחנו מפרסמים משהו ששווה את הזמן שלך.

תוכן הקורס

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev10 דקות קריאה

מודל ה-AI Jev נבנה להחלטות, לא לפרוזה

Jev של TypeSafe AI מושך תשומת לב כי הוא מתייחס לאינטליגנציית תוכנה כאל בעיית הסתברות: לבחור את ההסתעפות הנכונה, להצמיד ביטחון, ולהימנע מתשלום ל-LLM כדי שיכתוב טקסט כשהקוד צריך החלטה.

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering10 דקות קריאה

הנדסת הקשר לסוכני AI ארוכי־טווח

סוכנים שרצים לאורך זמן לא נכשלים רק כי החלון קטן. הם נכשלים כשקבצים, פלטי כלים והיסטוריה מיושנת דוחקים החוצה את המשימה שהסוכן היה אמור להשלים.

מוכנים לתת ל-LIA לבחור?

בנו עם כל מודלי ה-AI במקום אחד — התחילו בחינם עוד היום.