चैट

इमेज, PDFs, ऑडियो और वीडियो इनपुट

जो मॉडल तस्वीरें, PDF, ऑडियो और वीडियो पढ़ सकते हैं, उनके लिए इन्हें मैसेज में जोड़ें। फ़ाइल खुद (base64) या उसका लिंक भेजें: हम लिंक से फ़ाइल खुद लाते हैं, इसलिए 20 MB तक की फ़ाइल का कोई भी सार्वजनिक https लिंक काम करता है।

एक नज़र में

क्या भेजना है/v1/chat/completions (every model)/v1/messages (Claude)फ़ॉर्मैट
एक तस्वीरimage_url भागimage ब्लॉकPNG, JPEG, WebP, GIF
एक PDFfile भागdocument ब्लॉकPDF
एक रिकॉर्डिंगinput_audio भागClaude ऑडियो नहीं सुन सकताWAV, MP3
एक वीडियोvideo_url भागClaude वीडियो नहीं देखताMP4, MOV, WebM
टेक्स्ट, कोड, CSV, Word, Excelटेक्स्ट सीधे मैसेज मेंएक text ब्लॉक, या सादे टेक्स्ट वाला documentटेक्स्ट

हर पार्ट में सार्वजनिक https लिंक या फ़ाइल को base64 डेटा URL के रूप में भेजा जा सकता है, जैसे data:application/pdf;base64,JVBERi0.... एक मैसेज में कई तरह की फ़ाइलें भेज सकते हैं, बशर्ते मॉडल उन सभी को पढ़ सके.

कौन-से मॉडल क्या पढ़ते हैं

हर चैट मॉडल टेक्स्ट पढ़ता है. यह टेबल लगातार अपडेट होती है: इसमें दिखता है कि हर मॉडल फ़िलहाल क्या पढ़ सकता है. मॉडल जिस तरह की सामग्री नहीं पढ़ सकता, उसे unsupported_content के साथ तुरंत अस्वीकार कर देता है, इसलिए वह ऐसी फ़ाइल के बारे में कभी जवाब नहीं देता जिसे उसने देखा ही नहीं.

इमेज

लिंक या डेटा URL के साथ एक image_url पार्ट जोड़ें. PNG, JPEG, WebP और GIF. इमेज पढ़ने वाले हर मॉडल को एक मैसेज में कई इमेज भेज सकते हैं.

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)

डिस्क से फ़ाइल भेजने के लिए, उसे base64 में एन्कोड करके डेटा 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) बिना बदलाव के आगे भेजा जाता है.

PDF फ़ाइलें

एक file पार्ट जोड़ें, जिसमें file_data में PDF का डेटा URL और फ़ाइल का नाम हो. मॉडल टेक्स्ट पढ़ते हैं और, जहाँ संभव हो, पेजों को इमेज के रूप में भी पढ़ते हैं (चार्ट, स्कैन, टेबल). 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 फ़ाइलों में हर पेज के लिए इनपुट टोकन लगते हैं (नीचे बिलिंग देखें), इसलिए सिर्फ़ ज़रूरी पेज भेजें. कई दस्तावेज़ों के बारे में एक साथ पूछने के लिए, हर दस्तावेज़ का अलग file पार्ट जोड़ें और ऐसे नाम दें जिनसे उन्हें अलग पहचान सकें.

Word, Excel, टेक्स्ट और कोड

मॉडल PDF पढ़ते हैं, Word, Excel या PowerPoint फ़ाइलें नहीं. टेक्स्ट, CSV, JSON, Markdown या कोड सीधे मैसेज में टेक्स्ट के रूप में डालें: इसकी बिलिंग सामान्य इनपुट टोकन की तरह होती है, और मॉडल इसे सबसे अच्छी तरह पढ़ता है. जब लेआउट मायने रखता हो (टेबल, चार्ट, स्कैन), तो फ़ाइल को PDF में एक्सपोर्ट करके भेजें. किसी अन्य प्रकार का डेटा URL, जैसे text/plain, अस्वीकार कर दिया जाता है और एरर में इसकी वजह बताई जाती है.

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)

ऑडियो

ऑडियो सुन सकने वाले मॉडल के लिए (टेबल देखें): base64 ऑडियो और उसके फ़ॉर्मैट, wav या mp3, के साथ एक input_audio पार्ट जोड़ें. input_audio में सीधे ऑडियो दिया जाता है; लिंक भेजने के लिए file पार्ट इस्तेमाल करें और लिंक को file_data में रखें. ब्राउज़र में की गई रिकॉर्डिंग आमतौर पर WebM होती हैं, जिन्हें वीडियो के रूप में पढ़ा जाता है: सिर्फ़ ऑडियो सुन सकने वाले मॉडल के लिए इन्हें MP3 या WAV में बदलें.

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)

वीडियो

वीडियो देख सकने वाले मॉडल के लिए: लिंक या डेटा URL के साथ एक video_url पार्ट जोड़ें (file पार्ट भी काम करता है). MP4, MOV और WebM. ऑडियो सुन सकने वाले मॉडल वीडियो का ऑडियो भी पढ़ते हैं, इसलिए आप पूछ सकते हैं कि उसमें क्या कहा गया है.

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)

डिस्क से क्लिप भी इसी तरह डेटा 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}},
]

आप एक फ़ॉर्मैट भेजें, मॉडल को सही फ़ॉर्मैट मिले

लैब मीडिया को अलग-अलग फ़ॉर्मैट में स्वीकार करती हैं (आप किसके दस्तावेज़ पढ़ते हैं, उसके आधार पर वीडियो video_url, image_url या file पार्ट हो सकता है). इनमें से किसी भी फ़ॉर्मैट में भेजें: हम हर मॉडल को मीडिया उसी फ़ॉर्मैट में देते हैं जिसे वह पढ़ सकता है.

एक मैसेज में कई फ़ाइलें

हर फ़ाइल के लिए एक पार्ट जोड़ें, उसी क्रम में जिसमें आप उन्हें पढ़वाना चाहते हैं, और अपने टेक्स्ट में क्रम या नाम से उनका ज़िक्र करें (“दूसरी इमेज”, “contract.pdf”). इमेज, PDF, ऑडियो और वीडियो एक साथ भेज सकते हैं, बशर्ते मॉडल हर प्रकार को पढ़ सके. फ़ाइलों की पहचान बताने के लिए उनके बीच टेक्स्ट पार्ट जोड़ सकते हैं.

  • लिंक सार्वजनिक https URL होने चाहिए. हम अधिकतम तीन रीडायरेक्ट का पालन करते हैं और 20 सेकंड तक इंतज़ार करते हैं.
  • जिस लिंक से डाउनलोड नहीं हो पाता, उसे किसी भी मॉडल को कॉल करने से पहले ही invalid_url और लिंक से मिले स्टेटस के साथ तुरंत अस्वीकार कर दिया जाता है.
  • साइन किए गए लिंक (S3, Cloud Storage, हमारे अपने इमेज लिंक) वैध रहने तक काम करते हैं.

Anthropic फ़ॉर्मैट

/v1/messages पर, Claude मॉडल Anthropic के ब्लॉक स्वीकार करते हैं: image और document, जिनका सोर्स base64 या url हो. कुछ Claude मॉडल सिर्फ़ /v1/chat/completions के ज़रिए PDF पढ़ते हैं; अगर आप /v1/messages पर PDF भेजते हैं, तो एरर में बताया जाता है कि उसे कहाँ भेजना है.

कॉन्टेंट ब्लॉक
[
{ "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." }
]

सीमाएँ

सीमावैल्यू
एक फ़ाइल20 MB
एक रिक्वेस्ट में सारा मीडिया30 MB
रिक्वेस्ट बॉडी (base64 से आकार लगभग एक तिहाई बढ़ता है)25 MB
हर रिक्वेस्ट में मीडिया पार्ट100
हर अनुरोध में लिंक20

बड़ी फ़ाइलों के लिए लिंक भेजें: यह अनुरोध की बॉडी में नहीं गिना जाता। किसी लैब के अपने Files API (file_id) पर अपलोड की गई फ़ाइलें इस्तेमाल नहीं की जा सकतीं; इसके बजाय फ़ाइल या लिंक भेजें।

गड़बड़ियाँ

स्थितिगड़बड़ीकब
400unsupported_contentयह मॉडल इस तरह की फ़ाइल नहीं पढ़ता। ऊपर दी गई तालिका से ऐसा मॉडल चुनें जो इसे पढ़ता हो।
400invalid_urlकिसी लिंक से डाउनलोड नहीं हो सका। मैसेज में वजह बताई गई है (उसका स्टेटस, टाइमआउट या मीडिया फ़ाइल न होना)।
400invalid_request_errorकोई हिस्सा डेटा URL या https लिंक नहीं है, खाली है, या ऐसे प्रकार का है जिसे मॉडल नहीं पढ़ते (Word, सादा टेक्स्ट)।
413invalid_request_error20 MB से बड़ी फ़ाइल, 30 MB से ज़्यादा मीडिया, या 25 MB से बड़ी अनुरोध की बॉडी।

पहले दो गड़बड़ी के code हैं; बाकी उसके type हैं, जिनके साथ एक मैसेज होता है जो बताता है कि क्या बदलना है। ये सभी किसी भी मॉडल को कॉल किए जाने से पहले लौटते हैं, इसलिए इनका कोई शुल्क नहीं लगता। बाकी के लिए गड़बड़ियाँ देखें।

मीडिया की बिलिंग कैसे होती है

मॉडल मीडिया को इनपुट टोकन में बदलते हैं, जिनकी बिलिंग मॉडल की इनपुट दर पर होती है। हर लैब अपने तरीके से गिनती है; हमारे मापे हुए कुछ आम आँकड़े ये हैं:

ClaudeGPTGemini
1024 × 1024 की एक तस्वीरलगभग 1,400 टोकनलगभग 1,250 से 1,650लगभग 1,100
एक बड़ी फ़ोटो (12 MP)लगभग 4,800 तकपिक्सेल की संख्या के साथ बढ़ता हैलगभग 1,100 से 1,200
PDF का एक पेजलगभग 1,600 से 2,500पेज का टेक्स्टलगभग 560
एक सेकंड का ऑडियोनहीं पढ़तानहीं पढ़तालगभग 25
एक सेकंड का वीडियोनहीं पढ़तानहीं पढ़तालगभग 100 से 300

आपका अनुरोध लॉग दिखाता है कि हर अनुरोध में ठीक कितने टोकन गिने गए। तस्वीरों को अपनी ज़रूरत के आकार तक छोटा करना बचत का सबसे आसान तरीका है: ज़्यादातर मॉडल 1024 px की तस्वीर को 4000 px की तस्वीर जितनी अच्छी तरह पढ़ते हैं।

कई अनुरोधों में एक ही तस्वीर या दस्तावेज़ भेज रहे हैं? उसे बातचीत की शुरुआत में रखें और उस शुरुआती हिस्से को एक जैसा बनाए रखें: प्रॉम्प्ट कैशिंग वाले मॉडल दोहराए गए इनपुट की बिलिंग अपनी कैश की गई इनपुट दर पर करते हैं।

कोई सवाल है, या कुछ छूट गया है? हमारी सहायता टीम से पूछें और हम ईमेल से जवाब देंगे, आम तौर पर एक मिनट के भीतर.