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

Senden/v1/chat/completions (every model)/v1/messages (Claude)Formate
Ein Bildimage_url-Teilimage-BlockPNG, JPEG, WebP, GIF
Ein PDFfile-Teildocument-BlockPDF
Eine Aufnahmeinput_audio-TeilClaude kann Audio nicht hörenWAV, MP3
Ein Videovideo_url-TeilClaude kann Videos nicht ansehenMP4, MOV, WebM
Text, Code, CSV, Word, ExcelDen Text selbst, in der NachrichtEin text-Block oder ein document als KlartextText

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 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)

Um eine Datei von deiner Festplatte zu senden, kodiere sie mit base64 als Daten-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) 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, 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 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 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

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, 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

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 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)

Einen Clip von deiner Festplatte sendest du genauso, als Daten-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}},
]

Ein Format rein, das passende Format raus

Labs erwarten Medien in unterschiedlichen Formaten (ein Video kann ein 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 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_url und 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.

Inhaltsblöcke
[
{ "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

LimitWert
Eine Datei20 MB
Alle Medien in einer Anfrage30 MB
Anfrageinhalt (base64 erhöht die Größe um etwa ein Drittel)25 MB
Medienteile pro Anfrage100
Links pro Anfrage20

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

StatusFehlerWann
400unsupported_contentDas Modell kann diesen Dateityp nicht lesen. Wähle aus der Tabelle oben ein Modell, das ihn unterstützt.
400invalid_urlEin Link ließ sich nicht herunterladen. Die Meldung sagt dir, warum (Status, Timeout oder keine Mediendatei).
400invalid_request_errorEin Teil ist keine Daten-URL oder kein https-Link, ist leer oder hat einen Dateityp, den Modelle nicht lesen können (Word, Klartext).
413invalid_request_errorEine Datei über 20 MB, mehr als 30 MB Medien oder ein Anfrageinhalt über 25 MB.

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:

ClaudeGPTGemini
Ein Bild mit 1024 × 1024etwa 1,400 tokensetwa 1,250 bis 1,650etwa 1,100
Ein großes Foto (12 MP)bis zu etwa 4,800skaliert mit der Pixelzahletwa 1,100 bis 1,200
Eine PDF-Seiteetwa 1,600 bis 2,500der Text der Seiteetwa 560
Eine Sekunde Audiowird nicht gelesenwird nicht gelesenetwa 25
Eine Sekunde Videowird nicht gelesenwird nicht gelesenetwa 100 bis 300

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.

Sendest du dasselbe Bild oder Dokument in vielen Anfragen? Setz es an den Anfang der Unterhaltung und lass diesen Anfang unverändert: Modelle mit Prompt-Caching berechnen wiederholte Eingaben zum Cache-Preis.

Fragen oder fehlt etwas? Frag unser Support-Team und wir antworten per E-Mail, meist innerhalb einer Minute.