B2BB2B LLM

API Batch compatible OpenAI

Téléchargez des fichiers d'entrée par lots JSONL et traitez des lots compatibles OpenAI via la file d'attente durable de Model Gate.

API Batch compatible OpenAI

Model Gate implémente le workflow OpenAI Files + Batch sur https://api.model-gate.com/v1. Il s'agit d'une couche de compatibilité : chaque élément JSONL est exécuté via le chemin d'inférence normal de Model Gate. Model Gate fait pas soumettre un lot OpenAI natif du fournisseur en amont.

Les points de terminaison de fichiers/lecture par lots/contrôle sont un plan de contrôle : un identifiant API actif par ailleurs valide peut répertorier/lire/télécharger/annuler/supprimer les ressources existantes même lorsque le solde du compte est actuellement nul ou qu'une limite de dépenses réinitialisable est épuisée. Les opérations de stockage sont différentes : POST /v1/files et POST /v1/batches exiger une nouvelle admission de solde positif/de dépenses avant que Model Gate n'insère les données de fichier/tâche/élément. Une clé à solde nul ne peut donc pas télécharger JSONL ou créer un nouveau stockage par lots. Les éléments du lot réel revérifient toujours l'admission au moment de la réclamation du travailleur et restent en file d'attente si les fonds sont épuisés par la suite. L'entrée JSONL est lue de manière incrémentielle et validée/insérée ligne par ligne ; Model Gate ne conserve pas l'intégralité des 200 Mo d'entrée ainsi que tous les corps de requête dans la mémoire de processus lors de la création d'un lot. Les quotas d'octets stockés/fichiers/tâches actives/éléments en file d'attente par utilisateur fournissent une limite indépendante en matière d'abus de base de données.

Les points de terminaison de lots pris en charge dans cette version sont :

  • /v1/responses
  • /v1/chat/completions
  • /v1/embeddings
  • /v1/images/generations

Chaque élément exécuté est marqué request_mode=batch, batch_protocol=openai, avec son batch_job_public_id et custom_id.

1. Téléchargez un fichier d'entrée JSONL

Chaque ligne non vide contient custom_id, method, url, et body. L'URL doit être égale au point de terminaison fourni ultérieurement à /v1/batches.

Exemple 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."}}

Demande

curl https://api.model-gate.com/v1/files \
  -H "Authorization: Bearer mg_live_..." \
  -F "purpose=batch" \
  -F "[email protected]"

Réponse — 200

{
  "id": "file-01K...",
  "object": "file",
  "bytes": 322,
  "created_at": 1786610000,
  "filename": "batch.jsonl",
  "purpose": "batch",
  "status": "processed",
  "status_details": null
}

2. Créez le lot

completion_window doit être 24h.

Demande

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"}
  }'

Réponse — 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. Récupérer un lot

Demande

curl https://api.model-gate.com/v1/batches/batch_01K... \
  -H "Authorization: Bearer mg_live_..."

Réponse — complétée

{
  "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. Télécharger les résultats

Demande

curl https://api.model-gate.com/v1/files/file-01KOUTPUT.../content \
  -H "Authorization: Bearer mg_live_..."

Réponse — 200

{"id":"batch_req_01K...","custom_id":"request-1","response":{"status_code":200,"request_id":"01K...","body":{"id":"resp_...","status":"completed"}},"error":null}

Les éléments en échec, annulés ou expirés sont écrits dans error_file_id comme les enregistrements JSONL avec response:null et un error objet.

5. Liste des lots

limit par défaut 20 et doit provenir de 1 à 100. Utiliser after pour la pagination du curseur.

Demande

curl "https://api.model-gate.com/v1/batches?limit=20&after=batch_01K..." \
  -H "Authorization: Bearer mg_live_..."

Réponse — 200

{
  "object": "list",
  "data": [],
  "first_id": null,
  "last_id": null,
  "has_more": false
}

Les objets de lot terminés peuvent inclure un agrégat usage objet lorsque la comptabilité des demandes Model Gate réglées est disponible.

6. Annuler un lot

Annuler empêche le démarrage des éléments en file d'attente ; un article en cours de traitement peut se terminer.

Demande

curl -X POST https://api.model-gate.com/v1/batches/batch_01K.../cancel \
  -H "Authorization: Bearer mg_live_..."

Réponse — 200

{
  "id": "batch_01K...",
  "object": "batch",
  "status": "cancelling",
  "request_counts": {
    "total": 2,
    "completed": 0,
    "failed": 0
  }
}

7. Métadonnées, liste et suppression des fichiers

Récupérer les métadonnées :

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
}

Répertorier les fichiers avec facultatif purpose, after, et order=asc|desc; limit par défaut 10000 et doit provenir de 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
}

Supprimez un fichier compatible non référencé/expiré :

curl -X DELETE https://api.model-gate.com/v1/files/file-01K... \
  -H "Authorization: Bearer mg_live_..."
{
  "id": "file-01K...",
  "object": "file",
  "deleted": true
}

Limites et sémantique de récupération

Model Gate accepte jusqu'à 50 000 éléments JSONL et limite le fichier téléchargé aux éléments configurés. OPENAI_BATCH_MAX_FILE_BYTES valeur (200 Mio par défaut). Chaque article de lot individuel doit également correspondre aux normes normales de Model Gate. MAX_REQUEST_BODY_BYTES limite. custom_id les valeurs doivent être uniques. Les éléments du lot ne peuvent pas être utilisés stream:true ou imbriqué async:true. Les fichiers JSONL volumineux sont conservés en interne sous forme de morceaux de base de données plutôt que sous forme de valeur SQL surdimensionnée.

La récupération de l'exécution est au moins une fois, pas exactement une fois. Si un travailleur s'arrête après l'acceptation d'une demande en amont mais avant que son résultat ne soit enregistré de manière durable, un bail expiré peut entraîner une nouvelle tentative du même ID de demande Model Gate. Le règlement reste idempotent pour les lignes de requêtes déjà terminées, mais les outils/effets secondaires externes initiés par un modèle devraient eux-mêmes être idempotents.

Chaque élément JSONL est admis immédiatement avant qu'un travailleur ne le réclame. Les articles autrement valides restent en file d'attente tant que le solde actuel du compte n'est pas positif ou que la limite de dépenses réinitialisable par clé/groupe est déjà épuisée. Cet état d'attente ne consomme pas de tentative et ne crée pas d'enregistrement d'erreur ; une recharge ultérieure, une réinitialisation de l'utilisation ou une augmentation de la limite rend automatiquement les éléments restants éligibles. Model Gate ne réserve pas de coût de lot théorique maximum. Les articles déjà admis peuvent donc être réglés intégralement même lorsque le travail simultané rend le solde final négatif ou produit un léger dépassement de la limite de dépenses, après quoi les nouveaux articles restent en file d'attente jusqu'à ce que le compte soit à nouveau éligible.

Tarification et comptabilité

L'adaptateur de lots n'utilise pas l'exécution par lots native du fournisseur. Chaque article passe par le routage et le règlement normaux du modèle Model Gate, puis reçoit le modèle de tarification. Coefficient de prix de demande de lot. Défaut: 1.

Si le coefficient est 0.5, un objet dont le coût normal de Model Gate est 0.02 est débité comme 0.01. Le prix de référence officiel reste inchangé. Le coefficient appliqué est instantané et stocké sur la demande d'audit.

Erreurs

{
  "error": {
    "message": "line 2 url must match batch endpoint /v1/responses",
    "type": "invalid_request_error",
    "param": null,
    "code": "invalid_batch_file"
  }
}