Saltar al contenido
21/30Capítulo 21 de 30

Precios multimodales: qué facturan de verdad las imágenes, el audio y el vídeo

Tres modelos con las mismas 500 fotos discrepan por un factor de 5,5; el más barato cambia en cuanto alguien las redimensiona.

En esta página

Aquí tienes una tarea, con tres precios distintos: describir quinientas fotografías de producto, una leyenda breve para cada una. Mismas fotografías, misma instrucción, misma longitud de respuesta. Lo único que cambia es qué modelo las lee.

fotografíagpt-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

Hay tres cosas en esa tabla en las que merece la pena detenerse.

El modelo más barato cambia entre la tercera fila y la cuarta, en la misma tarea, porque alguien redimensionó las fotografías. Pide un párrafo en vez de una leyenda y el punto de cruce vuelve a moverse: a 1280 × 960 gana Gemini para una leyenda de cuarenta tokens y OpenAI para un párrafo de cuatrocientos tokens.

La columna de Gemini no se mueve en absoluto, en ninguna fila: una fotografía de 4000 × 3000 le cuesta exactamente lo mismo que una de 640 × 480. Una fotografía de 4000 × 3000 cuesta exactamente lo mismo que una fotografía de 640 × 480. Eso no es un tope. Es una consecuencia de cómo cuenta, y significa que la optimización de costes más común en este negocio —reducir la resolución antes de subir— rinde así:

image tokens, 4000 × 3000 → 800 × 600coste de la ejecuciónahorro
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 %

Ninguna de esas cifras es un precio que publique el proveedor. Las tres hubo que calcularlas, a partir de tres reglas distintas, porque una fotografía no es una unidad facturable en ninguna parte: primero se convierte en tokens, mediante una aritmética escrita en tres lugares incompatibles.

El capítulo 16 construyó la factura del texto y se detuvo donde acaba el texto. Este capítulo es el resto de la factura: imágenes, voz, transcripción, vídeo y cómputo bruto, que entre todos se facturan en ocho unidades distintas, y el método para comparar cosas que no se venden con la misma medida.

Mostrar detalles

Qué necesita este capítulo de los anteriores.

  • Capítulo 7 construyó el tokenizer y la unidad. Todo lo de aquí es un intento de convertir algo que no es texto en esa unidad.
  • Capítulo 8 estableció qué consume un modelo: no símbolos, sino vectores en un espacio de embedding. Por eso una imagen puede tener precio en tokens.
  • Capítulo 16 construyó computeCost, sus tramos de precio y sus cinco cubos de tokens. Este capítulo amplía esa función en lugar de sustituirla.
  • Capítulo 11 introdujo LoRA como técnica de fine-tuning y capítulo 20 le puso precio como decisión presupuestaria. Aquí aparece en un modelo que no es un modelo de lenguaje.

Sin tensores, por la regla del capítulo 14: esto son tarifas, conversiones y contabilidad, así que es TypeScript.

Por qué una fotografía tiene precio en tokens

Enlace a la sección: Por qué una fotografía tiene precio en tokens

Un transformer recibe una secuencia de vectores. No tiene opinión sobre de dónde vienen. El capítulo 8 le alimentó embeddings buscados a partir de un id de token; nada en la arquitectura exige esa búsqueda.

Así que: corta la imagen en cuadrados fijos, aplana cada cuadrado en una lista de números y pasa cada lista por una capa lineal aprendida para obtener un vector del ancho del modelo. Un parche de 32 × 32 píxeles de color son 32×32×3=307232 \times 32 \times 3 = 3072 números; la proyección ERd×3072E \in \mathbb{R}^{d \times 3072} lo convierte en un vector de dd dimensiones, exactamente la forma con la que llega un token de texto. Eso es todo, y es el paper cuyo título lo dice: una imagen vale 16 × 16 palabras.1 Añade una codificación posicional para que el modelo sepa qué cuadrado estaba dónde, entrelaza los resultados con los embeddings de texto, y la secuencia que lee el modelo es parte imagen y parte frase.

Tres papers lo convirtieron en producto. CLIP entrenó un codificador de imágenes y un codificador de texto para ponerse de acuerdo, sobre cuatrocientos millones de pares extraídos de la web, y ahí fue donde la idea de que píxeles y palabras podían compartir un espacio dejó de ser una hipótesis.2 Flamingo acopló un codificador de visión congelado a un modelo de lenguaje congelado con unas pocas capas puente entrenadas.3 LLaVA mostró que el puente podía ser una única proyección lineal y que el seguimiento de instrucciones podía enseñarse con datos generados, que es la razón por la que desde entonces todos los modelos abiertos de visión-lenguaje se parecen más o menos.4

La consecuencia para tu factura es inmediata y poco glamourosa: los parches son posiciones en la secuencia, así que son input tokens, así que pagas por ellos a la tarifa de entrada. Cuántos son es aritmética, y cada proveedor la hace de forma distinta.

Cada regla de abajo está implementada a partir de la documentación del propio proveedor y comprobada con los ejemplos resueltos de esa misma documentación.

OpenAI cubre la imagen con parches de 32 × 32 y multiplica el recuento por un factor por modelo. Si el número de parches supera el presupuesto de ese modelo y nivel de detalle, la imagen se escala hacia abajo hasta que encaja:

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 cubre con parches de 28 × 28, un visual token cada uno, y limita tanto el lado largo como el recuento de tokens: 1,568 píxeles y 1,568 tokens en modelos de tramo estándar, 2,576 y 4,784 en el tramo de alta resolución. Las imágenes demasiado grandes se escalan al mayor tamaño que cumpla ambas condiciones.5

Google no cuenta píxeles en absoluto. Una imagen con ambos lados en 384 píxeles o menos cuesta una tarifa plana de 258 tokens. Cualquier imagen mayor se corta en teselas de 258 tokens cada una, y la cuadrícula de teselas sale de una unidad de recorte 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;      
}

Ejecuta cada una contra los números que imprime su propio proveedor:

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

Se imprimen nueve coincidencias; la ejecución completa comprueba quince, porque la tabla de Anthropic da ambos tramos para los seis tamaños. Las reglas ya son tuyas para ejecutarlas sobre cualquier fotografía que tengas, y ese es el punto: estas son las únicas tres funciones de este capítulo que no puedes obtener de una página de precios.

Pasa la misma fotografía 4:3 por las tres reglas en seis tamaños:

tamañoOpenAI, highAnthropic, estándarAnthropic, alta resoluciónGemini
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

Lee la última columna hacia abajo. Una vez que la imagen supera los 384 píxeles, el número no vuelve a cambiar, y eso no es una coincidencia ni un tope. Sustituye la unidad de recorte de nuevo en la fórmula de teselas, para una imagen al menos tan ancha 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

El tamaño se cancela. Los image tokens de Google dependen de la relación de aspecto y de nada más. Una fotografía 4:3 son cuatro teselas tanto si es una miniatura como si es un póster. Ese único hecho algebraico es toda la explicación del cero en la tabla de ahorro de arriba, y ninguna página de precios lo dice.

Las otras dos columnas sí hacen tope, a alturas distintas y por razones distintas —Anthropic en un techo declarado de tokens, OpenAI en un presupuesto de parches después de un límite de píxeles—, por eso las tres curvas se cruzan en tamaños distintos.

Ahora rómpelo. La forma obvia de gastar menos en un modelo de visión es pedir menos detalle, así que envía 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 detalle costó un 25 % más. No es un bug, y OpenAI lo dice en una línea de la tabla de tamaños: en esa familia de modelos, low usa un límite de 2048 píxeles con un presupuesto de 6,144 parches, mientras que high usa el mismo límite de píxeles con un presupuesto de 2,500 parches, «so it can use more tokens than high».7 La palabra low nombra un ajuste de fidelidad, no un precio: en dos de las cinco familias de modelos documentadas no compra ningún ahorro, y en una de esas dos cuesta más.

Todo hasta ahora ha sido un modelo leyendo una imagen. Hacer una funciona con un mecanismo que no tiene tokens en absoluto, y esa es la razón por la que se vende por imagen en lugar de por palabra.

Hacer una imagen: un precio por imagen es un precio por token

Enlace a la sección: Hacer una imagen: un precio por imagen es un precio por token

Los proveedores publican la generación de imágenes como un precio por imagen. No lo es. Los modelos GPT Image emiten image tokens especializados cuyo recuento depende del tamaño y la calidad solicitados; multiplica los recuentos publicados por la tarifa de salida de imagen publicada para GPT Image 1, $40 por millón, y compáralos con los precios por imagen de la misma página:

calidad1024 × 10241024 × 15361536 × 1024
baja272 tok → $0.0109 ($0.011)408 tok → $0.0163 ($0.016)400 tok → $0.0160 ($0.016)
media1,056 tok → $0.0422 ($0.042)1,584 tok → $0.0634 ($0.063)1,568 tok → $0.0627 ($0.063)
alta4,160 tok → $0.1664 ($0.167)6,240 tok → $0.2496 ($0.25)6,208 tok → $0.2483 ($0.25)

Nueve cifras derivadas frente a nueve publicadas, y cada par coincide con un margen inferior a $0.002.11 Google es aún más explícito y hace la conversión por ti en la propia página de precios: salida de imagen a $60 por millón de tokens, «output images at 1K (1024x1024px) consume 1120 tokens and are equivalent to $0.067 per image».12

Así que un precio por imagen es un precio por token con el recuento plegado dentro. Lo cual está bien, y oculta algo. Toma la tabla de la generación actual y divide hacia atrás:

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

La imagen más grande es la más barata en todas las calidades. Un lienzo de 1024 × 1536 tiene un 50 % más de píxeles que uno de 1024 × 1024 y cuesta un 23 % menos de tokens en calidad media. OpenAI lo señala en una frase que te saltarías: «a larger non-square resolution can sometimes produce fewer output tokens than a smaller or square resolution at the same quality setting», y en la generación anterior del modelo iba al revés, con el retrato costando un 50 % más que el cuadrado.11 Cada valor por defecto de 1024x1024 escrito antes de ese cambio es ahora la opción cara.

Sonido, facturado por segundo, carácter y token

Enlace a la sección: Sonido, facturado por segundo, carácter y token

Pide a tres productos que pronuncien los mismos 519 caracteres —unos 38 segundos de audio— y obtienes tres sistemas de unidades de dos proveedores:

modelounidadprecio
tts-1por carácter$15.00 por millón de caracteres → $0.007785
tts-1-hdpor carácter$30.00 por millón de caracteres → $0.015570
gemini-3.1-flash-ttspor audio token, 25 por segundo$20.00 por millón → $0.019319

El mismo proveedor vende ambas unidades: tts-1 de OpenAI tiene precio por millón de caracteres, mientras que gpt-4o-mini-tts tiene precio por millón de tokens, $0.60 de entrada y $12.00 de salida.13 Así que «el text-to-speech más barato» no es una pregunta con respuesta hasta que dices qué vas a pronunciar.

Y las dos unidades son ciegas a cosas opuestas. Un precio por carácter no puede ver la duración: elige una voz lenta y deliberada, o añade pausas, y la factura no se mueve mientras el audio se alarga. Un precio por segundo no puede ver el contenido: treinta segundos cuestan lo mismo si son un párrafo técnico denso o alguien contando hasta diez. Cambia la voz y exactamente uno de tus dos proveedores cambia el precio.

La transcripción va en la dirección contraria y es la línea más simple de toda la factura: por minuto de audio, plano:

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)

Fíjate en la última fila frente a la tercera: hacerlo en directo, a medida que llegan las palabras, cuesta 5,7 veces más que hacerlo sobre un archivo terminado. Esa brecha es el precio de no poder hacer batch, y es lo que encarece la siguiente sección.

Ahora el número que decide si la voz es una función o un producto.

La llamada: una conversación de soporte de diez turnos, 149 palabras, que a una velocidad declarada de 150 palabras por minuto son 59,6 segundos de habla: 21,2 hablados por quien llama, 38,4 devueltos como respuesta. Las conversiones a tokens son las de los propios proveedores. 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, en ambas direcciones, algo que su página de precios confirma al publicar $12.00 por millón y $0.018 por minuto en la misma línea.12

La conversación se acumula exactamente como dijo el capítulo 16, porque es el mismo mecanismo: «the entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive».14 Solo que ahora el historial se mide en audio tokens.

turnousuarioasistenteaudio nuevo entranteaudio en caché entranteaudio salientecoste
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

Ahora la comparación que decide el producto, las cuatro normalizadas a un minuto:

por minutofrente a texto
gpt-realtime-2.1, sin caché$0.13125937.9×
gpt-realtime-2.1, historial en caché$0.05742516.6×
gemini-3.1-flash-live, sin caché$0.0239656.9×
las mismas palabras tecleadas, gpt-5.6-terra$0.003461

Treinta y ocho veces. No treinta y ocho por ciento. El intercambio idéntico, llevado a cabo en sonido en lugar de texto, es casi dos órdenes de magnitud más caro, y nada de esa brecha es un margen que alguien haya decidido cobrar: es la tasa de conversión. Un segundo de audio del asistente son veinte tokens. Ese mismo segundo transporta 2,5 palabras a la velocidad declarada, y la transcripción medida da 1,26 tokens por palabra, así que como texto son 3,15 tokens. El sonido es un paquete 6,3 veces más voluminoso para el mismo significado, y cada uno de sus tokens se factura a 5,3 veces la tarifa de salida de texto y 16 veces la tarifa de entrada de texto. Multiplica una relación de volumen por una relación de precio y el orden de magnitud ya está ahí antes de que empiece cualquier contabilidad.

De la tabla salen directamente dos consecuencias operativas.

La caché de audio no es una optimización, es el modelo de negocio. La entrada de audio en caché cuesta $0.40 por millón frente a $32.00 fresca: un descuento del 98,75 % que reduce la llamada a la mitad. La regla es la del capítulo 16, sin cambios: la caché empareja un prefijo, así que cualquier cosa insertada al principio de la conversación en mitad de la llamada la destruye, y el lugar natural para poner «la persona que llama ya está verificada» es exactamente ahí.

Y nada de lo que hagas en el cliente desfactura un sonido. El usuario habla encima del asistente, tu código detiene la reproducción, el altavoz se calla. Todo lo que ya se había generado ya se había cobrado, porque la facturación se acumula cuando se crea la respuesta; y por la regla del capítulo 16, todo lo que permanece en la conversación se reenvía, como audio de entrada, en cada turno posterior. El capítulo 14 hizo este punto sobre abortar un stream de texto. En voz cuesta treinta veces más.

Vídeo, GPU-segundos y un precio que no es un precio

Enlace a la sección: Vídeo, GPU-segundos y un precio que no es un precio

Algunos proveedores venden vídeo por segundo y otros por clip, con tramos por resolución y a veces por duración. Esas dos formas no solo difieren en comodidad; se cruzan.

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

El proveedor por clip es más caro que el proveedor por segundo por debajo de 1,2 segundos y 16,7 veces más barato a los veinte. Ningún orden entre esos dos modelos sobrevive a un cambio en la duración del clip, así que «qué modelo de vídeo es más barato» no es una pregunta sobre modelos.

La última fila es peor, y es el corazón honesto del capítulo. mochi se factura contra segundos reales de GPU —el tiempo de predicción medido del trabajo— a $0.001400 por segundo en una A100 y $0.001525 en una H100, que son las tarifas de la máquina alquilada y nada más.15 Es una tarifa perfectamente precisa y no es un precio, porque la cantidad por la que multiplica se desconoce hasta después de que te hayas comprometido a pagarla. La fila de arriba asume doce GPU-segundos por segundo de salida; cuadruplica esa suposición y sale de la banda más barata, y solo a seis veces aterriza a mitad de tabla. Es la única tarifa de esta página que no puedes meter en un presupuesto.

Así que: tokens, image tokens, caracteres, minutos, segundos de vídeo, clips completos, GPU-segundos, unidades planas. Ocho magnitudes, y la única forma de ponerlas en un eje es declarar una carga de trabajo y ponerle precio.

Esa es la ampliación del computeCost del capítulo 16: la misma maquinaria de tramos, ahora con criterios que no son la longitud 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;
}

Las dos líneas marcadas son donde se rompe. Una tarifa cotizada por unidad multiplica u.images ?? 1; una tarifa cotizada por token multiplica algo que por defecto es cero. Alimenta ambas con un uso vacío —la forma que obtienes cuando falla una medición— y mira:

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

No pasó nada, seis veces, y costó tres dólares una vez y nada cinco veces. No es una diferencia de redondeo; es una decisión sobre qué significa un número ausente, tomada por separado para cada unidad y nunca escrita. La regla sensata es que un campo que nadie midió permanece ausente, porque «no medido» y «medido y salió cero» son cosas distintas. Esta función discrepa en silencio.

El segundo fallo es la duración. La tarifa por clip selecciona su tramo con maxDurationSeconds contra u.videoSeconds ?? 0, así que un uso que nunca registró duración coincide con el tramo más corto:

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

Cuarenta por ciento de descuento por no saber cuánto duraba el vídeo. Ambos bugs tienen la misma raíz: un valor por defecto elegido por comodidad dentro de una función cuyo trabajo entero es ser exacta.

Con los costes calculables, la comparación necesita la otra mitad: una carga de trabajo representativa declarada, una por motor, expuesta públicamente para que el lector pueda discrepar:

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 una de esas líneas es un argumento. El texto mezcla un cuarto de entrada y tres cuartos de salida porque el uso real se inclina hacia la salida; una mezcla al cincuenta por ciento clasifica los modelos de otra manera. La carga de trabajo de imagen asume 1,500 output tokens, entre los 1,056 de OpenAI para un cuadrado medio y sus 1,584 para un retrato medio. El vídeo asume cinco segundos a 1080p, y acabamos de ver que dos proveedores intercambian posiciones a 1,2 segundos. La entrada de cómputo asume sesenta GPU-segundos porque no hay nada más que asumir.

Ese es el método, y es el único honesto disponible: no puedes comparar precios en unidades distintas; solo puedes comparar el coste de una carga de trabajo que has escrito. Cualquier tabla que clasifique modelos multimodales sin imprimir su carga de trabajo está clasificando sus propias suposiciones.

Ahora puedes poner precio a cualquier cosa que un modelo pueda producir, en la unidad en que se venda, y decir en voz alta qué carga de trabajo asumió tu comparación. Eso cierra la factura que abrió el capítulo 16, y cierra la parte III: todo desde el capítulo 14 hasta aquí ha tratado de una llamada: cómo hacerla, qué meter en ella, cómo muestrearla, qué devuelve, cuánto cuesta.

El capítulo 22 cambia la unidad de análisis, y el cambio es caro. Un agent no es una llamada; es un bucle que decide por sí mismo cuántas llamadas hacer, y la aritmética de los dos últimos capítulos es lo que convierte eso de un diagrama de arquitectura en un presupuesto. Abre haciendo la misma pregunta al mismo modelo dos veces, con una tool añadida al catálogo la segunda vez, y midiendo qué hizo esa única tool: una llamada se convirtió en dos, treinta y nueve input tokens se convirtieron en 420.

Que eso lo convierta en un agent depende de cuál de dos definiciones publicadas abras, y no coinciden. Una de ellas no coincide consigo misma.


Cada precio, fórmula y tasa de conversión de este capítulo se leyó de la página del propio proveedor el 7 de septiembre de 2026 y se cita con esa fecha, porque todos se moverán. Los recuentos de tokens, costes y comparaciones se calcularon sobre esos datos con el código impreso arriba, en una máquina, sin hacer ninguna llamada de API de pago; que es también la razón honesta por la que no hay ni una sola afirmación de latencia en este capítulo.

Las funciones de image-token, las tablas de coste, el desglose de la llamada de voz y los resultados de uso vacío se produjeron con el TypeScript impreso en este capítulo, ejecutado en Node 22. El diálogo usado para la comparación de voz tiene 149 palabras y se tokenizó con tiktoken bajo la codificación o200k_base en 188 tokens; su duración sale de una velocidad declarada de 150 palabras por minuto, que es un parámetro de la comparación y no una medición. Cada cifra de proveedor lleva la nota al pie que nombra la página de la que procede.

  1. Dosovitskiy, A. et al. An Image Is Worth 16x16 Words: Transformers for Image Recognition at Scale. arXiv:2010.11929 (2020). Parches, la proyección lineal hacia la dimensión de embedding y los position embeddings que hacen legible la cuadrícula para un modelo de secuencia.

  2. Radford, A. et al. Learning Transferable Visual Models From Natural Language Supervision. arXiv:2103.00020 (2021). Entrenamiento contrastivo de un codificador de imágenes y un codificador de texto sobre 400 millones de pares, y el espacio compartido que todo lo posterior presupone.

  3. Alayrac, J.-B. et al. Flamingo: a Visual Language Model for Few-Shot Learning. arXiv:2204.14198 (2022). Codificador de visión congelado, modelo de lenguaje congelado, capas puente entrenadas: la arquitectura que convirtió la comprensión de imágenes en una capacidad de chat.

  4. Liu, H., Li, C., Wu, Q. and Lee, Y. J. Visual Instruction Tuning. arXiv:2304.08485 (2023). Una única proyección lineal como puente y datos de instrucciones generados como conjunto de entrenamiento; la razón por la que los modelos abiertos de visión-lenguaje convergieron en una forma.

  5. Anthropic, Vision, platform.claude.com/docs/en/build-with-claude/vision, consultado el 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.» También los dos tramos de resolución (estándar: lado largo de 1568 píxeles, 1568 visual tokens; alta resolución, en Claude 4.7 y posteriores: 2576 píxeles y 4784 tokens), la regla de reducción de tamaño y la tabla de seis filas de tamaños y recuentos de tokens reproducida arriba. Tarifas de modelo de Anthropic, Pricing, platform.claude.com/docs/en/about-claude/pricing, misma fecha: Claude Haiku 4.5 a $1 y $5 por millón de input y output tokens.

  6. Google, Image understanding, ai.google.dev/gemini-api/docs/image-understanding, consultado el 2026-09-07. «258 tokens if both dimensions <= 384 pixels. Larger images are tiled into 768x768 pixel tiles, each costing 258 tokens», con la fórmula de unidad de recorte —floor(min(width, height) / 1.5), dimensiones divididas por ella y multiplicadas entre sí— y el ejemplo resuelto de 960 × 540 que da 3 × 2 = 6 teselas. Google la llama «a rough formula»; la invariancia de escala derivada arriba es una propiedad de la fórmula tal como se publicó. La entrada de audio en la misma familia es de 32 tokens por segundo de audio (ai.google.dev/gemini-api/docs/audio, misma fecha).

  7. OpenAI, Images and vision, developers.openai.com/api/docs/guides/images-vision, consultado el 2026-09-07. Fuente de la regla basada en parches (parches de 32 × 32, patch_count = ceil(width/32)×ceil(height/32), la fórmula shrink_factor y su ajuste entero, el límite de rechazo de 30,000 parches); la tabla de tamaños de modelo, incluido que low en gpt-5.4 usa un límite de 2048 píxeles y un presupuesto de 6,144 parches «so it can use more tokens than high», frente al presupuesto de 2,500 parches de high; la tabla de multiplicadores (1.2 para las familias GPT-5.x, 1.62 para gpt-4.1-mini, 2.46 para gpt-4.1-nano); los dos ejemplos resueltos reproducidos arriba (1024 × 1024 → 1229 tokens, 2048 × 2048 → 3000 tokens); las reglas basadas en teselas para modelos anteriores (base más teselas de 512 píxeles, 85 + 170 en gpt-4o); y la lista de limitaciones citada en el recuadro de visión. 2

  8. Ho, J., Jain, A. and Abbeel, P. Denoising Diffusion Probabilistic Models. arXiv:2006.11239 (2020). El calendario de ruido hacia delante, la reparametrización que convierte el objetivo en predecir el ruido añadido y el bucle de muestreo.

  9. Rombach, R., Blattmann, A., Lorenz, D., Esser, P. and Ommer, B. High-Resolution Image Synthesis with Latent Diffusion Models. arXiv:2112.10752 (2022). Ejecutar el proceso de difusión en un espacio latente comprimido, que es lo que hizo el número fijo de pasos lo bastante asequible como para venderlo por imagen.

  10. Prince, S. J. D. Understanding Deep Learning (MIT Press, 2023), capítulo 18. La delegación declarada para todo lo que este capítulo se saltó sobre difusión: la cota variacional, los calendarios de ruido, classifier-free guidance y las familias de samplers. Hu, E. et al., LoRA: Low-Rank Adaptation of Large Language Models, arXiv:2106.09685 (2021), es el adaptador en sí, introducido en el capítulo 11 sobre un modelo de lenguaje y usado aquí sobre un modelo de imagen sin cambio de matemáticas. Radford, A. et al., Robust Speech Recognition via Large-Scale Weak Supervision (Whisper), arXiv:2212.04356 (2022), es el modelo de transcripción cuyo precio por minuto aparece arriba.

  11. OpenAI, Image generation, developers.openai.com/api/docs/guides/image-generation, Pricing, developers.openai.com/api/docs/pricing, y la página del modelo para gpt-image-1, todas consultadas el 2026-09-07. La página del modelo para gpt-image-2 no incluye sección de precios; sus tarifas vienen de la página de precios anterior. La página de GPT Image 1 publica entrada de texto a $5.00, entrada de imagen a $10.00 y salida de imagen a $40.00 por millón de tokens junto a la tabla por imagen usada en la derivación de arriba. También: la tabla de output tokens para modelos anteriores a gpt-image-2 (272 / 408 / 400 bajo, 1056 / 1584 / 1568 medio, 4160 / 6240 / 6208 alto, para cuadrado, retrato y paisaje); las tablas de precios por imagen para GPT Image 2, 1.5, 1 y 1 Mini usadas en las derivaciones anteriores; 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 de que cada imagen parcial en streaming cuesta 100 image output tokens extra; y las tarifas de gpt-image-2 de $8.00 image input, $2.00 cached image input, $30.00 image output y $5.00 text input por millón de tokens. Tarifas de modelos de texto usadas para las comparaciones: gpt-5.6-terra a $2.00 entrada, $0.20 cached input y $12.00 salida, gpt-5.6-luna a $0.20 y $1.20, tramo estándar, context corto. Vídeo: sora-2 a $0.10 por segundo a 720p y sora-2-pro a $0.30, $0.50 y $0.70 a 720p, 1024p y 1080p. Transcripción: $0.006, $0.0045, $0.003 y $0.017 por minuto para gpt-4o-transcribe, gpt-transcribe, gpt-4o-mini-transcribe y gpt-live-transcribe. 2

  12. Google, Gemini Developer API pricing, ai.google.dev/gemini-api/docs/pricing, consultado el 2026-09-07. Gemini 3.1 Flash-Lite a $0.25 por millón de input tokens (texto, imagen y vídeo) y $1.50 de salida. Gemini 3.1 Flash Image: salida de imagen a $60 por millón de tokens, con las equivalencias publicadas de 747, 1120, 1680 y 2520 tokens para imágenes de 0.5K, 1K, 2K y 4K y sus precios por imagen de $0.045, $0.067, $0.101 y $0.151. Gemini 3.1 Flash TTS: $1.00 de entrada de texto, $20.00 de salida de audio, «audio tokens correspond to 25 tokens per second of audio». Gemini 3.1 Flash Live Preview: $0.75 texto y «$3.00 or $0.005/min» entrada de audio, «$4.50 (text) $12.00 or $0.018/min (audio)» salida. Veo 3.1 por segundo con audio: $0.40 a 720p y 1080p y $0.60 a 4K estándar; $0.10, $0.12 y $0.30 rápido. Gemini Omni Flash factura la salida de vídeo «at a rate of 5,792 tokens per second of 720p video», que la misma nota convierte en unos $0.10 por segundo: la declaración publicada más clara de que un precio de medios por segundo es un precio por token. 2

  13. Páginas de modelo de OpenAI para tts-1, tts-1-hd y gpt-4o-mini-tts, developers.openai.com/api/docs/models, consultadas el 2026-09-07. tts-1 a $15.00 y tts-1-hd a $30.00 por millón de caracteres; gpt-4o-mini-tts a $0.60 por millón de text input tokens y $12.00 por millón de audio output tokens: el mismo proveedor, la misma operación, dos unidades.

  14. OpenAI, Managing costs (Realtime API), developers.openai.com/api/docs/guides/realtime-costs, consultado el 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.» También: «The entire conversation is sent to the model for each Response... thus turns later in the session will be more expensive»; los costes se acumulan cuando se crea una Response; el ejemplo resuelto de dos turnos cuya acumulación reproduce la tabla de arriba; y el payload de uso response.done con sus divisiones input_token_details y output_token_details. Tarifas de la página de precios, misma fecha: audio gpt-realtime-2.1 a $32.00 entrada, $0.40 cached input y $64.00 salida por millón de tokens, texto a $4.00, $0.40 y $24.00, image input a $5.00. 2

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

¿Listo para dejar que elija LIA?

Crea con todos los modelos de IA en un mismo sitio. Empieza gratis hoy.