Chat

Afbeeldingen, PDF's, audio en video als invoer

Voeg afbeeldingen, PDF’s, audio en video toe aan een bericht voor modellen die ze kunnen lezen. Stuur het bestand zelf (base64) of een link: we halen links zelf op, dus elke openbare https-link naar een bestand tot 20 MB werkt.

In één oogopslag

Te versturen/v1/chat/completions (every model)/v1/messages (Claude)Formaten
Een afbeeldingimage_url-onderdeelimage-blokPNG, JPEG, WebP, GIF
Een PDFfile-onderdeeldocument-blokPDF
Een opnameinput_audio-onderdeelClaude kan geen audio beluisterenWAV, MP3
Een videovideo_url-onderdeelClaude kan geen video bekijkenMP4, MOV, WebM
Tekst, code, CSV, Word, ExcelDe tekst zelf, in het berichtEen text-blok, of een document met platte tekstTekst

Elk onderdeel accepteert een openbare https-link of het bestand zelf als base64-data-URL, zoals data:application/pdf;base64,JVBERi0.... Je kunt meerdere bestanden in één bericht meesturen, in elke combinatie die het model kan lezen.

Welke modellen wat kunnen lezen

Elk chatmodel kan tekst lezen. Deze tabel is actueel: je ziet wat elk model op dit moment kan lezen. Krijgt een model iets dat het niet kan lezen, dan weigert het dit direct met unsupported_content. Zo geeft het nooit antwoord over een bestand dat het niet heeft gezien.

Afbeeldingen

Voeg een image_url-onderdeel toe met een link of een data-URL. PNG, JPEG, WebP en GIF. Meerdere afbeeldingen in één bericht werken bij elk model dat afbeeldingen kan lezen.

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)

Om een bestand vanaf schijf te versturen, codeer je het met base64 als 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) wordt doorgegeven aan modellen die dit gebruiken.

PDF's

Voeg een file-onderdeel toe met de PDF als data-URL in file_data, plus de bestandsnaam. Modellen lezen de tekst en, waar mogelijk, de pagina's als afbeeldingen (grafieken, scans, tabellen). Een openbare link werkt ook in 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)

Lange PDF's kosten inputtokens per pagina (zie de uitleg over kosten hieronder), dus stuur alleen de pagina's die je nodig hebt. Stel vragen over meerdere documenten tegelijk door voor elk document een file-onderdeel toe te voegen, met namen die ze van elkaar onderscheiden.

Word, Excel, tekst en code

Modellen lezen PDF's, geen Word-, Excel- of PowerPoint-bestanden. Zet tekst, CSV, JSON, Markdown of code direct als tekst in het bericht: dit wordt als gewone inputtokens in rekening gebracht en is wat het model het beste kan lezen. Is de opmaak belangrijk (tabellen, grafieken, scans), exporteer het bestand dan naar PDF en stuur die mee. Een data-URL van een ander type, zoals text/plain, wordt geweigerd met een foutmelding die dit aangeeft.

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

Voor modellen die audio kunnen beluisteren (zie de tabel): een input_audio-onderdeel met de base64-audio en het formaat, wav of mp3. input_audio accepteert de audio zelf; gebruik voor een link een file-onderdeel met de link in file_data. Opnames uit een browser zijn meestal WebM, wat als video wordt gelezen: converteer ze naar MP3 of WAV voor modellen die alleen audio kunnen beluisteren.

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)

Video

Voor modellen die video kunnen bekijken: een video_url-onderdeel met een link of een data-URL (een file-onderdeel werkt ook). MP4, MOV en WebM. Modellen die audio ondersteunen, beluisteren ook het geluidsspoor, dus je kunt vragen wat er wordt gezegd.

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)

Een clip vanaf schijf verstuur je op dezelfde manier, als 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}},
]

Eén formaat erin, het juiste formaat eruit

Labs accepteren media in verschillende formaten (een video kan een video_url-, image_url- of file-onderdeel zijn, afhankelijk van wiens documentatie je leest). Stuur ze gerust allemaal: wij geven elk model de media in het formaat dat het kan lezen.

Meerdere bestanden in één bericht

Voeg voor elk bestand een onderdeel toe, in de volgorde waarin je ze wilt laten lezen, en verwijs er in je tekst naar op volgorde van naam (“de tweede afbeelding”, “contract.pdf”). Je kunt afbeeldingen, PDF's, audio en video combineren, zolang het model elk type kan lezen. Tussen bestanden kun je tekstonderdelen plaatsen om ze te benoemen.

  • Links moeten openbare https-URL's zijn. We volgen maximaal drie omleidingen en wachten maximaal 20 seconden.
  • Als downloaden via een link niet lukt, wordt deze direct geweigerd met invalid_url en de ontvangen status, voordat er een model wordt aangeroepen.
  • Ondertekende links (S3, Cloud Storage, onze eigen afbeeldingslinks) werken zolang ze geldig zijn.

Anthropic-formaat

Op /v1/messages accepteren Claude-modellen de blokken van Anthropic: image en document, met een base64- of url-bron. Sommige Claude-modellen lezen PDF's alleen via /v1/chat/completions; stuur je er een naar /v1/messages, dan geeft de foutmelding aan waar je die wel naartoe moet sturen.

Inhoudsblokken
[
{ "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." }
]

Limieten

LimietWaarde
Eén bestand20 MB
Alle media in één verzoek30 MB
Requestbody (base64 voegt ongeveer een derde toe)25 MB
Mediaonderdelen per verzoek100
Links per verzoek20

Stuur voor grotere bestanden een link: die telt niet mee voor de verzoekbody. Bestanden die naar de eigen Files API van een lab (file_id) zijn geüpload, kun je niet gebruiken; stuur het bestand of een link.

Fouten

StatusFoutWanneer
400unsupported_contentHet model kan dit bestandstype niet lezen. Kies in de tabel hierboven een model dat dit wel kan.
400invalid_urlEen link kon niet worden gedownload. De melding geeft aan waarom (de status, een time-out, geen mediabestand).
400invalid_request_errorEen onderdeel is geen data-URL of https-link, is leeg of heeft een type dat modellen niet kunnen lezen (Word, platte tekst).
413invalid_request_errorEen bestand groter dan 20 MB, meer dan 30 MB aan media of een verzoekbody groter dan 25 MB.

De eerste twee zijn de code van de fout; de andere zijn de type, met een melding die aangeeft wat je moet aanpassen. Ze komen allemaal terug voordat een model wordt aangeroepen en kosten dus niets. Zie Fouten voor de overige fouten.

Hoe media worden berekend

Modellen zetten media om in inputtokens, die tegen het inputtarief van het model worden berekend. Elk lab telt op zijn eigen manier; dit zijn gangbare waarden die we hebben gemeten:

ClaudeGPTGemini
Een afbeelding van 1024 × 1024ongeveer 1,400 tokensongeveer 1,250 tot 1,650ongeveer 1,100
Een grote foto (12 MP)tot ongeveer 4,800schaalt met het aantal pixelsongeveer 1,100 tot 1,200
Eén PDF-paginaongeveer 1,600 tot 2,500de tekst op de paginaongeveer 560
Eén seconde audioniet gelezenniet gelezenongeveer 25
Eén seconde videoniet gelezenniet gelezenongeveer 100 tot 300

Je verzoeklog toont precies wat voor elk verzoek is meegeteld. Afbeeldingen verkleinen tot het formaat dat je nodig hebt, is de makkelijkste besparing: de meeste modellen lezen een afbeelding van 1024 px even goed als een van 4000 px.

Stuur je dezelfde afbeelding van hetzelfde document in veel verzoeken? Zet die vroeg in het gesprek en houd dat begin hetzelfde: modellen met promptcaching berekenen herhaalde input tegen hun cachetarief.

Vragen, of ontbreekt er iets? Vraag het ons supportteam en je krijgt antwoord per e-mail, meestal binnen een minuut.