Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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
GlobalBatchde déploiement ouDataZoneBatchdé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.
-
Connectez-vous à Microsoft Foundry. Vérifiez que le commutateur New Foundry est activé. Ces étapes font référence à Foundry (nouveau).
Dans le coin supérieur droit, sélectionnez Générer
Dans le volet gauche, sélectionnez Modèles
Sélectionner Travaux par lots>créer un travail par lots
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
- Un abonnement Azure - Create one gratuitement.
- Python version 3.8 ou ultérieure
- Bibliothèque de Python suivante :
openai - Jupyter Notebooks
- Ressource OpenAI Azure avec un modèle du type de déploiement
Global-Batchdéployé. Vous pouvez consulter le guide de création de ressources et de déploiement de modèle pour obtenir de l’aide sur ce processus.
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 :
- Tâches Batch volumineuses déjà en cours d'exécution et utilisant tous les jetons disponibles pour votre déploiement.
- Nouvelle tâche par lots soumise.
- Le nouveau travail de traitement par lots passe à la phase de validation qui peut durer jusqu’à quelques minutes.
- Le nombre de jetons pour le nouveau travail est vérifié par rapport au quota actuellement disponible.
- 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 :
- Grand(s) traitement(s) batch en cours et utilisant tous les jetons disponibles pour votre déploiement
- Nouveau tâche par lots soumise
- 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
- Un abonnement Azure - Create one gratuitement.
- Ressource OpenAI Azure avec un modèle du type de déploiement
Global-Batchdéployé. Vous pouvez consulter le guide de création de ressources et de déploiement de modèle pour obtenir de l’aide sur ce processus.
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.commodè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
jsonlen 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
- En savoir plus sur les types de déploiement d'Azure OpenAI déploiement
- En savoir plus sur Azure OpenAI quotas et limites