Мультимодальне ціноутворення: за що насправді рахують зображення, аудіо та відео
Три моделі для тих самих 500 фото дають різницю в 5,5 раза, а найдешевша змінюється після зміни розміру.
На цій сторінці
Ось одне завдання, оцінене трьома способами: описати п’ятсот фотографій товарів, по одному короткому підпису для кожної. Ті самі фотографії, та сама інструкція, та сама довжина відповіді. Змінюється лише модель, яка їх читає.
| фотографія | gpt-5.6-luna | gemini-3.1-flash-lite | claude-haiku-4.5 |
|---|---|---|---|
| 800 × 600 | $0.0848 | $0.1638 | $0.4380 |
| 1024 × 768 | $0.1200 | $0.1638 | $0.6370 |
| 1280 × 960 | $0.1718 | $0.1638 | $0.9010 |
| 1600 × 1200 | $0.2558 | $0.1638 | $0.9010 |
| 4000 × 3000 | $0.3220 | $0.1638 | $0.9010 |
У цій таблиці варто зупинитися на трьох речах.
Найдешевша модель змінюється між третім і четвертим рядком для того самого завдання, бо хтось змінив розмір фотографій. Попросіть абзац замість підпису — і точка перетину знову зсунеться: при 1280 × 960 перемагає Gemini для підпису на сорок tokens і OpenAI для абзацу на чотириста tokens.
Стовпець Gemini не рухається взагалі в жодному рядку: фотографія 4000 × 3000 коштує для нього рівно стільки ж, скільки 640 × 480. Фотографія 4000 × 3000 коштує рівно стільки ж, скільки фотографія 640 × 480. Це не ліміт. Це наслідок того, як вона рахує, і це означає, що найпоширеніша оптимізація витрат у цьому бізнесі — зменшити зображення перед завантаженням — працює так:
| image tokens, 4000 × 3000 → 800 × 600 | вартість запуску | економія | |
|---|---|---|---|
gpt-5.6-luna | 2,942 → 570 | $0.3220 → $0.0848 | 73.7 % |
claude-haiku-4.5 | 1,564 → 638 | $0.9010 → $0.4380 | 51.4 % |
gemini-3.1-flash-lite | 1,032 → 1,032 | $0.1638 → $0.1638 | 0.0 % |
Жодне з цих чисел не є ціною, яку публікує постачальник. Усі три довелося обчислити з трьох різних правил, бо фотографія ніде не є оплачуваною одиницею: спершу її перетворюють на tokens за арифметикою, записаною у трьох несумісних місцях.
Розділ 16 склав рахунок для тексту й зупинився там, де текст закінчується. Цей розділ — решта інвойсу: зображення, мовлення, транскрипція, відео й сирий compute, які разом тарифікуються у восьми різних одиницях, і метод порівняння речей, що продаються не в одній мірі.
Показати подробиці
Що цьому розділу потрібно з попередніх.
- Розділ 7 побудував tokenizer і одиницю. Усе тут — спроба перетворити щось нетекстове на цю одиницю.
- Розділ 8 встановив, що споживає модель: не символи, а вектори в embedding-просторі. Саме тому зображення взагалі можна оцінювати в tokens.
- Розділ 16 побудував
computeCost, його цінові рівні й п’ять token-кошиків. Цей розділ розширює цю функцію, а не замінює її. - Розділ 11 ввів LoRA як техніку fine-tuning, а Розділ 20 оцінив її як бюджетне рішення. Тут вона з’являється на моделі, яка не є мовною.
Без тензорів, за правилом із Розділу 14: це тарифи, конверсії й облік, тож це TypeScript.
Чому фотографія має token-ціну
Посилання на розділ: Чому фотографія має token-цінуtransformer приймає послідовність векторів. Йому байдуже, звідки вони взялися. У Розділі 8 ми подавали йому embeddings, знайдені за token id; в архітектурі немає вимоги, щоб це був саме lookup.
Отже: розріжте картинку на фіксовані квадрати, розгорніть кожен квадрат у список чисел і пропустіть кожен список через один навчений лінійний шар, щоб отримати вектор ширини моделі. Патч кольорових пікселів 32 × 32 — це чисел; проєкція перетворює його на один -вимірний вектор, точно такої форми, у якій приходить текстовий token. Ось і все, і це саме та стаття, назва якої каже: зображення варте 16 × 16 слів.1 Додайте positional encoding, щоб модель знала, який квадрат де був, перемішайте результати з текстовими embeddings — і послідовність, яку читає модель, стає частково картинкою, частково реченням.
Три статті зробили це продуктом. CLIP навчила image encoder і text encoder узгоджуватися на чотирьохстах мільйонах зібраних пар, і саме там ідея, що пікселі та слова можуть мати спільний простір, перестала бути гіпотезою.2 Flamingo прикрутив заморожений vision encoder до замороженої мовної моделі кількома навченими містками.3 LLaVA показала, що містком може бути одна лінійна проєкція, а instruction-following можна навчити на згенерованих даних, тому всі відкриті vision-language моделі відтоді виглядають приблизно однаково.4
Наслідок для вашого інвойсу негайний і непривабливий: патчі — це позиції в послідовності, отже вони є input tokens, отже ви платите за них за вхідною ставкою. Скільки саме — арифметика, і кожен постачальник робить її по-своєму.
Три правила, усі опубліковані, жодне не однакове
Посилання на розділ: Три правила, усі опубліковані, жодне не однаковеКожне правило нижче реалізоване з власної документації постачальника й перевірене на прикладах із тієї самої документації.
OpenAI покриває зображення патчами 32 × 32 і множить кількість на коефіцієнт конкретної моделі. Якщо кількість патчів перевищує бюджет для цієї моделі й рівня деталізації, зображення зменшують, доки воно не вміститься:
Anthropic покриває його патчами 28 × 28, по одному visual token кожен, і обмежує як довгий бік, так і кількість tokens — 1,568 пікселів і 1,568 tokens на моделях standard-tier, 2,576 і 4,784 на high-resolution tier. Надто великі зображення масштабуються до найбільшого розміру, який відповідає обом обмеженням.5
Google узагалі не рахує пікселі. Зображення, у якого обидві сторони не перевищують 384 пікселі, коштує фіксовані 258 tokens. Усе більше ріжеться на tiles по 258 tokens кожен, а сітка tiles походить із crop unit .6
export function openaiImageTokens(
w: number, h: number,
{ maxDim, patchBudget, multiplier }: { maxDim: number; patchBudget: number; multiplier: number },
) {
const fit = Math.min(1, maxDim / Math.max(w, h)); // never enlarges
w = Math.floor(w * fit); h = Math.floor(h * fit);
let patches = Math.ceil(w / 32) * Math.ceil(h / 32);
if (patches > patchBudget) {
const s = Math.sqrt((32 * 32 * patchBudget) / (w * h));
const adj = s * Math.min(
Math.floor((w * s) / 32) / ((w * s) / 32),
Math.floor((h * s) / 32) / ((h * s) / 32));
patches = Math.ceil(Math.floor(w * adj) / 32) * Math.ceil(Math.floor(h * adj) / 32);
}
return Math.ceil(patches * multiplier);
}
export function anthropicVisualTokens(
w: number, h: number,
{ maxLongEdge, maxTokens }: { maxLongEdge: number; maxTokens: number },
) {
const tok = (a: number, b: number) => Math.ceil(a / 28) * Math.ceil(b / 28);
const long = Math.max(w, h), short = Math.min(w, h);
for (let L = Math.min(long, maxLongEdge); L >= 1; L--) {
const t = tok(L, Math.round((short * L) / long));
if (t <= maxTokens) return t;
}
return 0;
}
export function geminiImageTokens(w: number, h: number) {
if (w <= 384 && h <= 384) return 258;
const crop = Math.floor(Math.min(w, h) / 1.5);
return Math.ceil(w / crop) * Math.ceil(h / crop) * 258;
}Запустіть кожне правило на числах, які друкує його власний постачальник:
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, high | Anthropic, standard | Anthropic, high-res | Gemini |
|---|---|---|---|---|
| 384 × 288 | 130 | 154 | 154 | 258 |
| 640 × 480 | 360 | 414 | 414 | 1,032 |
| 800 × 600 | 570 | 638 | 638 | 1,032 |
| 1600 × 1200 | 2,280 | 1,564 | 2,494 | 1,032 |
| 3200 × 2400 | 2,942 | 1,564 | 4,740 | 1,032 |
| 4000 × 3000 | 2,942 | 1,564 | 4,740 | 1,032 |
Прочитайте останній стовпець зверху вниз. Щойно картинка більша за 384 пікселі, число більше ніколи не змінюється, і це не збіг і не cap. Підставте crop unit назад у формулу tile для зображення, яке принаймні таке широке, як високе:
Розмір скорочується. Google image tokens залежать від aspect ratio і більше ні від чого. Фотографія 4:3 — це чотири tiles, чи вона мініатюра, чи постер. Один цей алгебраїчний факт повністю пояснює нуль у таблиці економії вище, і жодна сторінка цін ніде цього не формулює.
Два інші стовпці натомість обмежуються, на різних висотах і з різних причин — Anthropic на оголошеній стелі tokens, OpenAI на patch budget після pixel limit — тому три криві перетинаються на різних розмірах.
Тепер зламайте це. Очевидний спосіб витратити менше на vision model — попросити менше деталей, тож надішліть detail: "low":
1600x1200 low = 2280 high = 2280 ratio 1.00
3200x2400 low = 3687 high = 2942 ratio 1.25Попросити менше деталей коштувало на 25 % більше. Це не баг, і OpenAI каже про це одним рядком у таблиці розмірів: у цій сім’ї моделей low використовує 2048-піксельний ліміт із 6,144-patch budget, тоді як high використовує той самий pixel limit із 2,500-patch budget, «so it can use more tokens than high».7 Слово low означає налаштування fidelity, а не ціну: у двох із п’яти задокументованих сімейств моделей воно взагалі не дає економії, а в одному з цих двох коштує дорожче.
Згенерувати зображення — це інша машина
Посилання на розділ: Згенерувати зображення — це інша машинаУсе досі стосувалося моделі, яка читає зображення. Створення зображення працює на механізмі, у якому взагалі немає tokens, і саме тому воно продається за картинку, а не за слово.
Створення зображення: ціна за картинку є ціною за token
Посилання на розділ: Створення зображення: ціна за картинку є ціною за tokenПостачальники публікують генерацію зображень як ціну за картинку. Це не так. GPT Image models випускають спеціалізовані image tokens, кількість яких залежить від потрібного розміру та якості; помножте опубліковані кількості на опубліковану ставку GPT Image 1 для image output — $40 за мільйон — і порівняйте з per-image цінами на тій самій сторінці:
| якість | 1024 × 1024 | 1024 × 1536 | 1536 × 1024 |
|---|---|---|---|
| low | 272 tok → $0.0109 ($0.011) | 408 tok → $0.0163 ($0.016) | 400 tok → $0.0160 ($0.016) |
| medium | 1,056 tok → $0.0422 ($0.042) | 1,584 tok → $0.0634 ($0.063) | 1,568 tok → $0.0627 ($0.063) |
| high | 4,160 tok → $0.1664 ($0.167) | 6,240 tok → $0.2496 ($0.25) | 6,208 tok → $0.2483 ($0.25) |
Дев’ять виведених чисел проти дев’яти опублікованих, кожна пара збігається в межах $0.002.11 Google ще явніший і сам робить конверсію на сторінці цін: image output по $60 за мільйон tokens, «output images at 1K (1024x1024px) consume 1120 tokens and are equivalent to $0.067 per image».12
Тож per-image price — це per-token price із уже вкладеною кількістю. Це нормально, але дещо приховує. Візьміть таблицю поточного покоління й поділіть у зворотному напрямку:
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Більше зображення є дешевшим за кожного рівня якості. Полотно 1024 × 1536 має на 50 % більше пікселів, ніж 1024 × 1024, і коштує на 23 % менше tokens на medium. OpenAI позначає це реченням, яке ви пропустили б: «a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting» — а в попередньому поколінні моделей усе було навпаки, портрет коштував на 50 % більше, ніж квадрат.11 Кожний default 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 — за мільйон tokens, $0.60 in і $12.00 out.13 Тож «найдешевший text-to-speech» — це не питання з відповіддю, доки ви не скажете, що саме озвучуєте.
І ці дві одиниці сліпі до протилежних речей. Ціна за символ не бачить тривалість: оберіть повільний, виразний голос або додайте паузи — рахунок не зміниться, хоча аудіо стане довшим. Ціна за секунду не бачить зміст: тридцять секунд коштують однаково, чи це щільний технічний абзац, чи хтось рахує до десяти. Змініть голос — і рівно один із двох постачальників перераховує ціну.
Транскрипція працює навпаки й є найпростішим рядком у всьому інвойсі — за хвилину аудіо, фіксовано:
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, і саме вона робить наступний розділ дорогим.
Одна хвилина голосу, постатейно
Посилання на розділ: Одна хвилина голосу, постатейноТепер число, яке вирішує, чи голос — це функція, чи продукт.
Дзвінок: десятираундова розмова підтримки, 149 слів, що за оголошених 150 слів на хвилину становить 59.6 секунди мовлення — 21.2 сказано абонентом, 38.4 сказано у відповідь. Конверсії tokens — власні конверсії постачальників. OpenAI: «audio tokens in user messages are 1 token per 100 ms of audio, while audio tokens in assistant messages are 1 token per 50 ms».14 Google: 25 tokens за секунду в обох напрямках, що підтверджує її сторінка цін, публікуючи $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 Тільки тепер історія вимірюється в audio tokens.
| turn | user | assistant | fresh audio in | cached audio in | audio out | cost |
|---|---|---|---|---|---|---|
| 1 | 4.4 s | 9.2 s | 44 | 0 | 184 | $0.013224 |
| 2 | 5.6 s | 9.6 s | 56 | 228 | 192 | $0.014211 |
| 3 | 5.2 s | 9.2 s | 52 | 476 | 184 | $0.013670 |
| 4 | 4.0 s | 4.8 s | 40 | 712 | 96 | $0.007749 |
| 5 | 2.0 s | 5.6 s | 20 | 848 | 112 | $0.008187 |
Тепер порівняння, яке вирішує продукт, усі чотири нормалізовані до хвилини:
| за хвилину | проти тексту | |
|---|---|---|
gpt-realtime-2.1, без caching | $0.131259 | 37.9× |
gpt-realtime-2.1, history cached | $0.057425 | 16.6× |
gemini-3.1-flash-live, без caching | $0.023965 | 6.9× |
ті самі слова набрані, gpt-5.6-terra | $0.003461 | — |
Тридцять вісім разів. Не тридцять вісім відсотків. Ідентичний обмін, проведений звуком замість тексту, майже на два порядки дорожчий, і жодна частина цього розриву не є маржею, яку хтось вирішив нарахувати, — це conversion rate. Одна секунда assistant audio — це двадцять tokens. Та сама секунда несе 2.5 слова за оголошеною швидкістю, а виміряний transcript має 1.26 tokens на слово, тож як текст це 3.15 tokens. Звук — у 6.3 раза громіздкіший пакет для того самого змісту, і кожен його token тарифікується у 5.3 раза дорожче за text output rate і в 16 разів дорожче за text input rate. Помножте bulk ratio на price ratio — і порядок величини вже є ще до будь-якого обліку.
Два операційні наслідки прямо випливають із таблиці.
Audio caching — не оптимізація, а бізнес-модель. Cached audio input коштує $0.40 за мільйон проти $32.00 fresh — знижка 98.75 %, яка вдвічі здешевлює дзвінок. Правило з Розділу 16 незмінне: cache збігається з prefix, тож будь-що, вставлене на початок розмови посеред дзвінка, руйнує його, а природне місце для «caller is now verified» — саме там.
І ніщо, що ви робите в клієнті, не скасовує оплату звуку. Користувач перебиває assistant, ваш код зупиняє відтворення, динамік стихає. Усе, що вже було згенеровано, уже було нараховано, бо billing accrues when the response is created; і за правилом Розділу 16 усе, що лишається в розмові, повторно надсилається як input audio на кожному наступному turn. Розділ 14 казав це про aborting text stream. У голосі це коштує у тридцять разів більше.
Відео, GPU-seconds і ціна, яка не є ціною
Посилання на розділ: Відео, GPU-seconds і ціна, яка не є ціноюВідео одні постачальники продають за секунду, інші — за clip, з рівнями для роздільності й іноді тривалості. Ці дві форми відрізняються не лише зручністю; вони перетинаються.
| модель | 1 s | 2 s | 5 s | 10 s | 20 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 |
Постачальник із per-clip дорожчий за per-second нижче 1.2 секунди й у 16.7 раза дешевший на двадцяти. Жодне ранжування цих двох моделей не переживає зміни довжини clip, тож «яка video model найдешевша» — не питання про моделі.
Останній рядок гірший, і це чесне серце розділу. mochi тарифікується за реальні GPU seconds — виміряний prediction time завдання — по $0.001400 за секунду на A100 і $0.001525 на H100, тобто це ставки орендованої машини й нічого більше.15 Це абсолютно точний тариф, але це не ціна, бо величина, на яку він множиться, невідома, доки ви вже не погодилися платити. Рядок вище припускає дванадцять GPU-seconds на секунду output; збільште це припущення вчетверо — і він виходить із найдешевшої смуги, а лише при шестикратному множнику опиняється в середині таблиці. Це єдиний тариф на цій сторінці, який не можна поставити в quote.
Нормалізатор
Посилання на розділ: НормалізаторОтже: tokens, image tokens, characters, minutes, video seconds, whole clips, GPU seconds, flat units. Вісім величин, і єдиний спосіб поставити їх на одну вісь — оголосити workload і порахувати його.
Це розширення computeCost з Розділу 16 — той самий tier-механізм, тепер із критеріями, які не є довжиною prompt:
export interface MediaCriteria {
resolution?: string[]; quality?: string[];
hasAudio?: boolean; maxDurationSeconds?: number;
}
export interface MediaTier { when?: MediaCriteria; price: number }
export type MediaRate = number | MediaTier[];
const matches = (when: MediaCriteria, u: Usage) => {
const inList = (l?: string[], v?: string) => !l || (v !== undefined && l.includes(v));
if (!inList(when.resolution, u.resolution)) return false;
if (!inList(when.quality, u.quality)) return false;
if (when.hasAudio !== undefined && when.hasAudio !== (u.hasAudio ?? false)) return false;
if (when.maxDurationSeconds !== undefined
&& (u.videoSeconds ?? 0) > when.maxDurationSeconds) return false;
return true;
};
const mediaPrice = (rate: MediaRate | undefined, u: Usage): number => {
if (rate === undefined) return 0;
if (typeof rate === "number") return rate;
for (const t of rate.filter((t) => t.when)) if (matches(t.when!, u)) return t.price;
return rate.find((t) => !t.when)?.price ?? 0; // the tier with no criteria is the default
};
export function computeCost(p: Pricing, u: Usage): number {
let c = textCost(p, u); // Chapter 16, unchanged
if (p.imageInputToken || p.imageOutputToken) {
c += (u.imageInputTokens ?? 0) * (p.imageInputToken ?? 0)
+ (u.imageOutputTokens ?? 0) * (p.imageOutputToken ?? 0);
} else if (p.imageUnit !== undefined) c += (u.images ?? 1) * mediaPrice(p.imageUnit, u);
if (p.videoSecond !== undefined) c += (u.videoSeconds ?? 0) * mediaPrice(p.videoSecond, u);
if (p.videoUnit !== undefined) c += (u.videoCount ?? 1) * mediaPrice(p.videoUnit, u);
c += (u.audioInputTokens ?? 0) * (p.audioInputToken ?? 0)
+ (u.cachedAudioInputTokens ?? 0) * (p.cachedAudioInputToken ?? p.audioInputToken ?? 0)
+ (u.audioOutputTokens ?? 0) * (p.audioOutputToken ?? 0)
+ (u.computeSeconds ?? 0) * (p.computeSecond ?? 0)
+ (u.chars ?? 0) * (p.perChar ?? 0)
+ (u.minutes ?? 0) * (p.perMinute ?? 0);
return c;
}Два позначені рядки — місце, де все ламається. Тариф, заданий за unit, множить u.images ?? 1; тариф, заданий за token, множить щось, що за замовчуванням дорівнює нулю. Подайте обом порожнє usage — форму, яку отримуєте, коли measurement failed, — і подивіться:
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Нічого не сталося, шість разів, і один раз це коштувало три долари, а п’ять разів нічого. Це не різниця округлення; це рішення про те, що означає відсутнє число, прийняте окремо для кожної одиниці й ніде не записане. Слушне правило таке: поле, яке ніхто не вимірював, лишається absent, бо «not measured» і «measured and came out zero» — різні речі. Ця функція тихо не погоджується.
Другий збій — duration. Clip-priced tariff обирає свій tier через maxDurationSeconds проти u.videoSeconds ?? 0, тож usage, який не записав duration, збігається з найкоротшим tier:
duration recorded -> $0.45
duration missing -> $0.27Сорок відсотків знижки за те, що ви не знаєте, якої довжини було відео. Обидва баги мають той самий корінь: default, обраний для зручності всередині функції, вся робота якої — бути точною.
Як зробити число порівнюваним
Посилання на розділ: Як зробити число порівнюванимКоли costs можна обчислити, порівнянню потрібна друга половина — оголошений representative workload, по одному на engine, сформульований публічно, щоб читач міг із ним не погодитися:
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 },
};Кожен із цих рядків — аргумент. Text змішує чверть input і три чверті output, бо реальне використання схиляється до output; fifty-fifty blend ранжує моделі інакше. Image workload припускає 1,500 output tokens, між 1,056 OpenAI для medium square і 1,584 для medium portrait. Video припускає п’ять секунд у 1080p, і ми щойно бачили, як два постачальники міняються місцями на 1.2 секунди. Compute entry припускає шістдесят GPU-seconds, бо припустити більше нічого.
Ось метод, і це єдиний чесний метод: ви не можете порівнювати ціни в різних одиницях; ви можете порівнювати лише вартість workload, який ви записали. Будь-яка таблиця, що ранжує multimodal models без надрукованого workload, ранжує власні припущення.
Куди далі
Посилання на розділ: Куди даліТепер ви можете оцінити все, що модель може створити, у будь-якій одиниці, у якій це продається, і вголос сказати, який workload припускає ваше порівняння. Це закриває інвойс, який відкрив Розділ 16, і закриває Частину III: усе від Розділу 14 до цього місця було про один call — як його зробити, що в нього покласти, як його sample, що він повертає, скільки коштує.
Розділ 22 змінює одиницю аналізу, і ця зміна дорога. agent — це не один call; це loop, який сам вирішує, скільки calls зробити, а арифметика останніх двох розділів перетворює це з architecture diagram на бюджет. Він починається з того, що ставить тій самій моделі те саме питання двічі, вдруге додаючи до каталогу один tool, і вимірює, що зробив цей один tool: один call став двома, тридцять дев’ять input tokens стали 420.
Чи робить це його agent, залежить від того, яке з двох опублікованих визначень ви відкриєте, і вони не погоджуються. Одне з них не погоджується саме із собою.
Джерела й метод
Посилання на розділ: Джерела й методКожну ціну, формулу й conversion rate у цьому розділі було прочитано зі сторінки самого постачальника 7 вересня 2026 року і процитовано з цією датою, бо всі вони зміняться. Token counts, costs і comparisons були обчислені на цих даних кодом, надрукованим вище, на одній машині, без жодного платного API call — і це також чесна причина, чому в цьому розділі немає жодної latency claim.
Image-token functions, cost tables, voice-call breakdown і empty-usage results були створені TypeScript, надрукованим у цьому розділі, запущеним на Node 22. Dialogue для voice comparison має 149 слів і був tokenized with tiktoken under the o200k_base encoding at 188 tokens; його duration випливає з оголошеної швидкості 150 слів за хвилину, яка є parameter of the comparison, а не measurement. Кожна provider figure має footnote, що називає сторінку, з якої її взято.
Примітки
Посилання на розділ: Примітки-
Dosovitskiy, A. et al. An Image Is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv:2010.11929 (2020). Patches, linear projection into the embedding dimension і position embeddings, які роблять grid читабельною для sequence model. ↩
-
Radford, A. et al. Learning Transferable Visual Models From Natural Language Supervision. arXiv:2103.00020 (2021). Contrastive training image encoder і text encoder на 400 мільйонах пар і shared space, який припускає все downstream. ↩
-
Alayrac, J.-B. et al. Flamingo: a Visual Language Model for Few-Shot Learning. arXiv:2204.14198 (2022). Frozen vision encoder, frozen language model, trained bridging layers — architecture, яка перетворила image understanding на chat capability. ↩
-
Liu, H., Li, C., Wu, Q. and Lee, Y. J. Visual Instruction Tuning. arXiv:2304.08485 (2023). Single linear projection як bridge і generated instruction data як training set; причина, чому open vision-language models зійшлися до однієї форми. ↩
-
Anthropic, Vision,
platform.claude.com/docs/en/build-with-claude/vision, accessed 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 tiers (standard: 1568-pixel long edge, 1568 visual tokens; high-resolution, on Claude 4.7 and later: 2576 pixels and 4784 tokens), downsizing rule і шестирядкова таблиця sizes і token counts, відтворена вище. Model rates з Anthropic, Pricing,platform.claude.com/docs/en/about-claude/pricing, та сама дата: Claude Haiku 4.5 по $1 і $5 за мільйон input і output tokens. ↩ -
Google, Image understanding,
ai.google.dev/gemini-api/docs/image-understanding, accessed 2026-09-07. «258 tokens if both dimensions <= 384 pixels. Larger images are tiled into 768x768 pixel tiles, each costing 258 tokens», із crop-unit formula —floor(min(width, height) / 1.5), dimensions divided by it and multiplied together — і worked example 960 × 540, що дає 3 × 2 = 6 tiles. Google називає це «a rough formula»; scale-invariance, виведена вище, є властивістю формули як опублікованої. Audio input у тому самому сімействі — 32 tokens за секунду audio (ai.google.dev/gemini-api/docs/audio, та сама дата). ↩ -
OpenAI, Images and vision,
developers.openai.com/api/docs/guides/images-vision, accessed 2026-09-07. Джерело patch-based rule (32 × 32 patches,patch_count = ceil(width/32)×ceil(height/32), формулаshrink_factorта її integer adjustment, 30,000-patch rejection limit); model sizing table, включно з тим, щоlowнаgpt-5.4використовує 2048-pixel limit і 6,144-patch budget «so it can use more tokens thanhigh», проти 2,500-patch budget уhigh; multiplier table (1.2 для сімейств GPT-5.x, 1.62 дляgpt-4.1-mini, 2.46 дляgpt-4.1-nano); два worked examples, відтворені вище (1024 × 1024 → 1229 tokens, 2048 × 2048 → 3000 tokens); tile-based rules для старіших моделей (base plus 512-pixel tiles, 85 + 170 наgpt-4o); і список limitations, процитований у vision-блоці. ↩ ↩2 -
Ho, J., Jain, A. and Abbeel, P. Denoising Diffusion Probabilistic Models. arXiv:2006.11239 (2020). Forward noising schedule, reparameterisation, що перетворює objective на predicting the added noise, і sampling loop. ↩
-
Rombach, R., Blattmann, A., Lorenz, D., Esser, P. and Ommer, B. High-Resolution Image Synthesis with Latent Diffusion Models. arXiv:2112.10752 (2022). Запуск diffusion process у compressed latent space, що зробило fixed step count достатньо дешевим для продажу per image. ↩
-
Prince, S. J. D. Understanding Deep Learning (MIT Press, 2023), chapter 18. Оголошена делегація для всього, що цей розділ пропустив про diffusion — variational bound, noise schedules, classifier-free guidance і sampler families. Hu, E. et al., LoRA: Low-Rank Adaptation of Large Language Models, arXiv:2106.09685 (2021), — сам adapter, введений у Розділі 11 на language model і використаний тут на image model без зміни математики. Radford, A. et al., Robust Speech Recognition via Large-Scale Weak Supervision (Whisper), arXiv:2212.04356 (2022), — transcription model, per-minute price якої наведено вище. ↩
-
OpenAI, Image generation,
developers.openai.com/api/docs/guides/image-generation, Pricing,developers.openai.com/api/docs/pricing, і сторінка моделі дляgpt-image-1, усі accessed 2026-09-07. Сторінка моделі дляgpt-image-2не має pricing section; її rates узято зі сторінки pricing вище. Сторінка GPT Image 1 публікує text input по $5.00, image input по $10.00 і image output по $40.00 за мільйон tokens поруч із per-image table, використаною у виведенні вище. Також: output-token table для models prior to gpt-image-2 (272 / 408 / 400 low, 1056 / 1584 / 1568 medium, 4160 / 6240 / 6208 high, для square, portrait і landscape); per-image price tables для GPT Image 2, 1.5, 1 і 1 Mini, використані вище; речення «a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting»; note, що кожне streamed partial image коштує extra 100 image output tokens; і gpt-image-2 rates $8.00 image input, $2.00 cached image input, $30.00 image output і $5.00 text input за мільйон tokens. Text model rates для порівнянь: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 за секунду at 720p іsora-2-proпо $0.30, $0.50 і $0.70 at 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 -
Google, Gemini Developer API pricing,
ai.google.dev/gemini-api/docs/pricing, accessed 2026-09-07. Gemini 3.1 Flash-Lite по $0.25 за мільйон input tokens (text, image і video) і $1.50 output. Gemini 3.1 Flash Image: image output по $60 за мільйон tokens, з опублікованими еквівалентами 747, 1120, 1680 і 2520 tokens для 0.5K, 1K, 2K і 4K images та per-image prices $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 per second with audio: $0.40 at 720p and 1080p and $0.60 at 4K standard; $0.10, $0.12 and $0.30 fast. Gemini Omni Flash bills video output «at a rate of 5,792 tokens per second of 720p video», що та сама примітка конвертує приблизно в $0.10 за секунду — найчіткіше опубліковане твердження, що per-second media price є token price. ↩ ↩2 -
OpenAI model pages для
tts-1,tts-1-hdіgpt-4o-mini-tts,developers.openai.com/api/docs/models, accessed 2026-09-07.tts-1по $15.00 іtts-1-hdпо $30.00 за мільйон characters;gpt-4o-mini-ttsпо $0.60 за мільйон text input tokens і $12.00 за мільйон audio output tokens — той самий постачальник, та сама операція, дві одиниці. ↩ -
OpenAI, Managing costs (Realtime API),
developers.openai.com/api/docs/guides/realtime-costs, accessed 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 accrue when a Response is created; worked two-turn example, accumulation якого відтворює таблиця вище; іresponse.doneusage payload із його splitsinput_token_detailsіoutput_token_details. Rates зі сторінки pricing, та сама дата:gpt-realtime-2.1audio по $32.00 input, $0.40 cached input і $64.00 output за мільйон tokens, text по $4.00, $0.40 і $24.00, image input по $5.00. ↩ ↩2 -
Replicate, Pricing,
replicate.com/pricing, accessed 2026-09-07. Nvidia A100 (80GB) по $0.001400 за секунду і $5.04 за годину; Nvidia H100 по $0.001525 за секунду і $5.49 за годину. ↩