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
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 osfrom openai import OpenAIclient = 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, osfrom openai import OpenAIclient = 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, osfrom openai import OpenAIclient = 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 osfrom pathlib import Pathfrom openai import OpenAIclient = 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, osfrom openai import OpenAIclient = 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 osfrom openai import OpenAIclient = 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:
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
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.
Enlaces
- Los enlaces deben ser URLs
httpspúblicas. Seguimos hasta tres redirecciones y esperamos hasta 20 segundos. - Un enlace que no se descarga se rechaza de inmediato con
invalid_urly 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.
[ { "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
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
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:
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.
¿Tienes dudas o falta algo? Escribe a nuestro equipo de soporte y te responderemos por email, normalmente en menos de un minuto.