Obrolan

Input gambar, PDF, audio dan video

Sertakan gambar, PDF, audio, dan video dalam pesan untuk model yang dapat membacanya. Kirim file langsung (base64) atau tautan: kami mengambil file dari tautan tersebut, jadi tautan https publik apa pun ke file berukuran hingga 20 MB dapat digunakan.

Sekilas

Yang dikirim/v1/chat/completions (every model)/v1/messages (Claude)Format
GambarBagian image_urlBlok imagePNG, JPEG, WebP, GIF
PDFBagian fileBlok documentPDF
RekamanBagian input_audioClaude tidak dapat mendengar audioWAV, MP3
VideoBagian video_urlClaude tidak dapat menonton videoMP4, MOV, WebM
Teks, kode, CSV, Word, ExcelTeks langsung di dalam pesanBlok text, atau document berisi teks biasaTeks

Setiap bagian menerima tautan https publik atau file langsung sebagai URL data base64, seperti data:application/pdf;base64,JVBERi0.... Beberapa file dapat disertakan dalam satu pesan, dengan kombinasi apa pun yang dapat dibaca model.

Jenis input yang dibaca setiap model

Semua model chat dapat membaca teks. Tabel ini diperbarui secara langsung: isinya menunjukkan jenis input yang dapat dibaca setiap model saat ini. Jika diberi input yang tidak dapat dibaca, model langsung menolaknya dengan unsupported_content, sehingga model tidak akan menjawab tentang file yang tidak dilihatnya.

Gambar

Tambahkan bagian image_url dengan tautan atau URL data. PNG, JPEG, WebP dan GIF. Beberapa gambar dalam satu pesan didukung oleh semua model yang dapat membaca gambar.

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)

Untuk mengirim file dari disk, enkode file tersebut dengan base64 menjadi URL 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("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) diteruskan untuk model yang menggunakannya.

PDF

Tambahkan bagian file dengan PDF sebagai URL data di file_data, beserta nama filenya. Model membaca teks dan, jika didukung, halaman sebagai gambar (grafik, hasil pindai, tabel). Tautan publik juga dapat digunakan di 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)

PDF panjang menggunakan token input per halaman (lihat penagihan di bawah), jadi kirim hanya halaman yang Anda perlukan. Untuk bertanya tentang beberapa dokumen sekaligus, tambahkan bagian file untuk setiap dokumen, dengan nama yang membedakan masing-masing.

Word, Excel, teks dan kode

Model membaca PDF, bukan file Word, Excel, atau PowerPoint. Masukkan teks, CSV, JSON, Markdown, atau kode langsung ke dalam pesan sebagai teks: semuanya ditagih sebagai token input biasa, dan format inilah yang paling mudah dibaca model. Jika tata letak penting (tabel, grafik, hasil pindai), ekspor file ke PDF lalu kirimkan. URL data dengan jenis lain, seperti text/plain, akan ditolak dengan pesan kesalahan yang menjelaskan alasannya.

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

Untuk model yang dapat mendengar (lihat tabel): gunakan bagian input_audio dengan audio base64 dan formatnya, wav atau mp3. input_audio menerima audio langsung; untuk tautan, gunakan bagian file dengan tautan di file_data. Rekaman yang dibuat di browser biasanya berformat WebM, yang dibaca sebagai video: konversikan ke MP3 atau WAV untuk model yang hanya dapat mendengar.

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

Untuk model yang dapat menonton video: gunakan bagian video_url dengan tautan atau URL data (bagian file juga bisa). MP4, MOV dan WebM. Model yang mendukung suara juga membaca trek audionya, jadi Anda dapat menanyakan apa yang diucapkan.

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)

Klip dari disk dikirim dengan cara yang sama, sebagai URL data:

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

Satu format masuk, format yang tepat keluar

Setiap lab menerima media dalam format berbeda (video bisa berupa bagian video_url, image_url atau file, tergantung dokumentasi yang Anda baca). Kirim dalam format mana pun: kami meneruskan media ke setiap model dalam format yang bisa dibacanya.

Beberapa file dalam satu pesan

Tambahkan satu bagian untuk setiap file, sesuai urutan yang Anda inginkan untuk dibaca, lalu rujuk file dalam teks Anda berdasarkan urutan atau nama (“gambar kedua”, “contract.pdf”). Gambar, PDF, audio dan video bisa digabung selama model dapat membaca setiap jenisnya. Bagian teks bisa disisipkan di antara file untuk memberi label.

  • Tautan harus berupa URL https publik. Kami mengikuti hingga tiga pengalihan dan menunggu hingga 20 detik.
  • Tautan yang gagal diunduh langsung ditolak dengan invalid_url beserta status responsnya, sebelum model dipanggil.
  • Tautan bertanda tangan (S3, Cloud Storage, tautan gambar kami sendiri) bisa digunakan selama masih berlaku.

Format Anthropic

Di /v1/messages, model Claude menerima blok Anthropic: image dan document, dengan sumber base64 atau url. Beberapa model Claude hanya bisa membaca PDF melalui /v1/chat/completions; jika Anda mengirimnya ke /v1/messages, pesan error akan memberi tahu ke mana harus mengirimnya.

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

Batas

BatasNilai
Satu file20 MB
Semua media dalam satu permintaan30 MB
Body permintaan (base64 menambah ukuran sekitar sepertiga)25 MB
Bagian media per permintaan100
Tautan per permintaan20

Untuk file yang lebih besar, kirim tautan: ukurannya tidak dihitung dalam body permintaan. File yang diunggah ke Files API milik lab (file_id) tidak bisa digunakan; kirim file atau tautannya.

Kesalahan

StatusErrorKapan
400unsupported_contentModel tidak bisa membaca jenis file tersebut. Pilih model yang mendukungnya dari tabel di atas.
400invalid_urlTautan gagal diunduh. Pesan menjelaskan penyebabnya (status respons, batas waktu habis, bukan file media).
400invalid_request_errorBagian bukan berupa data URL atau tautan https, kosong, atau berjenis file yang tidak bisa dibaca model (Word, teks biasa).
413invalid_request_errorFile melebihi 20 MB, total media melebihi 30 MB, atau body permintaan melebihi 25 MB.

Dua yang pertama adalah code error; sisanya adalah type, disertai pesan yang menjelaskan apa yang perlu diubah. Semuanya dikembalikan sebelum model dipanggil, jadi tidak dikenakan biaya. Lihat Error untuk yang lainnya.

Cara biaya media dihitung

Model mengubah media menjadi token input, yang ditagih sesuai harga input model. Setiap lab punya cara penghitungan sendiri; berikut angka umum dari pengukuran kami:

ClaudeGPTGemini
Gambar 1024 × 1024sekitar 1,400 tokensekitar 1,250 hingga 1,650sekitar 1,100
Foto besar (12 MP)hingga sekitar 4,800sebanding dengan jumlah pikselsekitar 1,100 hingga 1,200
Satu halaman PDFsekitar 1,600 hingga 2,500teks halamansekitar 560
Satu detik audiotidak dibacatidak dibacasekitar 25
Satu detik videotidak dibacatidak dibacasekitar 100 hingga 300

Log permintaan Anda menunjukkan persis apa yang dihitung dari setiap permintaan. Cara termudah untuk berhemat adalah memperkecil gambar sesuai kebutuhan: sebagian besar model dapat membaca gambar 1024 px sama baiknya dengan gambar 4000 px.

Mengirim gambar atau dokumen yang sama dalam banyak permintaan? Letakkan di awal percakapan dan pertahankan prefiks tersebut: model dengan caching prompt menagih input berulang dengan tarif cache.

Ada pertanyaan, atau ada yang kurang? Tanyakan kepada tim dukungan kami dan kami akan menjawab lewat email, biasanya dalam satu menit.