فایلها و Batch
POST /v1/files و POST /v1/batches — یک فایل JSONL از درخواستها، اجرا در پسزمینه، نتیجه بهصورت فایل.
https://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.
curl https://iranrouter.com/v1/files \ -H "Authorization: Bearer ir-..." \ -F purpose=batch \ -F file=@requests.jsonl
{ "id": "9c1e...-file-id", "object": "file", "bytes": 4210, "created_at": 1789000000, "filename": "requests.jsonl", "purpose": "batch", "status": "processed" }https://iranrouter.com/v1/batchesیک فایل JSONL از درخواستها برای یک endpoint، در پسزمینه و خط به خط از همان مسیر عادی اجرا میشود — هر خط یک درخواست عادی با صورتحساب و محدودیتهای عادی همان کلید — و نتیجهها بهصورت فایل برمیگردند. تخفیفی در کار نیست؛ batch راحتی است، نه قیمت متفاوت. completion_window پذیرفته میشود ولی وعده نیست: batch بلافاصله شروع میشود.
{"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": "خداحافظ"}]}}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 |
status | validating → in_progress → finalizing → completed | failed | cancelling → cancelled |
request_counts | total، 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 را متوقف میکند و خطهای اجرانشده در فایل خطا میآیند.