Перейти к содержимому
21/30Глава 21 из 30

Multimodal Pricing: за что на самом деле платят в изображениях, аудио и видео

Три модели на одних 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 %

Ни одно из этих чисел не является ценой, которую публикует поставщик. Все три пришлось вычислить по трём разным правилам, потому что фотография нигде не является расчётной единицей: сначала она преобразуется в tokens — по арифметике, записанной в трёх несовместимых местах.

Глава 16 построила счёт для текста и остановилась там, где заканчивается текст. Эта глава — остальная часть инвойса: изображения, речь, транскрибация, видео и сырые вычисления, которые вместе тарифицируются в восьми разных единицах, и метод сравнения вещей, которые продаются не в одной мере.

Показать детали

Что этой главе нужно из предыдущих.

  • Глава 7 построила tokenizer и единицу измерения. Всё здесь — попытка превратить что-то, что не является текстом, в эту единицу.
  • Глава 8 установила, что потребляет модель: не символы, а векторы в embedding space. Именно поэтому изображение вообще можно оценивать в tokens.
  • Глава 16 построила computeCost, его ценовые уровни и пять token buckets. Эта глава расширяет эту функцию, а не заменяет её.
  • Глава 11 представила LoRA как технику fine-tuning, а Глава 20 оценила её как бюджетное решение. Здесь она появляется на модели, которая не является языковой моделью.

Без тензоров, по правилу из Главы 14: это тарифы, преобразования и учёт, поэтому это TypeScript.

transformer принимает последовательность векторов. Ему всё равно, откуда они взялись. В Главе 8 в него подавались embeddings, найденные по token id; в архитектуре ничто не требует именно такого поиска.

Итак: разрежьте картинку на фиксированные квадраты, разверните каждый квадрат в список чисел и пропустите каждый список через один обученный линейный слой, чтобы получить вектор ширины модели. Патч цветных пикселей 32 × 32 — это 32×32×3=307232 \times 32 \times 3 = 3072 чисел; проекция E∈Rd×3072E \in \mathbb{R}^{d \times 3072} превращает его в один dd-мерный вектор — ровно той же формы, в которой приходит текстовый token. Вот и всё, и именно это говорит название статьи: одно изображение стоит 16 × 16 слов.1 Добавьте positional encoding, чтобы модель знала, какой квадрат где был, перемешайте результаты с текстовыми embeddings — и последовательность, которую читает модель, станет частью картинкой и частью предложением.

Три статьи превратили это в продукт. CLIP обучил image encoder и text encoder соглашаться, на четырёхстах миллионах собранных пар, и именно там идея о том, что пиксели и слова могут делить одно пространство, перестала быть гипотезой.2 Flamingo прикрутил замороженный vision encoder к замороженной языковой модели с несколькими обученными мостовыми слоями.3 LLaVA показала, что мостом может быть одна линейная проекция, а instruction-following можно обучить на сгенерированных данных, и поэтому каждая открытая vision-language model с тех пор выглядит примерно одинаково.4

Последствие для вашего счёта немедленное и не гламурное: патчи — это позиции в последовательности, значит, они input tokens, значит, вы платите за них по входному тарифу. Сколько их — вопрос арифметики, и каждый провайдер делает её по-своему.

Три правила, все опубликованы, ни одно не совпадает

Ссылка на раздел: Три правила, все опубликованы, ни одно не совпадает

Каждое правило ниже реализовано по собственной документации провайдера и сверено с разобранными примерами в той же документации.

OpenAI покрывает изображение патчами 32 × 32 и умножает их количество на коэффициент конкретной модели. Если число патчей превышает бюджет для этой модели и уровня детализации, изображение уменьшается, пока не поместится:

patches=⌈w32⌉×⌈h32⌉,shrink=322⋅budgetw⋅h\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 tokens на моделях standard-tier, 2,576 и 4,784 на high-resolution tier. Слишком большие изображения уменьшаются до максимального размера, который помещается в оба ограничения.5

Google вообще не считает пиксели. Изображение, у которого обе стороны не больше 384 пикселей, стоит фиксированные 258 tokens. Всё большее режется на тайлы по 258 tokens каждый, а сетка тайлов получается из 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;      
}

Запустите каждое правило на числах, которые печатает его собственный поставщик:

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 для всех шести размеров. Теперь эти правила можно запускать на любой вашей фотографии, и в этом суть: это единственные три функции в этой главе, которые нельзя получить со страницы цен.

Новые статьи у вас в почте

Новости AI, гайды и обновления продукта — короткое письмо, когда мы публикуем что-то полезное.

Пропустите одну и ту же фотографию 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 пикселя, число больше никогда не меняется — и это не совпадение и не потолок. Подставьте crop unit обратно в формулу тайлов для изображения, которое как минимум не уже, чем выше:

tiles=⌈w⌊h/1.5⌋⌉×⌈h⌊h/1.5⌋⌉≈⌈1.5 wh⌉×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

Размер сокращается. Google's image tokens зависят от соотношения сторон и больше ни от чего. Фотография 4:3 — это четыре тайла, будь она миниатюрой или постером. Один этот алгебраический факт полностью объясняет ноль в таблице экономии выше, и ни одна страница цен нигде его не формулирует.

Два других столбца вместо этого упираются в потолок — на разных высотах и по разным причинам: Anthropic в объявленный token ceiling, OpenAI в patch budget после pixel limit. Поэтому три кривые пересекаются при разных размерах.

Теперь сломаем это. Очевидный способ меньше тратить на vision model — попросить меньше детализации, поэтому отправьте 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

Запрос меньшей детализации стоил на 25 % больше. Это не баг, и OpenAI говорит об этом одной строкой в таблице размеров: в этом семействе моделей low использует 2048-пиксельный лимит с бюджетом 6,144 патча, а high — тот же pixel limit с бюджетом 2,500 патчей, «so it can use more tokens than high».7 Слово low называет настройку качества, а не цену: в двух из пяти документированных семейств моделей оно вообще не даёт экономии, а в одном из этих двух стоит дороже.

Сгенерировать изображение — это другая машина

Ссылка на раздел: Сгенерировать изображение — это другая машина

Всё до сих пор было о модели, которая читает изображение. Создание изображения работает на механизме, в котором вообще нет tokens, и именно поэтому оно продаётся по картинкам, а не по словам.

Создание изображения: цена за картинку — это цена за token

Ссылка на раздел: Создание изображения: цена за картинку — это цена за token

Поставщики публикуют генерацию изображений как цену за картинку. Это не так. GPT Image models выдают специализированные image tokens, число которых зависит от запрошенных размера и качества; умножьте опубликованные counts на опубликованную ставку image output для GPT Image 1 — $40 за миллион — и сравните с ценами за изображение на той же странице:

качество1024 × 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 за миллион tokens, «output images at 1K (1024x1024px) consume 1120 tokens and are equivalent to $0.067 per image».12

Так что цена за изображение — это цена за token со встроенным count. Это нормально, но кое-что скрывает. Возьмите таблицу текущего поколения и разделите обратно:

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 % меньше 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

Один и тот же поставщик продаёт обе единицы: OpenAI tts-1 оценивается за миллион символов, а gpt-4o-mini-tts — за миллион tokens, $0.60 на входе и $12.00 на выходе.13 Поэтому «самый дешёвый text-to-speech» — это вопрос без ответа, пока вы не сказали, что именно произносится.

И две единицы слепы к противоположным вещам. Цена за символ не видит длительности: выберите медленный, размеренный голос или добавьте паузы — счёт не изменится, хотя аудио станет длиннее. Цена за секунду не видит содержания: тридцать секунд стоят одинаково, будь это плотный технический абзац или кто-то, считающий до десяти. Смените голос — и ровно один из двух поставщиков пересчитает цену.

Транскрибация идёт в другую сторону и является самой простой строкой во всём инвойсе — поминутно, фиксированно:

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, и именно он делает следующий раздел дорогим.

Теперь число, которое решает, является ли голос функцией или продуктом.

Звонок: support-разговор на десять реплик, 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.

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

Теперь сравнение, которое определяет продукт: все четыре варианта нормированы к минуте:

за минутупротив текста
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—

Тридцать восемь раз. Не тридцать восемь процентов. Идентичный обмен, проведённый звуком вместо текста, почти на два порядка дороже, и ни одна часть этого разрыва не является маржой, которую кто-то решил взять, — это коэффициент преобразования. Одна секунда assistant audio — это двадцать tokens. Та же секунда несёт 2,5 слова при заявленной скорости, а измеренная транскрипция идёт по 1,26 token на слово, то есть как текст это 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, поэтому всё, что вставлено в начало разговора в середине звонка, уничтожает его, а естественное место для «звонящий теперь проверен» — именно там.

И ничто, что вы делаете в клиенте, не отменяет счёт за звук. Пользователь говорит поверх assistant, ваш код останавливает playback, динамик замолкает. Всё, что уже было сгенерировано, уже списано, потому что billing накапливается при создании response; и по правилу Главы 16 всё, что остаётся в разговоре, заново отправляется как input audio на каждом следующем turn. Глава 14 говорила это об остановке text stream. В голосе это стоит в тридцать раз дороже.

Видео, GPU-секунды и цена, которая не цена

Ссылка на раздел: Видео, GPU-секунды и цена, которая не цена

Видео одни поставщики продают посекундно, другие — по клипам, с уровнями для разрешения и иногда длительности. Эти две формы отличаются не только удобством; они пересекаются.

модель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, за клип, 1080p$0.480$0.480$0.480$0.480$0.480
mochi, за GPU-секунду$0.018$0.037$0.092$0.183$0.366

Поставщик с оплатой за клип дороже посекундного ниже 1,2 секунды и в 16,7 раза дешевле на двадцати секундах. Никакой порядок этих двух моделей не переживает изменения длины клипа, поэтому «какая video model дешевле» — это вопрос не о моделях.

Последняя строка хуже, и это честное сердце главы. mochi тарифицируется по реальным GPU seconds — измеренному prediction time задания — по $0.001400 в секунду на A100 и $0.001525 на H100, то есть по ставкам арендуемой машины и ничему больше.15 Это совершенно точный тариф, и это не цена, потому что величина, на которую он умножается, неизвестна до тех пор, пока вы уже не обязались платить. Строка выше предполагает двенадцать GPU-секунд на секунду output; увеличьте это допущение вчетверо — и она выйдет из самого дешёвого диапазона, и только при шестикратном множителе окажется в середине таблицы. Это единственный тариф на этой странице, который нельзя поставить в quote.

Итак: tokens, image tokens, символы, минуты, video seconds, целые клипы, GPU seconds, flat units. Восемь величин, и единственный способ положить их на одну ось — объявить workload и оценить его.

Это расширение computeCost из Главы 16 — тот же механизм tier, теперь с критериями, которые не являются длиной 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;
}

Две отмеченные строки — места, где он ломается. Тариф, указанный за unit, умножает 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

Ничего не произошло шесть раз, и один раз это стоило три доллара, а пять раз — ничего. Это не разница округления; это решение о том, что означает отсутствующее число, принятое отдельно для каждой unit и нигде не записанное. Здравое правило таково: поле, которое никто не измерял, остаётся отсутствующим, потому что «не измерено» и «измерено и получилось ноль» — разные вещи. Эта функция тихо не согласна.

Второй сбой — длительность. Тариф за клип выбирает свой tier через maxDurationSeconds против u.videoSeconds ?? 0, поэтому usage, который никогда не записал duration, попадает в самый короткий tier:

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

Скидка сорок процентов за незнание длины видео. У обоих багов один корень: default, выбранный ради удобства внутри функции, вся работа которой — быть точной.

Когда затраты можно вычислить, сравнению нужна вторая половина — объявленный 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, потому что реальное использование смещено к output; смесь пятьдесят на пятьдесят ранжирует модели иначе. Image workload предполагает 1,500 output tokens — между 1,056 OpenAI для medium square и 1,584 для medium portrait. Video предполагает пять секунд при 1080p, а мы только что видели, как два поставщика меняются местами на 1,2 секунды. Compute-запись предполагает sixty GPU-seconds, потому что предполагать больше нечего.

В этом и метод, и это единственный честный доступный метод: нельзя сравнивать цены в разных единицах; можно сравнивать только стоимость workload, который вы записали. Любая таблица, ранжирующая multimodal models без напечатанного workload, ранжирует собственные допущения.

Теперь вы можете оценить всё, что модель может произвести, в какой бы unit это ни продавалось, и вслух сказать, какой workload предполагало ваше сравнение. Это закрывает инвойс, открытый Главой 16, и закрывает Часть III: всё от Главы 14 до этого места было об одном вызове — как его сделать, что в него положить, как его sample, что он возвращает, сколько стоит.

Глава 22 меняет единицу анализа, и это изменение дорогое. agent — это не один вызов; это loop, который сам решает, сколько вызовов сделать, а арифметика последних двух глав превращает это из архитектурной диаграммы в бюджет. Она начинается с того, что задаёт один и тот же вопрос одной и той же модели дважды, добавляя во второй раз один tool в каталог, и измеряет, что сделал этот один tool: один вызов стал двумя, тридцать девять input tokens стали 420.

Делает ли это его agent, зависит от того, какое из двух опубликованных определений вы откроете, и они не согласны. Одно из них не согласно само с собой.


Каждая цена, формула и ставка преобразования в этой главе были взяты со страницы самого поставщика 7 сентября 2026 года и цитируются с этой датой, потому что все они изменятся. Token counts, costs и comparisons были вычислены на этих данных кодом, напечатанным выше, на одной машине, без платного API-вызова — что также является честной причиной, почему в этой главе нет ни одного утверждения о latency.

Image-token functions, cost tables, voice-call breakdown и empty-usage results были произведены TypeScript, напечатанным в этой главе, запущенным на Node 22. Диалог, использованный для voice comparison, содержит 149 слов и был tokenized с tiktoken под encoding o200k_base в 188 tokens; его duration следует из объявленной скорости 150 слов в минуту, которая является параметром сравнения, а не измерением. Каждая provider figure сопровождается footnote, называющей страницу, с которой она взята.

  1. Dosovitskiy, A. et al. An Image Is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv:2010.11929 (2020). Patches, linear 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). Contrastive training image encoder и text encoder на 400 миллионах пар и shared space, которое предполагает всё downstream. ↩

  3. Alayrac, J.-B. et al. Flamingo: a Visual Language Model for Few-Shot Learning. arXiv:2204.14198 (2022). Frozen vision encoder, frozen language model, обученные bridging layers — architecture, которая превратила image understanding в chat capability. ↩

  4. Liu, H., Li, C., Wu, Q. and Lee, Y. J. Visual Instruction Tuning. arXiv:2304.08485 (2023). Одна linear projection как bridge и generated instruction data как training set; причина, по которой open vision-language models сошлись к одной форме. ↩

  5. 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 пикселей, 1568 visual tokens; high-resolution, на Claude 4.7 и позже: 2576 пикселей и 4784 tokens), downsizing rule и таблица из шести строк с размерами и token counts, воспроизведённая выше. Model rates из 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, 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 — floor(min(width, height) / 1.5), dimensions делятся на неё и перемножаются — и 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, та же дата). ↩

  7. OpenAI, Images and vision, developers.openai.com/api/docs/guides/images-vision, accessed 2026-09-07. Источник patch-based rule (патчи 32 × 32, patch_count = ceil(width/32)×ceil(height/32), формула shrink_factor и её integer adjustment, rejection limit в 30,000 патчей); таблица размеров модели, включая то, что low на gpt-5.4 использует 2048-пиксельный лимит и 6,144-patch budget «so it can use more tokens than high», против 2,500-patch budget у high; таблица multiplier (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 для older models (base плюс 512-пиксельные тайлы, 85 + 170 на gpt-4o); и список limitations, процитированный в vision box. ↩ ↩2

  8. 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. ↩

  9. Rombach, R., Blattmann, A., Lorenz, D., Esser, P. and Ommer, B. High-Resolution Image Synthesis with Latent Diffusion Models. arXiv:2112.10752 (2022). Запуск diffusion process в compressed latent space, что сделало fixed step count достаточно доступным, чтобы продавать per image. ↩

  10. Prince, S. J. D. Understanding Deep Learning (MIT Press, 2023), chapter 18. Объявленная delegation для всего, что эта глава пропустила о 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 на языковой модели и использованный здесь на модели изображений без изменения математики. Radford, A. et al., Robust Speech Recognition via Large-Scale Weak Supervision (Whisper), arXiv:2212.04356 (2022), — transcription model, чья per-minute price появляется выше. ↩

  11. 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; её ставки взяты со страницы pricing выше. Страница GPT Image 1 публикует text input по $5.00, image input по $10.00 и image output по $40.00 за миллион tokens рядом с таблицей per-image, использованной в выводе выше. Также: output-token table для models prior to gpt-image-2 (272 / 408 / 400 low, 1056 / 1584 / 1568 medium, 4160 / 6240 / 6208 high, for square, portrait and 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»; примечание, что каждое streamed partial image стоит дополнительные 100 image output tokens; и ставки gpt-image-2: $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 за секунду на 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, 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 и их ценами за изображение $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 на 720p и 1080p и $0.60 на 4K standard; $0.10, $0.12 и $0.30 fast. Gemini Omni Flash тарифицирует video output «at a rate of 5,792 tokens per second of 720p video», что та же footnote переводит примерно в $0.10 за секунду — самое ясное опубликованное утверждение о том, что per-second media price является token price. ↩ ↩2

  13. Страницы моделей OpenAI для 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 — тот же поставщик, та же operation, две units. ↩

  14. 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 которого воспроизводит таблица выше; и usage payload response.done с его split input_token_details и output_token_details. Rates from the pricing page, та же дата: gpt-realtime-2.1 audio по $32.00 input, $0.40 cached input и $64.00 output за миллион tokens, text по $4.00, $0.40 и $24.00, image input по $5.00. ↩ ↩2

  15. Replicate, Pricing, replicate.com/pricing, accessed 2026-09-07. Nvidia A100 (80GB) по $0.001400 в секунду и $5.04 в час; Nvidia H100 по $0.001525 в секунду и $5.49 в час. ↩

Запустите свой ИИ в работу уже сегодня

Все модели и инструменты в одном месте. Начните бесплатно, карта не нужна.