Chat
Bilder, PDFs, Audio- und Videoeingaben
Füge Bildern, PDFs, Audio und Videos zu Nachrichten hinzu, wenn das Modell sie verarbeiten kann. Sende die Datei selbst (base64) oder einen Link: Wir rufen Links selbst ab, daher funktioniert jeder öffentliche https-Link zu einer Datei mit bis zu 20 MB.
Auf einen Blick
Jeder Teil akzeptiert einen öffentlichen https-Link oder die Datei selbst als base64-Daten-URL, zum Beispiel data:application/pdf;base64,JVBERi0.... Du kannst mehrere Dateien in einer Nachricht kombinieren, sofern das Modell sie verarbeiten kann.
Welche Modelle was verarbeiten
Jedes Chat-Modell verarbeitet Text. Diese Tabelle ist live und zeigt, was die einzelnen Modelle aktuell verarbeiten können. Erhält ein Modell etwas, das es nicht verarbeiten kann, lehnt es die Anfrage sofort mit unsupported_content ab. So antwortet es nie zu einer Datei, die es nicht gesehen hat.
Bilder
Füge einen image_url-Teil mit einem Link oder einer Daten-URL hinzu. Unterstützt werden PNG, JPEG, WebP und GIF. Modelle, die Bilder verarbeiten können, unterstützen auch mehrere Bilder in einer Nachricht.
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)Um eine Datei von deiner Festplatte zu senden, kodiere sie mit base64 als Daten-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) wird an Modelle weitergegeben, die es verwenden.
PDFs
Füge einen file-Teil mit dem PDF als Daten-URL in file_data und seinem Dateinamen hinzu. Modelle lesen den Text und, sofern möglich, die Seiten als Bilder (Diagramme, Scans, Tabellen). Auch ein öffentlicher Link funktioniert 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 PDFs verbrauchen Input-Tokens pro Seite (siehe Abrechnung unten). Sende daher nur die Seiten, die du brauchst. Für Fragen zu mehreren Dokumenten kannst du für jedes einen file-Teil hinzufügen und ihnen unterscheidbare Namen geben.
Word, Excel, Text und Code
Modelle verarbeiten PDFs, aber keine Word-, Excel- oder PowerPoint-Dateien. Füge Text, CSV, JSON, Markdown oder Code direkt als Text in die Nachricht ein: Das wird als gewöhnliche Input-Tokens abgerechnet und ist für das Modell am besten lesbar. Wenn das Layout wichtig ist (Tabellen, Diagramme, Scans), exportiere die Datei als PDF und sende sie so. Eine Daten-URL eines anderen Typs, etwa text/plain, wird mit einer entsprechenden Fehlermeldung abgelehnt.
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
Für Modelle, die Audio verarbeiten können (siehe Tabelle): ein input_audio-Teil mit dem base64-kodierten Audio und seinem Format, wav oder mp3. input_audio enthält das Audio selbst; für einen Link verwende einen file-Teil mit dem Link in file_data. Aufnahmen aus dem Browser sind meist WebM, das als Video verarbeitet wird. Wandle sie für Modelle, die nur Audio verarbeiten, in MP3 oder WAV um.
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
Für Modelle, die Videos verarbeiten können: ein video_url-Teil mit einem Link oder einer Daten-URL (ein file-Teil funktioniert auch). Unterstützt werden MP4, MOV und WebM. Modelle mit Audiounterstützung verarbeiten auch die Tonspur. Du kannst also fragen, was gesagt wird.
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)Einen Clip von deiner Festplatte sendest du genauso, als Daten-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}},]Ein Format rein, das passende Format raus
video_url, ein image_url oder ein file-Teil sein, je nachdem, welche Doku du liest). Schick sie in einem dieser Formate: Wir geben jedem Modell die Medien in dem Format, das es versteht.Mehrere Dateien in einer Nachricht
Füge für jede Datei einen Teil hinzu, in der Reihenfolge, in der sie gelesen werden sollen. Verweise im Text nach Reihenfolge oder Namen darauf („das zweite Bild“, „contract.pdf“). Du kannst Bilder, PDFs, Audio und Video mischen, solange das Modell die jeweiligen Formate versteht. Zwischen den Dateien kannst du Textteile einfügen, um sie zu beschriften.
Links
- Links müssen öffentliche
https-URLs sein. Wir folgen bis zu drei Weiterleitungen und warten bis zu 20 Sekunden. - Wenn sich ein Link nicht herunterladen lässt, lehnen wir ihn sofort mit
invalid_urlund dem zurückgegebenen Status ab, noch bevor ein Modell aufgerufen wird. - Signierte Links (S3, Cloud Storage, unsere eigenen Bildlinks) funktionieren, solange sie gültig sind.
Anthropic-Format
Unter /v1/messages verwenden Claude-Modelle die Blöcke von Anthropic: image und document, mit einer base64- oder url-Quelle. Einige Claude-Modelle lesen PDFs nur über /v1/chat/completions. Schickst du eines an /v1/messages, sagt dir die Fehlermeldung, wohin du es stattdessen senden sollst.
[ { "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." }]Limits
Schick größere Dateien per Link: Sie zählen nicht zum Anfrageinhalt. Dateien aus der Files API eines Labs (file_id) kannst du nicht verwenden. Schick stattdessen die Datei oder einen Link.
Fehler
Die ersten beiden stehen im code des Fehlers, die anderen im type. Eine Meldung sagt dir, was du ändern musst. Alle Fehler kommen zurück, bevor ein Modell aufgerufen wird – sie kosten also nichts. Mehr dazu unter Fehler.
So werden Medien abgerechnet
Modelle wandeln Medien in Input-Tokens um, die zum Input-Preis des Modells abgerechnet werden. Jedes Lab zählt anders. Das sind typische Werte, die wir gemessen haben:
Im Anfragelog siehst du genau, was bei jeder Anfrage gezählt wurde. Bilder auf die benötigte Größe zu verkleinern, ist der einfachste Weg zu sparen: Die meisten Modelle lesen ein Bild mit 1024 px genauso gut wie eines mit 4000 px.
Fragen oder fehlt etwas? Frag unser Support-Team und wir antworten per E-Mail, meist innerhalb einer Minute.