Was this page helpful?
Le traitement par lots est une approche puissante pour gérer efficacement de grands volumes de demandes. Au lieu de traiter les demandes une à une avec des réponses immédiates, le traitement par lots vous permet de soumettre plusieurs demandes ensemble pour un traitement asynchrone. Ce modèle est particulièrement utile lorsque :
L'API Message Batches est notre première implémentation de ce modèle.
L'API Message Batches est un moyen puissant et rentable de traiter de manière asynchrone de grands volumes de demandes Messages. Cette approche convient bien aux tâches qui ne nécessitent pas de réponses immédiates, la plupart des lots se terminant en moins d'une heure tout en réduisant les coûts de 50 % et en augmentant le débit.
Vous pouvez explorer la référence API directement, en plus de ce guide.
Lorsque vous envoyez une demande à l'API Message Batches :
Ceci est particulièrement utile pour les opérations en masse qui ne nécessitent pas de résultats immédiats, telles que :
Tous les modèles actifs prennent en charge l'API Message Batches.
Toute demande que vous pouvez faire à l'API Messages peut être incluse dans un lot. Cela inclut :
Puisque chaque demande du lot est traitée indépendamment, vous pouvez mélanger différents types de demandes dans un seul lot.
Puisque les lots peuvent prendre plus de 5 minutes à traiter, envisagez d'utiliser la durée de cache d'1 heure avec la mise en cache des invites pour de meilleurs taux de succès du cache lors du traitement des lots avec un contexte partagé.
L'API Batches offre des économies de coûts significatives. Tous les usages sont facturés à 50 % des prix standard de l'API.
| Model | Batch input | Batch output |
|---|---|---|
| Claude Opus 4.6 | $2.50 / MTok | $12.50 / MTok |
| Claude Opus 4.5 | $2.50 / MTok | $12.50 / MTok |
| Claude Opus 4.1 | $7.50 / MTok | $37.50 / MTok |
| Claude Opus 4 | $7.50 / MTok | $37.50 / MTok |
| Claude Sonnet 4.5 | $1.50 / MTok | $7.50 / MTok |
| Claude Sonnet 4 | $1.50 / MTok | $7.50 / MTok |
| Claude Sonnet 3.7 (deprecated) | $1.50 / MTok | $7.50 / MTok |
| Claude Haiku 4.5 | $0.50 / MTok | $2.50 / MTok |
| Claude Haiku 3.5 |
Un Message Batch est composé d'une liste de demandes pour créer un Message. La forme d'une demande individuelle comprend :
custom_id unique pour identifier la demande Messagesparams avec les paramètres standard de l'API MessagesVous pouvez créer un lot en passant cette liste dans le paramètre requests :
Dans cet exemple, deux demandes distinctes sont traitées par lots ensemble pour un traitement asynchrone. Chaque demande a un custom_id unique et contient les paramètres standard que vous utiliseriez pour un appel API Messages.
Testez vos demandes de lot avec l'API Messages
La validation de l'objet params pour chaque demande de message est effectuée de manière asynchrone, et les erreurs de validation sont renvoyées une fois le traitement de l'ensemble du lot terminé. Vous pouvez vous assurer que vous construisez votre entrée correctement en vérifiant d'abord la forme de votre demande avec l'API Messages.
Lorsqu'un lot est créé pour la première fois, la réponse aura un statut de traitement de in_progress.
{
"id": "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d",
"type": "message_batch",
"processing_status": "in_progress",
"request_counts": {
"processing": 2,
"succeeded": 0,
"errored": 0,
"canceled": 0,
"expired": 0
},
"ended_at": null,
"created_at": "2024-09-24T18:37:24.100435Z",
"expires_at": "2024-09-25T18:37:24.100435Z",
"cancel_initiated_at": null,
"results_url": null
}Le champ processing_status du Message Batch indique l'étape du traitement du lot. Il commence par in_progress, puis se met à jour vers ended une fois que toutes les demandes du lot ont terminé le traitement et que les résultats sont prêts. Vous pouvez surveiller l'état de votre lot en visitant la Console, ou en utilisant le point de terminaison de récupération.
Pour interroger un Message Batch, vous aurez besoin de son id, qui est fourni dans la réponse lors de la création d'un lot ou en listant les lots. Vous pouvez implémenter une boucle d'interrogation qui vérifie périodiquement l'état du lot jusqu'à ce que le traitement soit terminé :
Vous pouvez lister tous les Message Batches dans votre Workspace en utilisant le point de terminaison de liste. L'API prend en charge la pagination, en récupérant automatiquement les pages supplémentaires selon les besoins :
Une fois le traitement du lot terminé, chaque demande Messages du lot aura un résultat. Il y a 4 types de résultats :
| Type de résultat | Description |
|---|---|
succeeded | La demande a réussi. Inclut le résultat du message. |
errored | La demande a rencontré une erreur et un message n'a pas été créé. Les erreurs possibles incluent les demandes invalides et les erreurs internes du serveur. Vous ne serez pas facturé pour ces demandes. |
canceled | L'utilisateur a annulé le lot avant que cette demande puisse être envoyée au modèle. Vous ne serez pas facturé pour ces demandes. |
expired | Le lot a atteint son expiration de 24 heures avant que cette demande puisse être envoyée au modèle. Vous ne serez pas facturé pour ces demandes. |
Vous verrez un aperçu de vos résultats avec le request_counts du lot, qui montre combien de demandes ont atteint chacun de ces quatre états.
Les résultats du lot sont disponibles pour téléchargement à la propriété results_url sur le Message Batch, et si la permission de l'organisation le permet, dans la Console. En raison de la taille potentiellement importante des résultats, il est recommandé de diffuser les résultats plutôt que de les télécharger tous à la fois.
Les résultats seront au format .jsonl, où chaque ligne est un objet JSON valide représentant le résultat d'une seule demande dans le Message Batch. Pour chaque résultat diffusé, vous pouvez faire quelque chose de différent en fonction de son custom_id et de son type de résultat. Voici un exemple d'ensemble de résultats :
{"custom_id":"my-second-request","result":{"type":"succeeded","message":{"id":"msg_014VwiXbi91y3JMjcpyGBHX5","type":"message","role":"assistant","model":"claude-opus-4-6","content":[{"type":"text","text":"Hello again! It's nice to see you. How can I assist you today? Is there anything specific you'd like to chat about or any questions you have?"}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":11,"output_tokens":36}}}}
{"custom_id":"my-first-request","result":{"type":"succeeded","message":{"id":"msg_01FqfsLoHwgeFbguDgpz48m7","type":"message","role":"assistant","model":"claude-opus-4-6","content":[{"type":"text","text":"Hello! How can I assist you today? Feel free to ask me any questions or let me know if there's anything you'd like to chat about."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":10,"output_tokens":34}}}}Si votre résultat a une erreur, son result.error sera défini sur notre forme d'erreur standard.
Les résultats du lot peuvent ne pas correspondre à l'ordre d'entrée
Les résultats du lot peuvent être renvoyés dans n'importe quel ordre et peuvent ne pas correspondre à l'ordre des demandes lors de la création du lot. Dans l'exemple ci-dessus, le résultat de la deuxième demande du lot est renvoyé avant le premier. Pour faire correspondre correctement les résultats à leurs demandes correspondantes, utilisez toujours le champ custom_id.
Vous pouvez annuler un Message Batch qui est actuellement en traitement en utilisant le point de terminaison d'annulation. Immédiatement après l'annulation, le processing_status d'un lot sera canceling. Vous pouvez utiliser la même technique d'interrogation décrite ci-dessus pour attendre que l'annulation soit finalisée. Les lots annulés se terminent avec un statut de ended et peuvent contenir des résultats partiels pour les demandes qui ont été traitées avant l'annulation.
La réponse affichera le lot dans un état canceling :
{
"id": "msgbatch_013Zva2CMHLNnXjNJJKqJ2EF",
"type": "message_batch",
"processing_status": "canceling",
"request_counts": {
"processing": 2,
"succeeded": 0,
"errored": 0,
"canceled": 0,
"expired": 0
},
"ended_at": null,
"created_at": "2024-09-24T18:37:24.100435Z",
"expires_at": "2024-09-25T18:37:24.100435Z",
"cancel_initiated_at": "2024-09-24T18:39:03.114875Z",
"results_url": null
}L'API Message Batches prend en charge la mise en cache des invites, ce qui vous permet de réduire potentiellement les coûts et le temps de traitement pour les demandes par lot. Les réductions de prix de la mise en cache des invites et de Message Batches peuvent s'accumuler, offrant des économies de coûts encore plus importantes lorsque les deux fonctionnalités sont utilisées ensemble. Cependant, comme les demandes par lot sont traitées de manière asynchrone et concurrente, les accès au cache sont fournis au mieux. Les utilisateurs connaissent généralement des taux d'accès au cache allant de 30 % à 98 %, selon leurs modèles de trafic.
Pour maximiser la probabilité d'accès au cache dans vos demandes par lot :
cache_control identiques dans chaque demande Message au sein de votre lotExemple d'implémentation de la mise en cache des invites dans un lot :
Dans cet exemple, les deux demandes du lot incluent des messages système identiques et le texte complet de Pride and Prejudice marqué avec cache_control pour augmenter la probabilité d'accès au cache.
Pour tirer le meilleur parti de l'API Batches :
custom_id significatives pour faire correspondre facilement les résultats aux demandes, car l'ordre n'est pas garanti.Si vous rencontrez un comportement inattendu :
request_too_large.custom_id unique.created_at du lot (pas le temps ended_at du traitement). Si plus de 29 jours se sont écoulés, les résultats ne seront plus visibles.Notez que l'échec d'une demande dans un lot n'affecte pas le traitement des autres demandes.
Isolation de l'espace de travail : Les lots sont isolés dans l'espace de travail dans lequel ils sont créés. Ils ne peuvent être accessibles que par les clés API associées à cet espace de travail, ou par les utilisateurs ayant la permission de consulter les lots de l'espace de travail dans la Console.
Disponibilité des résultats : Les résultats des lots sont disponibles pendant 29 jours après la création du lot, ce qui permet amplement de temps pour la récupération et le traitement.
| $0.40 / MTok |
| $2 / MTok |
| Claude Opus 3 (deprecated) | $7.50 / MTok | $37.50 / MTok |
| Claude Haiku 3 | $0.125 / MTok | $0.625 / MTok |
curl https://api.anthropic.com/v1/messages/batches \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data \
'{
"requests": [
{
"custom_id": "my-first-request",
"params": {
"model": "claude-opus-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, world"}
]
}
},
{
"custom_id": "my-second-request",
"params": {
"model": "claude-opus-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hi again, friend"}
]
}
}
]
}'import anthropic
import time
client = anthropic.Anthropic()
message_batch = None
while True:
message_batch = client.messages.batches.retrieve(
MESSAGE_BATCH_ID
)
if message_batch.processing_status == "ended":
break
print(f"Batch {MESSAGE_BATCH_ID} is still processing...")
time.sleep(60)
print(message_batch)import anthropic
client = anthropic.Anthropic()
# Automatically fetches more pages as needed.
for message_batch in client.messages.batches.list(
limit=20
):
print(message_batch)#!/bin/sh
curl "https://api.anthropic.com/v1/messages/batches/msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d" \
--header "anthropic-version: 2023-06-01" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
| grep -o '"results_url":[[:space:]]*"[^"]*"' \
| cut -d'"' -f4 \
| while read -r url; do
curl -s "$url" \
--header "anthropic-version: 2023-06-01" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
| sed 's/}{/}\n{/g' \
| while IFS= read -r line
do
result_type=$(echo "$line" | sed -n 's/.*"result":[[:space:]]*{[[:space:]]*"type":[[:space:]]*"\([^"]*\)".*/\1/p')
custom_id=$(echo "$line" | sed -n 's/.*"custom_id":[[:space:]]*"\([^"]*\)".*/\1/p')
error_type=$(echo "$line" | sed -n 's/.*"error":[[:space:]]*{[[:space:]]*"type":[[:space:]]*"\([^"]*\)".*/\1/p')
case "$result_type" in
"succeeded")
echo "Success! $custom_id"
;;
"errored")
if [ "$error_type" = "invalid_request" ]; then
# Request body must be fixed before re-sending request
echo "Validation error: $custom_id"
else
# Request can be retried directly
echo "Server error: $custom_id"
fi
;;
"expired")
echo "Expired: $line"
;;
esac
done
done
import anthropic
client = anthropic.Anthropic()
message_batch = client.messages.batches.cancel(
MESSAGE_BATCH_ID,
)
print(message_batch)curl https://api.anthropic.com/v1/messages/batches \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data \
'{
"requests": [
{
"custom_id": "my-first-request",
"params": {
"model": "claude-opus-4-6",
"max_tokens": 1024,
"system": [
{
"type": "text",
"text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n"
},
{
"type": "text",
"text": "<the entire contents of Pride and Prejudice>",
"cache_control": {"type": "ephemeral"}
}
],
"messages": [
{"role": "user", "content": "Analyze the major themes in Pride and Prejudice."}
]
}
},
{
"custom_id": "my-second-request",
"params": {
"model": "claude-opus-4-6",
"max_tokens": 1024,
"system": [
{
"type": "text",
"text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n"
},
{
"type": "text",
"text": "<the entire contents of Pride and Prejudice>",
"cache_control": {"type": "ephemeral"}
}
],
"messages": [
{"role": "user", "content": "Write a summary of Pride and Prejudice."}
]
}
}
]
}'