پرش به محتوا
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 برنده برای کپشن چهل-tokenی Gemini است و برای پاراگراف چهارصد-tokenی OpenAI.

ستون Gemini در هیچ ردیفی اصلاً تکان نمی‌خورد: یک عکس 4000 × 3000 دقیقاً همان‌قدر برایش هزینه دارد که یک عکس 640 × 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 صورتحساب متن را ساخت و جایی ایستاد که متن تمام می‌شود. این فصل بقیه فاکتور است: تصویر، گفتار، transcription، ویدئو و compute خام، که روی‌هم‌رفته با هشت واحد مختلف صورتحساب می‌شوند، و روش مقایسه چیزهایی که با یک مقیاس فروخته نمی‌شوند.

نمایش جزئیات

این فصل از فصل‌های قبلی چه می‌خواهد.

  • فصل 7 tokenizer و واحد را ساخت. همه‌چیز اینجا تلاشی است برای تبدیل چیزی که متن نیست به همان واحد.
  • فصل 8 مشخص کرد مدل چه چیزی مصرف می‌کند: نه نمادها، بلکه بردارها در یک فضای embedding. به همین دلیل است که تصویر اصلاً می‌تواند با token قیمت‌گذاری شود.
  • فصل 16 تابع computeCost، رده‌های قیمت و پنج سبد token آن را ساخت. این فصل آن تابع را گسترش می‌دهد، نه جایگزینش می‌کند.
  • فصل 11 LoRA را به‌عنوان تکنیک fine-tuning معرفی کرد و فصل 20 آن را به‌عنوان تصمیم بودجه‌ای قیمت‌گذاری کرد. اینجا روی مدلی ظاهر می‌شود که مدل زبانی نیست.

طبق قاعده فصل 14، بدون تنسور: اینجا تعرفه، تبدیل و حسابداری است، پس TypeScript است.

یک transformer دنباله‌ای از بردارها می‌گیرد. برایش مهم نیست از کجا آمده‌اند. فصل 8 به آن embeddingهایی را خوراند که از یک token id lookup شده بودند؛ هیچ‌چیز در معماری، lookup را الزام نمی‌کند.

پس: تصویر را به مربع‌های ثابت ببرید، هر مربع را به فهرستی از اعداد تخت کنید، و هر فهرست را از یک لایه خطیِ یادگرفته‌شده عبور دهید تا برداری با عرض مدل بسازید. یک patch ‏32 × 32 از پیکسل‌های رنگی، 32×32×3=307232 \times 32 \times 3 = 3072 عدد است؛ projection ‏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 نشان داد این پل می‌تواند یک projection خطی واحد باشد و instruction-following می‌تواند با داده تولیدی آموخته شود؛ به همین دلیل است که تقریباً همه مدل‌های vision-language باز بعد از آن شبیه هم به نظر می‌رسند.4

پیامد آن برای فاکتور شما فوری و بی‌زرق‌وبرق است: patchها موقعیت‌هایی در دنباله‌اند، پس input tokens هستند، پس با نرخ ورودی هزینه‌شان را می‌پردازید. تعدادشان حساب است، و هر provider آن را جور دیگری انجام می‌دهد.

سه قاعده، همه منتشرشده، هیچ‌کدام مثل هم نیست

لینک به بخش: سه قاعده، همه منتشرشده، هیچ‌کدام مثل هم نیست

هر قاعده زیر از مستندات خود provider پیاده‌سازی شده و با مثال‌های محاسبه‌شده همان مستندات سنجیده شده است.

OpenAI تصویر را با patchهای 32 × 32 می‌پوشاند و تعداد را در ضریب مخصوص هر مدل ضرب می‌کند. اگر تعداد patch از بودجه آن مدل و سطح 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 آن را با patchهای 28 × 28 می‌پوشاند، هر کدام یک visual token، و هم لبه بلند و هم تعداد token را سقف‌گذاری می‌کند — 1,568 پیکسل و 1,568 token در مدل‌های standard-tier، و 2,576 و 4,784 در high-resolution tier. تصاویر بیش‌ازحد بزرگ به بزرگ‌ترین اندازه‌ای کوچک می‌شوند که با هر دو جور دربیاید.5

Google اصلاً پیکسل‌ها را نمی‌شمارد. تصویری که هر دو ضلعش 384 پیکسل یا کمتر باشد، هزینه ثابت 258 token دارد. هر چیز بزرگ‌تر به tileهایی از 258 token بریده می‌شود، و شبکه tile از crop unit ‏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;      
}

هر کدام را روی اعدادی اجرا کنید که vendor خودش چاپ کرده است:

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 هر دو tier را برای هر شش اندازه می‌دهد. حالا قواعد برای اجرای روی هر عکسی که دارید مال شماست، و نکته همین است: این‌ها تنها سه تابع این فصل‌اند که از صفحه قیمت به دست نمی‌آیند.

«بزرگ‌تر» یعنی چه، سه بار

لینک به بخش: «بزرگ‌تر» یعنی چه، سه بار

همان عکس 4:3 را در شش اندازه از هر سه عبور دهید:

اندازهOpenAI، highAnthropic، استانداردAnthropic، 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 پیکسل بزرگ‌تر شد، عدد دیگر هرگز تغییر نمی‌کند، و این نه تصادف است نه سقف. crop unit را برای تصویری که حداقل به پهنای ارتفاعش است دوباره در فرمول tile جای‌گذاری کنید:

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 گوگل به aspect ratio وابسته‌اند و به هیچ چیز دیگر. یک عکس 4:3 چهار tile است، چه thumbnail باشد چه poster. همین واقعیت جبریِ واحد، کل توضیح صفرِ جدول صرفه‌جویی بالاست، و هیچ صفحه قیمتی در هیچ‌جا آن را بیان نمی‌کند.

دو ستون دیگر در عوض سقف می‌خورند، در ارتفاع‌های متفاوت و به دلایل متفاوت — Anthropic در سقف اعلام‌شده token، OpenAI در بودجه patch بعد از یک محدودیت پیکسلی — و به همین دلیل سه منحنی در اندازه‌های متفاوت همدیگر را قطع می‌کنند.

حالا خرابش کنید. راه بدیهی برای هزینه کمتر در 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-patch استفاده می‌کند، درحالی‌که high از همان محدودیت پیکسلی با بودجه 2,500-patch استفاده می‌کند، «so it can use more tokens than high».7 واژه low نام یک تنظیم fidelity است، نه قیمت: در دو تا از پنج خانواده مدل مستندشده هیچ صرفه‌جویی نمی‌خرد، و در یکی از همان دو، بیشتر هزینه دارد.

ساختن یک تصویر، ماشین دیگری است

لینک به بخش: ساختن یک تصویر، ماشین دیگری است

همه‌چیز تا اینجا مدلی بوده که تصویری را می‌خواند. ساختن تصویر روی مکانیزمی اجرا می‌شود که اصلاً token ندارد، و به همین دلیل به‌جای کلمه، با تصویر فروخته می‌شود.

ساختن تصویر: قیمت هر عکس، قیمت هر token است

لینک به بخش: ساختن تصویر: قیمت هر عکس، قیمت هر token است

Vendorها image generation را به‌صورت قیمت هر تصویر منتشر می‌کنند. این‌طور نیست. مدل‌های GPT Image، image tokens تخصصی بیرون می‌دهند که تعدادشان به اندازه و quality درخواستی وابسته است؛ تعدادهای منتشرشده را در نرخ 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 images at 1K (1024x1024px) consume 1120 tokens and are equivalent to $0.067 per image».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

تصویر بزرگ‌تر در هر quality ارزان‌تر است. یک canvas ‏1024 × 1536 پنجاه درصد پیکسل بیشتری از 1024 × 1024 دارد و در medium بیست‌وسه درصد token کمتر هزینه دارد. OpenAI آن را در جمله‌ای علامت می‌زند که احتمالاً از آن می‌گذرید — «a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting» — و در نسل قبلی مدل‌ها برعکس بود، portrait پنجاه درصد بیشتر از square هزینه داشت.11 هر default از 1024x1024 که قبل از آن تغییر نوشته شده، حالا گزینه گران است.

صدا، با ثانیه، کاراکتر و token صورتحساب می‌شود

لینک به بخش: صدا، با ثانیه، کاراکتر و token صورتحساب می‌شود

از سه محصول بخواهید همان 519 کاراکتر را بگویند — حدود 38 ثانیه audio — و از دو vendor سه سیستم واحد می‌گیرید:

مدلواحدقیمت
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

همان vendor هر دو واحد را می‌فروشد: tts-1 از OpenAI برحسب هر میلیون کاراکتر قیمت‌گذاری می‌شود، درحالی‌که gpt-4o-mini-tts برحسب هر میلیون token قیمت‌گذاری می‌شود، $0.60 ورودی و $12.00 خروجی.13 پس «ارزان‌ترین text-to-speech» تا وقتی نگویید چه چیزی را می‌خوانید، پرسشی با پاسخ نیست.

و دو واحد نسبت به چیزهای متضاد کورند. قیمت هر کاراکتر duration را نمی‌بیند: صدایی آهسته و شمرده انتخاب کنید، یا مکث اضافه کنید، فاکتور تکان نمی‌خورد درحالی‌که audio طولانی‌تر می‌شود. قیمت هر ثانیه content را نمی‌بیند: سی ثانیه همان‌قدر هزینه دارد، چه یک پاراگراف فنی فشرده باشد چه کسی تا ده بشمارد. voice را عوض کنید و دقیقاً یکی از دو vendor شما دوباره قیمت‌گذاری می‌کند.

Transcription برعکس می‌رود و ساده‌ترین خط کل فاکتور است — به ازای هر دقیقه audio، ثابت:

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)

ردیف آخر را نسبت به سوم ببینید: انجام آن به‌صورت زنده، وقتی کلمات می‌رسند، 5.7 برابر انجام آن روی فایل آماده هزینه دارد. این فاصله قیمتِ نتوانستن برای batch کردن است، و همان چیزی است که بخش بعدی را گران می‌کند.

حالا عددی که تعیین می‌کند voice یک feature است یا یک محصول.

تماس: مکالمه پشتیبانی ده‌نوبتی، 149 کلمه، که با نرخ اعلام‌شده 150 کلمه در دقیقه، 59.6 ثانیه گفتار است — 21.2 ثانیه از تماس‌گیرنده، 38.4 ثانیه پاسخ. تبدیل‌های token متعلق به خود providerهاست. OpenAI: «audio tokens in user messages are 1 token per 100 ms of audio, while audio tokens in assistant messages are 1 token per 50 ms».14 Google: ‏25 token در ثانیه، در هر دو جهت، که صفحه قیمتش با انتشار $12.00 به ازای هر میلیون و $0.018 به ازای هر دقیقه در همان خط تأیید می‌کند.12

مکالمه دقیقاً همان‌طور انباشته می‌شود که فصل 16 گفت، چون همان مکانیزم است: «the entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive».14 فقط حالا history با audio tokens اندازه‌گیری می‌شود.

نوبتکاربرassistantaudio تازه ورودیaudio cached ورودیaudio خروجیهزینه
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، history cached$0.05742516.6×
gemini-3.1-flash-live، بدون caching$0.0239656.9×
همان کلمات تایپ‌شده، gpt-5.6-terra$0.003461

سی‌وهشت برابر. نه سی‌وهشت درصد. همان تبادل، اگر به‌جای متن با صدا انجام شود، تقریباً دو مرتبه بزرگی گران‌تر است، و هیچ‌کدام از این فاصله حاشیه سودی نیست که کسی انتخاب کرده باشد — نرخ تبدیل است. یک ثانیه audio از assistant بیست token است. همان ثانیه با نرخ اعلام‌شده 2.5 کلمه حمل می‌کند، و transcript اندازه‌گیری‌شده 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 تازه — تخفیف 98.75 % که تماس را نصف می‌کند. قاعده همان قاعده فصل 16 است، بی‌تغییر: cache یک prefix را match می‌کند، پس هر چیزی که وسط تماس جلوی مکالمه درج شود آن را نابود می‌کند، و جای طبیعی گذاشتن «تماس‌گیرنده اکنون verify شده» دقیقاً همان‌جاست.

و هیچ کاری در client یک صدا را از صورتحساب خارج نمی‌کند. کاربر روی حرف assistant صحبت می‌کند، کد شما پخش را متوقف می‌کند، speaker ساکت می‌شود. هرچه قبلاً تولید شده بود قبلاً هزینه شده، چون billing وقتی response ساخته می‌شود انباشته می‌شود؛ و طبق قاعده فصل 16 هرچه در مکالمه بماند، در هر نوبت بعدی دوباره به‌عنوان input audio فرستاده می‌شود. فصل 14 این نکته را درباره abort کردن text stream گفت. در voice سی برابر بیشتر هزینه دارد.

ویدئو، GPU-second، و قیمتی که قیمت نیست

لینک به بخش: ویدئو، GPU-second، و قیمتی که قیمت نیست

Video را بعضی vendorها به ازای هر ثانیه می‌فروشند و بعضی به ازای هر clip، با tierهایی برای resolution و گاهی duration. این دو شکل فقط از نظر راحتی فرق ندارند؛ همدیگر را قطع می‌کنند.

مدل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

vendor هر-clip زیر 1.2 ثانیه از هر-ثانیه گران‌تر است و در بیست ثانیه 16.7 برابر ارزان‌تر. هیچ ترتیب رتبه‌بندی این دو مدل با تغییر طول clip دوام نمی‌آورد، پس «کدام video model ارزان‌تر است» پرسشی درباره مدل‌ها نیست.

ردیف آخر بدتر است، و قلب صادق این فصل همان‌جاست. mochi بر اساس ثانیه‌های واقعی GPU صورتحساب می‌شود — زمان prediction اندازه‌گیری‌شده job — با $0.001400 در ثانیه روی A100 و $0.001525 روی H100، که نرخ‌های ماشین اجاره‌ای‌اند و هیچ چیز دیگر.15 این تعرفه‌ای کاملاً دقیق است و قیمت نیست، چون کمیتی که در آن ضرب می‌شود تا بعد از تعهد به پرداخت ناشناخته است. ردیف بالا دوازده GPU-second به ازای هر ثانیه خروجی فرض می‌کند؛ آن فرض را چهار برابر کنید و از باند ارزان‌ترین خارج می‌شود، و فقط در شش برابر به میانه جدول می‌رسد. این تنها تعرفه این صفحه است که نمی‌توانید در quote بگذارید.

پس: tokenها، image tokens، کاراکترها، دقیقه‌ها، video seconds، clipهای کامل، GPU seconds، واحدهای ثابت. هشت کمیت، و تنها راه گذاشتنشان روی یک محور این است که workloadی اعلام کنید و آن را قیمت‌گذاری کنید.

این گسترش computeCost فصل 16 است — همان ماشین tier، حالا با criterionهایی که prompt length نیستند:

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

دو خط علامت‌خورده جایی است که می‌شکند. تعرفه‌ای که به ازای unit نقل شده، u.images ?? 1 را ضرب می‌کند؛ تعرفه‌ای که به ازای token نقل شده، چیزی را ضرب می‌کند که پیش‌فرضش صفر است. به هر دو یک usage خالی بدهید — شکلی که وقتی measurement شکست می‌گیرید — و ببینید:

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

شش بار هیچ اتفاقی نیفتاد، و یک بار سه دلار هزینه داشت و پنج بار هیچ. این اختلاف گرد کردن نیست؛ تصمیمی است درباره اینکه عدد غایب یعنی چه، جداگانه برای هر unit گرفته شده و هیچ‌جا نوشته نشده. قاعده درست این است که فیلدی که هیچ‌کس اندازه‌اش نگرفته غایب می‌ماند، چون «اندازه‌گیری نشده» و «اندازه‌گیری شده و صفر درآمده» چیزهای متفاوت‌اند. این تابع آرام با آن مخالف است.

شکست دوم duration است. تعرفه clip-priced، tier خود را با maxDurationSeconds در برابر u.videoSeconds ?? 0 انتخاب می‌کند، پس usageی که هرگز duration ثبت نکرده، با کوتاه‌ترین tier match می‌شود:

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

چهل درصد تخفیف برای اینکه نمی‌دانید video چقدر طول داشته است. هر دو باگ یک ریشه دارند: پیش‌فرضی که برای راحتی داخل تابعی انتخاب شده که کل کارش دقیق بودن است.

وقتی هزینه‌ها قابل محاسبه شدند، مقایسه نیمه دیگر را می‌خواهد — یک representative 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 را مخلوط می‌کند چون usage واقعی به output متمایل است؛ blend پنجاه‌پنجاه مدل‌ها را جور دیگری رتبه‌بندی می‌کند. workload تصویر 1,500 output token فرض می‌کند، بین 1,056 OpenAI برای medium square و 1,584 آن برای medium portrait. Video پنج ثانیه در 1080p فرض می‌کند، و همین حالا دیدیم دو vendor در 1.2 ثانیه جا عوض می‌کنند. ورودی compute شصت GPU-second فرض می‌کند چون چیز دیگری برای فرض کردن نیست.

روش همین است، و تنها روش صادقانه موجود: نمی‌توانید قیمت‌ها را در واحدهای متفاوت مقایسه کنید؛ فقط می‌توانید هزینه workloadی را که نوشته‌اید مقایسه کنید. هر جدولی که multimodal models را بدون چاپ workload خود رتبه‌بندی کند، فرض‌های خودش را رتبه‌بندی می‌کند.

حالا می‌توانید هر چیزی را که مدل می‌تواند تولید کند، در هر واحدی که فروخته می‌شود، قیمت‌گذاری کنید و با صدای بلند بگویید مقایسه شما چه workloadی را فرض کرده است. این فاکتوری را که فصل 16 باز کرد می‌بندد، و Part III را هم می‌بندد: همه‌چیز از فصل 14 تا اینجا درباره یک call بوده است — چطور آن را بسازید، چه چیزی در آن بگذارید، چطور sample کنید، چه برمی‌گرداند، چه هزینه‌ای دارد.

فصل 22 واحد تحلیل را عوض می‌کند، و این تغییر گران است. یک agent یک call نیست؛ حلقه‌ای است که خودش تصمیم می‌گیرد چند call بسازد، و حساب دو فصل اخیر همان چیزی است که آن را از diagram معماری به budget تبدیل می‌کند. با پرسیدن همان سؤال از همان مدل دو بار شروع می‌شود، با یک tool اضافه‌شده به catalogue در بار دوم، و اندازه‌گیری اینکه آن یک tool چه کرد: یک call شد دو call، سی‌ونه input token شد 420.

اینکه آیا همین آن را agent می‌کند یا نه، بستگی دارد کدام‌یک از دو تعریف منتشرشده را باز کنید، و آن‌ها توافق ندارند. یکی از آن‌ها حتی با خودش هم توافق ندارد.


هر قیمت، فرمول و نرخ تبدیل در این فصل از صفحه خود provider در 7 سپتامبر 2026 خوانده شده و با همان تاریخ نقل می‌شود، چون همه‌شان جابه‌جا خواهند شد. token countها، هزینه‌ها و مقایسه‌ها روی آن data با کدی که بالا چاپ شد، روی یک ماشین، و بدون هیچ paid API call محاسبه شدند — که دلیل صادقانه نبودن حتی یک ادعای latency در این فصل هم هست.

توابع image-token، جدول‌های هزینه، breakdown تماس voice و نتایج empty-usage با TypeScript چاپ‌شده در این فصل تولید شدند، اجراشده روی Node 22. دیالوگ استفاده‌شده برای مقایسه voice، 149 کلمه است و با tiktoken تحت encoding ‏o200k_base به 188 token تبدیل شد؛ duration آن از نرخ اعلام‌شده 150 کلمه در دقیقه می‌آید، که parameter مقایسه است نه measurement. هر رقم provider، footnoteای دارد که صفحه مبدأش را نام می‌برد.

  1. Dosovitskiy, A. et al. An Image Is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv:2010.11929 (2020). Patchها، projection خطی به embedding dimension، و position embeddings که grid را برای sequence model خوانا می‌کنند.

  2. Radford, A. et al. Learning Transferable Visual Models From Natural Language Supervision. arXiv:2103.00020 (2021). training کنتراستی یک 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 منجمد، مدل زبانی منجمد، لایه‌های پل‌زن آموزش‌دیده — معماری‌ای که image understanding را به قابلیت chat تبدیل کرد.

  4. Liu, H., Li, C., Wu, Q. and Lee, Y. J. Visual Instruction Tuning. arXiv:2304.08485 (2023). یک projection خطی واحد به‌عنوان پل و داده instruction تولیدشده به‌عنوان مجموعه آموزشی؛ دلیل اینکه مدل‌های vision-language باز روی یک شکل همگرا شدند.

  5. Anthropic، Vision، platform.claude.com/docs/en/build-with-claude/vision، دسترسی در 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.» همچنین دو resolution tier (standard: لبه بلند 1568 پیکسل، 1568 visual token؛ high-resolution، روی Claude 4.7 و بعدتر: 2576 پیکسل و 4784 token)، قاعده downsizing، و جدول شش‌ردیفی اندازه‌ها و token countها که بالا بازتولید شد. نرخ‌های مدل از 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 tokens if both dimensions <= 384 pixels. Larger images are tiled into 768x768 pixel tiles, each costing 258 tokens»، با فرمول crop-unit — floor(min(width, height) / 1.5)، ابعاد تقسیم بر آن و ضرب در هم — و مثال محاسبه‌شده 960 × 540 که 3 × 2 = 6 tile می‌دهد. Google آن را «a rough formula» می‌نامد؛ scale-invariance مشتق‌شده در بالا ویژگی فرمول همان‌طور است که منتشر شده. audio input روی همان خانواده 32 token در ثانیه audio است (ai.google.dev/gemini-api/docs/audio، همان تاریخ).

  7. OpenAI، Images and vision، developers.openai.com/api/docs/guides/images-vision، دسترسی در 2026-09-07. منبع قاعده مبتنی بر patch (patchهای 32 × 32، patch_count = ceil(width/32)×ceil(height/32)، فرمول shrink_factor و تنظیم integer آن، محدودیت رد 30,000-patch)؛ جدول اندازه‌گذاری مدل، از جمله اینکه low روی gpt-5.4 از محدودیت 2048 پیکسلی و بودجه 6,144-patch استفاده می‌کند «so it can use more tokens than high»، در برابر بودجه 2,500-patch در 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)؛ قواعد مبتنی بر tile برای مدل‌های قدیمی‌تر (base به‌علاوه tileهای 512 پیکسلی، 85 + 170 روی gpt-4o)؛ و فهرست محدودیت‌های نقل‌شده در جعبه vision. 2

  8. Ho, J., Jain, A. and Abbeel, P. Denoising Diffusion Probabilistic Models. arXiv:2006.11239 (2020). forward noising schedule، reparameterisation که objective را به پیش‌بینی نویز اضافه‌شده تبدیل می‌کند، و 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). اجرای process diffusion در فضای latent فشرده، همان چیزی که تعداد گام ثابت را آن‌قدر مقرون‌به‌صرفه کرد که به ازای هر تصویر فروخته شود.

  10. Prince, S. J. D. Understanding Deep Learning (MIT Press, 2023), chapter 18. واگذاری اعلام‌شده برای هر چیزی که این فصل درباره diffusion کنار گذاشت — variational bound، noise schedules، 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)، مدل transcriptionی است که قیمت هر دقیقه‌اش بالا آمده است.

  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 بخش pricing ندارد؛ نرخ‌هایش از صفحه pricing بالا آمده‌اند. صفحه GPT Image 1، text input را با $5.00، image input را با $10.00 و image output را با $40.00 به ازای هر میلیون token کنار جدول per-image استفاده‌شده در derivation بالا منتشر می‌کند. همچنین: جدول output-token برای مدل‌های قبل از gpt-image-2 (272 / 408 / 400 low، 1056 / 1584 / 1568 medium، 4160 / 6240 / 6208 high، برای square، portrait و landscape)؛ جداول per-image price برای GPT Image 2، 1.5، 1 و 1 Mini استفاده‌شده در derivationهای بالا؛ جمله «a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting»؛ یادداشت اینکه هر partial image استریم‌شده 100 image output token اضافه هزینه دارد؛ و نرخ‌های gpt-image-2 شامل $8.00 image input، $2.00 cached image input، $30.00 image output و $5.00 text input به ازای هر میلیون token. نرخ‌های text model استفاده‌شده برای مقایسه‌ها: 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. Video: sora-2 با $0.10 در ثانیه در 720p و sora-2-pro با $0.30، $0.50 و $0.70 در 720p، 1024p و 1080p. Transcription: $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 (متن، تصویر و video) و $1.50 خروجی. Gemini 3.1 Flash Image: image output با $60 به ازای هر میلیون token، با equivalenceهای منتشرشده 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 correspond to 25 tokens per second of audio». Gemini 3.1 Flash Live Preview: $0.75 text و «$3.00 or $0.005/min» audio input، «$4.50 (text) $12.00 or $0.018/min (audio)» output. Veo 3.1 هر ثانیه با audio: $0.40 در 720p و 1080p و $0.60 در 4K standard؛ $0.10، $0.12 و $0.30 fast. Gemini Omni Flash خروجی video را «at a rate of 5,792 tokens per second of 720p video» صورتحساب می‌کند، که همان footnote به حدود $0.10 در ثانیه تبدیل می‌کند — روشن‌ترین بیان منتشرشده در هر جا که قیمت media هر ثانیه، قیمت 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 — همان vendor، همان عملیات، دو unit.

  14. OpenAI، Managing costs (Realtime API)، developers.openai.com/api/docs/guides/realtime-costs، دسترسی در 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.» همچنین: «The entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive»؛ costs وقتی Response ساخته می‌شود accrue می‌شود؛ مثال محاسبه‌شده دو turn که accumulation آن در جدول بالا بازتولید شده؛ و usage payload ‏response.done با splitهای input_token_details و output_token_details. نرخ‌ها از صفحه pricing، همان تاریخ: audio در gpt-realtime-2.1 با $32.00 input، $0.40 cached input و $64.00 output به ازای هر میلیون token، text با $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.
jev12 دقیقه مطالعه

مدل هوش مصنوعی Jev برای تصمیم ساخته شده، نه نثر

Jev از TypeSafe AI توجه‌ها را جلب کرده چون هوشمندی نرم‌افزار را مسئله‌ای احتمالاتی می‌بیند: شاخه درست را انتخاب کنید، میزان اطمینان را کنار آن بگذارید، و وقتی کد به یک تصمیم نیاز دارد برای نوشتن متن به یک LLM پول ندهید.

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering13 دقیقه مطالعه

مهندسی کانتکست برای عامل‌های AI بلندافق

عامل‌های طولانی‌اجرا فقط به‌خاطر کوچک بودن پنجره شکست نمی‌خورند. وقتی فایل‌ها، خروجی ابزارها و تاریخچهٔ کهنه وظیفه‌ای را که عامل قرار بود تمام کند کنار می‌زنند، شکست رخ می‌دهد.

آماده‌اید انتخاب مدل را به LIA بسپارید؟

با همه مدل‌های هوش مصنوعی در یک جا بسازید — همین امروز رایگان شروع کنید.