Introduction aux déploiements par lots d'Azure OpenAI

L’API OpenAI Batch Azure est conçue pour gérer efficacement les tâches de traitement à grande échelle et à volume élevé. Traiter des groupes asynchrones de requêtes avec un quota distinct, avec un objectif de délai de 24 heures, à un coût 50% moins élevé que la norme mondiale. Avec le traitement par lots, plutôt que d’envoyer une seule requête à la fois, vous envoyez un grand nombre de requêtes dans un seul fichier. Les demandes de lots globales ont un quota de jetons en file d’attente distinct qui évite toute interruption de vos charges de travail en ligne.

Les principaux cas d’usage sont les suivants :

  • Traitement des données à grande échelle : Analysez rapidement de larges ensembles de données en parallèle.

  • Génération de contenu : Créez de grands volumes de texte, tels que des descriptions de produits ou des articles.

  • Révision et synthèse des documents : Automatisez la révision et la synthèse des documents longs.

  • Automatisation du support client : Gérez plusieurs requêtes simultanément pour obtenir des réponses plus rapides.

  • Extraction et analyse des données : Extrayez et analysez des informations à partir de grandes quantités de données non structurées.

  • Tâches de traitement du langage naturel (NLP) : Effectuez des tâches telles que l’analyse des sentiments ou la traduction sur des jeux de données volumineux.

  • Marketing et personnalisation : Générez du contenu et des recommandations personnalisés à grande échelle.

Conseil

Si vos travaux de traitement par lots sont si volumineux que vous atteignez la limite de jetons en file d'attente, même après avoir atteint le quota pour votre déploiement, certaines régions prennent désormais en charge une nouvelle fonctionnalité: elle vous permet de mettre en file d’attente plusieurs travaux par lots avec une attente exponentielle.

Une fois que votre quota de jetons en file d'attente est disponible, le travail de traitement par lots suivant peut être créé et démarré automatiquement. Pour plus d’informations, consultez l’automatisation des tentatives de réexécution des grandes tâches par lots avec une temporisation exponentielle.

Important

Nous nous efforçons de traiter les demandes par lots dans les 24 heures ; nous n’expireons pas les travaux qui prennent plus de temps. Vous pouvez annuler le travail à tout moment. Lorsque vous annulez le travail, tout travail restant est annulé et tout travail déjà terminé est retourné. Vous serez facturé pour tout travail terminé.

Les données stockées au repos restent dans la zone géographique désignée Azure, tandis que les données peuvent être traitées pour inférence dans n’importe quel emplacement OpenAI Azure.  En savoir plus sur la résidence des données. 

Support des traitements batch

Disponibilité globale du modèle batch

Région gpt-5.1, 2025-11-13 gpt-5, 2025-08-07 o3, 2025-04-16 o4-mini, 2025-04-16 gpt-4.1, 2025-04-14 gpt-4.1-nano, 2025-04-14 gpt-4.1-mini, 2025-04-14 o3-mini, 2025-01-31 gpt-4o, 2024-05-13 gpt-4o, 2024-08-06 gpt-4o, 2024-11-20 gpt-4o-mini, 2024-07-18
australiaeast
brésilsud
canadaeast
centralus
eastus
eastus2
francecentral
allemagnewestcentral
japaneast
koreacentral
northcentralus
Norvège-Est
polognecentral
south africanorth
southcentralus
sud de l'Inde
swedencentral
suisse-nord
uksouth
westeurope
westus
westus3

L'inscription est nécessaire pour l’accès à gpt-5 et o3. Pour plus d’informations, consultez le guide des modèles de raisonnement.

Note

Bien que Global Batch prenne en charge les versions antérieures de l’API, certains modèles nécessitent des versions d’API plus récentes. Par exemple, o3-mini n’est pas pris en charge avec 2024-10-21 puisqu'il a été publié après cette date. Pour accéder aux modèles plus récents avec Global Batch, utilisez l’API v1.

Prise en charge des fonctionnalités

Les éléments suivants ne sont actuellement pas pris en charge :

  • Intégration à l’API Assistants.
  • Intégration avec la fonctionnalité OpenAI sur vos données d'Azure.

Déploiement par lots

Note

Dans le portail Microsoft Foundry les types de déploiement par lots apparaissent sous forme de Global-Batch et Data Zone Batch. Pour en savoir plus sur Azure types de déploiement OpenAI, consultez le guide des types de déploiement .

Conseil

Nous vous recommandons d’activer le quota dynamique pour tous les déploiements de modèles de lots globaux afin d’éviter les échecs de travail en raison d’un quota de jetons mis en file d’attente insuffisant. L’utilisation d’un quota dynamique permet à votre déploiement de tirer parti opportunistement de davantage de quota lorsque la capacité supplémentaire est disponible. Lorsque le quota dynamique est désactivé, votre déploiement ne pourra traiter que les requêtes jusqu’à la limite de jeton en file d’attente définie lors de la création du déploiement.

Conditions préalables

  • Un abonnement Azure - Create one gratuitement.
  • Ressource avec un modèle du type GlobalBatch de déploiement ou DataZoneBatch déployé.

Préparation de votre fichier batch

Comme le réglage précis, batch utilise des fichiers au format lignes JSON (.jsonl). Voici quelques exemples de fichiers avec différents types de contenu pris en charge :

Format d’entrée

API de Réponses

{"custom_id": "task-0", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was Microsoft founded, and by whom?"}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was XBOX merged into Microsoft?"}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "What is Visual Basic?"}}

API de complétion de chat

{"custom_id": "task-0", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was Microsoft founded?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was the first XBOX released?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "What is Altair Basic?"}]}}

custom_id est nécessaire pour vous permettre d'identifier quelle demande de lot individuelle correspond à une réponse donnée. Les réponses ne sont pas retournées de manière identique à l’ordre défini dans le .jsonl fichier batch.

model l’attribut doit être défini pour correspondre au nom du déploiement Global Batch que vous souhaitez cibler pour les réponses d’inférence.

Important

L’attribut model doit être défini pour correspondre au nom du déploiement Global Batch que vous souhaitez cibler pour les réponses d’inférence. Le même nom de déploiement de modèle Batch global doit être présent sur chaque ligne du fichier batch. Si vous souhaitez cibler un autre déploiement, vous devez le faire dans un fichier/travail de lot distinct.

Pour obtenir les meilleures performances, nous vous recommandons d’envoyer des fichiers volumineux pour le traitement par lots, plutôt qu’un grand nombre de petits fichiers avec seulement quelques lignes dans chaque fichier.

Créer un fichier d’entrée

Pour cet article, nous allons créer un fichier nommé test.jsonl et copier le contenu du bloc de code d’entrée standard ci-dessus dans le fichier. Vous devez modifier et ajouter votre nom de déploiement par lots global à chaque ligne du fichier.

Créer une tâche par lots

Une fois votre fichier d’entrée préparé, vous devez d’abord charger le fichier pour pouvoir lancer un travail par lots. Le chargement de fichiers peut être effectué par programmation ou via le portail Microsoft Foundry. Cet exemple illustre le chargement d’un fichier directement dans votre ressource OpenAI Azure. Vous pouvez également configure Stockage Blob Azure pour Azure OpenAI Batch.

  1. Connectez-vous à Microsoft Foundry. Vérifiez que le commutateur New Foundry est activé. Ces étapes font référence à Foundry (nouveau).

  2. Dans le coin supérieur droit, sélectionnez Générer

  3. Dans le volet gauche, sélectionnez Modèles

  4. Sélectionner Travaux par lots>créer un travail par lots

    Capture d’écran de la nouvelle expérience de création de lots Foundry.

Suivre la progression du travail par lots

Une fois votre travail créé, vous pouvez surveiller la progression du travail en sélectionnant l’ID de travail pour le travail le plus récemment créé. Par défaut, vous accédez à la page d’état de votre tâche de traitement par lots la plus récente.

Vous pouvez suivre l’état du travail pour votre travail dans le volet droit :

Récupérer le fichier de sortie du travail par lots

Une fois votre travail terminé ou atteint un état de terminal, il génère un fichier d’erreur et un fichier de sortie qui peut être téléchargé pour révision en sélectionnant le bouton correspondant avec l’icône de flèche vers le bas.

Annuler le traitement par lots

Annule un lot en cours. Le lot sera en état cancelling pendant jusqu’à 10 minutes, avant de passer à cancelled, où il aura des résultats partiels (le cas échéant) disponibles dans le fichier de sortie.

Conditions préalables

Les étapes décrites dans cet article sont destinées à être exécutées de manière séquentielle dans les notebooks Jupyter. Pour cette raison, nous instancions uniquement le client OpenAI Azure une fois au début des exemples. Si vous souhaitez exécuter une étape hors commande, vous devez souvent configurer un client OpenAI Azure dans le cadre de cet appel.

Même si vous avez déjà installé la bibliothèque openAI Python, vous devrez peut-être mettre à niveau votre installation vers la dernière version :

!pip install openai --upgrade

Préparation de votre fichier batch

Comme le réglage précis, le traitement par lots global utilise des fichiers au format lignes JSON (.jsonl). Voici quelques exemples de fichiers avec différents types de contenu pris en charge :

Format d’entrée

API de Réponses

{"custom_id": "task-0", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was Microsoft founded, and by whom?"}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was XBOX merged into Microsoft?"}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "What is Visual Basic?"}}

API de complétion de chat

{"custom_id": "task-0", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was Microsoft founded?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was the first XBOX released?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "What is Altair Basic?"}]}}

custom_id est nécessaire pour vous permettre d'identifier quelle demande de lot individuelle correspond à une réponse donnée. Les réponses ne sont pas retournées de manière identique à l’ordre défini dans le .jsonl fichier batch.

model l’attribut doit être défini pour correspondre au nom du déploiement Global Batch que vous souhaitez cibler pour les réponses d’inférence.

Important

L’attribut model doit être défini pour correspondre au nom du déploiement Global Batch que vous souhaitez cibler pour les réponses d’inférence. Le même nom de déploiement de modèle Batch global doit être présent sur chaque ligne du fichier batch. Si vous souhaitez cibler un autre déploiement, vous devez le faire dans un fichier/travail de lot distinct.

Pour obtenir les meilleures performances, nous vous recommandons d’envoyer des fichiers volumineux pour le traitement par lots, plutôt qu’un grand nombre de petits fichiers avec seulement quelques lignes dans chaque fichier.

Créer un fichier d’entrée

Pour cet article, nous allons créer un fichier nommé test.jsonl et copier le contenu du bloc de code d’entrée standard ci-dessus dans le fichier. Vous devez modifier et ajouter votre nom de déploiement par lots global à chaque ligne du fichier. Enregistrez ce fichier dans le même répertoire où vous exécutez votre Jupyter Notebook.

Charger un fichier batch

Une fois votre fichier d’entrée préparé, vous devez d’abord charger le fichier pour pouvoir lancer un travail par lots. Le chargement de fichiers peut être effectué par programmation ou via le portail Microsoft Foundry. Cet exemple illustre le chargement d’un fichier directement dans votre ressource OpenAI Azure. Vous pouvez également configure Stockage Blob Azure pour Azure OpenAI Batch.

import os
from datetime import datetime
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.azure.com/.default"
)

client = OpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
  api_key=token_provider,
)

# Upload a file with a purpose of "batch"
file = client.files.create(
  file=open("test.jsonl", "rb"), 
  purpose="batch",
  extra_body={"expires_after":{"seconds": 1209600, "anchor": "created_at"}} # Optional you can set to a number between 1209600-2592000. This is equivalent to 14-30 days
)

print(file.model_dump_json(indent=2))

print(f"File expiration: {datetime.fromtimestamp(file.expires_at) if file.expires_at is not None else 'Not set'}")

file_id = file.id

En supprimant le commentaire et en ajoutant extra_body={"expires_after":{"seconds": 1209600, "anchor": "created_at"}}, vous définissez l'expiration de notre fichier téléversé à 14 jours. Il existe une limite maximale de 500 fichiers de lots d’entrée par ressource quand aucune expiration n’est définie. En définissant une valeur pour l’expiration, le nombre de fichiers batch d’entrée par ressource est augmenté à 10 000 fichiers par ressource. Pour supprimer les limites de fichiers d’entrée par lots, utilisez Batch avec Stockage Blob Azure.

Sortie:

{
  "id": "file-655111ec9cfc44489d9af078f08116ef",
  "bytes": 176064,
  "created_at": 1743391067,
  "filename": "test.jsonl",
  "object": "file",
  "purpose": "batch",
  "status": "processed",
  "expires_at": 1744600667,
  "status_details": null
}
File expiration: 2025-04-13 23:17:47

Créer une tâche par lots

Une fois que votre fichier a été chargé, vous pouvez envoyer le fichier pour le traitement par lots.

# Submit a batch job with the file
batch_response = client.batches.create(
    input_file_id=file_id,
    endpoint="/chat/completions", # While passing this parameter is required, the system will read your input file to determine if the chat completions or responses API is needed.  
    completion_window="24h",
    # extra_body={"output_expires_after":{"seconds": 1209600, "anchor": "created_at"}} # Optional you can set to a number between 1209600-2592000. This is equivalent to 14-30 days
)

# Save batch ID for later use
batch_id = batch_response.id

print(batch_response.model_dump_json(indent=2))

Note

Actuellement, la fenêtre d’achèvement doit être définie sur 24h. Si vous définissez une autre valeur que 24h votre travail échoue. Les travaux prenant plus de 24 heures continueront à s’exécuter jusqu’à ce qu’ils ne sont pas annulés.

Sortie:

{
  "id": "batch_6caaf24d-54a5-46be-b1b7-518884fcbdde",
  "completion_window": "24h",
  "created_at": 1722476583,
  "endpoint": null,
  "input_file_id": "file-655111ec9cfc44489d9af078f08116ef",
  "object": "batch",
  "status": "validating",
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "error_file_id": null,
  "errors": null,
  "expired_at": null,
  "expires_at": 1722562983,
  "failed_at": null,
  "finalizing_at": null,
  "in_progress_at": null,
  "metadata": null,
  "output_file_id": null,
  "request_counts": {
    "completed": 0,
    "failed": 0,
    "total": 0
  }
}

Si vos travaux de traitement par lots sont si volumineux que vous atteignez la limite de jetons en file d'attente, même après avoir atteint le quota de votre déploiement, certaines régions prennent désormais en charge une nouvelle fonctionnalité d'échec rapide qui vous permet de mettre en file d'attente plusieurs travaux de traitement par lots avec un recul exponentiel. Une fois qu'un grand travail de traitement par lots est terminé, le suivant peut être lancé automatiquement. Pour en savoir plus sur les régions qui prennent en charge cette fonctionnalité et comment adapter votre code pour en tirer parti, consultez la mise en file d’attente des travaux par lots.

Suivre la progression du travail par lots

Une fois que vous avez créé un travail par lots, vous pouvez surveiller sa progression dans Studio ou par programmation. Lors de la vérification de la progression du travail par lots, nous vous recommandons d’attendre au moins 60 secondes entre chaque appel d’état.

import time
import datetime 

status = "validating"
while status not in ("completed", "failed", "canceled"):
    time.sleep(60)
    batch_response = client.batches.retrieve(batch_id)
    status = batch_response.status
    print(f"{datetime.datetime.now()} Batch Id: {batch_id},  Status: {status}")

if batch_response.status == "failed":
    for error in batch_response.errors.data:  
        print(f"Error code {error.code} Message {error.message}")

Sortie:

2024-07-31 21:48:32.556488 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: validating
2024-07-31 21:49:39.221560 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: in_progress
2024-07-31 21:50:53.383138 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: in_progress
2024-07-31 21:52:07.274570 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: in_progress
2024-07-31 21:53:21.149501 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: finalizing
2024-07-31 21:54:34.572508 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: finalizing
2024-07-31 21:55:35.304713 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: finalizing
2024-07-31 21:56:36.531816 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: finalizing
2024-07-31 21:57:37.414105 Batch Id: batch_6caaf24d-54a5-46be-b1b7-518884fcbdde,  Status: completed

Les valeurs d’état suivantes sont possibles :

Statut Description
validating Le fichier d’entrée est validé avant le début du traitement par lots.
failed Le fichier d’entrée a échoué le processus de validation.
in_progress Le fichier d’entrée a été validé avec succès et le lot est en cours d’exécution.
finalizing Le lot est terminé et les résultats sont préparés.
completed Le lot a été terminé et les résultats sont prêts.
expired Le lot n’a pas pu être terminé dans la fenêtre de temps de 24 heures.
cancelling Le lot est en cours cancelled (cela peut prendre jusqu’à 10 minutes pour prendre effet.)
cancelled le lot était cancelled.

Pour examiner les détails de l’état du travail, vous pouvez exécuter :

print(batch_response.model_dump_json(indent=2))

Sortie:

{
  "id": "batch_6caaf24d-54a5-46be-b1b7-518884fcbdde",
  "completion_window": "24h",
  "created_at": 1722476583,
  "endpoint": null,
  "input_file_id": "file-9f3a81d899b4442f98b640e4bc3535dd",
  "object": "batch",
  "status": "completed",
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": 1722477429,
  "error_file_id": "file-c795ae52-3ba7-417d-86ec-07eebca57d0b",
  "errors": null,
  "expired_at": null,
  "expires_at": 1722562983,
  "failed_at": null,
  "finalizing_at": 1722477177,
  "in_progress_at": null,
  "metadata": null,
  "output_file_id": "file-3304e310-3b39-4e34-9f1c-e1c1504b2b2a",
  "request_counts": {
    "completed": 3,
    "failed": 0,
    "total": 3
  }
}

Observez qu’il y a à la fois error_file_id et un séparé output_file_id. Utilisez le error_file_id pour faciliter le débogage des problèmes qui surviennent avec votre tâche par lots.

Récupérer le fichier de sortie du travail par lots

import json

output_file_id = batch_response.output_file_id

if not output_file_id:
    output_file_id = batch_response.error_file_id

if output_file_id:
    file_response = client.files.content(output_file_id)
    raw_responses = file_response.text.strip().split('\n')  

    for raw_response in raw_responses:  
        json_response = json.loads(raw_response)  
        formatted_json = json.dumps(json_response, indent=2)  
        print(formatted_json)

Sortie:

Pour la concision, nous n’incluons qu’une seule réponse d’achèvement de conversation de sortie. Si vous suivez les étapes décrites dans cet article, vous devez avoir trois réponses similaires à celles ci-dessous :

Finalisation de la conversation

{
  "custom_id": "task-0",
  "response": {
    "body": {
      "choices": [
        {
          "content_filter_results": {
            "hate": {
              "filtered": false,
              "severity": "safe"
            },
            "self_harm": {
              "filtered": false,
              "severity": "safe"
            },
            "sexual": {
              "filtered": false,
              "severity": "safe"
            },
            "violence": {
              "filtered": false,
              "severity": "safe"
            }
          },
          "finish_reason": "stop",
          "index": 0,
          "logprobs": null,
          "message": {
            "content": "Microsoft was founded on April 4, 1975, by Bill Gates and Paul Allen in Albuquerque, New Mexico.",
            "role": "assistant"
          }
        }
      ],
      "created": 1722477079,
      "id": "chatcmpl-9rFGJ9dh08Tw9WRKqaEHwrkqRa4DJ",
      "model": "gpt-4o-2024-05-13",
      "object": "chat.completion",
      "prompt_filter_results": [
        {
          "prompt_index": 0,
          "content_filter_results": {
            "hate": {
              "filtered": false,
              "severity": "safe"
            },
            "jailbreak": {
              "filtered": false,
              "detected": false
            },
            "self_harm": {
              "filtered": false,
              "severity": "safe"
            },
            "sexual": {
              "filtered": false,
              "severity": "safe"
            },
            "violence": {
              "filtered": false,
              "severity": "safe"
            }
          }
        }
      ],
      "system_fingerprint": "fp_a9bfe9d51d",
      "usage": {
        "completion_tokens": 24,
        "prompt_tokens": 27,
        "total_tokens": 51
      }
    },
    "request_id": "660b7424-b648-4b67-addc-862ba067d442",
    "status_code": 200
  },
  "error": null
}

API de Réponses

{
  "custom_id": "task-0",
  "response": {
    "body": {
      "id": "resp_0e5c78eb05ee70cf00690cc6d988e4819587556df17436a206",
      "created_at": 1762445017.0,
      "error": null,
      "incomplete_details": null,
      "instructions": null,
      "metadata": {},
      "model": "gpt-4.1-batch",
      "object": "response",
      "output": [
        {
          "id": "msg_0e5c78eb05ee70cf00690cc6da3c548195aae483031113df16",
          "content": [
            {
              "annotations": [],
              "text": "Microsoft was founded on **April 4, 1975** by **Bill Gates** and **Paul Allen**.",
              "type": "output_text",
              "logprobs": []
            }
          ],
          "role": "assistant",
          "status": "completed",
          "type": "message"
        }
      ],
      "parallel_tool_calls": true,
      "temperature": 1.0,
      "tool_choice": "auto",
      "tools": [],
      "top_p": 1.0,
      "background": false,
      "max_output_tokens": null,
      "max_tool_calls": null,
      "previous_response_id": null,
      "prompt_cache_key": null,
      "reasoning": {
        "effort": null,
        "summary": null
      },
      "safety_identifier": null,
      "service_tier": "default",
      "status": "completed",
      "text": {
        "format": {
          "type": "text"
        },
        "verbosity": "medium"
      },
      "top_logprobs": 0,
      "truncation": "disabled",
      "usage": {
        "input_tokens": 16,
        "input_tokens_details": {
          "cached_tokens": 0
        },
        "output_tokens": 25,
        "output_tokens_details": {
          "reasoning_tokens": 0
        },
        "total_tokens": 41
      },
      "user": null,
      "content_filters": null,
      "store": true
    },
    "request_id": "809b30c2-fa0b-4613-b5cc-c30f6b780c9a",
    "status_code": 200
  },
  "error": null
}

Commandes de lot supplémentaires

Annuler le traitement par lots

Annule un lot en cours. Le lot sera en état cancelling pendant jusqu’à 10 minutes, avant de passer à cancelled, où il aura des résultats partiels (le cas échéant) disponibles dans le fichier de sortie.

client.batches.cancel("batch_abc123") # set to your batch_id for the job you want to cancel

Lister un lot

Répertorier les travaux par lots pour une ressource Azure OpenAI particulière.

client.batches.list()

Les méthodes de liste de la bibliothèque Python sont paginées.

Pour répertorier tous les travaux :

all_jobs = []
# Automatically fetches more pages as needed.
for job in client.batches.list(
    limit=20,
):
    # Do something with job here
    all_jobs.append(job)
print(all_jobs)

Lister le lot (préversion)

Utilisez l’API REST pour répertorier tous les travaux de traitement par lots avec des options de tri/filtrage supplémentaires.

Dans les exemples ci-dessous, nous fournissons la fonction generate_time_filter pour faciliter la construction du filtre. Si vous ne souhaitez pas utiliser cette fonction, le format de la chaîne de filtre ressemble à created_at gt 1728860560 and status eq 'Completed'.

import requests
import json
from datetime import datetime, timedelta
from azure.identity import DefaultAzureCredential

token_credential = DefaultAzureCredential()
token = token_credential.get_token('https://ai.azure.com/.default')

endpoint = "https://{YOUR_RESOURCE_NAME}.openai.azure.com/"
api_version = "2025-03-01-preview"
url = f"{endpoint}openai/batches"
order = "created_at asc"
time_filter =  lambda: generate_time_filter("past 8 hours")

# Additional filter examples:
#time_filter =  lambda: generate_time_filter("past 1 day")
#time_filter =  lambda: generate_time_filter("past 3 days", status="Completed")

def generate_time_filter(time_range, status=None):
    now = datetime.now()
    
    if 'day' in time_range:
        days = int(time_range.split()[1])
        start_time = now - timedelta(days=days)
    elif 'hour' in time_range:
        hours = int(time_range.split()[1])
        start_time = now - timedelta(hours=hours)
    else:
        raise ValueError("Invalid time range format. Use 'past X day(s)' or 'past X hour(s)'")
    
    start_timestamp = int(start_time.timestamp())
    
    filter_string = f"created_at gt {start_timestamp}"
    
    if status:
        filter_string += f" and status eq '{status}'"
    
    return filter_string

filter = time_filter()

headers = {'Authorization': 'Bearer ' + token.token}

params = {
    "api-version": api_version,
    "$filter": filter,
    "$orderby": order
}

response = requests.get(url, headers=headers, params=params)

json_data = response.json()

if response.status_code == 200:
    print(json.dumps(json_data, indent=2))
else:
    print(f"Request failed with status code: {response.status_code}")
    print(response.text)  

Sortie:

{
  "data": [
    {
      "cancelled_at": null,
      "cancelling_at": null,
      "completed_at": 1729011896,
      "completion_window": "24h",
      "created_at": 1729011128,
      "error_file_id": "file-472c0626-4561-4327-9e4e-f41afbfb30e6",
      "expired_at": null,
      "expires_at": 1729097528,
      "failed_at": null,
      "finalizing_at": 1729011805,
      "id": "batch_4ddc7b60-19a9-419b-8b93-b9a3274b33b5",
      "in_progress_at": 1729011493,
      "input_file_id": "file-f89384af0082485da43cb26b49dc25ce",
      "errors": null,
      "metadata": null,
      "object": "batch",
      "output_file_id": "file-62bebde8-e767-4cd3-a0a1-28b214dc8974",
      "request_counts": {
        "total": 3,
        "completed": 2,
        "failed": 1
      },
      "status": "completed",
      "endpoint": "/chat/completions"
    },
    {
      "cancelled_at": null,
      "cancelling_at": null,
      "completed_at": 1729016366,
      "completion_window": "24h",
      "created_at": 1729015829,
      "error_file_id": "file-85ae1971-9957-4511-9eb4-4cc9f708b904",
      "expired_at": null,
      "expires_at": 1729102229,
      "failed_at": null,
      "finalizing_at": 1729016272,
      "id": "batch_6287485f-50fc-4efa-bcc5-b86690037f43",
      "in_progress_at": 1729016126,
      "input_file_id": "file-686746fcb6bc47f495250191ffa8a28e",
      "errors": null,
      "metadata": null,
      "object": "batch",
      "output_file_id": "file-04399828-ae0b-4825-9b49-8976778918cb",
      "request_counts": {
        "total": 3,
        "completed": 2,
        "failed": 1
      },
      "status": "completed",
      "endpoint": "/chat/completions"
    }
  ],
  "first_id": "batch_4ddc7b60-19a9-419b-8b93-b9a3274b33b5",
  "has_more": false,
  "last_id": "batch_6287485f-50fc-4efa-bcc5-b86690037f43"
}

Mise en file d’attente des travaux par lots

Si vos travaux de traitement par lots sont si volumineux que vous atteignez la limite de jetons en file d’attente, même après avoir maximisé le quota pour votre déploiement, certaines régions prennent désormais en charge une nouvelle fonctionnalité d’échec rapide qui vous permet de mettre en file d’attente plusieurs travaux par lots avec un ralentissement exponentiel. Une fois qu’une tâche de traitement par lots volumineuse est terminée et que votre quota de jetons en file d’attente est à nouveau disponible, le travail de lot suivant peut être créé et lancé automatiquement.

Ancien comportement :

  1. Tâches Batch volumineuses déjà en cours d'exécution et utilisant tous les jetons disponibles pour votre déploiement.
  2. Nouvelle tâche par lots soumise.
  3. Le nouveau travail de traitement par lots passe à la phase de validation qui peut durer jusqu’à quelques minutes.
  4. Le nombre de jetons pour le nouveau travail est vérifié par rapport au quota actuellement disponible.
  5. La nouvelle tâche de traitement par lots échoue en raison d'une limite de jetons de rapport d'erreurs dépassée.

Nouveau comportement :

  1. Grand(s) traitement(s) batch en cours et utilisant tous les jetons disponibles pour votre déploiement
  2. Nouveau tâche par lots soumise
  3. Le nombre approximatif de jetons du nouveau travail comparé immédiatement au quota de lot actuellement disponible échoue rapidement si cela vous permet de gérer plus facilement les tentatives de nouvelle exécution de manière programmatique.

Prise en charge des régions

Les régions suivantes prennent en charge le nouveau comportement du mécanisme de détection rapide d'échec :

  • australiaeast
  • eastus
  • allemagnewestcentral
  • italynorth
  • northcentralus
  • polognecentral
  • swedencentral
  • suisse-nord
  • eastus2
  • westus

Le code ci-dessous illustre la mécanique de base de la gestion du comportement de défaillance rapide pour permettre l’automatisation des nouvelles tentatives et la mise en file d’attente par lots avec recul exponentiel.

En fonction de la taille de vos travaux de traitement par lots, il se peut que vous deviez augmenter considérablement le max_retries ou modifier davantage cet exemple.

import time
from openai import BadRequestError

max_retries = 10
retries = 0
initial_delay = 5
delay = initial_delay

while True:
    try:
        batch_response = client.batches.create(
            input_file_id=file_id,
            endpoint="/chat/completions",
            completion_window="24h",
        )
        
        # Save batch ID for later use
        batch_id = batch_response.id
        
        print(f"✅ Batch created successfully after {retries} retries")
        print(batch_response.model_dump_json(indent=2))
        break  
        
    except BadRequestError as e:
        error_message = str(e)
        
        # Check if it's a token limit error
        if 'token_limit_exceeded' in error_message:
            retries += 1
            if retries >= max_retries:
                print(f"❌ Maximum retries ({max_retries}) reached. Giving up.")
                raise
            
            print(f"⏳ Token limit exceeded. Waiting {delay} seconds before retry {retries}/{max_retries}...")
            time.sleep(delay)
            
            # Exponential backoff - increase delay for next attempt
            delay *= 2
        else:
            # If it's a different error, raise it immediately
            print(f"❌ Encountered non-token limit error: {error_message}")
            raise

Sortie:

⏳ Token limit exceeded. Waiting 5 seconds before retry 1/10...
⏳ Token limit exceeded. Waiting 10 seconds before retry 2/10...
⏳ Token limit exceeded. Waiting 20 seconds before retry 3/10...
⏳ Token limit exceeded. Waiting 40 seconds before retry 4/10...
⏳ Token limit exceeded. Waiting 80 seconds before retry 5/10...
⏳ Token limit exceeded. Waiting 160 seconds before retry 6/10...
⏳ Token limit exceeded. Waiting 320 seconds before retry 7/10...
✅ Batch created successfully after 7 retries
{
  "id": "batch_1e1e7b9f-d4b4-41fa-bd2e-8d2ec50fb8cc",
  "completion_window": "24h",
  "created_at": 1744402048,
  "endpoint": "/chat/completions",
  "input_file_id": "file-e2ba4ccaa4a348e0976c6fe3c018ea92",
  "object": "batch",
  "status": "validating",
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "error_file_id": "",
  "errors": null,
  "expired_at": null,
  "expires_at": 1744488444,
  "failed_at": null,
  "finalizing_at": null,
  "in_progress_at": null,
  "metadata": null,
  "output_file_id": "",
  "request_counts": {
    "completed": 0,
    "failed": 0,
    "total": 0
  }
}

Conditions préalables

Préparation de votre fichier batch

Comme le réglage précis, le traitement par lots global utilise des fichiers au format lignes JSON (.jsonl). Voici quelques exemples de fichiers avec différents types de contenu pris en charge :

Format d’entrée

API de Réponses

{"custom_id": "task-0", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was Microsoft founded, and by whom?"}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "When was XBOX merged into Microsoft?"}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/responses", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "input": "What is Visual Basic?"}}

API de complétion de chat

{"custom_id": "task-0", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was Microsoft founded?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "When was the first XBOX released?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "REPLACE-WITH-MODEL-DEPLOYMENT-NAME", "messages": [{"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": "What is Altair Basic?"}]}}

custom_id est nécessaire pour vous permettre d'identifier quelle demande de lot individuelle correspond à une réponse donnée. Les réponses ne sont pas retournées de manière identique à l’ordre défini dans le .jsonl fichier batch.

model l’attribut doit être défini pour correspondre au nom du déploiement Global Batch que vous souhaitez cibler pour les réponses d’inférence.

Important

L’attribut model doit être défini pour correspondre au nom du déploiement Global Batch que vous souhaitez cibler pour les réponses d’inférence. Le même nom de déploiement de modèle Batch global doit être présent sur chaque ligne du fichier batch. Si vous souhaitez cibler un autre déploiement, vous devez le faire dans un fichier/travail de lot distinct.

Pour obtenir les meilleures performances, nous vous recommandons d’envoyer des fichiers volumineux pour le traitement par lots, plutôt qu’un grand nombre de petits fichiers avec seulement quelques lignes dans chaque fichier.

Créer un fichier d’entrée

Pour cet article, nous allons créer un fichier nommé test.jsonl et copier le contenu du bloc de code d’entrée standard ci-dessus dans le fichier. Vous devez modifier et ajouter votre nom de déploiement par lots global à chaque ligne du fichier.

Charger un fichier batch

Une fois votre fichier d’entrée préparé, vous devez d’abord charger le fichier pour pouvoir lancer un travail par lots. Le chargement de fichiers peut être effectué par programmation ou via le portail Microsoft Foundry. Cet exemple illustre le chargement d’un fichier directement dans votre ressource OpenAI Azure. Vous pouvez également configure Stockage Blob Azure pour Azure OpenAI Batch.

Important

Utilisez des clés API avec précaution. N’incluez pas la clé API directement dans votre code et ne la publiez jamais publiquement. Si vous utilisez une clé API, stockez-la en toute sécurité dans Azure Key Vault. Pour plus d’informations sur l’utilisation sécurisée des clés API dans vos applications, consultez les API avec Azure Key Vault.

Pour plus d’informations sur la sécurité des services d’INTELLIGENCE artificielle, consultez Demandes d’authentification à Azure AI services.

curl -X POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/files \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=batch" \
  -F "file=@C:\\batch\\test.jsonl;type=application/json" \
  -F "expires_after.seconds=1209600" \
  -F "expires_after.anchor=created_at"

Le code ci-dessus suppose un chemin d’accès de fichier particulier pour votre fichier test.jsonl. Ajustez ce chemin de fichier pour votre système local si nécessaire.

En ajoutant les paramètres facultatifs "expires_after.seconds=1209600" que "expires_after.anchor=created_at" vous définissez votre fichier de chargement pour expirer dans 14 jours. Il existe une limite maximale de 500 fichiers d’entrée par lot par ressource quand aucune expiration n’est définie. En définissant une valeur pour l’expiration, le nombre de fichiers par lot par ressource est augmenté à 10 000 fichiers par ressource. Vous pouvez définir un nombre compris entre 1209600 et 2592000. Cela équivaut à 14 à 30 jours. Pour supprimer les limites de fichiers d’entrée par lots, utilisez Batch avec Stockage Blob Azure.

Sortie:

{
  "status": "processed",
  "bytes": 817,
  "purpose": "batch",
  "filename": "test.jsonl",
  "expires_at": 1744607747,
  "id": "file-7733bc35e32841e297a62a9ee50b3461",
  "created_at": 1743398147,
  "object": "file"
}

Suivre l’état du chargement de fichier

En fonction de la taille de votre fichier de chargement, il peut prendre un certain temps avant qu’il ne soit entièrement chargé et traité. Pour vérifier l’état du chargement de votre fichier, exécutez :

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/files/{file-id} \
  -H "api-key: $AZURE_OPENAI_API_KEY"

Sortie:

{
  "status": "processed",
  "bytes": 686,
  "purpose": "batch",
  "filename": "test.jsonl",
  "expires_at": 1744607747,
  "id": "file-7733bc35e32841e297a62a9ee50b3461",
  "created_at": 1721408291,
  "object": "file"
}

Créer une tâche par lots

Une fois que votre fichier a été chargé, vous pouvez envoyer le fichier pour le traitement par lots.

curl -X POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/batches \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input_file_id": "file-abc123",
    "endpoint": "/chat/completions",
    "completion_window": "24h",
    "output_expires_after": {
        "seconds": 1209600
    },
    "anchor": "created_at"
  }'

Ici, vous pouvez éventuellement ajouter "output_expires_after":{"seconds": 1209600}, et "anchor": "created_at" de sorte que vos fichiers de sortie expirent dans 14 jours.

Note

Actuellement, la fenêtre d’achèvement doit être définie sur 24h. Si vous définissez une autre valeur que 24h votre travail échoue. Les travaux prenant plus de 24 heures continueront à s’exécuter jusqu’à ce qu’ils ne sont pas annulés.

Sortie:

{
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "completion_window": "24h",
  "created_at": "2024-07-19T17:13:57.2491382+00:00",
  "error_file_id": null,
  "expired_at": null,
  "expires_at": "2024-07-20T17:13:57.1918498+00:00",
  "failed_at": null,
  "finalizing_at": null,
  "id": "batch_fe3f047a-de39-4068-9008-346795bfc1db",
  "in_progress_at": null,
  "input_file_id": "file-21006e70789246658b86a1fc205899a4",
  "errors": null,
  "metadata": null,
  "object": "batch",
  "output_file_id": null,
  "request_counts": {
    "total": null,
    "completed": null,
    "failed": null
  },
  "status": "Validating"
}

Suivre la progression du travail par lots

Une fois que vous avez créé un travail par lots, vous pouvez surveiller sa progression dans Studio ou par programmation. Lors de la vérification de la progression du travail par lots, nous vous recommandons d’attendre au moins 60 secondes entre chaque appel d’état.

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/batches/{batch_id} \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Sortie:

{
  "cancelled_at": null,
  "cancelling_at": null,
  "completed_at": null,
  "completion_window": "24h",
  "created_at": "2024-07-19T17:33:29.1619286+00:00",
  "error_file_id": null,
  "expired_at": null,
  "expires_at": "2024-07-20T17:33:29.1578141+00:00",
  "failed_at": null,
  "finalizing_at": null,
  "id": "batch_e0a7ee28-82c4-46a2-a3a0-c13b3c4e390b",
  "in_progress_at": null,
  "input_file_id": "file-c55ec4e859d54738a313d767718a2ac5",
  "errors": null,
  "metadata": null,
  "object": "batch",
  "output_file_id": null,
  "request_counts": {
    "total": null,
    "completed": null,
    "failed": null
  },
  "status": "Validating"
}

Les valeurs d’état suivantes sont possibles :

Statut Description
validating Le fichier d’entrée est validé avant le début du traitement par lots.
failed Le fichier d’entrée a échoué le processus de validation.
in_progress Le fichier d’entrée a été validé avec succès et le lot est en cours d’exécution.
finalizing Le lot est terminé et les résultats sont préparés.
completed Le lot a été terminé et les résultats sont prêts.
expired Le lot n’a pas pu être terminé dans la fenêtre de temps de 24 heures.
cancelling Le lot est en cours cancelled (cela peut prendre jusqu’à 10 minutes pour entrer en vigueur.)
cancelled le lot était cancelled.

Récupérer le fichier de sortie du travail par lots

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/files/{output_file_id}/content \
  -H "api-key: $AZURE_OPENAI_API_KEY" > batch_output.jsonl

Commandes de lot supplémentaires

Annuler le traitement par lots

Annule un lot en cours. Le lot sera en état cancelling pendant jusqu’à 10 minutes, avant de passer à cancelled, où il aura des résultats partiels (le cas échéant) disponibles dans le fichier de sortie.

curl -X POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/batches/{batch_id}/cancel \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Lister un lot

Répertoriez les travaux de traitement par lots existants pour une ressource OpenAI donnée Azure.

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/v1/batches \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

La requête API pour la liste est paginée. La réponse contient une valeur booléenne has_more pour indiquer s’il y a plus de résultats à parcourir.

Lister le lot (préversion)

Utilisez l’API REST pour répertorier tous les travaux de traitement par lots avec des options de tri/filtrage supplémentaires.

curl "YOUR_RESOURCE_NAME.openai.azure.com/batches?api-version=2025-04-01-preview&$filter=created_at%20gt%201728773533%20and%20created_at%20lt%201729032733%20and%20status%20eq%20'Completed'&$orderby=created_at%20asc" \
  -H "api-key: $AZURE_OPENAI_API_KEY"

Pour éviter l'erreur, les espaces sont remplacés par URL rejected: Malformed input to a URL function.

Limites de traitement par lots

Nom de la limite Valeur limite
Nombre maximal de fichiers d’entrée Batch - (sans expiration) 500
Nombre maximal de fichiers d’entrée Batch - (configuration d'expiration) 10 000
Taille maximale du fichier d’entrée 200 Mo
Taille maximale du fichier d’entrée - Apportez votre propre stockage (BYOS) 1 Go
Nombre maximal de requêtes par fichier 100,000

Note

Les limites de fichiers batch ne s’appliquent pas aux fichiers de sortie (par exemple, result.jsonlet error.jsonl). Pour supprimer les limites du fichier d’entrée par lot, utilisez Batch avec Stockage Blob Azure.

Quota de lots

Le tableau indique la limite de quota de lots. Les valeurs de quota pour le lot global sont représentées en termes de jetons mis en file d’attente. Lorsque vous envoyez un fichier pour le traitement par lots, le nombre de jetons dans le fichier est compté. Jusqu’à ce que le travail de traitement par lots atteigne un état terminal, ces jetons sont comptabilisés par rapport à votre limite totale de jetons mis en file d’attente.

Lot global

Modèle Entreprise et MCA-E Par défaut Abonnements mensuels basés sur des cartes de crédit Abonnements MSDN Azure pour étudiants, essais gratuits
gpt-4.1 5B 200M 50 M 90 000 ko N/A
gpt-4.1 mini 15B 1B 50 M 90 000 ko N/A
gpt-4.1-nano 15B 1B 50 M 90 000 ko N/A
gpt-4o 5B 200M 50 M 90 000 ko N/A
gpt-4o-mini 15B 1B 50 M 90 000 ko N/A
gpt-4-turbo 300 millions 80M 40 M 90 000 ko N/A
gpt-4 150M 30M 5M 100 Ko N/A
o3-mini 15B 1B 50 M 90 000 ko N/A
o4-mini 15B 1B 50 M 90 000 ko N/A
gpt-5 5B 200M 50 M 90 000 ko N/A
gpt-5.1 5B 200M 50 M 90 000 ko N/A

B = milliards | M = million | K = mille

Lot de zones de données

Modèle Entreprise et MCA-E Par défaut Abonnements mensuels basés sur des cartes de crédit Abonnements MSDN Azure pour étudiants, essais gratuits
gpt-4.1 500M 30M 30M 90 000 ko N/A
gpt-4.1-mini 1,5 milliard 100M 50 M 90 000 ko N/A
gpt-4o 500M 30M 30M 90 000 ko N/A
gpt-4o-mini 1,5 milliard 100M 50 M 90 000 ko N/A
o3-mini 1,5 milliard 100M 50 M 90 000 ko N/A
gpt-5 5B 200M 50 M 90 000 ko N/A
gpt-5.1 5B 200M 50 M 90 000 ko N/A

Objet Batch

Propriété Type Définition
id String Identificateur du lot.
object String batch
endpoint String Point de terminaison d’API utilisé par le lot
errors Objet Informations d’erreur pour le lot, le cas échéant.
input_file_id String Identifiant du fichier d’entrée du lot
completion_window String Délai dans lequel le lot doit être traité
status String État actuel du lot. Valeurs possibles : validating, , failedin_progress, finalizingcompletedexpiredcancellingcancelled.
output_file_id String ID du fichier contenant les sorties des requêtes exécutées avec succès.
error_file_id String ID du fichier contenant les sorties des requêtes avec des erreurs.
created_at Entier Horodatage à la création de ce lot (en secondes d’époque Unix).
in_progress_at Entier Horodatage indiquant le moment où ce lot a commencé à progresser (en secondes du temps Unix).
expires_at Entier Horodatage indiquant l'expiration de ce lot (en secondes depuis le début de l'époque Unix).
finalizing_at Entier Horodatage lorsque ce lot a commencé à se finaliser (en secondes d'époque Unix).
completed_at Entier Horodatage lorsque ce lot s’est terminé (en secondes d’époque Unix).
failed_at Entier Horodatage lorsque ce lot a échoué (en secondes d’époque Unix).
expired_at Entier Horodatage à l'expiration de ce lot (en secondes d’époque Unix).
cancelling_at Entier Horodatage indiquant le moment où ce lot a démarré cancelling (en secondes d'époque Unix).
cancelled_at Entier Horodatage lorsque ce lot était cancelled (en secondes d’époque Unix).
request_counts Objet Structure d’objet :

total Entier
Nombre total de requêtes dans le lot.
completed Entier
Nombre de requêtes dans le lot qui ont été effectuées avec succès.
failed Entier
Nombre de requêtes dans le lot qui ont échoué.
metadata Carte Ensemble de paires clé-valeur pouvant être attachées au lot. Cette propriété peut être utile pour stocker des informations supplémentaires sur le lot dans un format structuré.

Foire aux questions (FAQ)

Les images peuvent-elles être utilisées avec l’API batch ?

Cette fonctionnalité est limitée à certains modèles multimodaux. Les images peuvent être fournies en entrée via une URL d’image ou une représentation codée en base64 de l’image.

Puis-je utiliser l’API batch avec des modèles affinés ?

Cela n’est actuellement pas pris en charge.

Puis-je utiliser l’API batch pour incorporer des modèles ?

Cela n’est actuellement pas pris en charge.

Le filtrage de contenu fonctionne-t-il avec le déploiement Global Batch ?

Oui. Comme pour d’autres types de déploiement, vous pouvez créer des filtres de contenu et les associer au type de déploiement Global Batch.

Puis-je demander un quota supplémentaire ?

Oui, à partir de la page de quota dans le portail Foundry. L’allocation de quota par défaut est disponible dans l’article sur le quota et les limites.

Que se passe-t-il si l’API ne termine pas ma demande dans le délai de 24 heures ?

Nous nous efforçons de traiter ces demandes dans les 24 heures ; nous n’expireons pas les travaux qui prennent plus de temps. Vous pouvez annuler le travail à tout moment. Lorsque vous annulez le travail, tout travail restant est annulé et tout travail déjà terminé est retourné. Vous serez facturé pour tout travail terminé.

Combien de demandes puis-je mettre en file d’attente à l’aide d’un lot ?

Il n’existe aucune limite fixe sur le nombre de demandes que vous pouvez traiter par lot. Toutefois, elle dépend de votre quota de jetons mis en file d’attente. Votre quota de jetons en file d’attente inclut le nombre maximal de jetons d’entrée que vous pouvez mettre en file d’attente à la fois.

Une fois votre requête par lots terminée, votre limite de débit est réinitialisée, car vos jetons de requête sont effacés. La limite dépend du nombre de requêtes globales dans la file d’attente. Si la file d’attente de l’API Batch traite rapidement vos lots, votre limite de taux de traitement par lots est réinitialisée plus rapidement.

Dépannage

Un travail réussit quand status c’est completed. Les tâches réussies généreront toujours un error_file_id, mais il sera associé à un fichier vide de zéro octet.

Lorsqu’un échec de travail se produit, vous trouverez des détails sur l’échec dans la errors propriété :

{
  "value": [
    {
      "id": "batch_80f5ad38-e05b-49bf-b2d6-a799db8466da",
      "completion_window": "24h",
      "created_at": 1725419394,
      "endpoint": "/chat/completions",
      "input_file_id": "file-c2d9a7881c8a466285e6f76f6321a681",
      "object": "batch",
      "status": "failed",
      "cancelled_at": null,
      "cancelling_at": null,
      "completed_at": 1725419955,
      "error_file_id": "file-3b0f9beb-11ce-4796-bc31-d54e675f28fb",
      "errors": {
        "object": "list",
        "data": [
          {
            "code": "empty_file",
            "message": "The input file is empty. Please ensure that the batch contains at least one request."
          }
        ]
      },
      "expired_at": null,
      "expires_at": 1725505794,
      "failed_at": null,
      "finalizing_at": 1725419710,
      "in_progress_at": 1725419572,
      "metadata": null,
      "output_file_id": "file-ef12af98-dbbc-4d27-8309-2df57feed572",
      "request_counts": {
        "total": 10,
        "completed": null,
        "failed": null
      }
    }
  ]
}

Codes d’erreur

Code d’erreur Définition
invalid_json_line Une ligne (ou plusieurs) dans votre fichier d’entrée n’a pas pu être analysée comme json valide.

Assurez-vous qu'il n'y a aucune faute de frappe, qu'il n'y a aucun problème avec les crochets ouvrants et fermants appropriés, ainsi qu'avec les guillemets conformément à la norme JSON, puis renvoyez la requête.
too_many_tasks Le nombre de requêtes dans le fichier d’entrée dépasse la valeur maximale autorisée de 100 000.

Vérifiez que vos demandes totales sont inférieures à 100 000 et soumettez à nouveau le travail.
url_mismatch Une ligne de votre fichier d’entrée a une URL qui ne correspond pas au reste des lignes, ou l’URL spécifiée dans le fichier d’entrée ne correspond pas à l’URL de point de terminaison attendue.

Vérifiez que toutes les URL de requête sont identiques et qu’elles correspondent à l’URL de point de terminaison associée à votre déploiement openAI Azure.
model_not_found Le nom de déploiement du modèle OpenAI Azure spécifié dans la propriété model du fichier d'entrée n'a pas été trouvé.

Vérifiez que ce nom pointe vers un déploiement de modèle Azure OpenAI valide.
duplicate_custom_id L’ID personnalisé de cette requête est un doublon de l’ID personnalisé dans une autre requête.
empty_file Le fichier d’entrée est vide. Vérifiez que le lot contient au moins une requête.
model_mismatch Le nom de déploiement du modèle OpenAI Azure spécifié dans la propriété model de cette requête dans le fichier d'entrée ne correspond pas au reste du fichier.

Assurez-vous que toutes les requêtes du lot pointent vers le même modèle de déploiement Azure OpenAI dans Foundry Models, dans la propriété model de la requête.
invalid_request Le schéma de la ligne d’entrée n’est pas valide ou la référence SKU de déploiement n’est pas valide.

Vérifiez que les propriétés de la requête dans votre fichier d’entrée correspondent aux propriétés d’entrée attendues et que la référence SKU de déploiement OpenAI Azure est globalbatch pour les demandes d’API batch.
input_modified L'entrée blob a été modifiée après que le travail par lots a été soumis.
input_no_permissions Il n’est pas possible d’accéder à l’objet blob d’entrée. Vérifiez permissions et l’accès réseau entre le compte OpenAI Azure et le compte stockage Azure.

Problèmes connus

  • Les ressources déployées avec Azure CLI ne fonctionnent pas immédiatement avec le lot global d'Azure OpenAI. Cela est dû à un problème où les ressources déployées à l’aide de cette méthode ont des sous-domaines de point de terminaison qui ne suivent pas le https://your-resource-name.openai.azure.com modèle. Une solution de contournement pour ce problème consiste à déployer une nouvelle ressource OpenAI Azure à l’aide de l’une des autres méthodes de déploiement courantes qui gèrent correctement la configuration du sous-domaine dans le cadre du processus de déploiement.

  • Les fichiers codés jsonl en UTF-8-BOM ne sont pas pris en charge. Les fichiers de lignes JSON doivent être encodés à l’aide de UTF-8. L'utilisation de fichiers encodés avec une marque d'ordre d'octet (BOM) n'est pas officiellement prise en charge par la spécification JSON RFC, et Azure OpenAI considèrera actuellement les fichiers encodés avec BOM comme non valides. Un fichier encodé UTF-8-BOM retourne actuellement le message d’erreur générique : « Échec de la validation : Un nom de déploiement de modèle valide n’a pas pu être extrait du fichier d’entrée. Vérifiez que chaque ligne du fichier d’entrée a un nom de déploiement valide spécifié dans le champ « modèle » et que le nom de déploiement est cohérent sur toutes les lignes. »

  • Lorsque vous utilisez votre propre stockage pour les données d’entrée par lots, une fois que le travail de traitement par lots est envoyé, si le blob d'entrée est modifié, le service interrompt le travail de scoring.

Voir aussi