OpenAI-съвместим Batch API
Качвайте JSONL пакетни входни файлове и обработвайте OpenAI-съвместими пакети чрез трайната опашка на Model Gate.
OpenAI-съвместим Batch API
Model Gate внедрява работния процес OpenAI Files + Batch https://api.model-gate.com/v1. Това е слой за съвместимост: всеки JSONL елемент се изпълнява през нормалния път на извод на Model Gate. Model Gate го прави не изпратете партида OpenAI, базирана на доставчика нагоре.
Файлове/пакетно четене/контролни крайни точки са контролна равнина: иначе валиден активен API идентификационен номер може да изброява/чете/изтегля/анулира/изтрива съществуващи ресурси, дори когато салдото на акаунта в момента е нула или лимитът на разходите, който може да се нулира, е изчерпан. Операциите за създаване на съхранение са различни: POST /v1/files и POST /v1/batches изискване на нов положителен баланс/разходи, преди Model Gate да вмъкне данни за файл/задание/артикул. Следователно ключът с нулев баланс не може да качи JSONL или да създаде ново пакетно хранилище. Действителните партидни артикули все още проверяват повторно приемането по време на заявката на работника и остават на опашка, ако средствата по-късно са изчерпани. Въведеният JSONL се чете постепенно и се валидира/вмъква ред по ред; Model Gate не запазва пълния вход от 200 MB плюс всички тела на заявка в паметта на процеса, докато създава партида. Квотите за съхраняван байт/файл/активно задание/елемент на опашка за потребител осигуряват независима граница за злоупотреба с база данни.
Поддържаните партидни крайни точки в тази версия са:
/v1/responses/v1/chat/completions/v1/embeddings/v1/images/generations
Всеки изпълнен елемент се маркира request_mode=batch, batch_protocol=openai, със своите batch_job_public_id и custom_id.
1. Качете входен JSONL файл
Всеки непразен ред съдържа custom_id, method, url, и body. URL адресът трябва да е равен на крайната точка, предоставена по-късно /v1/batches.
Пример batch.jsonl:
{"custom_id":"request-1","method":"POST","url":"/v1/responses","body":{"model":"gpt-5.4","input":"Summarize this text."}}
{"custom_id":"request-2","method":"POST","url":"/v1/responses","body":{"model":"gpt-5.4","input":"Classify this text."}}
Заявка
curl https://api.model-gate.com/v1/files \
-H "Authorization: Bearer mg_live_..." \
-F "purpose=batch" \
-F "[email protected]"
Отговор — 200
{
"id": "file-01K...",
"object": "file",
"bytes": 322,
"created_at": 1786610000,
"filename": "batch.jsonl",
"purpose": "batch",
"status": "processed",
"status_details": null
}
2. Създайте партидата
completion_window трябва да бъде 24h.
Заявка
curl https://api.model-gate.com/v1/batches \
-H "Authorization: Bearer mg_live_..." \
-H "Content-Type: application/json" \
-d '{
"input_file_id":"file-01K...",
"endpoint":"/v1/responses",
"completion_window":"24h",
"metadata":{"job":"nightly-evaluation"}
}'
Отговор — 200
{
"id": "batch_01K...",
"object": "batch",
"endpoint": "/v1/responses",
"input_file_id": "file-01K...",
"completion_window": "24h",
"status": "in_progress",
"output_file_id": null,
"error_file_id": null,
"request_counts": {
"total": 2,
"completed": 0,
"failed": 0
},
"metadata": {
"job": "nightly-evaluation"
}
}
3. Извличане на партида
Заявка
curl https://api.model-gate.com/v1/batches/batch_01K... \
-H "Authorization: Bearer mg_live_..."
Отговорът е завършен
{
"id": "batch_01K...",
"object": "batch",
"endpoint": "/v1/responses",
"status": "completed",
"output_file_id": "file-01KOUTPUT...",
"error_file_id": null,
"request_counts": {
"total": 2,
"completed": 2,
"failed": 0
},
"usage": {
"input_tokens": 240,
"input_tokens_details": {"cached_tokens": 0},
"output_tokens": 90,
"output_tokens_details": {"reasoning_tokens": 0},
"total_tokens": 330
}
}
4. Изтеглете резултатите
Заявка
curl https://api.model-gate.com/v1/files/file-01KOUTPUT.../content \
-H "Authorization: Bearer mg_live_..."
Отговор — 200
{"id":"batch_req_01K...","custom_id":"request-1","response":{"status_code":200,"request_id":"01K...","body":{"id":"resp_...","status":"completed"}},"error":null}
Записват се неуспешни, отменени или изтекли елементи error_file_id като JSONL записи с response:null и ан error обект.
5. Списък на партидите
limit по подразбиране 20 и трябва да е от 1 към 100. Използвайте after за пагинация на курсора.
Заявка
curl "https://api.model-gate.com/v1/batches?limit=20&after=batch_01K..." \
-H "Authorization: Bearer mg_live_..."
Отговор — 200
{
"object": "list",
"data": [],
"first_id": null,
"last_id": null,
"has_more": false
}
Завършените пакетни обекти могат да включват агрегат usage обект, когато е уреден Модел Gate отчитане на заявка е налично.
6. Отменете партида
Cancel предотвратява стартирането на поставени в опашка елементи; елемент, който вече се обработва, може да завърши.
Заявка
curl -X POST https://api.model-gate.com/v1/batches/batch_01K.../cancel \
-H "Authorization: Bearer mg_live_..."
Отговор — 200
{
"id": "batch_01K...",
"object": "batch",
"status": "cancelling",
"request_counts": {
"total": 2,
"completed": 0,
"failed": 0
}
}
7. Файлови метаданни, списък и изтриване
Извличане на метаданни:
curl https://api.model-gate.com/v1/files/file-01K... \
-H "Authorization: Bearer mg_live_..."
{
"id": "file-01K...",
"object": "file",
"bytes": 322,
"filename": "batch.jsonl",
"purpose": "batch",
"status": "processed",
"expires_at": 1789202000
}
Списък на файлове с опция purpose, after, и order=asc|desc; limit по подразбиране 10000 и трябва да е от 1 към 10000:
curl "https://api.model-gate.com/v1/files?purpose=batch&order=desc&limit=100" \
-H "Authorization: Bearer mg_live_..."
{
"object": "list",
"data": [],
"first_id": null,
"last_id": null,
"has_more": false
}
Изтрийте нерефериран/съвместим с изтекъл срок на годност файл:
curl -X DELETE https://api.model-gate.com/v1/files/file-01K... \
-H "Authorization: Bearer mg_live_..."
{
"id": "file-01K...",
"object": "file",
"deleted": true
}
Ограничения и семантика на възстановяване
Model Gate приема до 50 000 JSONL елемента и ограничава качения файл до конфигурирания OPENAI_BATCH_MAX_FILE_BYTES стойност (200 MiB по подразбиране). Всеки отделен партиден артикул трябва също така да отговаря на нормата на Model Gate MAX_REQUEST_BODY_BYTES лимит. custom_id стойностите трябва да са уникални. Партидни елементи не могат да се използват stream:true или вложени async:true. Големите JSONL файлове се съхраняват вътрешно като парчета база данни, а не една прекалено голяма SQL стойност.
Възстановяването на изпълнение е най-малко-веднъж, не точно-веднъж. Ако работник спре след приемане на заявка нагоре по веригата, но преди резултатът от нея да бъде трайно записан, изтекъл лизинг може да доведе до повторен опит за същия ID на заявка за модел Gate. Сетълментът остава идемпотентен за вече завършени редове на заявка, но инструментът/външните странични ефекти, инициирани от модел, самите трябва да са идемпотентни.
Всеки JSONL артикул се допуска незабавно преди работникът да го поиска. В противен случай валидните артикули остават на опашка, докато текущото салдо по сметката не е положително или лимитът на разходите за ключ/група, който може да се нулира, вече е изчерпан. Това състояние на изчакване не отнема опит или не създава запис за грешка; по-късно допълване, нулиране на потреблението или увеличаване на лимита автоматично прави останалите елементи допустими. Model Gate не запазва теоретична максимална партидна цена. Поради това вече приетите артикули може да се уредят напълно дори когато едновременната работа прави крайното салдо отрицателно или води до малко превишаване на лимита на разходите, след което новите артикули остават на опашка, докато акаунтът отново отговаря на условията.
Ценообразуване и счетоводство
Адаптерът за партиди не използва собствено пакетно изпълнение на доставчика. Всеки артикул преминава през нормално маршрутизиране и уреждане на модел на Model Gate, след което получава шаблона за ценообразуване Ценови коефициент на партидна заявка. По подразбиране: 1.
Ако коефициентът е 0.5, артикул, чиято нормална цена за Model Gate е 0.02 се дебитира като 0.01. Официалните референтни цени остават непроменени. Приложеният коефициент се заснема и съхранява в заявката за одит.
Грешки
{
"error": {
"message": "line 2 url must match batch endpoint /v1/responses",
"type": "invalid_request_error",
"param": null,
"code": "invalid_batch_file"
}
}