Salta al contenuto
21/30Capitolo 21 di 30

Prezzi multimodali: cosa fatturano davvero immagini, audio e video

Tre modelli con le stesse 500 foto differiscono di 5,5×, e il più economico cambia appena qualcuno le ridimensiona.

In questa pagina

Ecco un compito, prezzato in tre modi: descrivere cinquecento fotografie di prodotto, una breve didascalia ciascuna. Stesse fotografie, stessa istruzione, stessa lunghezza di risposta. L’unica cosa che cambia è quale modello le legge.

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

In quella tabella ci sono tre cose su cui vale la pena fermarsi.

Il modello più economico cambia tra la terza riga e la quarta, sullo stesso compito, perché qualcuno ha ridimensionato le fotografie. Chiedi un paragrafo invece di una didascalia e il punto di incrocio si sposta di nuovo: a 1280 × 960 vince Gemini per una didascalia da quaranta token e OpenAI per un paragrafo da quattrocento token.

La colonna Gemini non si muove affatto, in nessuna riga: una fotografia 4000 × 3000 costa esattamente quanto una 640 × 480. Una fotografia 4000 × 3000 costa esattamente quanto una fotografia 640 × 480. Non è un tetto. È una conseguenza di come conta, e significa che l’ottimizzazione dei costi più comune in questo settore — ridimensionare verso il basso prima dell’upload — rende così:

image tokens, 4000 × 3000 → 800 × 600costo dell’esecuzionerisparmio
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 %

Nessuno di questi numeri è un prezzo pubblicato dal vendor. Tutti e tre hanno dovuto essere calcolati, a partire da tre regole diverse, perché una fotografia non è mai un’unità fatturabile: prima viene convertita in token, tramite un’aritmetica scritta in tre luoghi incompatibili.

Il Capitolo 16 ha costruito la fattura del testo e si è fermato dove finisce il testo. Questo capitolo è il resto della fattura: immagini, parlato, trascrizione, video e compute grezzo, che insieme vengono fatturati in otto unità diverse, e il metodo per confrontare cose che non sono vendute con la stessa misura.

Mostra dettagli

Cosa serve a questo capitolo dai precedenti.

  • Il Capitolo 7 ha costruito il tokenizer e l’unità. Tutto qui è un tentativo di trasformare qualcosa che non è testo in quell’unità.
  • Il Capitolo 8 ha stabilito cosa consuma un modello: non simboli, ma vettori in uno spazio di embedding. È per questo che un’immagine può essere prezzata in token.
  • Il Capitolo 16 ha costruito computeCost, i suoi scaglioni di prezzo e i suoi cinque bucket di token. Questo capitolo estende quella funzione invece di sostituirla.
  • Il Capitolo 11 ha introdotto LoRA come tecnica di fine-tuning e il Capitolo 20 l’ha prezzata come decisione di budget. Qui ricompare su un modello che non è un language model.

Niente tensori, secondo la regola del Capitolo 14: qui si parla di tariffe, conversioni e contabilità, quindi è TypeScript.

Perché una fotografia ha un prezzo in token

Link alla sezione: Perché una fotografia ha un prezzo in token

Un transformer prende una sequenza di vettori. Non ha opinioni su da dove arrivino. Il Capitolo 8 gli dava in pasto embeddings cercati da un token id; niente nell’architettura richiede quella ricerca.

Quindi: taglia l’immagine in quadrati fissi, appiattisci ogni quadrato in una lista di numeri e passa ogni lista attraverso un singolo layer lineare appreso per ottenere un vettore della larghezza del modello. Una patch 32 × 32 di pixel a colori è composta da 32×32×3=307232 \times 32 \times 3 = 3072 numeri; la proiezione ERd×3072E \in \mathbb{R}^{d \times 3072} la trasforma in un vettore dd-dimensionale, esattamente la forma con cui arriva un token di testo. È tutto qui, ed è l’articolo il cui titolo lo dice: un’immagine vale 16 × 16 parole.1 Aggiungi un positional encoding perché il modello sappia quale quadrato era dove, intreccia i risultati con gli embeddings del testo, e la sequenza letta dal modello è in parte immagine e in parte frase.

Tre articoli l’hanno trasformato in prodotto. CLIP ha addestrato un image encoder e un text encoder a concordare, su quattrocento milioni di coppie raccolte dal web, ed è lì che l’idea che pixel e parole possano condividere uno spazio ha smesso di essere un’ipotesi.2 Flamingo ha innestato un vision encoder congelato su un language model congelato con pochi layer di collegamento addestrati.3 LLaVA ha mostrato che il ponte poteva essere una singola proiezione lineare e che l’instruction-following poteva essere insegnato con dati generati, ed è per questo che ogni modello vision-language open da allora ha più o meno la stessa forma.4

La conseguenza per la tua fattura è immediata e poco glamour: le patch sono posizioni nella sequenza, quindi sono token di input, quindi le paghi alla tariffa di input. Quanti siano è aritmetica, e ogni provider la fa diversamente.

Tre regole, tutte pubblicate, nessuna uguale

Link alla sezione: Tre regole, tutte pubblicate, nessuna uguale

Ogni regola qui sotto è implementata dalla documentazione del provider e verificata sugli esempi svolti nella stessa documentazione.

OpenAI copre l’immagine con patch 32 × 32 e moltiplica il conteggio per un fattore per modello. Se il conteggio delle patch supera il budget per quel modello e quel livello di dettaglio, l’immagine viene ridimensionata finché ci sta:

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 la copre con patch 28 × 28, un visual token ciascuna, e limita sia il lato lungo sia il conteggio dei token — 1.568 pixel e 1.568 token sui modelli standard-tier, 2.576 e 4.784 sul tier ad alta risoluzione. Le immagini troppo grandi vengono ridimensionate alla dimensione massima che rispetta entrambi.5

Google non conta affatto i pixel. Un’immagine con entrambi i lati pari o inferiori a 384 pixel costa una quota fissa di 258 token. Qualsiasi cosa più grande viene tagliata in tile da 258 token ciascuna, e la griglia di tile deriva da un’unità di crop pari a 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;      
}

Esegui ciascuna contro i numeri stampati dal suo vendor:

three implementations against three documentationsTEXT
OpenAI, gpt-5.4 at detail:high (2048 px, 2,500 patches, 1.2x)
  1024x1024 -> 1024 patches -> 1229 tokens   doc says 1229   MATCH
  2048x2048 -> 2500 patches -> 3000 tokens   doc says 3000   MATCH

Anthropic, the published table (one tier per row shown)
  200x200    std   64 @ 200x200     doc   64, not resized    OK
  1000x1000  std 1296 @ 1000x1000   doc 1296, not resized    OK
  1092x1092  std 1521 @ 1092x1092   doc 1521, not resized    OK
  1920x1080  std 1560 @ 1456x819    doc 1560, 1456x819       OK
  2000x1500  std 1564 @ 1269x952    doc 1564, 1269x952       OK
  3840x2160  hi  4784 @ 2576x1449   doc 4784, 2576x1449      OK

Google, the worked example
  960x540 -> crop 360 -> 3 x 2 = 6 tiles     doc says 6      MATCH

Vengono stampate nove corrispondenze; l’esecuzione completa ne verifica quindici, perché la tabella di Anthropic dà entrambi i tier per tutte e sei le dimensioni. Le regole ora sono tue da eseguire su qualsiasi fotografia tu abbia: queste sono le uniche tre funzioni di questo capitolo che non puoi ottenere da una pagina prezzi.

Cosa significa «più grande», tre volte

Link alla sezione: Cosa significa «più grande», tre volte

Passa la stessa fotografia 4:3 attraverso tutte e tre a sei dimensioni:

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

Leggi l’ultima colonna dall’alto verso il basso. Una volta che l’immagine supera 384 pixel, il numero non cambia mai più, e non è una coincidenza né un tetto. Rimetti l’unità di crop dentro la formula dei tile, per un’immagine larga almeno quanto è 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

La dimensione si cancella. Gli image tokens di Google dipendono dall’aspect ratio e da nient’altro. Una fotografia 4:3 è quattro tile, che sia una miniatura o un poster. Quel singolo fatto algebrico è l’intera spiegazione dello zero nella tabella dei risparmi sopra, e nessuna pagina prezzi lo dice.

Le altre due colonne invece hanno un cap, ad altezze diverse e per ragioni diverse — Anthropic su un tetto dichiarato di token, OpenAI su un budget di patch dopo un limite di pixel — ed è per questo che le tre curve si incrociano a dimensioni diverse.

Ora rompiamolo. Il modo ovvio per spendere meno con un vision model è chiedere meno dettaglio, quindi invia 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

Chiedere meno dettaglio è costato il 25 % in più. Non è un bug e OpenAI lo dice in una riga della tabella di sizing: su quella famiglia di modelli, low usa un limite di 2048 pixel con un budget di 6.144 patch, mentre high usa lo stesso limite di pixel con un budget di 2.500 patch, «so it can use more tokens than high».7 La parola low indica un’impostazione di fedeltà, non un prezzo: su due delle cinque famiglie di modelli documentate non compra alcun risparmio, e su una di quelle due costa di più.

Fin qui abbiamo parlato di un modello che legge un’immagine. Produrla usa un meccanismo senza alcun token, ed è per questo che viene venduta a immagine invece che a parola.

Creare un’immagine: un prezzo per immagine è un prezzo per token

Link alla sezione: Creare un’immagine: un prezzo per immagine è un prezzo per token

I vendor pubblicano la generazione di immagini come prezzo per immagine. Non lo è. I modelli GPT Image emettono image tokens specializzati il cui conteggio dipende da dimensione e qualità richieste; moltiplica i conteggi pubblicati per la tariffa di output immagine pubblicata di GPT Image 1, $40 per milione, e confronta con i prezzi per immagine sulla stessa pagina:

qualità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)

Nove valori derivati contro nove valori pubblicati, ogni coppia concorde entro $0.002.11 Google è ancora più esplicita e fa la conversione per te nella pagina prezzi: output immagine a $60 per milione di token, «output images at 1K (1024x1024px) consume 1120 tokens and are equivalent to $0.067 per image».12

Quindi un prezzo per immagine è un prezzo per token con il conteggio incorporato. Va bene, e nasconde qualcosa. Prendi la tabella della generazione attuale e dividi al contrario:

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

L’immagine più grande è quella più economica a ogni qualità. Una canvas 1024 × 1536 ha il 50 % di pixel in più rispetto a una 1024 × 1024 e costa il 23 % di token in meno a medium. OpenAI lo segnala in una frase che salteresti — «a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting» — e sulla generazione precedente del modello funzionava al contrario, con il ritratto che costava il 50 % in più del quadrato.11 Ogni default di 1024x1024 scritto prima di quel cambiamento ora è l’opzione costosa.

Suono, fatturato al secondo, al carattere e al token

Link alla sezione: Suono, fatturato al secondo, al carattere e al token

Chiedi a tre prodotti di pronunciare gli stessi 519 caratteri — circa 38 secondi di audio — e ottieni tre sistemi di unità da due vendor:

modellounitàprezzo
tts-1per carattere$15.00 per milione di caratteri → $0.007785
tts-1-hdper carattere$30.00 per milione di caratteri → $0.015570
gemini-3.1-flash-ttsper audio token, 25 al secondo$20.00 per milione → $0.019319

Lo stesso vendor vende entrambe le unità: tts-1 di OpenAI è prezzato per milione di caratteri, mentre gpt-4o-mini-tts è prezzato per milione di token, $0.60 in ingresso e $12.00 in uscita.13 Quindi «il text-to-speech più economico» non è una domanda con una risposta finché non dici che cosa stai facendo pronunciare.

E le due unità sono cieche a cose opposte. Un prezzo per carattere non vede la durata: scegli una voce lenta e deliberata, o aggiungi pause, e la fattura non si muove mentre l’audio si allunga. Un prezzo per secondo non vede il contenuto: trenta secondi costano uguale, che siano un paragrafo tecnico denso o qualcuno che conta fino a dieci. Cambia la voce e soltanto uno dei tuoi due vendor ricalcola il prezzo.

La trascrizione va nella direzione opposta ed è la riga più semplice dell’intera fattura — per minuto di audio, piatta:

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)

Nota l’ultima riga rispetto alla terza: farlo live, mentre le parole arrivano, costa 5,7 volte farlo su un file già finito. Quel divario è il prezzo di non poter fare batch, ed è ciò che rende costosa la sezione successiva.

Ora il numero che decide se la voce è una feature o un prodotto.

La chiamata: una conversazione di supporto da dieci turni, 149 parole, che a 150 parole al minuto dichiarate fa 59,6 secondi di parlato — 21,2 pronunciati dal chiamante, 38,4 restituiti. Le conversioni in token sono dei provider stessi. OpenAI: «audio tokens in user messages are 1 token per 100 ms of audio, while audio tokens in assistant messages are 1 token per 50 ms».14 Google: 25 token al secondo, in entrambe le direzioni, cosa che la sua pagina prezzi conferma pubblicando $12.00 per milione e $0.018 al minuto sulla stessa riga.12

La conversazione si accumula esattamente come diceva il Capitolo 16, perché il meccanismo è lo stesso: «the entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive».14 Solo che ora la cronologia è misurata in audio tokens.

turnouserassistantaudio fresco in ingressoaudio cached in ingressoaudio outcosto
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

Ora il confronto che decide il prodotto, tutti e quattro normalizzati a un minuto:

al minutorispetto al testo
gpt-realtime-2.1, senza caching$0.13125937.9×
gpt-realtime-2.1, cronologia cached$0.05742516.6×
gemini-3.1-flash-live, senza caching$0.0239656.9×
le stesse parole digitate, gpt-5.6-terra$0.003461

Trentotto volte. Non trentotto per cento. Lo scambio identico, condotto in suono invece che in testo, è quasi due ordini di grandezza più caro, e nessuna parte di quel divario è un margine che qualcuno ha scelto di applicare: è il tasso di conversione. Un secondo di audio dell’assistant è venti token. Quello stesso secondo porta 2,5 parole al tasso dichiarato, e la trascrizione misurata è a 1,26 token per parola, quindi come testo sono 3,15 token. Il suono è un pacchetto 6,3 volte più voluminoso per lo stesso significato, e ciascuno dei suoi token viene fatturato a 5,3 volte la tariffa di output testuale e 16 volte la tariffa di input testuale. Moltiplica un rapporto di volume per un rapporto di prezzo e l’ordine di grandezza è già lì prima che inizi qualsiasi contabilità.

Dalla tabella derivano direttamente due conseguenze operative.

L’audio caching non è un’ottimizzazione, è il business model. L’input audio cached è $0.40 per milione contro $32.00 fresco — uno sconto del 98,75 % che dimezza la chiamata. La regola è quella del Capitolo 16, invariata: la cache corrisponde a un prefisso, quindi qualsiasi cosa inserita all’inizio della conversazione a metà chiamata la distrugge, e il posto naturale in cui mettere «il chiamante ora è verificato» è proprio lì.

E niente di ciò che fai nel client annulla la fatturazione di un suono. L’utente parla sopra l’assistant, il tuo codice ferma la riproduzione, lo speaker tace. Qualunque cosa fosse già stata generata era già stata addebitata, perché la fatturazione matura quando la risposta viene creata; e secondo la regola del Capitolo 16 tutto ciò che resta nella conversazione viene reinviato, come audio input, a ogni turno successivo. Il Capitolo 14 lo diceva sull’interruzione di uno stream testuale. Nella voce costa trenta volte di più.

Video, GPU-seconds e un prezzo che non è un prezzo

Link alla sezione: Video, GPU-seconds e un prezzo che non è un prezzo

Il video è venduto al secondo da alcuni vendor e a clip da altri, con tier per risoluzione e talvolta per durata. Queste due forme non differiscono solo per comodità; si incrociano.

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

Il vendor a clip è più caro di quello al secondo sotto 1,2 secondi e 16,7 volte più economico a venti. Nessun ordinamento di quei due modelli sopravvive a un cambiamento nella lunghezza della clip, quindi «quale video model è più economico» non è una domanda sui modelli.

L’ultima riga è peggiore, ed è il cuore onesto del capitolo. mochi viene fatturato sui secondi GPU reali — il tempo di predizione misurato del job — a $0.001400 al secondo su A100 e $0.001525 su H100, che sono le tariffe della macchina noleggiata e nient’altro.15 È una tariffa perfettamente precisa e non è un prezzo, perché la quantità che moltiplica è ignota fino a dopo che ti sei impegnato a pagarla. La riga sopra assume dodici GPU-seconds per secondo di output; quadruplica quell’assunzione ed esce dalla fascia più economica, e solo a sei volte finisce a metà tabella. È l’unica tariffa in questa pagina che non puoi mettere in un preventivo.

Quindi: token, image tokens, caratteri, minuti, secondi video, clip intere, GPU seconds, unità piatte. Otto quantità, e l’unico modo per metterle su un solo asse è dichiarare un workload e prezzarlo.

Questa è l’estensione di computeCost del Capitolo 16 — lo stesso meccanismo di tier, ora con criteri che non sono la lunghezza del 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;
}

Le due righe marcate sono dove si rompe. Una tariffa quotata per unità moltiplica u.images ?? 1; una tariffa quotata per token moltiplica qualcosa che di default è zero. Dai in pasto a entrambe un usage vuoto — la forma che ottieni quando una misurazione fallisce — e guarda:

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

Non è successo nulla, sei volte, ed è costato tre dollari una volta e nulla cinque volte. Non è una differenza di arrotondamento; è una decisione su cosa significhi un numero assente, presa separatamente per ogni unità e mai scritta. La regola sensata è che un campo che nessuno ha misurato resta assente, perché «non misurato» e «misurato ed è venuto zero» sono cose diverse. Questa funzione è silenziosamente in disaccordo.

Il secondo fallimento è la durata. La tariffa a clip seleziona il suo tier con maxDurationSeconds rispetto a u.videoSeconds ?? 0, quindi un usage che non ha mai registrato una durata corrisponde al tier più breve:

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

Quaranta per cento di sconto per non sapere quanto durava il video. Entrambi i bug hanno la stessa radice: un default scelto per comodità dentro una funzione il cui intero compito è essere esatta.

Una volta che i costi sono computabili, al confronto serve l’altra metà: un workload rappresentativo dichiarato, uno per engine, esposto pubblicamente così chi legge può contestarlo:

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

Ognuna di quelle righe è un argomento. Il testo mescola un quarto di input e tre quarti di output perché l’uso reale tende verso l’output; una miscela cinquanta-cinquanta classifica i modelli diversamente. Il workload immagine assume 1.500 output token, tra i 1.056 di OpenAI per un quadrato medium e i suoi 1.584 per un ritratto medium. Il video assume cinque secondi a 1080p, e abbiamo appena visto due vendor scambiarsi di posto a 1,2 secondi. La voce compute assume sessanta GPU-seconds perché non c’è altro da assumere.

Questo è il metodo, ed è l’unico onesto disponibile: non puoi confrontare prezzi in unità diverse; puoi solo confrontare il costo di un workload che hai scritto. Qualsiasi tabella che classifica modelli multimodali senza stampare il proprio workload sta classificando le proprie assunzioni.

Ora puoi prezzare qualsiasi cosa un modello possa produrre, in qualunque unità sia venduta, e dire ad alta voce quale workload assume il tuo confronto. Questo chiude la fattura aperta dal Capitolo 16, e chiude la Parte III: tutto, dal Capitolo 14 a qui, è stato su una call — come farla, cosa metterci dentro, come campionarla, cosa restituisce, quanto costa.

Il Capitolo 22 cambia l’unità di analisi, e il cambiamento è costoso. Un agent non è una call; è un loop che decide da solo quante call fare, e l’aritmetica degli ultimi due capitoli è ciò che lo trasforma da diagramma architetturale a budget. Si apre ponendo allo stesso modello la stessa domanda due volte, con un tool aggiunto al catalogo la seconda volta, e misurando cosa ha fatto quell’unico tool: una call è diventata due, trentanove token di input sono diventati 420.

Se questo lo rende un agent dipende da quale delle due definizioni pubblicate apri, e non sono d’accordo. Una delle due non è d’accordo con sé stessa.


Ogni prezzo, formula e tasso di conversione in questo capitolo è stato letto dalla pagina del provider il 7 settembre 2026 ed è citato con quella data, perché si muoveranno tutti. I conteggi di token, i costi e i confronti sono stati calcolati su quei dati dal codice stampato sopra, su una macchina, senza effettuare alcuna chiamata API a pagamento — ed è anche la ragione onesta per cui in questo capitolo non c’è una sola affermazione sulla latenza.

Le funzioni per gli image-token, le tabelle dei costi, la scomposizione della voice call e i risultati con usage vuoto sono stati prodotti dal TypeScript stampato in questo capitolo, eseguito su Node 22. Il dialogo usato per il confronto vocale è di 149 parole ed è stato tokenizzato con tiktoken sotto l’encoding o200k_base a 188 token; la sua durata deriva da un tasso dichiarato di 150 parole al minuto, che è un parametro del confronto e non una misurazione. Ogni cifra del provider porta la footnote che nomina la pagina da cui proviene.

  1. Dosovitskiy, A. et al. An Image Is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv:2010.11929 (2020). Patch, proiezione lineare nella dimensione di embedding e position embeddings che rendono la griglia leggibile a un modello sequenziale.

  2. Radford, A. et al. Learning Transferable Visual Models From Natural Language Supervision. arXiv:2103.00020 (2021). Training contrastivo di un image encoder e un text encoder su 400 milioni di coppie, e lo spazio condiviso che tutto ciò che viene dopo assume.

  3. Alayrac, J.-B. et al. Flamingo: a Visual Language Model for Few-Shot Learning. arXiv:2204.14198 (2022). Vision encoder congelato, language model congelato, layer di collegamento addestrati — l’architettura che ha trasformato la comprensione delle immagini in una capacità di chat.

  4. Liu, H., Li, C., Wu, Q. and Lee, Y. J. Visual Instruction Tuning. arXiv:2304.08485 (2023). Una singola proiezione lineare come ponte e dati di istruzioni generati come training set; il motivo per cui i vision-language models open sono convergiti su una sola forma.

  5. Anthropic, Vision, platform.claude.com/docs/en/build-with-claude/vision, consultato il 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.» Anche i due tier di risoluzione (standard: lato lungo 1568 pixel, 1568 visual token; high-resolution, su Claude 4.7 e successivi: 2576 pixel e 4784 token), la regola di downsizing e la tabella a sei righe di dimensioni e conteggi token riprodotta sopra. Tariffe modello da Anthropic, Pricing, platform.claude.com/docs/en/about-claude/pricing, stessa data: Claude Haiku 4.5 a $1 e $5 per milione di token input e output.

  6. Google, Image understanding, ai.google.dev/gemini-api/docs/image-understanding, consultato il 2026-09-07. «258 tokens if both dimensions <= 384 pixels. Larger images are tiled into 768x768 pixel tiles, each costing 258 tokens», con la formula dell’unità di crop — floor(min(width, height) / 1.5), dimensioni divise per essa e moltiplicate insieme — e l’esempio svolto di 960 × 540 che dà 3 × 2 = 6 tile. Google la chiama «a rough formula»; l’invarianza di scala derivata sopra è una proprietà della formula così come pubblicata. L’audio input sulla stessa famiglia è 32 token al secondo di audio (ai.google.dev/gemini-api/docs/audio, stessa data).

  7. OpenAI, Images and vision, developers.openai.com/api/docs/guides/images-vision, consultato il 2026-09-07. Fonte della regola basata su patch (patch 32 × 32, patch_count = ceil(width/32)×ceil(height/32), la formula shrink_factor e il suo aggiustamento intero, il limite di rifiuto a 30.000 patch); la tabella di sizing dei modelli, inclusa l’indicazione che low su gpt-5.4 usa un limite di 2048 pixel e un budget di 6.144 patch «so it can use more tokens than high», contro il budget di 2.500 patch di high; la tabella dei moltiplicatori (1.2 per le famiglie GPT-5.x, 1.62 per gpt-4.1-mini, 2.46 per gpt-4.1-nano); i due esempi svolti riprodotti sopra (1024 × 1024 → 1229 token, 2048 × 2048 → 3000 token); le regole a tile per modelli più vecchi (base più tile da 512 pixel, 85 + 170 su gpt-4o); e la lista di limitazioni citata nel box sulla visione. 2

  8. Ho, J., Jain, A. and Abbeel, P. Denoising Diffusion Probabilistic Models. arXiv:2006.11239 (2020). Lo schedule di noising in avanti, la riparametrizzazione che trasforma l’obiettivo nella predizione del rumore aggiunto e il loop di 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). Eseguire il processo di diffusion in uno spazio latente compresso, ciò che ha reso il conteggio fisso di step abbastanza economico da essere venduto per immagine.

  10. Prince, S. J. D. Understanding Deep Learning (MIT Press, 2023), capitolo 18. La delega dichiarata per tutto ciò che questo capitolo ha saltato sulla diffusion — il variational bound, gli noise schedules, classifier-free guidance e le famiglie di sampler. Hu, E. et al., LoRA: Low-Rank Adaptation of Large Language Models, arXiv:2106.09685 (2021), è l’adapter stesso, introdotto nel Capitolo 11 su un language model e usato qui su un image model senza cambiare matematica. Radford, A. et al., Robust Speech Recognition via Large-Scale Weak Supervision (Whisper), arXiv:2212.04356 (2022), è il modello di trascrizione il cui prezzo al minuto compare sopra.

  11. OpenAI, Image generation, developers.openai.com/api/docs/guides/image-generation, Pricing, developers.openai.com/api/docs/pricing, e la pagina modello per gpt-image-1, tutti consultati il 2026-09-07. La pagina modello per gpt-image-2 non contiene una sezione pricing; le sue tariffe vengono dalla pagina pricing sopra. La pagina di GPT Image 1 pubblica text input a $5.00, image input a $10.00 e image output a $40.00 per milione di token accanto alla tabella per immagine usata nella derivazione sopra. Inoltre: la tabella degli output-token per modelli precedenti a gpt-image-2 (272 / 408 / 400 low, 1056 / 1584 / 1568 medium, 4160 / 6240 / 6208 high, per square, portrait e landscape); le tabelle di prezzo per immagine per GPT Image 2, 1.5, 1 e 1 Mini usate nelle derivazioni sopra; la frase «a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting»; la nota che ogni immagine parziale streamed costa 100 image output token extra; e le tariffe di gpt-image-2 di $8.00 image input, $2.00 cached image input, $30.00 image output e $5.00 text input per milione di token. Tariffe dei text model usate per i confronti: 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, standard tier, short context. Video: sora-2 a $0.10 al secondo a 720p e sora-2-pro a $0.30, $0.50 e $0.70 a 720p, 1024p e 1080p. Trascrizione: $0.006, $0.0045, $0.003 e $0.017 al minuto per 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, consultato il 2026-09-07. Gemini 3.1 Flash-Lite a $0.25 per milione di input token (testo, immagine e video) e $1.50 output. Gemini 3.1 Flash Image: image output a $60 per milione di token, con le equivalenze pubblicate di 747, 1120, 1680 e 2520 token per immagini 0.5K, 1K, 2K e 4K e i rispettivi prezzi per immagine di $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 testo e «$3.00 or $0.005/min» audio input, «$4.50 (text) $12.00 or $0.018/min (audio)» output. Veo 3.1 al secondo con audio: $0.40 a 720p e 1080p e $0.60 a 4K standard; $0.10, $0.12 e $0.30 fast. Gemini Omni Flash fattura l’output video «at a rate of 5,792 tokens per second of 720p video», che la stessa nota converte a circa $0.10 al secondo — la dichiarazione pubblicata più chiara ovunque che un prezzo media al secondo è un prezzo in token. 2

  13. Pagine modello OpenAI per tts-1, tts-1-hd e gpt-4o-mini-tts, developers.openai.com/api/docs/models, consultate il 2026-09-07. tts-1 a $15.00 e tts-1-hd a $30.00 per milione di caratteri; gpt-4o-mini-tts a $0.60 per milione di text input token e $12.00 per milione di audio output token — lo stesso vendor, la stessa operazione, due unità.

  14. OpenAI, Managing costs (Realtime API), developers.openai.com/api/docs/guides/realtime-costs, consultato il 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.» Inoltre: «The entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive»; i costi maturano quando viene creata una Response; l’esempio svolto a due turni la cui accumulazione è riprodotta dalla tabella sopra; e il payload usage response.done con i suoi split input_token_details e output_token_details. Tariffe dalla pagina pricing, stessa data: audio gpt-realtime-2.1 a $32.00 input, $0.40 cached input e $64.00 output per milione di token, testo a $4.00, $0.40 e $24.00, image input a $5.00. 2

  15. Replicate, Pricing, replicate.com/pricing, consultato il 2026-09-07. Nvidia A100 (80GB) a $0.001400 al secondo e $5.04 all’ora; Nvidia H100 a $0.001525 al secondo e $5.49 all’ora.

Pronto a lasciare scegliere LIA?

Crea con ogni modello AI in un unico posto — inizia gratis oggi.