Пакетный API, совместимый с OpenAI
Загружайте файлы пакетного ввода JSONL и обрабатывайте пакеты, совместимые с OpenAI, через устойчивую очередь Model Gate.
Пакетный API, совместимый с OpenAI
Model Gate реализует рабочий процесс OpenAI Files + Batch на https://api.model-gate.com/v1. Это уровень совместимости: каждый элемент JSONL выполняется через обычный путь вывода Model Gate. Модель Gate делает нет отправьте пакет OpenAI, принадлежащий вышестоящему поставщику.
Конечные точки чтения/управления файлов/пакетной обработки представляют собой плоскость управления: действительные в противном случае активные учетные данные API могут отображать/читать/загружать/отменять/удалять существующие ресурсы, даже если баланс учетной записи в настоящее время равен нулю или сбрасываемый лимит расходов исчерпан. Хранилище-производящие операции бывают разные: POST /v1/files и POST /v1/batches требуют нового подтверждения положительного баланса/расходов до того, как Model Gate вставит данные файла/задания/элемента. Таким образом, ключ с нулевым балансом не может загружать JSONL или создавать новое пакетное хранилище. Фактические элементы партии по-прежнему повторно проверяют прием во время заявки работника и остаются в очереди, если средства позже исчерпаны. Ввод JSONL считывается постепенно и проверяется/вставляется построчно; Model Gate не сохраняет все входные данные размером 200 МБ, а также все тела запроса в памяти процесса при создании пакета. Квоты на количество хранимых байтов, файлов, активных заданий и элементов в очереди для каждого пользователя обеспечивают независимую границу злоупотреблений базой данных.
В этом выпуске поддерживаются следующие конечные точки пакетной обработки:
/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 объект, когда доступен расчетный учет запросов Model Gate.
6. Отменить пакет
Отмена предотвращает запуск элементов в очереди; уже обрабатываемый элемент может завершиться.
Запрос
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 МБ по умолчанию). Каждый отдельный элемент партии также должен соответствовать стандартному стандарту Model Gate. MAX_REQUEST_BODY_BYTES предел. custom_id значения должны быть уникальными. Пакетные элементы не могут использоваться stream:true или вложенный async:true. Большие файлы JSONL сохраняются внутри как фрагменты базы данных, а не как одно слишком большое значение SQL.
Восстановление выполнения хотя бы один раз, не точно-один раз. Если исполнитель останавливается после того, как восходящий запрос был принят, но до того, как его результат будет надежно записан, истекший срок аренды может привести к повторной попытке того же идентификатора запроса Model Gate. Расчет остается идемпотентным для уже завершенных строк запроса, но инструментальные/внешние побочные эффекты, инициированные моделью, сами по себе должны быть идемпотентными.
Каждый элемент JSONL принимается непосредственно перед тем, как исполнитель затребует его. В противном случае действительные элементы остаются в очереди, пока текущий баланс счета не является положительным или лимит расходов, подлежащий сбросу для ключа/группы, уже исчерпан. В этом состоянии ожидания не учитываются попытки и не создается запись об ошибке; более позднее пополнение счета, сброс использования или увеличение лимита автоматически делает доступными оставшиеся элементы. Model Gate не резервирует теоретическую максимальную стоимость партии. Таким образом, уже принятые элементы могут быть оплачены в полном объеме, даже если одновременная работа приводит к отрицательному итоговому балансу или небольшому превышению лимита расходов, после чего новые элементы остаются в очереди до тех пор, пока учетная запись снова не станет приемлемой.
Ценообразование и учет
Пакетный адаптер не использует собственное пакетное выполнение поставщика. Каждый товар проходит обычную маршрутизацию и расчет модели Model Gate, а затем получает шаблон цен. Ценовой коэффициент пакетного запроса. По умолчанию: 1.
Если коэффициент 0.5, предмет, обычная стоимость Модельных ворот которого равна 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"
}
}