Chat

Entrada de imágenes, PDF, audio y de video

Incluye imágenes, PDFs, audio y vídeo en un mensaje para los modelos que los leen. Envía el archivo en sí (base64) o un enlace: nosotros descargamos los enlaces, así que sirve cualquier enlace https público a un archivo de hasta 20 MB.

De un vistazo

Para enviar/v1/chat/completions (every model)/v1/messages (Claude)Formatos
Una imagenparte image_urlbloque imagePNG, JPEG, WebP, GIF
Un PDFparte filebloque documentPDF
Una grabaciónparte input_audioClaude no oye audioWAV, MP3
Un vídeoparte video_urlClaude no ve vídeoMP4, MOV, WebM
Texto, código, CSV, Word, ExcelEl texto en sí, en el mensajeUn bloque text, o un document de texto planoTexto

Cada parte acepta un enlace https público o el archivo en sí como data URL base64, por ejemplo data:application/pdf;base64,JVBERi0.... Puedes enviar varios archivos en un mismo mensaje, en cualquier combinación que lea el modelo.

Qué lee cada modelo

Todos los modelos de chat leen texto. Esta tabla está en vivo: muestra lo que lee hoy cada modelo. Si a un modelo le das algo que no lee, lo rechaza al instante con unsupported_content, así que nunca responde sobre un archivo que no ha visto.

Imágenes

Añade una parte image_url con un enlace o una data URL. PNG, JPEG, WebP y GIF. Varias imágenes en un mismo mensaje funcionan en todos los modelos que leen imágenes.

import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.zurelay.com/v1",
api_key=os.environ["ZURELAY_API_KEY"],
)
response = client.chat.completions.create(
model="gemini-3.7-flash",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "What's in this picture? One sentence."
},
{
"type": "image_url",
"image_url": {
"url": "https://zurelay.com/examples/gpt-image-2.5-flare/watch-800.webp"
}
}
]
}
],
)
print(response.choices[0].message.content)

Para enviar un archivo del disco, codifícalo en base64 como data URL:

import base64, os
from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])
with open("receipt.jpg", "rb") as f:
data_url = "data:image/jpeg;base64," + base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="claude-sonnet-5-5",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "What's the total on this receipt?"},
{"type": "image_url", "image_url": {"url": data_url}},
],
}],
)
print(response.choices[0].message.content)

detail (low, high, auto) se transmite tal cual a los modelos que lo usan.

PDFs

Añade una parte file con el PDF como data URL en file_data, junto con su nombre de archivo. Los modelos leen el texto y, cuando pueden, las páginas como imágenes (gráficos, escaneos, tablas). Un enlace público también funciona en file_data.

import base64, os
from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])
with open("contract.pdf", "rb") as f:
pdf = "data:application/pdf;base64," + base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="gemini-3.7-flash",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Who are the parties, and how can the contract be ended?"},
{"type": "file", "file": {"filename": "contract.pdf", "file_data": pdf}},
],
}],
)
print(response.choices[0].message.content)

Los PDFs largos cuestan tokens de entrada por página (consulta la facturación más abajo), así que envía solo las páginas que necesites. Para preguntar por varios documentos a la vez, añade una parte file por cada uno, con nombres que los distingan.

Word, Excel, texto y código

Los modelos leen PDFs, no archivos de Word, Excel o PowerPoint. Pon el texto, CSV, JSON, Markdown o código directamente en el mensaje como texto: se factura como tokens de entrada normales y es lo que mejor lee el modelo. Cuando el diseño importa (tablas, gráficos, escaneos), exporta el archivo a PDF y envíalo. Una data URL de cualquier otro tipo, como text/plain, se rechaza con un error que lo indica.

import os
from pathlib import Path
from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])
notes = Path("meeting-notes.md").read_text()
sales = Path("sales.csv").read_text()
response = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{
"role": "user",
"content": f"Summarize the notes, then total the sales by region.\n\n"
f"<notes>\n{notes}\n</notes>\n\n<sales>\n{sales}\n</sales>",
}],
)
print(response.choices[0].message.content)

Audio

Para los modelos que oyen (consulta la tabla): una parte input_audio con el audio en base64 y su formato, wav o mp3. input_audio acepta el audio en sí; para un enlace, usa una parte file con el enlace en file_data. Las grabaciones hechas en un navegador suelen ser WebM, que se lee como vídeo: conviértelas a MP3 o WAV para los modelos que solo oyen.

import base64, os
from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])
with open("call.mp3", "rb") as f:
audio = base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="gemini-3.7-flash",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Transcribe this call, then list the action items."},
{"type": "input_audio", "input_audio": {"data": audio, "format": "mp3"}},
],
}],
)
print(response.choices[0].message.content)

Vídeo

Para los modelos que ven vídeo: una parte video_url con un enlace o una data URL (una parte file también sirve). MP4, MOV y WebM. Los modelos con sonido leen también la pista de audio, así que puedes preguntar qué se dice.

import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.zurelay.com/v1",
api_key=os.environ["ZURELAY_API_KEY"],
)
response = client.chat.completions.create(
model="gemini-3.7-flash",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "Describe what happens, and transcribe anything that's said."
},
{
"type": "video_url",
"video_url": {
"url": "https://example.com/clip.mp4"
}
}
]
}
],
)
print(response.choices[0].message.content)

Un clip del disco se envía igual, como data URL:

Python
with open("clip.mp4", "rb") as f:
video = "data:video/mp4;base64," + base64.b64encode(f.read()).decode()
content = [
{"type": "text", "text": "What happens in this clip?"},
{"type": "video_url", "video_url": {"url": video}},
]

Una forma de entrada, la forma correcta de salida

Cada laboratorio recibe los archivos multimedia en formas distintas (un video puede ser una parte video_url, image_url o file, según la documentación que leas). Envía cualquiera de ellas: nosotros le damos a cada modelo sus archivos multimedia en la forma que lee.

Varios archivos en un solo mensaje

Agrega una parte por cada archivo, en el orden en que quieres que se lean, y refiérete a ellos en tu texto por orden o por nombre (“la segunda imagenn”, “contrato.pdf”). Puedes combinar imágenes, PDFs, audio y video siempre que el modelo lea cada tipo. Las partes de texto pueden ir entre archivos para etiquetarlos.

  • Los enlaces deben ser URLs https públicas. Seguimos hasta tres redirecciones y esperamos hasta 20 segundos.
  • Un enlace que no se descarga se rechaza de inmediato con invalid_url y el estado que respondió, antes de llamar a ningún modelo.
  • Los enlaces firmados (S3, Cloud Storage, nuestros propios enlaces de imágenes) funcionan mientras sean válidos.

Formato Anthropic

En /v1/messages, los modelos de Claude aceptan los bloques de Anthropic: image y document, con un origen base64 o url. Algunos modelos de Claude solo leen PDFs mediante /v1/chat/completions; si envías uno a /v1/messages, el error indica dónde enviarlo en su lugar.

Bloques de contenido
[
{ "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": "iVBORw0KGgo..." } },
{ "type": "document", "source": { "type": "url", "url": "https://example.com/report.pdf" } },
{ "type": "document", "source": { "type": "base64", "media_type": "application/pdf", "data": "JVBERi0..." } },
{ "type": "text", "text": "Compare the chart with the report's conclusion." }
]

Límites

LímiteValor
Un archivo20 MB
Todos los archivos multimedia en una solicitud30 MB
Cuerpo de la solicitud (base64 agrega cerca de un tercio)25 MB
Partes multimedia por solicitud100
Enlaces por solicitud20

Para archivos más grandes, envía un enlace: no cuenta para el cuerpo de la solicitud. Los archivos subidos a la Files API del propio laboratorio (file_id) no se pueden usar; envía el archivo o un enlace en su lugar.

Errores

EstadoErrorCuándo
400unsupported_contentEl modelo no lee ese tipo de archivo. Elige uno que sí lo haga de la tabla anterior.
400invalid_urlUn enlace no se descargó. El mensaje indica por qué (su estado, un tiempo de espera agotado, no es un archivo multimedia).
400invalid_request_errorUna parte no es una URL de datos ni un enlace https, está vacía, o es de un tipo que los modelos no leen (Word, texto sin formato).
413invalid_request_errorUn archivo de más de 20 MB, más de 30 MB de archivos multimedia, o un cuerpo de solicitud de más de 25 MB.

Los dos primeros son el code del error; los demás son su type, con un mensaje que indica qué cambiar. Todos se devuelven antes de llamar a ningún modelo, así que no tienen costo. Consulta Errores para el resto.

Cómo se facturan los archivos multimedia

Los modelos convierten los archivos multimedia en tokens de entrada, facturados al precio de entrada del modelo. Cada laboratorio los cuenta a su manera; estas son cifras típicas que medimos:

ClaudeGPTGemini
Una imagen de 1024 × 1024unos 1.400 tokensentre unos 1.250 y 1.650unos 1.100
Una foto grande (12 MP)hasta unos 4.800varía según los píxelesentre unos 1.100 y 1.200
Una página de PDFentre 1.600 y 2.500el texto de la páginaunos 560
Un segundo de audiono se leeno se leeunos 25
Un segundo de vídeono se leeno se leeunos 100 a 300

El registro de solicitudes muestra exactamente qué contó cada una. Reducir las imágenes al tamaño que necesitas es el ahorro más fácil: la mayoría de los modelos leen igual de bien una imagenn de 1024 px que una de 4000 px.

¿Envías la misma imagenn o el mismo documento en muchas solicitudes? Colócalo al principio de la conversación y mantén ese prefijo igual: los modelos con caché de prompt facturan la entrada repetida a su precio en caché.

¿Tienes dudas o falta algo? Escribe a nuestro equipo de soporte y te responderemos por email, normalmente en menos de un minuto.