Saltar para o conteúdo
21/30Capítulo 21 de 30

Preços multimodais: o que imagens, áudio e vídeo faturam realmente

Três modelos recebem as mesmas 500 fotografias e divergem 5,5 vezes; o mais barato muda assim que alguém as redimensiona.

Nesta página

Aqui está uma tarefa, com três preços: descrever quinhentas fotografias de produto, uma legenda curta para cada uma. As mesmas fotografias, a mesma instrução, o mesmo comprimento de resposta. A única coisa que muda é o modelo que as lê.

fotografiagpt-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

Há três coisas nessa tabela que merecem uma pausa.

O modelo mais barato muda entre a terceira linha e a quarta, na mesma tarefa, porque alguém redimensionou as fotografias. Peça um parágrafo em vez de uma legenda e o ponto de cruzamento volta a mudar: a 1280 × 960, o vencedor é Gemini para uma legenda de quarenta tokens e OpenAI para um parágrafo de quatrocentos tokens.

A coluna Gemini não se mexe, em nenhuma linha: uma fotografia 4000 \u00d7 3000 custa-lhe exatamente o mesmo que uma 640 \u00d7 480. Uma fotografia 4000 × 3000 custa-lhe exatamente o mesmo que uma fotografia 640 × 480. Isto não é um limite. É uma consequência da forma como conta, e significa que a otimização de custos mais comum neste negócio — reduzir a resolução antes de carregar — rende assim:

image tokens, 4000 × 3000 → 800 × 600custo da execuçãopoupança
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 %

Nenhum desses números é um preço publicado pelo fornecedor. Todos os três tiveram de ser calculados, a partir de três regras diferentes, porque uma fotografia não é uma unidade faturável em lado nenhum: primeiro é convertida em tokens, por uma aritmética escrita em três lugares incompatíveis.

O Capítulo 16 construiu a fatura para texto e parou onde o texto acaba. Este capítulo é o resto da fatura: imagens, fala, transcrição, vídeo e computação bruta, que no conjunto são faturados em oito unidades diferentes, e o método para comparar coisas que não são vendidas pela mesma medida.

Mostrar detalhes

O que este capítulo precisa dos anteriores.

  • O Capítulo 7 construiu o tokenizer e a unidade. Tudo aqui é uma tentativa de transformar algo que não é texto nessa unidade.
  • O Capítulo 8 estabeleceu o que um modelo consome: não símbolos, mas vetores num espaço de embedding. É por isso que uma imagem pode sequer ter preço em tokens.
  • O Capítulo 16 construiu computeCost, os seus escalões de preço e os seus cinco grupos de tokens. Este capítulo estende essa função em vez de a substituir.
  • O Capítulo 11 apresentou LoRA como técnica de fine-tuning e o Capítulo 20 avaliou o seu preço como decisão orçamental. Aqui aparece num modelo que não é um modelo de linguagem.

Sem tensores, pela regra do Capítulo 14: isto é tarifas, conversões e contabilidade, por isso é TypeScript.

Um transformer recebe uma sequência de vetores. Não tem opinião sobre a origem deles. O Capítulo 8 alimentou-o com embeddings procurados a partir de um token id; nada na arquitetura exige essa consulta.

Portanto: corte a imagem em quadrados fixos, achate cada quadrado numa lista de números e passe cada lista por uma camada linear aprendida para obter um vetor com a largura do modelo. Um patch 32 × 32 de píxeis de cor são 32×32×3=307232 \times 32 \times 3 = 3072 números; a projeção ERd×3072E \in \mathbb{R}^{d \times 3072} transforma-o num vetor de dd dimensões, exatamente com a forma em que chega um token de texto. É tudo, e é o artigo cujo título o diz: uma imagem vale 16 × 16 palavras.1 Acrescente uma codificação posicional para o modelo saber que quadrado estava onde, intercale os resultados com os text embeddings, e a sequência que o modelo lê é parte imagem e parte frase.

Três artigos transformaram isto num produto. CLIP treinou um image encoder e um text encoder para concordarem, em quatrocentos milhões de pares recolhidos da Web, e foi aí que a ideia de píxeis e palavras poderem partilhar um espaço deixou de ser hipótese.2 Flamingo aparafusou um vision encoder congelado a um modelo de linguagem congelado com algumas camadas de ponte treinadas.3 LLaVA mostrou que a ponte podia ser uma única projeção linear e que o seguimento de instruções podia ser ensinado com dados gerados, que é a razão pela qual todos os modelos abertos de visão-linguagem desde então têm aproximadamente a mesma forma.4

A consequência para a sua fatura é imediata e pouco glamorosa: os patches são posições na sequência, logo são input tokens, logo paga por eles à taxa de input. Quantos são é aritmética, e cada fornecedor fá-la de maneira diferente.

Todas as regras abaixo estão implementadas a partir da documentação do próprio fornecedor e verificadas contra os exemplos resolvidos nessa mesma documentação.

A OpenAI cobre a imagem com patches 32 × 32 e multiplica a contagem por um fator por modelo. Se a contagem de patches exceder o orçamento desse modelo e nível de detalhe, a imagem é reduzida até caber:

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

A Anthropic cobre-a com patches 28 × 28, um visual token cada, e limita tanto a aresta longa como a contagem de tokens — 1,568 píxeis e 1,568 tokens nos modelos de escalão standard, 2,576 e 4,784 no escalão de alta resolução. Imagens demasiado grandes são reduzidas para o maior tamanho que respeite ambos.5

A Google não conta píxeis de todo. Uma imagem com ambos os lados até 384 píxeis custa uma taxa fixa de 258 tokens. Qualquer coisa maior é cortada em tiles de 258 tokens cada, e a grelha de tiles vem de uma unidade de crop de 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;      
}

Execute cada uma contra os números que o seu próprio fornecedor imprime:

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

São impressas nove concordâncias; a execução completa verifica quinze, porque a tabela da Anthropic dá ambos os escalões para todos os seis tamanhos. As regras são agora suas para correr em qualquer fotografia que tenha, que é o ponto: estas são as únicas três funções neste capítulo que não consegue obter numa página de preços.

Passe a mesma fotografia 4:3 pelas três regras em seis tamanhos:

tamanhoOpenAI, 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

Leia a última coluna de cima para baixo. Assim que a imagem passa os 384 píxeis, o número nunca mais muda, e isso não é coincidência nem limite. Substitua a unidade de crop de volta na fórmula dos tiles, para uma imagem pelo menos tão larga como alta:

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

O tamanho cancela. Os image tokens da Google dependem do aspect ratio e de mais nada. Uma fotografia 4:3 são quatro tiles, quer seja uma miniatura ou um cartaz. Esse único facto algébrico é toda a explicação para o zero na tabela de poupança acima, e nenhuma página de preços em lado nenhum o afirma.

As outras duas colunas impõem limites, em vez disso, a alturas diferentes e por razões diferentes — a Anthropic num teto declarado de tokens, a OpenAI num orçamento de patches depois de um limite de píxeis — e é por isso que as três curvas se cruzam em tamanhos diferentes.

Agora parta a intuição. A forma óbvia de gastar menos num modelo de visão é pedir menos detalhe, por isso envie 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

Pedir menos detalhe custou 25 % mais. Isto não é um bug e a OpenAI di-lo numa linha da tabela de dimensionamento: nessa família de modelos, low usa um limite de 2048 píxeis com um orçamento de 6,144 patches, enquanto high usa o mesmo limite de píxeis com um orçamento de 2,500 patches, «por isso pode usar mais tokens do que high».7 A palavra low designa uma definição de fidelidade, não um preço: em duas das cinco famílias de modelos documentadas não compra poupança nenhuma, e numa dessas duas custa mais.

Tudo até aqui foi um modelo a ler uma imagem. Fazer uma imagem corre num mecanismo sem tokens nenhuns, e é essa a razão pela qual é vendido à imagem e não à palavra.

Fazer uma imagem: um preço por imagem é um preço por token

Ligação para a secção: Fazer uma imagem: um preço por imagem é um preço por token

Os fornecedores publicam geração de imagens como preço por imagem. Não é. Os modelos GPT Image emitem image tokens especializados cuja contagem depende do tamanho e da qualidade pedidos; multiplique as contagens publicadas pela taxa de image output publicada do GPT Image 1, $40 por milhão, e compare com os preços por imagem na mesma página:

qualidade1024 × 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)

Nove valores derivados contra nove publicados, cada par a concordar dentro de $0.002.11 A Google é ainda mais explícita e faz a conversão por si na própria página de preços: image output a $60 por milhão de tokens, «output images at 1K (1024x1024px) consume 1120 tokens and are equivalent to $0.067 per image».12

Portanto, um preço por imagem é um preço por token com a contagem dobrada lá dentro. O que está bem, e esconde uma coisa. Pegue na tabela da geração atual e divida ao contrário:

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

A imagem maior é a mais barata em todas as qualidades. Um canvas 1024 × 1536 tem mais 50 % de píxeis do que um 1024 × 1024 e custa menos 23 % de tokens em medium. A OpenAI assinala isto numa frase que saltaria por cima — «a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting» — e na geração anterior de modelos acontecia o inverso, com portrait a custar 50 % mais do que square.11 Todos os defaults de 1024x1024 escritos antes dessa mudança são agora a opção cara.

Peça a três produtos para falar os mesmos 519 caracteres — cerca de 38 segundos de áudio — e obtém três sistemas de unidades de dois fornecedores:

modelounidadepreço
tts-1por carácter$15.00 por milhão de caracteres → $0.007785
tts-1-hdpor carácter$30.00 por milhão de caracteres → $0.015570
gemini-3.1-flash-ttspor audio token, 25 por segundo$20.00 por milhão → $0.019319

O mesmo fornecedor vende ambas as unidades: o tts-1 da OpenAI tem preço por milhão de caracteres, enquanto gpt-4o-mini-tts tem preço por milhão de tokens, $0.60 de entrada e $12.00 de saída.13 Portanto, «text-to-speech mais barato» não é uma pergunta com resposta até dizer o que vai ser falado.

E as duas unidades são cegas a coisas opostas. Um preço por carácter não vê duração: escolha uma voz lenta e deliberada, ou acrescente pausas, e a fatura não se mexe enquanto o áudio fica mais longo. Um preço por segundo não vê conteúdo: trinta segundos custam o mesmo quer sejam um parágrafo técnico denso ou alguém a contar até dez. Mude a voz e exatamente um dos seus dois fornecedores recalcula o preço.

A transcrição vai no sentido oposto e é a linha mais simples de toda a fatura — por minuto de áudio, fixa:

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)

Repare na última linha contra a terceira: fazê-lo em direto, à medida que as palavras chegam, custa 5,7 vezes fazê-lo sobre um ficheiro terminado. Essa diferença é o preço de não poder fazer batch, e é o que torna a secção seguinte cara.

Agora o número que decide se a voz é uma funcionalidade ou um produto.

A chamada: uma conversa de suporte de dez turnos, 149 palavras, que a uma taxa declarada de 150 palavras por minuto dá 59,6 segundos de fala — 21,2 falados por quem liga, 38,4 respondidos. As conversões de tokens são dos próprios fornecedores. 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 por segundo, em ambas as direções, o que a sua página de preços confirma ao publicar $12.00 por milhão e $0.018 por minuto na mesma linha.12

A conversa acumula exatamente como o Capítulo 16 disse que acumularia, porque é o mesmo mecanismo: «the entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive».14 Só que agora o histórico é medido em audio tokens.

turnoutilizadorassistantfresh audio incached audio inaudio outcusto
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

Agora a comparação que decide o produto, todos os quatro normalizados para um minuto:

por minutoversus texto
gpt-realtime-2.1, sem caching$0.13125937.9×
gpt-realtime-2.1, histórico cached$0.05742516.6×
gemini-3.1-flash-live, sem caching$0.0239656.9×
as mesmas palavras escritas, gpt-5.6-terra$0.003461

Trinta e oito vezes. Não trinta e oito por cento. A troca idêntica, conduzida em som em vez de texto, é quase duas ordens de magnitude mais cara, e nenhuma parte dessa diferença é uma margem que alguém decidiu cobrar — é a taxa de conversão. Um segundo de áudio do assistant são vinte tokens. Esse mesmo segundo transporta 2,5 palavras à taxa declarada, e a transcrição medida dá 1,26 tokens por palavra, por isso em texto são 3,15 tokens. Som é um pacote 6,3 vezes mais volumoso para o mesmo significado, e cada um dos seus tokens é faturado a 5,3 vezes a taxa de text output e 16 vezes a taxa de text input. Multiplique uma razão de volume por uma razão de preço e a ordem de magnitude já lá está antes de qualquer contabilidade começar.

Duas consequências operacionais saem diretamente da tabela.

Audio caching não é uma otimização, é o modelo de negócio. Cached audio input custa $0.40 por milhão contra $32.00 fresh — um desconto de 98,75 % que corta a chamada para metade. A regra é a do Capítulo 16, sem alterações: a cache corresponde a um prefixo, por isso qualquer coisa inserida no início da conversa a meio da chamada destrói-a, e o lugar natural para pôr «o chamador está agora verificado» é precisamente aí.

E nada do que fizer no cliente desfatura um som. O utilizador fala por cima do assistant, o seu código para a reprodução, a coluna fica em silêncio. O que já tinha sido gerado já tinha sido cobrado, porque a faturação acumula quando a resposta é criada; e pela regra do Capítulo 16, o que ficar na conversa é reenviado, como input audio, em todos os turnos seguintes. O Capítulo 14 fez este ponto sobre abortar um stream de texto. Em voz custa trinta vezes mais.

Vídeo é vendido por segundo por alguns fornecedores e por clip por outros, com escalões por resolução e por vezes por duração. Essas duas formas não diferem apenas em conveniência; cruzam-se.

modelo1 s2 s5 s10 s20 s
veo-3.1, por segundo, 1080p$0.400$0.800$2.000$4.000$8.000
veo-3.1-fast, por segundo, 1080p$0.120$0.240$0.600$1.200$2.400
sora-2, por segundo, 720p$0.100$0.200$0.500$1.000$2.000
hailuo-02, por clip, 1080p$0.480$0.480$0.480$0.480$0.480
mochi, por GPU-segundo$0.018$0.037$0.092$0.183$0.366

O fornecedor por clip é mais caro do que o de por segundo abaixo de 1,2 segundos e 16,7 vezes mais barato aos vinte. Nenhuma ordenação desses dois modelos sobrevive a uma mudança no comprimento do clip, por isso «qual modelo de vídeo é mais barato» não é uma pergunta sobre modelos.

A última linha é pior, e é o coração honesto do capítulo. mochi é faturado contra segundos reais de GPU — o tempo de previsão medido do trabalho — a $0.001400 por segundo numa A100 e $0.001525 numa H100, que são as taxas da máquina alugada e nada mais.15 É uma tarifa perfeitamente precisa e não é um preço, porque a quantidade que multiplica é desconhecida até depois de se comprometer a pagá-la. A linha acima assume doze GPU-segundos por segundo de output; quadruplicar essa suposição tira-o da faixa mais barata, e só a seis vezes o coloca a meio da tabela. É a única tarifa nesta página que não consegue pôr num orçamento.

Portanto: tokens, image tokens, caracteres, minutos, segundos de vídeo, clips inteiros, GPU-segundos, unidades fixas. Oito quantidades, e a única forma de as pôr num eixo é declarar uma carga de trabalho e calcular-lhe o preço.

Essa é a extensão ao computeCost do Capítulo 16 — a mesma maquinaria de escalões, agora com critérios que não são o comprimento do 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;
}

As duas linhas assinaladas são onde isto falha. Uma tarifa cotada por unidade multiplica u.images ?? 1; uma tarifa cotada por token multiplica algo que por defeito é zero. Dê às duas uma utilização vazia — a forma que obtém quando uma medição falhou — e veja:

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

Nada aconteceu, seis vezes, e custou três dólares uma vez e nada cinco vezes. Isto não é diferença de arredondamento; é uma decisão sobre o que significa um número ausente, tomada separadamente para cada unidade e nunca escrita. A regra sensata é que um campo que ninguém mediu fica ausente, porque «não medido» e «medido e deu zero» são coisas diferentes. Esta função discorda em silêncio.

A segunda falha é a duração. A tarifa por clip escolhe o seu escalão com maxDurationSeconds contra u.videoSeconds ?? 0, por isso uma utilização que nunca registou uma duração corresponde ao escalão mais curto:

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

Quarenta por cento de desconto por não saber quanto tempo durou o vídeo. Ambos os bugs têm a mesma raiz: um default escolhido por conveniência dentro de uma função cujo trabalho inteiro é ser exata.

Com os custos calculáveis, a comparação precisa da outra metade — uma carga de trabalho representativa declarada, uma por engine, dita em público para que o leitor possa discordar dela:

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

Cada uma dessas linhas é um argumento. Texto mistura um quarto de input e três quartos de output porque a utilização real pende para output; uma mistura cinquenta-cinquenta ordena os modelos de outra forma. A carga de imagem assume 1,500 output tokens, entre os 1,056 da OpenAI para um quadrado medium e os seus 1,584 para um portrait medium. Vídeo assume cinco segundos a 1080p, e acabámos de ver dois fornecedores trocar de lugar a 1,2 segundos. A entrada de compute assume sessenta GPU-segundos porque não há mais nada para assumir.

Esse é o método, e é o único honesto disponível: não pode comparar preços em unidades diferentes; só pode comparar o custo de uma carga de trabalho que escreveu. Qualquer tabela que ordene modelos multimodais sem imprimir a sua carga de trabalho está a ordenar as suas próprias suposições.

Agora consegue atribuir preço a qualquer coisa que um modelo possa produzir, em qualquer unidade em que seja vendida, e dizer em voz alta qual foi a carga de trabalho assumida pela comparação. Isso fecha a fatura que o Capítulo 16 abriu, e fecha a Parte III: tudo do Capítulo 14 até aqui foi sobre uma chamada — como fazê-la, o que pôr nela, como a amostrar, o que devolve, quanto custa.

O Capítulo 22 muda a unidade de análise, e a mudança é cara. Um agent não é uma chamada; é um ciclo que decide por si mesmo quantas chamadas fazer, e a aritmética dos últimos dois capítulos é o que transforma isso de um diagrama de arquitetura num orçamento. Abre fazendo a mesma pergunta ao mesmo modelo duas vezes, com uma ferramenta acrescentada ao catálogo da segunda vez, e medindo o que essa única ferramenta fez: uma chamada tornou-se duas, trinta e nove input tokens tornaram-se 420.

Se isso faz dele um agent depende de qual de duas definições publicadas abre, e elas não concordam. Uma delas não concorda consigo própria.


Todos os preços, fórmulas e taxas de conversão neste capítulo foram lidos na página do próprio fornecedor em 7 de setembro de 2026 e são citados com essa data, porque todos vão mudar. As contagens de tokens, custos e comparações foram calculados sobre esses dados pelo código impresso acima, numa máquina, sem nenhuma chamada de API paga — que é também a razão honesta pela qual não há uma única afirmação de latência neste capítulo.

As funções de image-token, as tabelas de custos, a decomposição da chamada de voz e os resultados de utilização vazia foram produzidos pelo TypeScript impresso neste capítulo, corrido em Node 22. O diálogo usado para a comparação de voz tem 149 palavras e foi tokenized com tiktoken sob a codificação o200k_base em 188 tokens; a sua duração resulta de uma taxa declarada de 150 palavras por minuto, que é um parâmetro da comparação e não uma medição. Cada valor de fornecedor traz a nota de rodapé que nomeia a página de onde veio.

  1. Dosovitskiy, A. et al. An Image Is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv:2010.11929 (2020). Patches, a projeção linear para a dimensão de embedding, e os position embeddings que tornam a grelha legível para um modelo de sequência.

  2. Radford, A. et al. Learning Transferable Visual Models From Natural Language Supervision. arXiv:2103.00020 (2021). Treino contrastivo de um image encoder e de um text encoder em 400 milhões de pares, e o espaço partilhado que tudo a jusante assume.

  3. Alayrac, J.-B. et al. Flamingo: a Visual Language Model for Few-Shot Learning. arXiv:2204.14198 (2022). Vision encoder congelado, modelo de linguagem congelado, camadas de ponte treinadas — a arquitetura que transformou image understanding numa capacidade de chat.

  4. Liu, H., Li, C., Wu, Q. and Lee, Y. J. Visual Instruction Tuning. arXiv:2304.08485 (2023). Uma única projeção linear como ponte e dados de instrução gerados como conjunto de treino; a razão pela qual os modelos abertos de visão-linguagem convergiram para uma forma.

  5. Anthropic, Vision, platform.claude.com/docs/en/build-with-claude/vision, acedido em 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.» Também os dois escalões de resolução (standard: aresta longa de 1568 píxeis, 1568 visual tokens; alta resolução, em Claude 4.7 e posteriores: 2576 píxeis e 4784 tokens), a regra de redução, e a tabela de seis linhas de tamanhos e contagens de tokens reproduzida acima. Taxas dos modelos de Anthropic, Pricing, platform.claude.com/docs/en/about-claude/pricing, mesma data: Claude Haiku 4.5 a $1 e $5 por milhão de input e output tokens.

  6. Google, Image understanding, ai.google.dev/gemini-api/docs/image-understanding, acedido em 2026-09-07. «258 tokens if both dimensions <= 384 pixels. Larger images are tiled into 768x768 pixel tiles, each costing 258 tokens», com a fórmula da unidade de crop — floor(min(width, height) / 1.5), dimensões divididas por ela e multiplicadas entre si — e o exemplo resolvido de 960 × 540 que dá 3 × 2 = 6 tiles. A Google chama-lhe «a rough formula»; a invariância de escala derivada acima é uma propriedade da fórmula tal como publicada. Audio input na mesma família é 32 tokens por segundo de áudio (ai.google.dev/gemini-api/docs/audio, mesma data).

  7. OpenAI, Images and vision, developers.openai.com/api/docs/guides/images-vision, acedido em 2026-09-07. Fonte da regra baseada em patches (patches 32 × 32, patch_count = ceil(width/32)×ceil(height/32), a fórmula shrink_factor e o seu ajuste inteiro, o limite de rejeição de 30,000 patches); a tabela de dimensionamento de modelos, incluindo que low em gpt-5.4 usa um limite de 2048 píxeis e um orçamento de 6,144 patches «so it can use more tokens than high», contra o orçamento de 2,500 patches de high; a tabela de multiplicadores (1.2 para as famílias GPT-5.x, 1.62 para gpt-4.1-mini, 2.46 para gpt-4.1-nano); os dois exemplos resolvidos reproduzidos acima (1024 × 1024 → 1229 tokens, 2048 × 2048 → 3000 tokens); as regras baseadas em tiles para modelos mais antigos (base mais tiles de 512 píxeis, 85 + 170 em gpt-4o); e a lista de limitações citada na caixa de visão. 2

  8. Ho, J., Jain, A. and Abbeel, P. Denoising Diffusion Probabilistic Models. arXiv:2006.11239 (2020). O calendário de noising direto, a reparametrização que transforma o objetivo em prever o ruído acrescentado, e o ciclo de sampling.

  9. Rombach, R., Blattmann, A., Lorenz, D., Esser, P. and Ommer, B. High-Resolution Image Synthesis with Latent Diffusion Models. arXiv:2112.10752 (2022). Executar o processo de diffusion num espaço latent comprimido, que foi o que tornou a contagem fixa de passos suficientemente acessível para vender por imagem.

  10. Prince, S. J. D. Understanding Deep Learning (MIT Press, 2023), capítulo 18. A delegação declarada para tudo o que este capítulo saltou sobre diffusion — o variational bound, os noise schedules, classifier-free guidance e as famílias de sampler. Hu, E. et al., LoRA: Low-Rank Adaptation of Large Language Models, arXiv:2106.09685 (2021), é o adaptador em si, apresentado no Capítulo 11 num modelo de linguagem e usado aqui num modelo de imagem sem mudança de matemática. Radford, A. et al., Robust Speech Recognition via Large-Scale Weak Supervision (Whisper), arXiv:2212.04356 (2022), é o modelo de transcrição cujo preço por minuto aparece acima.

  11. OpenAI, Image generation, developers.openai.com/api/docs/guides/image-generation, Pricing, developers.openai.com/api/docs/pricing, e a página do modelo para gpt-image-1, todos acedidos em 2026-09-07. A página do modelo para gpt-image-2 não traz secção de pricing; as suas taxas vêm da página de pricing acima. A página do GPT Image 1 publica text input a $5.00, image input a $10.00 e image output a $40.00 por milhão de tokens ao lado da tabela por imagem usada na derivação acima. Também: a tabela de output-token para modelos anteriores a gpt-image-2 (272 / 408 / 400 low, 1056 / 1584 / 1568 medium, 4160 / 6240 / 6208 high, para square, portrait e landscape); as tabelas de preço por imagem para GPT Image 2, 1.5, 1 e 1 Mini usadas nas derivações acima; a frase «a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting»; a nota de que cada imagem parcial em streaming custa mais 100 image output tokens; e as taxas do gpt-image-2 de $8.00 image input, $2.00 cached image input, $30.00 image output e $5.00 text input por milhão de tokens. Taxas de modelos de texto usadas nas comparações: gpt-5.6-terra a $2.00 input, $0.20 cached input e $12.00 output, gpt-5.6-luna a $0.20 e $1.20, escalão standard, short context. Vídeo: sora-2 a $0.10 por segundo a 720p e sora-2-pro a $0.30, $0.50 e $0.70 a 720p, 1024p e 1080p. Transcrição: $0.006, $0.0045, $0.003 e $0.017 por minuto para gpt-4o-transcribe, gpt-transcribe, gpt-4o-mini-transcribe e gpt-live-transcribe. 2

  12. Google, Gemini Developer API pricing, ai.google.dev/gemini-api/docs/pricing, acedido em 2026-09-07. Gemini 3.1 Flash-Lite a $0.25 por milhão de input tokens (texto, imagem e vídeo) e $1.50 output. Gemini 3.1 Flash Image: image output a $60 por milhão de tokens, com as equivalências publicadas de 747, 1120, 1680 e 2520 tokens para imagens 0.5K, 1K, 2K e 4K e os seus preços por imagem de $0.045, $0.067, $0.101 e $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 texto e «$3.00 or $0.005/min» audio input, «$4.50 (text) $12.00 or $0.018/min (audio)» output. Veo 3.1 por segundo com áudio: $0.40 a 720p e 1080p e $0.60 a 4K standard; $0.10, $0.12 e $0.30 fast. Gemini Omni Flash fatura video output «at a rate of 5,792 tokens per second of 720p video», que a mesma nota converte para cerca de $0.10 por segundo — a afirmação publicada mais clara de todas de que um preço de media por segundo é um preço de token. 2

  13. Páginas de modelo da OpenAI para tts-1, tts-1-hd e gpt-4o-mini-tts, developers.openai.com/api/docs/models, acedidas em 2026-09-07. tts-1 a $15.00 e tts-1-hd a $30.00 por milhão de caracteres; gpt-4o-mini-tts a $0.60 por milhão de text input tokens e $12.00 por milhão de audio output tokens — o mesmo fornecedor, a mesma operação, duas unidades.

  14. OpenAI, Managing costs (Realtime API), developers.openai.com/api/docs/guides/realtime-costs, acedido em 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.» Também: «The entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive»; os custos acumulam quando uma Response é criada; o exemplo resolvido de dois turnos cuja acumulação a tabela acima reproduz; e o payload de utilização response.done com as suas divisões input_token_details e output_token_details. Taxas da página de pricing, mesma data: áudio gpt-realtime-2.1 a $32.00 input, $0.40 cached input e $64.00 output por milhão de tokens, texto a $4.00, $0.40 e $24.00, image input a $5.00. 2

  15. Replicate, Pricing, replicate.com/pricing, acedido em 2026-09-07. Nvidia A100 (80GB) a $0.001400 por segundo e $5.04 por hora; Nvidia H100 a $0.001525 por segundo e $5.49 por hora.

Pronto para deixar a LIA escolher?

Construa com todos os modelos de IA num só sítio — comece grátis hoje.