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.

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ón | Qué es | Cuándo | Qué no es |
|---|---|---|---|
| Cruda | image / input_image / inlineData con píxeles | Coordenadas, layout, “haz clic aquí”, OCR de un recorte | Memoria de sesión. No reenvíes el mismo 4K cada turno. |
| Caption | 1–3 frases estructuradas que escribió tu pipeline, no el LLM a ciegas | Historial, handoff, “el usuario mandó un ticket con foto de error 502” | Sustituto de OCR. Un caption no cita un número de factura. |
| OCR / extract | Texto + bbox o page | Búsqueda, RAG, reglas, PII en texto | Foto. 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.

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:
- Cuenta páginas (o las primeras N si el parser falla).
- Extrae texto por página cuando hay capa de texto.
- Si el usuario pregunta por “la tabla de la p. 12”, manda esa página (o un recorte), no 1–80.
- Si no hay pregunta espacial, manda OCR/extract, no visión.
- Files API /
file_idpara 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ón | Claude visión | Gemini imagen | |
|---|---|---|---|
| Formatos | PNG, JPEG, WEBP, GIF estático | JPEG, PNG, GIF, WebP | PNG, JPEG, WEBP, HEIC, HEIF |
| Conteo | 1.500 / request | 100 (200k ctx) / 600 (otros); 20 en claude.ai | 3.600 / request |
| Tokenización | parches 32×32; tope 30k/imagen | parches 28×28; downscale a 1568 o 2576 | 258 si ≤384 px; si no, tiles 768 |
| Detalle | detail: low/high/original/auto | automático por modelo; oversized_image: error para no downscale | media_resolution (Gemini 3) |
| no es este endpoint | document, 600 págs, 32 MB | File 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
- El turno pide una representación. Default: caption.
- Cruda solo con ROI + resize al techo del proveedor.
detail: original(OpenAI) o high-res (Claude 4.7+) solo si hay OCR/coordenadas.- PDF: índice + página, nunca el binario completo en el loop.
- PII visual redactada antes del proveedor. Cero blob en system/logs.
- No reenvíes la misma cruda el turno siguiente.
- 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.

Lecturas relacionadas
Sigue explorando Agentes Multimodales y otras piezas para builders.

SLO y error budget en agentes: 4 SLIs, burn rápido/lento y política 50/100

De error de producción a eval: el flywheel que alimenta el dataset

Consumir agentes externos con A2A: comprar, no criar
