Batch-Verarbeitung ist ein leistungsstarker Ansatz zur effizienten Verarbeitung großer Anfragemengen. Anstatt Anfragen einzeln mit sofortigen Antworten zu verarbeiten, ermöglicht die Batch-Verarbeitung das Einreichen mehrerer Anfragen zusammen zur asynchronen Verarbeitung. Dieses Muster ist besonders nützlich, wenn:
Die Message Batches API ist unsere erste Implementierung dieses Musters.
Die Message Batches API ist eine leistungsstarke, kostengünstige Möglichkeit, große Mengen von Messages-Anfragen asynchron zu verarbeiten. Dieser Ansatz eignet sich gut für Aufgaben, die keine sofortigen Antworten erfordern, wobei die meisten Batches in weniger als 1 Stunde abgeschlossen werden, während die Kosten um 50% gesenkt und der Durchsatz erhöht werden.
Sie können die API-Referenz direkt erkunden, zusätzlich zu diesem Leitfaden.
Wenn Sie eine Anfrage an die Message Batches API senden:
Dies ist besonders nützlich für Massenoperationen, die keine sofortigen Ergebnisse erfordern, wie zum Beispiel:
Alle aktiven Modelle unterstützen die Message Batches API.
Jede Anfrage, die Sie an die Messages API stellen können, kann in einen Batch aufgenommen werden. Dies umfasst:
Da jede Anfrage im Batch unabhängig verarbeitet wird, können Sie verschiedene Arten von Anfragen innerhalb eines einzelnen Batches mischen.
Da Batches länger als 5 Minuten verarbeitet werden können, sollten Sie die 1-Stunden-Cache-Dauer mit Prompt-Caching verwenden, um bessere Cache-Hit-Raten bei der Verarbeitung von Batches mit gemeinsamen Kontexten zu erzielen.
Die Batches API bietet erhebliche Kosteneinsparungen. Alle Nutzungen werden mit 50% der Standard-API-Preise berechnet.
| Model | Batch input | Batch output |
|---|---|---|
| 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 | $0.40 / MTok | $2 / MTok |
| Claude Opus 3 () |
Ein Message Batch besteht aus einer Liste von Anfragen zum Erstellen einer Message. Die Form einer einzelnen Anfrage besteht aus:
custom_id zur Identifizierung der Messages-Anfrageparams-Objekt mit den Standard-Messages API-ParameternSie können einen Batch erstellen, indem Sie diese Liste in den requests-Parameter übergeben:
In diesem Beispiel werden zwei separate Anfragen zusammen für die asynchrone Verarbeitung in einen Batch aufgenommen. Jede Anfrage hat eine eindeutige custom_id und enthält die Standard-Parameter, die Sie für einen Messages API-Aufruf verwenden würden.
Testen Sie Ihre Batch-Anfragen mit der Messages API
Die Validierung des params-Objekts für jede Message-Anfrage wird asynchron durchgeführt, und Validierungsfehler werden zurückgegeben, wenn die Verarbeitung des gesamten Batches beendet ist. Sie können sicherstellen, dass Sie Ihre Eingabe korrekt erstellen, indem Sie Ihre Anfragefrom zunächst mit der Messages API überprüfen.
Wenn ein Batch zum ersten Mal erstellt wird, hat die Antwort einen Verarbeitungsstatus von 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
}Das Feld processing_status des Message Batch gibt die Verarbeitungsphase des Batches an. Es beginnt als in_progress, wird dann auf ended aktualisiert, sobald alle Anfragen im Batch verarbeitet wurden und die Ergebnisse bereit sind. Sie können den Status Ihres Batches überwachen, indem Sie die Konsole besuchen oder den Abruf-Endpunkt verwenden.
Um einen Message Batch abzufragen, benötigen Sie seine id, die in der Antwort beim Erstellen eines Batches oder durch Auflisten von Batches bereitgestellt wird. Sie können eine Abfrageschleife implementieren, die den Batch-Status regelmäßig überprüft, bis die Verarbeitung beendet ist:
Sie können alle Message Batches in Ihrem Workspace mit dem List-Endpunkt auflisten. Die API unterstützt Pagination und ruft automatisch zusätzliche Seiten nach Bedarf ab:
Sobald die Batch-Verarbeitung beendet ist, hat jede Messages-Anfrage im Batch ein Ergebnis. Es gibt 4 Ergebnistypen:
| Ergebnistyp | Beschreibung |
|---|---|
succeeded | Anfrage war erfolgreich. Enthält das Message-Ergebnis. |
errored | Anfrage ist auf einen Fehler gestoßen und eine Message wurde nicht erstellt. Mögliche Fehler sind ungültige Anfragen und interne Serverfehler. Sie werden für diese Anfragen nicht berechnet. |
canceled | Benutzer hat den Batch abgebrochen, bevor diese Anfrage an das Modell gesendet werden konnte. Sie werden für diese Anfragen nicht berechnet. |
expired | Batch hat seine 24-Stunden-Ablaufzeit erreicht, bevor diese Anfrage an das Modell gesendet werden konnte. Sie werden für diese Anfragen nicht berechnet. |
Sie sehen eine Übersicht Ihrer Ergebnisse mit den request_counts des Batches, die zeigen, wie viele Anfragen jeden dieser vier Zustände erreicht haben.
Die Ergebnisse des Batches können unter der Eigenschaft results_url auf dem Message Batch heruntergeladen werden, und falls die Organisationsberechtigung dies zulässt, in der Konsole. Aufgrund der möglicherweise großen Größe der Ergebnisse wird empfohlen, Ergebnisse zu streamen, anstatt sie alle auf einmal herunterzuladen.
Die Ergebnisse liegen im .jsonl-Format vor, wobei jede Zeile ein gültiges JSON-Objekt ist, das das Ergebnis einer einzelnen Anfrage im Message Batch darstellt. Für jedes gestreamte Ergebnis können Sie je nach custom_id und Ergebnistyp etwas anderes tun. Hier ist ein Beispiel für einen Satz von Ergebnissen:
{"custom_id":"my-second-request","result":{"type":"succeeded","message":{"id":"msg_014VwiXbi91y3JMjcpyGBHX5","type":"message","role":"assistant","model":"claude-sonnet-4-5-20250929","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-sonnet-4-5-20250929","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}}}}Wenn Ihr Ergebnis einen Fehler hat, wird sein result.error auf unsere Standard-Fehlerform gesetzt.
Batch-Ergebnisse entsprechen möglicherweise nicht der Eingabereihenfolge
Batch-Ergebnisse können in beliebiger Reihenfolge zurückgegeben werden und entsprechen möglicherweise nicht der Reihenfolge der Anfragen beim Erstellen des Batches. Im obigen Beispiel wird das Ergebnis für die zweite Batch-Anfrage vor der ersten zurückgegeben. Um Ergebnisse korrekt mit ihren entsprechenden Anfragen abzugleichen, verwenden Sie immer das Feld custom_id.
Sie können einen Message Batch, der gerade verarbeitet wird, mit dem Cancel-Endpunkt abbrechen. Unmittelbar nach dem Abbruch hat der processing_status eines Batches den Wert canceling. Sie können die gleiche oben beschriebene Abfragetechnik verwenden, um zu warten, bis der Abbruch abgeschlossen ist. Abgebrochene Batches enden mit dem Status ended und können teilweise Ergebnisse für Anfragen enthalten, die vor dem Abbruch verarbeitet wurden.
Die Antwort zeigt den Batch in einem canceling-Zustand:
{
"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
}Die Message Batches API unterstützt Prompt Caching, wodurch Sie möglicherweise Kosten und Verarbeitungszeit für Batch-Anfragen reduzieren können. Die Preisrabatte aus Prompt Caching und Message Batches können sich stapeln und bieten noch größere Kosteneinsparungen, wenn beide Funktionen zusammen verwendet werden. Da Batch-Anfragen jedoch asynchron und gleichzeitig verarbeitet werden, werden Cache Hits auf Best-Effort-Basis bereitgestellt. Benutzer erleben typischerweise Cache-Hit-Raten zwischen 30 % und 98 %, je nach ihren Verkehrsmustern.
Um die Wahrscheinlichkeit von Cache Hits in Ihren Batch-Anfragen zu maximieren:
cache_control Blöcke in jede Message-Anfrage innerhalb Ihres Batches einBeispiel für die Implementierung von Prompt Caching in einem Batch:
In diesem Beispiel enthalten beide Anfragen im Batch identische Systemmeldungen und den vollständigen Text von Pride and Prejudice, der mit cache_control gekennzeichnet ist, um die Wahrscheinlichkeit von Cache Hits zu erhöhen.
Um das Beste aus der Batches API herauszuholen:
custom_id Werte, um Ergebnisse leicht mit Anfragen abzugleichen, da die Reihenfolge nicht garantiert ist.Wenn Sie unerwartet Verhalten feststellen:
request_too_large Fehler.custom_id hat.created_at (nicht der Verarbeitung ended_at) Zeit vergangen sind. Wenn mehr als 29 Tage vergangen sind, sind die Ergebnisse nicht mehr einsehbar.Beachten Sie, dass das Fehlschlagen einer Anfrage in einem Batch die Verarbeitung anderer Anfragen nicht beeinträchtigt.
Workspace-Isolation: Batches sind innerhalb des Workspace isoliert, in dem sie erstellt wurden. Sie können nur von API-Schlüsseln zugegriffen werden, die diesem Workspace zugeordnet sind, oder von Benutzern mit Berechtigung zum Anzeigen von Workspace-Batches in der Konsole.
Verfügbarkeit von Ergebnissen: Batch-Ergebnisse sind 29 Tage nach der Batch-Erstellung verfügbar, was ausreichend Zeit für Abruf und Verarbeitung bietet.
| $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-sonnet-4-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, world"}
]
}
},
{
"custom_id": "my-second-request",
"params": {
"model": "claude-sonnet-4-5",
"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()
# Ruft automatisch weitere Seiten nach Bedarf ab.
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-sonnet-4-5",
"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-sonnet-4-5",
"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."}
]
}
}
]
}'