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
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 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)Om een bestand vanaf schijf te versturen, codeer je het met base64 als 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) 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, 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)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 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
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, 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)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 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)Een clip vanaf schijf verstuur je op dezelfde manier, als 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}},]Eén formaat erin, het juiste formaat eruit
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
- 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_urlen 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.
[ { "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
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
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:
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.
Vragen, of ontbreekt er iets? Vraag het ons supportteam en je krijgt antwoord per e-mail, meestal binnen een minuut.