„Batch processing" (Batch-Verarbeitung) ist ein leistungsstarker Ansatz, um große Mengen von Anfragen effizient zu verarbeiten. Anstatt Anfragen einzeln mit sofortigen Antworten zu verarbeiten, ermöglicht dir die Batch-Verarbeitung, mehrere Anfragen zusammen für die asynchrone Verarbeitung einzureichen. Dieses Muster ist besonders nützlich, wenn:
Die Message Batches API ist Anthropics 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 sind, während die Kosten um 50 % reduziert und der Durchsatz erhöht wird.
Zusätzlich zu diesem Leitfaden kannst du die API-Referenz direkt erkunden.
Wenn du eine Anfrage an die Message Batches API sendest:
Dies ist besonders nützlich für Massenoperationen, die keine sofortigen Ergebnisse erfordern, wie zum Beispiel:
max_tokens von mindestens 1 haben. max_tokens: 0 (Cache-Vorwärmung) wird innerhalb eines Batches nicht unterstützt, da ein flüchtiger Cache-Eintrag, der während der Batch-Verarbeitung geschrieben wird, wahrscheinlich abläuft, bevor die Folgeanfrage ausgeführt wird.Alle aktiven Modelle unterstützen die Message Batches API.
Fast jede Anfrage, die du an die Messages API stellen kannst, kann in einen Batch aufgenommen werden. Dazu gehören:
Da jede Anfrage im Batch unabhängig verarbeitet wird, kannst du verschiedene Arten von Anfragen innerhalb eines einzelnen Batches mischen.
Eine kleine Anzahl von Messages-API-Parametern wird in Batch-Anfragen nicht unterstützt. Das Einbeziehen eines dieser Parameter führt zu einem Validierungsfehler:
| Parameter | Grund |
|---|---|
stream: true | Batch-Ergebnisse werden als einzelne Datei zurückgegeben, nicht als Stream. |
speed (Fast-Modus) | Der Fast-Modus optimiert die synchrone Latenz, was für die asynchrone Batch-Verarbeitung nicht relevant ist. |
store / previous_thread_event_id (Threads) | Threads sind zustandsbehaftet; Batch-Anfragen sind es nicht. |
cache_hint / context_hint | Diese Routing-Hinweise gelten nur für die synchrone Anfrageplanung. |
max_tokens: 0 | Siehe Batch-Einschränkungen. |
research_preview_2026_02: "active" | Der Research-Preview-Modus ist auf dem Batch-Pfad nicht verfügbar. |
Die Batches API bietet erhebliche Kosteneinsparungen. Die gesamte Nutzung wird zu 50 % der Standard-API-Preise berechnet.
| Modell | Batch-Input | Batch-Output |
|---|---|---|
| Claude Fable 5 | 5 $ / MTok | 25 $ / MTok |
| Claude Mythos 5 (begrenzte Verfügbarkeit) | 5 $ / MTok | 25 $ / MTok |
| Claude Opus 5 | 2,50 $ / MTok | 12,50 $ / MTok |
| Claude Opus 4.8 | 2,50 $ / MTok | 12,50 $ / MTok |
| Claude Opus 4.7 | 2,50 $ / MTok | 12,50 $ / MTok |
| Claude Opus 4.6 | 2,50 $ / MTok | 12,50 $ / MTok |
| Claude Opus 4.5 | 2,50 $ / MTok | 12,50 $ / MTok |
| Claude Opus 4.1 (eingestellt, außer auf Bedrock und Google Cloud) | 7,50 $ / MTok | 37,50 $ / MTok |
| Claude Opus 4 (eingestellt, außer auf Google Cloud) | 7,50 $ / MTok | 37,50 $ / MTok |
| Claude Sonnet 5 | 1 $ / MTok | 5 $ / MTok |
| Claude Sonnet 4.6 | 1,50 $ / MTok | 7,50 $ / MTok |
| Claude Sonnet 4.5 | 1,50 $ / MTok | 7,50 $ / MTok |
| Claude Sonnet 4 (eingestellt, außer auf Bedrock und Google Cloud) | 1,50 $ / MTok | 7,50 $ / MTok |
| Claude Haiku 4.5 | 0,50 $ / MTok | 2,50 $ / MTok |
| Claude Haiku 3.5 (eingestellt, außer auf Bedrock und Google Cloud) | 0,40 $ / MTok | 2 $ / MTok |
Ein Message Batch besteht aus einer Liste von Anfragen zum Erstellen einer Message. Die Struktur einer einzelnen Anfrage umfasst:
custom_id zur Identifizierung der Messages-Anfrage. Muss 1 bis 64 Zeichen lang sein und darf nur alphanumerische Zeichen, Bindestriche und Unterstriche enthalten (entsprechend ^[a-zA-Z0-9_-]{1,64}$).params-Objekt mit den Standard-Parametern der Messages APIDu kannst einen Batch erstellen, indem du diese Liste an den requests-Parameter übergibst:
from anthropic.types.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.messages.batch_create_params import Request
client = anthropic.Anthropic()
message_batch = client.messages.batches.create(
requests=[
Request(
custom_id="my-first-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Hello, world",
}
],
),
),
Request(
custom_id="my-second-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Hi again, friend",
}
],
),
),
]
)
print(message_batch)In diesem Beispiel werden zwei separate Anfragen für die asynchrone Verarbeitung zusammengefasst. Jede Anfrage hat eine eindeutige custom_id und enthält die Standardparameter, die du für einen Messages-API-Aufruf verwenden würdest.
Wenn ein Batch zum ersten Mal erstellt wird, hat die Antwort den Verarbeitungsstatus 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 Batches gibt an, in welcher Verarbeitungsphase sich der Batch befindet. Es beginnt mit in_progress und wechselt dann zu ended, sobald alle Anfragen im Batch verarbeitet wurden und die Ergebnisse bereit sind. Du kannst den Status deines Batches überwachen, indem du die Console besuchst oder den Abruf-Endpunkt verwendest.
Um einen Message Batch abzufragen, benötigst du seine id, die in der Antwort beim Erstellen eines Batches oder beim Auflisten von Batches bereitgestellt wird. Du kannst eine Polling-Schleife implementieren, die den Batch-Status regelmäßig überprüft, bis die Verarbeitung abgeschlossen ist:
import time
client = anthropic.Anthropic()
MESSAGE_BATCH_ID = "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d"
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)Du kannst alle Message Batches in deinem Workspace mit dem List-Endpunkt auflisten. Die API unterstützt Paginierung und ruft bei Bedarf automatisch weitere Seiten ab:
client = anthropic.Anthropic()
# Ruft bei Bedarf automatisch weitere Seiten ab.
for message_batch in client.messages.batches.list(limit=20):
print(message_batch)Sobald die Batch-Verarbeitung abgeschlossen ist, hat jede Messages-Anfrage im Batch ein Ergebnis. Es gibt vier Ergebnistypen:
| Ergebnistyp | Beschreibung |
|---|---|
succeeded | Anfrage war erfolgreich. Enthält das Message-Ergebnis. |
errored | Bei der Anfrage ist ein Fehler aufgetreten und es wurde keine Message erstellt. Mögliche Fehler sind ungültige Anfragen und interne Serverfehler. Diese Anfragen werden dir nicht in Rechnung gestellt. |
canceled | Der Benutzer hat den Batch abgebrochen, bevor diese Anfrage an das Modell gesendet werden konnte. Diese Anfragen werden dir nicht in Rechnung gestellt. |
expired | Der Batch hat sein 24-Stunden-Ablaufdatum erreicht, bevor diese Anfrage an das Modell gesendet werden konnte. Diese Anfragen werden dir nicht in Rechnung gestellt. |
Die request_counts des Batches zeigen eine Übersicht deiner Ergebnisse und geben an, wie viele Anfragen jeden dieser vier Zustände erreicht haben.
Die Ergebnisse des Batches stehen unter der Eigenschaft results_url des Message Batches zum Download bereit und, sofern die Organisationsberechtigung dies zulässt, auch in der Console. Aufgrund der potenziell großen Größe der Ergebnisse wird empfohlen, Ergebnisse zu streamen, anstatt sie alle auf einmal herunterzuladen.
client = anthropic.Anthropic()
# Streame die Ergebnisdatei in speichereffizienten Chunks und verarbeite sie einzeln
for result in client.messages.batches.results(
"msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d",
):
match result.result.type:
case "succeeded":
print(f"Success! {result.custom_id}")
case "errored":
if result.result.error.error.type == "invalid_request_error":
# Request-Body muss vor dem erneuten Senden der Anfrage korrigiert werden
print(f"Validation error {result.custom_id}")
else:
# Anfrage kann direkt wiederholt werden
print(f"Server error {result.custom_id}")
case "expired":
print(f"Request expired {result.custom_id}")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 kannst du je nach custom_id und Ergebnistyp etwas anderes tun. Hier ist ein Beispielsatz von Ergebnissen:
{"custom_id":"my-second-request","result":{"type":"succeeded","message":{"id":"msg_014VwiXbi91y3JMjcpyGBHX5","type":"message","role":"assistant","model":"claude-opus-5","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-5","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 dein Ergebnis einen Fehler enthält, wird result.error auf die standardmäßige Fehlerstruktur gesetzt.
Du kannst einen Message Batch, der gerade verarbeitet wird, mit dem Cancel-Endpunkt abbrechen. Unmittelbar nach dem Abbruch ist der processing_status eines Batches canceling. Du kannst dieselbe zuvor beschriebene Polling-Technik verwenden, um zu warten, bis der Abbruch abgeschlossen ist. Abgebrochene Batches enden mit dem Status ended und können Teilergebnisse für Anfragen enthalten, die vor dem Abbruch verarbeitet wurden.
client = anthropic.Anthropic()
MESSAGE_BATCH_ID = "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d"
message_batch = client.messages.batches.cancel(
MESSAGE_BATCH_ID,
)
print(message_batch)Die Antwort zeigt den Batch im Zustand 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
}Die Message Batches API unterstützt Prompt-Caching, wodurch du potenziell Kosten und Verarbeitungszeit für Batch-Anfragen reduzieren kannst. Die Preisnachlässe von Prompt-Caching und Message Batches können kombiniert werden, was noch größere Kosteneinsparungen ermöglicht, wenn beide Funktionen zusammen verwendet werden. Da Batch-Anfragen jedoch asynchron und gleichzeitig verarbeitet werden, werden Cache-Treffer nach dem Best-Effort-Prinzip bereitgestellt. Benutzer erleben typischerweise Cache-Trefferraten zwischen 30 % und 98 %, abhängig von ihren Traffic-Mustern.
Um die Wahrscheinlichkeit von Cache-Treffern in deinen Batch-Anfragen zu maximieren:
cache_control-Blöcke in jede Message-Anfrage innerhalb deines Batches ein.Beispiel für die Implementierung von Prompt-Caching in einem Batch:
from anthropic.types.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.messages.batch_create_params import Request
client = anthropic.Anthropic()
message_batch = client.messages.batches.create(
requests=[
Request(
custom_id="my-first-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-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.",
}
],
),
),
Request(
custom_id="my-second-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-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.",
}
],
),
),
]
)In diesem Beispiel enthalten beide Anfragen im Batch identische Systemnachrichten und den vollständigen Text von „Stolz und Vorurteil", markiert mit cache_control, um die Wahrscheinlichkeit von Cache-Treffern zu erhöhen.
Alle Server-Tools (Websuche, Web-Abruf, Code-Ausführung, MCP-Konnektoren, Advisor und Tool-Suche) funktionieren in Batch-Anfragen. Der Batch-Worker führt dieselbe serverseitige agentische Schleife aus wie die synchrone Messages API.
Da keine offene Verbindung aufrechterhalten werden muss, führt die Batch-Schleife mehr Iterationen pro Turn aus als eine synchrone Anfrage, bevor sie stop_reason: "pause_turn" zurückgibt. Wenn ein Batch-Ergebnis mit pause_turn zurückkommt, wurde der Turn nicht abgeschlossen; du kannst ihn fortsetzen, indem du den pausierten Assistant-Inhalt in einer Folgeanfrage (Batch oder synchron) einreichst, genau wie im pause_turn-Fortsetzungsmuster gezeigt.
Der Batch-Worker drosselt zusätzlich web_search pro Organisation, damit hochgradig gleichzeitige Batch-Verarbeitung das Websuche-Ratenlimit deiner Organisation nicht erschöpft. Der Batch wiederholt gedrosselte Anfragen automatisch; du musst dies nicht selbst handhaben, aber sehr große Websuche-Batches können länger dauern, bis sie abgeschlossen sind.
Der Beta-Header output-300k-2026-03-24 erhöht die max_tokens-Obergrenze auf 300.000 für Batch-Anfragen mit Claude Opus 5, Claude Opus 4.8, Claude Opus 4.7, Claude Opus 4.6, Claude Sonnet 5 oder Claude Sonnet 4.6. Füge den Header hinzu, um Ausgaben zu generieren, die weit über das standardmäßige max_tokens-Limit von 128k in einem einzelnen Turn hinausgehen.
Verwende die erweiterte Ausgabe für Langform-Generierung wie buchlange Entwürfe und technische Dokumentation, umfassende strukturierte Datenextraktion, große Code-Generierungs-Gerüste und lange Argumentationsketten.
Eine einzelne 300k-Token-Generierung kann über eine Stunde dauern, plane daher deine Batch-Einreichungen mit Blick auf das 24-Stunden-Verarbeitungsfenster. Es gelten die Standard-Batch-Preise (50 % der Standard-API-Preise).
from anthropic.types.beta.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.beta.messages.batch_create_params import Request
client = anthropic.Anthropic()
message_batch = client.beta.messages.batches.create(
betas=["output-300k-2026-03-24"],
requests=[
Request(
custom_id="long-form-request",
params=MessageCreateParamsNonStreaming(
model="claude-opus-5",
max_tokens=300_000,
messages=[
{
"role": "user",
"content": "Write a comprehensive technical guide to building distributed systems, covering architecture patterns, consistency models, fault tolerance, and operational best practices.",
}
],
),
),
],
)
print(message_batch)Um das Beste aus der Batches API herauszuholen:
custom_id-Werte, um Ergebnisse einfach mit Anfragen abzugleichen, da die Reihenfolge nicht garantiert ist.Bei unerwartetem Verhalten:
request_too_large.custom_id hat.created_at-Zeitpunkt des Batches (nicht dem ended_at-Zeitpunkt der Verarbeitung) weniger als 29 Tage vergangen sind. Wenn mehr als 29 Tage vergangen sind, sind die Ergebnisse nicht mehr einsehbar.Beachte, 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. Auf sie kann nur mit API-Keys zugegriffen werden, die diesem Workspace zugeordnet sind, oder von Benutzern mit der Berechtigung, Workspace-Batches in der Console anzuzeigen.
Verfügbarkeit der Ergebnisse: Batch-Ergebnisse sind 29 Tage nach der Erstellung des Batches verfügbar, was ausreichend Zeit für den Abruf und die Verarbeitung bietet.
Die Batch-Verarbeitung speichert Anfrage- und Antwortdaten bis zu 29 Tage nach der Batch-Erstellung. Du kannst einen Message Batch jederzeit nach der Verarbeitung mit dem Endpunkt DELETE /v1/messages/batches/{batch_id} löschen. Um einen laufenden Batch zu löschen, brich ihn zuerst ab. Die asynchrone Verarbeitung erfordert die serverseitige Speicherung sowohl der Eingaben als auch der Ausgaben bis zum Abschluss des Batches und zum Abruf der Ergebnisse.
Informationen zur ZDR-Berechtigung für alle Funktionen findest du unter API und Datenaufbewahrung.
Ermögliche natürliche Zitate für RAG-Anwendungen, indem du Suchergebnisse mit Quellenangabe bereitstellst.
Reduziere Kosten und Latenz, indem du Prompt-Präfixe cachst, die von Anfragen in einem Batch gemeinsam genutzt werden.
Was this page helpful?