فایل‌ها و Batch

POST /v1/files و POST /v1/batches — یک فایل JSONL از درخواست‌ها، اجرا در پس‌زمینه، نتیجه به‌صورت فایل.

POSThttps://iranrouter.com/v1/files

آپلود فایل (multipart: file و purpose). دو کاربرد دارد: ورودی batch با purpose=batch، و ارجاع به فایل در خود گفتگو با file_id (پایین‌تر). نوع فایل از روی محتوا تشخیص داده می‌شود نه پسوند؛ سند (PDF، Word، Excel، PowerPoint)، تصویر، صوت و متن (JSON، JSONL، CSV، Markdown) پذیرفته می‌شود و فایل اجرایی یا آرشیو با ۴۱۵ رد می‌شود. اگر در نام فایل مسیر بدهید (invoices/2026/march.pdf) یا فیلد folder بفرستید، همان به‌عنوان «پوشه» روی فایل می‌نشیند — فقط یک برچسب برای گروه‌بندی و فیلترِ GET /v1/files?folder=…، نه یک دایرکتوری واقعی. فایل نزد ما می‌ماند تا خودتان حذفش کنید (بدون انقضای خودکار؛ هر فایل تا ۱۰۰ مگابایت، مجموع هر حساب تا ۱۰ گیگابایت به‌طور پیش‌فرض (سهمیهٔ حساب شما ممکن است بیشتر باشد) — بیشتر از آن ۴۱۳ با کد file_quota_reached) و با GET /v1/files، GET /v1/files/{id}، GET /v1/files/{id}/content و DELETE /v1/files/{id} مدیریت می‌شود — همان شکل OpenAI.

Shell
curl https://iranrouter.com/v1/files \
  -H "Authorization: Bearer ir-..." \
  -F purpose=batch \
  -F file=@requests.jsonl
JSON
{ "id": "9c1e...-file-id", "object": "file", "bytes": 4210, "created_at": 1789000000, "filename": "requests.jsonl", "purpose": "batch", "status": "processed" }
POSThttps://iranrouter.com/v1/batches

یک فایل JSONL از درخواست‌ها برای یک endpoint، در پس‌زمینه و خط به خط از همان مسیر عادی اجرا می‌شود — هر خط یک درخواست عادی با صورت‌حساب و محدودیت‌های عادی همان کلید — و نتیجه‌ها به‌صورت فایل برمی‌گردند. تخفیفی در کار نیست؛ batch راحتی است، نه قیمت متفاوت. completion_window پذیرفته می‌شود ولی وعده نیست: batch بلافاصله شروع می‌شود.

Text
{"custom_id": "q1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "openai/gpt-4o-mini", "messages": [{"role": "user", "content": "سلام"}]}}
{"custom_id": "q2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "openai/gpt-4o-mini", "messages": [{"role": "user", "content": "خداحافظ"}]}}
Shell
curl https://iranrouter.com/v1/batches \
  -H "Authorization: Bearer ir-..." \
  -H "Content-Type: application/json" \
  -d '{"input_file_id": "9c1e...-file-id", "endpoint": "/v1/chat/completions", "completion_window": "24h"}'
فیلدتوضیح
endpoint/v1/chat/completions · /v1/responses · /v1/messages · /v1/embeddings · /v1/completions · /v1/moderations · /v1/rerank
statusvalidating → in_progress → finalizing → completed | failed | cancelling → cancelled
request_countstotal، completed، failed — هر ده خط به‌روز می‌شود.
output_file_id / error_file_idخروجی موفق‌ها و خطاها، هر خط {id, custom_id, response:{status_code, request_id, body}, error}. محتوا از GET /v1/files/{id}/content.
POST /v1/batches/{id}/cancelبعد از خط‌های در حال اجرا متوقف می‌شود؛ خروجی تا همان‌جا نوشته می‌شود.
  • هر batch تا ۱۰۰۰ خط؛ هر کاربر هم‌زمان تا ۵ batch باز (بیشتر: ۴۲۹ batch_limit_reached).
  • url هر خط باید همان endpoint باشد؛ stream خاموش می‌شود؛ خط نامعتبر به فایل خطا می‌رود و بقیه ادامه می‌یابند.
  • خطی که ۴۲۹ نرخ بگیرد بعد از retry-after تا سه بار دوباره تلاش می‌شود؛ یک ۴۰۲ موجودی، یا ۴۲۹ که بماند، همان خط را در فایل خطا می‌گذارد — batch متوقف نمی‌شود. کلیدی که وسط کار باطل شود batch را متوقف می‌کند و خط‌های اجرانشده در فایل خطا می‌آیند.

برای یک درخواست، دوقلوی async ←