Batch API zgodny z OpenAI
Przesyłaj wsadowe pliki wejściowe JSONL i przetwarzaj wsadowe pliki wsadowe kompatybilne z OpenAI za pośrednictwem trwałej kolejki Model Gate.
Batch API zgodny z OpenAI
Model Gate implementuje przepływ pracy OpenAI Files + Batch https://api.model-gate.com/v1. Jest to warstwa kompatybilności: każdy element JSONL jest wykonywany poprzez normalną ścieżkę wnioskowania Model Gate. Model Gate tak ma nie przesłać wcześniejszą partię OpenAI natywną dla dostawcy.
Punkty końcowe odczytu/kontroli plików/wsadu to płaszczyzna kontroli: w przeciwnym razie prawidłowe, aktywne poświadczenie API może wyświetlić/odczytać/pobrać/anulować/usunąć istniejące zasoby, nawet jeśli saldo konta wynosi obecnie zero lub wyczerpany jest resetowalny limit wydatków. Operacje magazynowania i produkcji są różne: POST /v1/files I POST /v1/batches wymagają świeżego dodatniego salda/wydatków, zanim Model Gate wstawi dane pliku/zadania/pozycji. Dlatego klucz o zerowym saldzie nie może przesyłać JSONL ani tworzyć nowego magazynu wsadowego. Rzeczywiste pozycje partii nadal są ponownie sprawdzane w momencie składania wniosków przez pracownika i pozostają w kolejce, jeśli fundusze zostaną później wyczerpane. Dane wejściowe JSONL są odczytywane przyrostowo i sprawdzane/wstawiane linia po linii; Model Gate nie przechowuje w pamięci procesu pełnych 200 MB danych wejściowych oraz wszystkich treści żądań podczas tworzenia wsadu. Przydziały przechowywanych bajtów/plików/aktywnych zadań/elementów w kolejce na użytkownika zapewniają niezależną granicę nadużyć w bazie danych.
Obsługiwane punkty końcowe wsadowe w tej wersji to:
/v1/responses/v1/chat/completions/v1/embeddings/v1/images/generations
Każdy wykonany element jest oznaczony request_mode=batch, batch_protocol=openai, z jego batch_job_public_id I custom_id.
1. Prześlij plik wejściowy JSONL
Każda niepusta linia zawiera custom_id, method, url, I body. Adres URL musi być równy punktowi końcowemu, do którego później zostanie dostarczony /v1/batches.
Przykład 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."}}
Wniosek
curl https://api.model-gate.com/v1/files \
-H "Authorization: Bearer mg_live_..." \
-F "purpose=batch" \
-F "[email protected]"
Odpowiedź — 200
{
"id": "file-01K...",
"object": "file",
"bytes": 322,
"created_at": 1786610000,
"filename": "batch.jsonl",
"purpose": "batch",
"status": "processed",
"status_details": null
}
2. Utwórz partię
completion_window musi być 24h.
Wniosek
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"}
}'
Odpowiedź — 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. Pobierz partię
Wniosek
curl https://api.model-gate.com/v1/batches/batch_01K... \
-H "Authorization: Bearer mg_live_..."
Odpowiedź – uzupełniona
{
"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. Pobierz wyniki
Wniosek
curl https://api.model-gate.com/v1/files/file-01KOUTPUT.../content \
-H "Authorization: Bearer mg_live_..."
Odpowiedź — 200
{"id":"batch_req_01K...","custom_id":"request-1","response":{"status_code":200,"request_id":"01K...","body":{"id":"resp_...","status":"completed"}},"error":null}
Zapisywane są elementy, które nie powiodły się, zostały anulowane lub wygasły error_file_id jak rekordy JSONL z response:null i error obiekt.
5. Lista partii
limit domyślnie 20 i musi pochodzić z 1 Do 100. Używać after do paginacji kursora.
Wniosek
curl "https://api.model-gate.com/v1/batches?limit=20&after=batch_01K..." \
-H "Authorization: Bearer mg_live_..."
Odpowiedź — 200
{
"object": "list",
"data": [],
"first_id": null,
"last_id": null,
"has_more": false
}
Gotowe obiekty wsadowe mogą zawierać agregat usage obiekt, gdy dostępne jest rozliczanie żądań Model Gate.
6. Anuluj partię
Anuluj zapobiega uruchomieniu elementów znajdujących się w kolejce; element już przetwarzany może zostać zakończony.
Wniosek
curl -X POST https://api.model-gate.com/v1/batches/batch_01K.../cancel \
-H "Authorization: Bearer mg_live_..."
Odpowiedź — 200
{
"id": "batch_01K...",
"object": "batch",
"status": "cancelling",
"request_counts": {
"total": 2,
"completed": 0,
"failed": 0
}
}
7. Metadane plików, lista i usuwanie
Pobierz metadane:
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
}
Wyświetl listę plików z opcjonalnymi purpose, after, I order=asc|desc; limit domyślnie 10000 i musi pochodzić z 1 Do 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
}
Usuń plik, do którego nie ma odniesienia/wygasł zgodny plik:
curl -X DELETE https://api.model-gate.com/v1/files/file-01K... \
-H "Authorization: Bearer mg_live_..."
{
"id": "file-01K...",
"object": "file",
"deleted": true
}
Ograniczenia i semantyka odzyskiwania
Model Gate akceptuje do 50 000 elementów JSONL i ogranicza przesyłany plik do skonfigurowanych OPENAI_BATCH_MAX_FILE_BYTES wartość (domyślnie 200 MiB). Każdy pojedynczy element partii musi również pasować do normy Model Gate MAX_REQUEST_BODY_BYTES limit. custom_id wartości muszą być unikalne. Nie można używać elementów wsadowych stream:true lub zagnieżdżone async:true. Duże pliki JSONL są utrwalane wewnętrznie w postaci fragmentów bazy danych, a nie jednej nadmiernej wartości SQL.
Odzyskiwanie wykonania jest przynajmniej raz, nie dokładnie-raz. Jeśli pracownik zatrzyma się po zaakceptowaniu żądania nadrzędnego, ale zanim jego wynik zostanie trwale zarejestrowany, wygasła dzierżawa może spowodować ponowną próbę tego samego identyfikatora żądania Model Gate. Rozliczenie pozostaje idempotentne dla już ukończonych wierszy żądań, ale narzędzia/zewnętrzne efekty uboczne inicjowane przez model same powinny być idempotentne.
Każdy element JSONL jest przyjmowany bezpośrednio przed odebraniem go przez pracownika. W przeciwnym razie ważne pozycje pozostają w kolejce, dopóki saldo konta bieżącego nie jest dodatnie lub limit wydatków możliwy do zresetowania dla klucza/grupy został już wyczerpany. Ten stan oczekiwania nie pochłania prób ani nie tworzy rekordu błędu; późniejsze doładowanie, zresetowanie użycia lub zwiększenie limitu automatycznie powoduje, że pozostałe pozycje kwalifikują się. Model Gate nie zastrzega sobie teoretycznego maksymalnego kosztu partii. Przedmioty już przyjęte mogą zatem zostać w pełni rozliczone nawet wtedy, gdy równoczesna praca spowoduje ujemne saldo końcowe lub spowoduje niewielkie przekroczenie limitu wydatków, po czym nowe pozycje pozostaną w kolejce do czasu, gdy konto ponownie będzie się kwalifikowało.
Cennik i księgowość
Adapter wsadowy nie korzysta z wykonywania wsadowego natywnego dla dostawcy. Każdy przedmiot przechodzi przez normalną trasę i rozliczenie modelu Model Gate, a następnie otrzymuje szablon wyceny Współczynnik ceny żądania partii. Domyślny: 1.
Jeśli współczynnik jest 0.5, przedmiot, którego normalny koszt Bramy Modelu wynosi 0.02 jest obciążany jako 0.01. Oficjalne ceny referencyjne pozostają niezmienione. Zastosowany współczynnik jest rejestrowany i przechowywany w żądaniu audytu.
Błędy
{
"error": {
"message": "line 2 url must match batch endpoint /v1/responses",
"type": "invalid_request_error",
"param": null,
"code": "invalid_batch_file"
}
}