Guía10 min

Entradas multimodales en agentes: imagen cruda, caption u OCR, no el PDF entero

Resumen

Un screenshot o un PDF no es un string. OpenAI tokeniza por parches 32×32, Claude por 28×28 y Gemini cobra 258 tokens por tile. Esta guía fija tres representaciones —píxeles, caption, texto extraído—, resize antes de enviar, PDFs por índice de páginas y PII visual fuera del prompt.

OpenAIAnthropicGemini
Tres caminos de una imagen hacia el agente: píxeles recortados, caption corto y texto OCR

Qué resuelve

Esta pieza se queda en la decisión práctica: qué instalar, qué riesgo agrega y cómo aplicarlo sin romper operación.

Meter un PNG de 4K o un PDF de 80 páginas en el siguiente turno no es “darle contexto”. Es pagar visión, quemar ventana y, si el archivo trae un DPI o un recibo, filtrar PII. OpenAI (Images and vision, 2026-09-06): las imágenes cuentan como tokens. Claude: cada parche visual es 28×28 px. Gemini: 258 tokens si ambos lados caben en 384 px; si no, tiles de 768×768.

Esto no recorta el tool_result —eso vive en truncar resultados—. Aquí el contrato es qué representación entra al modelo antes de que exista un result.

Fuentes verificadas el 6 de septiembre de 2026.

Una línea

Nunca pases el archivo crudo “por si acaso”. Elige cruda, caption u OCR. Recorta. Indexa el PDF. Redacta PII visual.

Tres representaciones (elige una por turno)

RepresentaciónQué esCuándoQué no es
Crudaimage / input_image / inlineData con píxelesCoordenadas, layout, “haz clic aquí”, OCR de un recorteMemoria de sesión. No reenvíes el mismo 4K cada turno.
Caption1–3 frases estructuradas que escribió tu pipeline, no el LLM a ciegasHistorial, handoff, “el usuario mandó un ticket con foto de error 502”Sustituto de OCR. Un caption no cita un número de factura.
OCR / extractTexto + bbox o pageBúsqueda, RAG, reglas, PII en textoFoto. Si el modelo necesita ver la tabla, manda el recorte, no las 40 páginas.

El agente elige con un enum, no con un “adjunta todo”:

type VisualIn = {
  kind: "raw" | "caption" | "ocr";
  mime?: "image/jpeg" | "image/png" | "image/webp";
  bytes?: Buffer;      // solo kind=raw, ya resize
  caption?: string;    // ≤ 400 chars
  text?: string;       // OCR, ya redactado
  page?: number;       // PDF
};

Si la tool de visión ya corrió, el siguiente turno lleva caption u OCR. Reenviar la cruda es un leak de presupuesto, no de “calidad”.

Resize y recorte: el modelo ya lo hace, peor

OpenAI (tabla Model sizing behavior): detail vale low / high / original / auto (default auto). En gpt-5.6-sol / terra / luna, low cabe en 512×512; high en 2048×2048 y 2.500 parches; original conserva tamaño salvo un lado > 65.535 px. Si tras el resize hay más de 30.000 parches 32×32, la API rechaza: no achica para entrar. OCR, objetos chicos y computer-use: detail: "original" cuando el modelo lo soporta, y recorta tú antes para que las coordenadas coincidan con tu bitmap.

Claude: techo 8.000×8.000 px; 10 MB base64 en la API (5 MB en Bedrock / Google Cloud). Más de 20 image/document en el request: techo extra de 2.000 px por lado o invalid_request_error de many-image requests. Tokens: ⌈ancho/28⌉ × ⌈alto/28⌉. Claude 4.7+ high-resolution: lado largo 2.576 px, tope 4.784 tokens visuales; el resto, 1.568 px / 1.568 tokens. Un 3840×2160 baja a 1.456×819 (1.560 tokens) en estándar, o 2.576×1.449 (4.784) en high-res. Computer-use: un tool_result que exceda el techo se rechaza, no se escala.

Gemini: MIME image/png, jpeg, webp, heic, heif. Máximo 3.600 archivos por request. 258 tokens si ambos lados ≤ 384 px; si no, tiles 768×768 a 258 c/u. Gemini 3 añade media_resolution como techo de tokens por imagen/frame. Tip oficial: con una sola imagen, el texto va antes en el array. Claude recomienda lo contrario (imagen, luego texto). No copies el orden de un proveedor al otro.

Contrato del adapter: tú resize. JPEG/WebP con q razonable. Recorte al ROI (error, tabla, DPI). Nada de EXIF al prompt: Claude no lee metadata; eso no es un redact.

Pipeline de tres representaciones: píxeles recortados, caption y texto OCR

PDFs: índice, no el binario

Claude PDF support (2026-09-06): request ≤ 32 MB; 600 páginas (100 si la ventana del request es < 1M tokens); PDF estándar, sin password. Tres fuentes: URL, base64 en document, o file_id de Files API. Cada página se procesa como imagen. Un PDF denso llena la ventana antes del tope de páginas. Bedrock Converse sin citations = solo texto; sin el flag, Claude “no ve” charts.

No mandes el archivo entero “porque cabe”. El adapter:

  1. Cuenta páginas (o las primeras N si el parser falla).
  2. Extrae texto por página cuando hay capa de texto.
  3. Si el usuario pregunta por “la tabla de la p. 12”, manda esa página (o un recorte), no 1–80.
  4. Si no hay pregunta espacial, manda OCR/extract, no visión.
  5. Files API / file_id para no repetir 20 MB en cada turno.

OpenAI: PNG/JPEG/WEBP/GIF no animado; payload hasta 512 MB y 1.500 imágenes/request. Eso no es permiso para 1.500 screenshots de un mismo PDF.

PII visual (distinto de regex)

Detectar PII en texto no ve un DPI fotografiado. Antes de kind: "raw":

  • Caras, documentos de identidad, tarjetas, recibos, pizarras con nombres.
  • Si el caso no necesita la foto, usa caption (“usuario envió foto de DPI; no se reenvía”).
  • Si necesita un recorte (monto, error de UI), crop + redact del resto.
  • Logs y memoria: guarda hash + caption, no el blob. Ver también evitar fugas.

Claude se niega a nombrar personas en fotos (AUP). No construyas un agente de “quién es”. Exactitud baja en imágenes < 200 px, rotadas o borrosas: no es un OCR de producción.

Tabla rápida de techos (hoy)

OpenAI visiónClaude visiónGemini imagen
FormatosPNG, JPEG, WEBP, GIF estáticoJPEG, PNG, GIF, WebPPNG, JPEG, WEBP, HEIC, HEIF
Conteo1.500 / request100 (200k ctx) / 600 (otros); 20 en claude.ai3.600 / request
Tokenizaciónparches 32×32; tope 30k/imagenparches 28×28; downscale a 1568 o 2576258 si ≤384 px; si no, tiles 768
Detalledetail: low/high/original/autoautomático por modelo; oversized_image: error para no downscalemedia_resolution (Gemini 3)
PDFno es este endpointdocument, 600 págs, 32 MBFile API / document (otra guía)

Los números cambian. El contrato no: medir tokens de visión en el adapter, no “confiar en que el modelo recorta”.

Checklist

  1. El turno pide una representación. Default: caption.
  2. Cruda solo con ROI + resize al techo del proveedor.
  3. detail: original (OpenAI) o high-res (Claude 4.7+) solo si hay OCR/coordenadas.
  4. PDF: índice + página, nunca el binario completo en el loop.
  5. PII visual redactada antes del proveedor. Cero blob en system/logs.
  6. No reenvíes la misma cruda el turno siguiente.
  7. Orden del content: Claude imagen→texto; Gemini texto→imagen.

FAQ

¿Puedo mandar el screenshot original “por si el modelo lo necesita”? No. Eso es el anti-patrón. Si más tarde hace falta un recorte, la tool de visión lo pide con bbox.

¿El caption lo escribe el mismo modelo de producción? Mejor un paso barato (modelo pequeño o OCR) con schema. El caption es dato, no prosa.

¿Y si el PDF no tiene capa de texto? Visión por página seleccionada, no las 600. Downsample imágenes embebidas; Claude lo dice: requests grandes fallan antes del tope de páginas.

¿Esto reemplaza RAG? No. El extract indexable va a retrieval. La cruda no se embebe “tal cual” en cada query.

Si estás armando el loop, sigue el hub de construcción y el curso. El archivo entra al agente como un tipo, no como un adjunto de chat.

Escudo de recorte y redacción antes de enviar una foto al modelo