Перейти к содержимому
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 чисел; проекция ERd×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=322budgetwh\text{patches} = \left\lceil \frac{w}{32} \right\rceil \times \left\lceil \frac{h}{32} \right\rceil, \qquad \text{shrink} = \sqrt{\frac{32^2 \cdot \text{budget}}{w \cdot h}}

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

Пропустите одну и ту же фотографию 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=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

Размер сокращается. 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 в час.

Готовы доверить выбор модели LIA?

Создавайте со всеми ИИ-моделями в одном месте — начните бесплатно уже сегодня.