Prompt-Caching
Cache Prompt-Präfixe mit cache_control, um Kosten und Latenz zu senken – mit automatischem Caching oder expliziten Breakpoints mit TTLs von 5 Minuten oder 1 Stunde.
„Prompt caching“ (Prompt-Caching) optimiert deine API-Nutzung, indem es das Fortsetzen ab bestimmten Präfixen in deinen Prompts ermöglicht. Dies reduziert die Verarbeitungszeit und die Kosten für sich wiederholende Aufgaben oder Prompts mit gleichbleibenden Elementen erheblich.
Es gibt zwei Möglichkeiten, Prompt-Caching zu aktivieren:
- Automatisches Caching: Füge ein einzelnes
cache_control-Feld auf der obersten Ebene deiner Anfrage hinzu. Das System wendet den Cache-Breakpoint automatisch auf den letzten cachefähigen Block an und verschiebt ihn nach vorne, wenn Gespräche wachsen. Am besten geeignet für mehrstufige Gespräche, bei denen der wachsende Nachrichtenverlauf automatisch gecacht werden soll. - Explizite Cache-Breakpoints: Platziere
cache_controldirekt auf einzelnen Inhaltsblöcken, um feingranular zu steuern, was genau gecacht wird.
Der einfachste Einstieg ist das automatische Caching:
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
cache_control={"type": "ephemeral"},
system="You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.",
messages=[
{
"role": "user",
"content": "Analyze the major themes in 'Pride and Prejudice'.",
}
],
)
print(response.usage.model_dump_json())Beim automatischen Caching cacht das System alle Inhalte bis einschließlich des letzten cachefähigen Blocks. Bei nachfolgenden Anfragen mit demselben Präfix werden gecachte Inhalte automatisch wiederverwendet.
So funktioniert Prompt-Caching
Wenn du eine Anfrage mit aktiviertem Prompt-Caching sendest:
- Das System prüft, ob ein Prompt-Präfix bis zu einem angegebenen Cache-Breakpoint bereits aus einer kürzlich erfolgten Abfrage gecacht ist.
- Falls gefunden, verwendet es die gecachte Version, was Verarbeitungszeit und Kosten reduziert.
- Andernfalls verarbeitet es den vollständigen Prompt und cacht das Präfix, sobald die Antwort beginnt.
Dies ist besonders nützlich für:
- Prompts mit vielen Beispielen
- Große Mengen an Kontext oder Hintergrundinformationen
- Sich wiederholende Aufgaben mit gleichbleibenden Anweisungen
- Lange mehrstufige Gespräche
Standardmäßig hat der Cache eine Lebensdauer von 5 Minuten. Der Cache wird jedes Mal, wenn der gecachte Inhalt verwendet wird, ohne zusätzliche Kosten aufgefrischt.
Die Lebensdauer wird ab dem Beginn der Anfrage gemessen, die den Cache-Eintrag schreibt oder liest, nicht ab dem Ende ihrer Antwort. Die für die Generierung einer Antwort aufgewendete Zeit wird auf die Lebensdauer angerechnet: Wenn das Streaming einer Antwort 4 Minuten dauert, muss eine Folgeanfrage, die dasselbe gecachte Präfix wiederverwendet, innerhalb von etwa 1 Minute nach Abschluss dieser Antwort beginnen.
Preise
Prompt-Caching führt eine neue Preisstruktur ein. Die folgende Tabelle zeigt den Preis pro Million Token für jedes unterstützte Modell:
| Modell | Basis-Input-Token | 5m Cache-Schreibvorgänge | 1h Cache-Schreibvorgänge | Cache-Treffer und -Aktualisierungen | Output-Token |
|---|---|---|---|---|---|
| Claude Fable 5.1 | 10 $ / MTok | 12,50 $ / MTok | 20 $ / MTok | 0,25 $ / MTok1 | 50 $ / MTok |
| Claude Mythos 5.1 (eingeschränkte Verfügbarkeit) | 10 $ / MTok | 12,50 $ / MTok | 20 $ / MTok | 0,25 $ / MTok1 | 50 $ / MTok |
| Claude Fable 5 | 10 $ / MTok | 12,50 $ / MTok | 20 $ / MTok | 1 $ / MTok | 50 $ / MTok |
| Claude Mythos 5 (eingeschränkte Verfügbarkeit) | 10 $ / MTok | 12,50 $ / MTok | 20 $ / MTok | 1 $ / MTok | 50 $ / MTok |
| Claude Opus 5 | 5 $ / MTok | 6,25 $ / MTok | 10 $ / MTok | 0,50 $ / MTok | 25 $ / MTok |
| Claude Opus 4.8 | 5 $ / MTok | 6,25 $ / MTok | 10 $ / MTok | 0,50 $ / MTok | 25 $ / MTok |
| Claude Opus 4.7 | 5 $ / MTok | 6,25 $ / MTok | 10 $ / MTok | 0,50 $ / MTok | 25 $ / MTok |
| Claude Opus 4.6 | 5 $ / MTok | 6,25 $ / MTok | 10 $ / MTok | 0,50 $ / MTok | 25 $ / MTok |
| Claude Opus 4.5 | 5 $ / MTok | 6,25 $ / MTok | 10 $ / MTok | 0,50 $ / MTok | 25 $ / MTok |
| Claude Opus 4.1 (eingestellt, außer auf Bedrock und Google Cloud) | 15 $ / MTok | 18,75 $ / MTok | 30 $ / MTok | 1,50 $ / MTok | 75 $ / MTok |
| Claude Opus 4 (eingestellt, außer auf Google Cloud) | 15 $ / MTok | 18,75 $ / MTok | 30 $ / MTok | 1,50 $ / MTok | 75 $ / MTok |
| Claude Sonnet 5 | 2 $ / MTok | 2,50 $ / MTok | 4 $ / MTok | 0,20 $ / MTok | 10 $ / MTok |
| Claude Sonnet 4.6 | 3 $ / MTok | 3,75 $ / MTok | 6 $ / MTok | 0,30 $ / MTok | 15 $ / MTok |
| Claude Sonnet 4.5 | 3 $ / MTok | 3,75 $ / MTok | 6 $ / MTok | 0,30 $ / MTok | 15 $ / MTok |
| Claude Sonnet 4 (eingestellt, außer auf Bedrock und Google Cloud) | 3 $ / MTok | 3,75 $ / MTok | 6 $ / MTok | 0,30 $ / MTok | 15 $ / MTok |
| Claude Haiku 4.5 | 1 $ / MTok | 1,25 $ / MTok | 2 $ / MTok | 0,10 $ / MTok | 5 $ / MTok |
| Claude Haiku 3.5 (eingestellt, außer auf Bedrock und Google Cloud) | 0,80 $ / MTok | 1 $ / MTok | 1,60 $ / MTok | 0,08 $ / MTok | 4 $ / MTok |
1 Cache-Treffer und -Aktualisierungen bei Claude Fable 5.1 und Claude Mythos 5.1 werden mit dem 0,025-Fachen des Basis-Input-Preises berechnet. Alle anderen Modelle verwenden den Standard-Multiplikator von 0,1x.
Unterstützte Modelle
Prompt-Caching (sowohl automatisch als auch explizit) wird auf allen aktiven Claude-Modellen unterstützt.
Automatisches Caching
Automatisches Caching ist die einfachste Möglichkeit, Prompt-Caching zu aktivieren. Anstatt cache_control auf einzelnen Inhaltsblöcken zu platzieren, fügst du ein einzelnes cache_control-Feld auf der obersten Ebene deines Anfrage-Bodys hinzu. Das System wendet den Cache-Breakpoint automatisch auf den letzten cachefähigen Block an.
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
cache_control={"type": "ephemeral"},
system="You are a helpful assistant that remembers our conversation.",
messages=[
{"role": "user", "content": "My name is Alex. I work on machine learning."},
{
"role": "assistant",
"content": "Nice to meet you, Alex! How can I help with your ML work today?",
},
{"role": "user", "content": "What did I say I work on?"},
],
)
print(response.usage.model_dump_json())So funktioniert automatisches Caching in mehrstufigen Gesprächen
Beim automatischen Caching verschiebt sich der Cache-Punkt automatisch nach vorne, wenn Gespräche wachsen. Jede neue Anfrage cacht alles bis zum letzten cachefähigen Block, und vorherige Inhalte werden aus dem Cache gelesen.
| Anfrage | Inhalt | Cache-Verhalten |
|---|---|---|
| Anfrage 1 | System + User(1) + Asst(1) + User(2) ◀ cache | Alles wird in den Cache geschrieben |
| Anfrage 2 | System + User(1) + Asst(1) + User(2) + Asst(2) + User(3) ◀ cache | System bis User(2) aus dem Cache gelesen; Asst(2) + User(3) in den Cache geschrieben |
| Anfrage 3 | System + User(1) + Asst(1) + User(2) + Asst(2) + User(3) + Asst(3) + User(4) ◀ cache | System bis User(3) aus dem Cache gelesen; Asst(3) + User(4) in den Cache geschrieben |
Der Cache-Breakpoint verschiebt sich in jeder Anfrage automatisch zum letzten cachefähigen Block, sodass du keine cache_control-Markierungen aktualisieren musst, wenn das Gespräch wächst.
TTL-Unterstützung
Standardmäßig verwendet automatisches Caching eine TTL von 5 Minuten. Du kannst eine TTL von 1 Stunde zum 2-fachen Basispreis für Eingabe-Token angeben:
{ "cache_control": { "type": "ephemeral", "ttl": "1h" } }Kombination mit Caching auf Blockebene
Automatisches Caching ist mit expliziten Cache-Breakpoints kompatibel. Bei gemeinsamer Verwendung belegt der automatische Cache-Breakpoint einen der 4 verfügbaren Breakpoint-Plätze.
So kannst du beide Ansätze kombinieren. Verwende zum Beispiel einen expliziten Breakpoint, um deinen System-Prompt zu cachen, während automatisches Caching das Gespräch übernimmt:
{
"model": "claude-opus-5",
"max_tokens": 1024,
"cache_control": { "type": "ephemeral" },
"system": [
{
"type": "text",
"text": "You are a helpful assistant.",
"cache_control": { "type": "ephemeral" }
}
],
"messages": [{ "role": "user", "content": "What are the key terms?" }]
}Was gleich bleibt
Automatisches Caching verwendet dieselbe zugrunde liegende Caching-Infrastruktur. Preise, Mindest-Token-Schwellen, Anforderungen an die Kontextreihenfolge und das Lookback-Fenster von 20 Blöcken gelten genauso wie bei expliziten Breakpoints.
Sonderfälle
- Wenn der letzte Block bereits ein explizites
cache_controlmit derselben TTL hat, ist automatisches Caching ein No-op. - Wenn der letzte Block ein explizites
cache_controlmit einer anderen TTL hat, gibt die API einen 400-Fehler zurück. - Wenn bereits 4 explizite Breakpoints auf Blockebene existieren, gibt die API einen 400-Fehler zurück (keine Plätze mehr für automatisches Caching).
- Wenn der letzte Block nicht als Ziel für einen automatischen Cache-Breakpoint geeignet ist, geht das System stillschweigend rückwärts, um den nächstgelegenen geeigneten Block zu finden. Wird keiner gefunden, wird das Caching übersprungen.
Explizite Cache-Breakpoints
Für mehr Kontrolle über das Caching kannst du cache_control direkt auf einzelnen Inhaltsblöcken platzieren. Das ist nützlich, wenn du verschiedene Abschnitte cachen musst, die sich unterschiedlich häufig ändern, oder wenn du feingranular steuern musst, was genau gecacht wird.
Strukturierung deines Prompts
Platziere statische Inhalte (Tool-Definitionen, Systemanweisungen, Kontext, Beispiele) am Anfang deines Prompts. Markiere das Ende des wiederverwendbaren Inhalts für das Caching mit dem Parameter cache_control.
Cache-Präfixe werden in der folgenden Reihenfolge erstellt: tools, system, dann messages. Diese Reihenfolge bildet eine Hierarchie, in der jede Ebene auf den vorherigen aufbaut.
So funktioniert die automatische Präfixprüfung
Du kannst nur einen einzigen Cache-Breakpoint am Ende deines statischen Inhalts verwenden, und das System findet automatisch das längste Präfix, das eine frühere Anfrage bereits in den Cache geschrieben hat. Zu verstehen, wie das funktioniert, hilft dir, deine Caching-Strategie zu optimieren.
Drei Grundprinzipien:
-
Cache-Schreibvorgänge erfolgen nur an deinem Breakpoint. Das Markieren eines Blocks mit
cache_controlschreibt genau einen Cache-Eintrag: einen Hash des Präfixes, das an diesem Block endet. Das System schreibt keine Einträge für frühere Positionen. Da der Hash kumulativ ist und alles bis einschließlich des Breakpoints abdeckt, erzeugt die Änderung eines beliebigen Blocks am oder vor dem Breakpoint bei der nächsten Anfrage einen anderen Hash. -
Cache-Lesevorgänge suchen rückwärts nach Einträgen, die frühere Anfragen geschrieben haben. Bei jeder Anfrage berechnet das System den Präfix-Hash an deinem Breakpoint und prüft, ob ein passender Cache-Eintrag existiert. Falls keiner existiert, geht es Block für Block rückwärts und prüft, ob der Präfix-Hash an jeder früheren Position mit etwas übereinstimmt, das bereits im Cache liegt. Es sucht nach früheren Schreibvorgängen, nicht nach stabilem Inhalt.
-
Das Lookback-Fenster umfasst 20 Blöcke. Das System prüft höchstens 20 Positionen pro Breakpoint, wobei der Breakpoint selbst als erste zählt. Findet das System in diesem Fenster keinen passenden Eintrag, endet die Prüfung (oder wird ab dem nächsten expliziten Breakpoint fortgesetzt, falls vorhanden). Auf der Claude API zählt eine Folge aufeinanderfolgender
tool_use-Blöcke als eine Position, ebenso eine Folge aufeinanderfolgendertool_result-Blöcke, sodass ein Zug mit vielen parallelen Tool-Aufrufen den Eintrag der vorherigen Anfrage nicht allein aus dem Fenster schiebt.
Beispiel: Lookback in einem wachsenden Gespräch
Du hängst in jedem Zug neue Blöcke an und setzt cache_control auf den letzten Block jeder Anfrage:
- Zug 1: 10 Blöcke, Breakpoint auf Block 10. Es existieren keine früheren Cache-Einträge. Das System schreibt einen Eintrag bei Block 10.
- Zug 2: 15 Blöcke, Breakpoint auf Block 15. Block 15 hat keinen Eintrag, also geht das System zurück zu Block 10 und findet den Eintrag aus Zug 1. Cache-Treffer bei Block 10; das System verarbeitet nur die Blöcke 11 bis 15 neu und schreibt einen neuen Eintrag bei Block 15.
- Zug 3: 35 Blöcke, Breakpoint auf Block 35. Das System prüft 20 Positionen (Blöcke 35 bis 16) und findet nichts. Der Eintrag aus Zug 2 bei Block 15 liegt eine Position außerhalb des Fensters, daher gibt es keinen Cache-Treffer. Das Hinzufügen eines zweiten Breakpoints bei Block 15 startet dort ein zweites Lookback-Fenster, das den Eintrag aus Zug 2 findet.
Häufiger Fehler: Breakpoint auf Inhalt, der sich bei jeder Anfrage ändert
Dein Prompt hat einen großen statischen Systemkontext (Blöcke 1 bis 5), gefolgt von einem anfragespezifischen Block mit einem Zeitstempel und der Benutzernachricht (Block 6). Du setzt cache_control auf Block 6:
- Anfrage 1: Cache-Schreibvorgang bei Block 6. Der Hash enthält den Zeitstempel.
- Anfrage 2: Der Zeitstempel unterscheidet sich, also unterscheidet sich der Präfix-Hash bei Block 6. Der Lookback geht durch die Blöcke 5, 4, 3, 2 und 1, aber das System hat an keiner dieser Positionen je einen Eintrag geschrieben. Kein Cache-Treffer. Du zahlst bei jeder Anfrage für einen neuen Cache-Schreibvorgang und erhältst nie einen Lesevorgang.
Der Lookback findet keinen stabilen Inhalt hinter deinem Breakpoint und cacht ihn. Er findet Einträge, die frühere Anfragen bereits geschrieben haben, und Schreibvorgänge erfolgen nur an Breakpoints. Verschiebe cache_control auf Block 5, den letzten Block, der über Anfragen hinweg gleich bleibt, und jede nachfolgende Anfrage liest das gecachte Präfix. Automatisches Caching tappt in dieselbe Falle: Es platziert den Breakpoint auf dem letzten cachefähigen Block, der in dieser Struktur derjenige ist, der sich bei jeder Anfrage ändert; verwende daher stattdessen einen expliziten Breakpoint auf Block 5.
Wichtigste Erkenntnis: Platziere cache_control auf dem letzten Block, dessen Präfix über die Anfragen hinweg identisch ist, die sich einen Cache teilen sollen. In einem wachsenden Gespräch funktioniert der letzte Block, solange jeder Zug weniger als 20 Blöcke hinzufügt: Frühere Inhalte ändern sich nie, sodass der Lookback der nächsten Anfrage den vorherigen Schreibvorgang findet. Bei einem Prompt mit variierendem Suffix (Zeitstempel, anfragespezifischer Kontext, die eingehende Nachricht) platziere den Breakpoint am Ende des statischen Präfixes, nicht auf dem variierenden Block.
Wann mehrere Breakpoints sinnvoll sind
Du kannst bis zu 4 Cache-Breakpoints definieren, wenn du:
- Verschiedene Abschnitte cachen möchtest, die sich unterschiedlich häufig ändern (zum Beispiel ändern sich Tools selten, aber der Kontext wird täglich aktualisiert)
- Mehr Kontrolle darüber haben möchtest, was genau gecacht wird
- Einen Cache-Treffer sicherstellen möchtest, wenn ein wachsendes Gespräch deinen Breakpoint 20 oder mehr Blöcke über den letzten Cache-Schreibvorgang hinausschiebt
Kosten von Cache-Breakpoints verstehen
Cache-Breakpoints selbst verursachen keine Kosten. Dir wird nur Folgendes berechnet:
- Cache-Schreibvorgänge: Wenn neuer Inhalt in den Cache geschrieben wird (25 % mehr als Basis-Eingabe-Token bei einer TTL von 5 Minuten)
- Cache-Lesevorgänge: Wenn gecachter Inhalt verwendet wird (10 % des Basispreises für Eingabe-Token bzw. 2,5 % bei Claude Fable 5.1 und Claude Mythos 5.1)
- Reguläre Eingabe-Token: Für alle nicht gecachten Inhalte
Das Hinzufügen weiterer cache_control-Breakpoints erhöht deine Kosten nicht – du zahlst weiterhin denselben Betrag, basierend darauf, welcher Inhalt tatsächlich gecacht und gelesen wird. Die Breakpoints geben dir Kontrolle darüber, welche Abschnitte unabhängig voneinander gecacht werden können.
Caching-Strategien und Überlegungen
Cache-Einschränkungen
Auf der Claude API, Claude Platform on AWS, Google Cloud und Microsoft Foundry beträgt die minimale cachefähige Prompt-Länge:
- 512 Token für Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5, Claude Fable 5 und Claude Mythos 5
- 2.048 Token für Claude Mythos Preview und Claude Opus 4.7
- 4.096 Token für Claude Opus 4.6 und Claude Opus 4.5
- 1.024 Token für Claude Opus 4.8, Claude Sonnet 5, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Opus 4.1 (eingestellt, außer auf Bedrock und Google Cloud), Claude Opus 4 (eingestellt, außer auf Google Cloud) und Claude Sonnet 4 (eingestellt, außer auf Bedrock und Google Cloud)
- 4.096 Token für Claude Haiku 4.5
- 2.048 Token für Claude Haiku 3.5 (eingestellt, außer auf Bedrock und Google Cloud)
Diese Mindestwerte gelten auf jeder Plattform, auf der das jeweilige Modell verfügbar ist.
Kürzere Prompts können nicht gecacht werden, selbst wenn sie mit cache_control markiert sind. Alle Anfragen, weniger als diese Anzahl an Token zu cachen, werden ohne Caching verarbeitet, und es wird kein Fehler zurückgegeben. Um zu überprüfen, ob ein Prompt gecacht wurde, prüfe die Usage-Felder der Antwort: Wenn sowohl cache_creation_input_tokens als auch cache_read_input_tokens 0 sind, wurde der Prompt nicht gecacht (wahrscheinlich, weil er die Mindestlänge nicht erreicht hat).
Wenn dein Prompt das Minimum für dein Modell und deine Plattform knapp verfehlt, lohnt es sich oft, den gecachten Inhalt zu erweitern, um die Schwelle zu erreichen. Cache-Lesevorgänge kosten deutlich weniger als nicht gecachte Eingabe-Token, sodass das Erreichen des Minimums die Kosten für häufig wiederverwendete Prompts senken kann.
Beachte bei gleichzeitigen Anfragen, dass ein Cache-Eintrag erst verfügbar wird, nachdem die erste Antwort begonnen hat. Wenn du Cache-Treffer für parallele Anfragen benötigst, warte auf die erste Antwort, bevor du nachfolgende Anfragen sendest.
Derzeit ist „ephemeral“ der einzige unterstützte Cache-Typ, der standardmäßig eine Lebensdauer von 5 Minuten hat.
Was gecacht werden kann
Die meisten Blöcke in der Anfrage können gecacht werden. Dazu gehören:
- Tools: Tool-Definitionen im
tools-Array - Systemnachrichten: Inhaltsblöcke im
system-Array - Textnachrichten: Inhaltsblöcke im
messages.content-Array, sowohl in Benutzer- als auch in Assistenten-Zügen - Bilder & Dokumente: Inhaltsblöcke im
messages.content-Array, in Benutzer-Zügen - Tool-Nutzung und Tool-Ergebnisse: Inhaltsblöcke im
messages.content-Array, sowohl in Benutzer- als auch in Assistenten-Zügen
Jedes dieser Elemente kann gecacht werden, entweder automatisch oder durch Markierung mit cache_control.
Was nicht gecacht werden kann
Obwohl die meisten Anfrageblöcke gecacht werden können, gibt es einige Ausnahmen:
-
Thinking-Blöcke können nicht direkt mit
cache_controlgecacht werden. Thinking-Blöcke KÖNNEN jedoch zusammen mit anderen Inhalten gecacht werden, wenn sie in vorherigen Assistenten-Zügen erscheinen. Wenn sie auf diese Weise gecacht werden, zählen sie beim Lesen aus dem Cache als Eingabe-Token. -
Unter-Inhaltsblöcke (wie Zitate) selbst können nicht direkt gecacht werden. Cache stattdessen den Block der obersten Ebene.
Im Fall von Zitaten können die Dokument-Inhaltsblöcke der obersten Ebene, die als Quellmaterial für Zitate dienen, gecacht werden. So kannst du Prompt-Caching effektiv mit Zitaten nutzen, indem du die Dokumente cachst, auf die sich die Zitate beziehen.
-
Leere Textblöcke können nicht gecacht werden.
Was den Cache invalidiert
Änderungen an gecachten Inhalten können den Cache teilweise oder vollständig invalidieren.
Wie unter Strukturierung deines Prompts beschrieben, folgt der Cache der Hierarchie: tools → system → messages. Änderungen auf einer Ebene invalidieren diese Ebene und alle nachfolgenden Ebenen.
Die folgende Tabelle zeigt, welche Teile des Caches durch verschiedene Arten von Änderungen invalidiert werden. ✘ bedeutet, dass der Cache invalidiert wird, während ✓ bedeutet, dass der Cache gültig bleibt.
| Was sich ändert | Tools-Cache | System-Cache | Messages-Cache | Auswirkung |
|---|---|---|---|---|
| Tool-Definitionen | ✘ | ✘ | ✘ | Das Ändern von Tool-Definitionen (Namen, Beschreibungen, Parameter) invalidiert den gesamten Cache |
| Websuche-Umschalter | ✓ | ✘ | ✘ | Das Aktivieren/Deaktivieren der Websuche ändert den System-Prompt |
| Zitate-Umschalter | ✓ | ✘ | ✘ | Das Aktivieren/Deaktivieren von Zitaten ändert den System-Prompt |
| Geschwindigkeitseinstellung | ✓ | ✘ | ✘ | Das Wechseln zwischen speed: "fast" und Standardgeschwindigkeit invalidiert System- und Nachrichten-Caches |
| Tool-Auswahl | ✓ | ✓ | ✘ | Änderungen am Parameter tool_choice betreffen nur Nachrichtenblöcke |
| Bilder | ✓ | ✓ | ✘ | Das Hinzufügen/Entfernen von Bildern an beliebiger Stelle im Prompt betrifft Nachrichtenblöcke |
| Thinking-Parameter | Modellspezifisch | Modellspezifisch | ✘ | Die Thinking-Konfiguration (Modus und budget_tokens im erweiterten Modus) wird in den Prompt gerendert, sodass eine Änderung immer Nachrichtenblöcke invalidiert; Tool- und System-Caches werden ebenfalls auf Modellen invalidiert, die die Konfiguration vor ihnen rendern. Siehe Thinking und Prompt-Caching. |
| Effort-Einstellung | Modellspezifisch | Modellspezifisch | ✘ | Das Ändern des Werts von output_config.effort invalidiert immer Nachrichtenblöcke, mit derselben modellspezifischen Auswirkung auf Tool- und System-Caches wie bei Thinking-Parametern. Effort explizit auf den Standardwert des Modells zu setzen, ist gleichbedeutend mit dem Weglassen und invalidiert nicht. Auf Modellen, die Effort pro Nachricht unterstützen, lässt eine Effort-Änderung, die in einer role: "system"-Nachricht innerhalb von messages übermittelt wird, das gecachte Präfix intakt. |
| Nicht-Tool-Ergebnisse, die an Anfragen mit erweitertem Denken übergeben werden | ✓ | ✓ | Modellspezifisch | Auf Opus 4.5+ und Sonnet 4.6+ werden Thinking-Blöcke standardmäßig beibehalten, sodass der Cache gültig bleibt (✓). Auf früheren Opus-/Sonnet-Modellen und allen Haiku-Modellen werden alle zuvor gecachten Thinking-Blöcke aus dem Kontext entfernt, und alle Nachrichten, die auf diese Thinking-Blöcke folgen, werden aus dem Cache entfernt (✘). Weitere Details findest du unter Caching mit Thinking-Blöcken. |
| Verworfene Thinking-Blöcke | ✓ | ✓ | ✘ | Wenn die API einen Thinking-Block von Claude Fable 5.1 oder Claude Mythos 5.1 verwirft, der bei dieser Anfrage nicht beibehalten wird (zum Beispiel einen, den du an ein früheres Modell zurückspielst), ändert sich das gecachte Präfix bei dieser Anfrage ab der Position dieses Blocks. Blöcke, die das empfangende Modell lesen kann und die unverändert zurückgegeben werden, halten den Cache intakt. |
Cache-Leistung verfolgen
Überwache die Cache-Leistung mithilfe dieser API-Antwortfelder innerhalb von usage in der Antwort (oder im message_start-Event bei Streaming):
cache_creation_input_tokens: Anzahl der Token, die beim Erstellen eines neuen Eintrags in den Cache geschrieben wurden.cache_read_input_tokens: Anzahl der Token, die für diese Anfrage aus dem Cache abgerufen wurden.input_tokens: Anzahl der Eingabe-Token, die weder aus einem Cache gelesen noch zum Erstellen eines Caches verwendet wurden (das heißt, Token nach dem letzten Cache-Breakpoint).
Caching mit Thinking-Blöcken
Bei der Verwendung von Thinking mit Prompt-Caching haben Thinking-Blöcke ein besonderes Verhalten:
Automatisches Caching zusammen mit anderen Inhalten: Obwohl Thinking-Blöcke nicht explizit mit cache_control markiert werden können, werden sie als Teil des Anfrageinhalts gecacht, wenn du nachfolgende API-Aufrufe mit Tool-Ergebnissen machst. Das passiert häufig bei der Tool-Nutzung, wenn du Thinking-Blöcke zurückgibst, um das Gespräch fortzusetzen.
Zählung der Eingabe-Token: Wenn Thinking-Blöcke aus dem Cache gelesen werden, zählen sie in deinen Nutzungsmetriken als Eingabe-Token. Das ist wichtig für die Kostenberechnung und die Token-Budgetierung.
Muster der Cache-Invalidierung:
- Der Cache bleibt gültig, wenn nur Tool-Ergebnisse als Benutzernachrichten bereitgestellt werden
- Auf Opus 4.5+ und Sonnet 4.6+ werden Thinking-Blöcke standardmäßig beibehalten, selbst wenn Benutzerinhalte hinzugefügt werden, die keine Tool-Ergebnisse sind, sodass der Cache gültig bleibt
- Auf früheren Opus-/Sonnet-Modellen und allen Haiku-Modellen wird der Cache invalidiert, wenn Benutzerinhalte hinzugefügt werden, die keine Tool-Ergebnisse sind, wodurch alle vorherigen Thinking-Blöcke aus dem Kontext entfernt werden
- Dieses Caching-Verhalten tritt auch ohne explizite
cache_control-Markierungen auf
Weitere Details zur Cache-Invalidierung findest du unter Was den Cache invalidiert.
Beispiel mit Tool-Nutzung:
Request 1: User: "What's the weather in Paris?"
Response: [thinking_block_1] + [tool_use block 1]
Request 2:
User: ["What's the weather in Paris?"],
Assistant: [thinking_block_1] + [tool_use block 1],
User: [tool_result_1, cache=True]
Response: [thinking_block_2] + [text block 2]
# Request 2 caches its request content (not the response)
# The cache includes: user message, thinking_block_1, tool_use block 1, and tool_result_1
Request 3:
User: ["What's the weather in Paris?"],
Assistant: [thinking_block_1] + [tool_use block 1],
User: [tool_result_1, cache=True],
Assistant: [thinking_block_2] + [text block 2],
User: [Text response, cache=True]
# On earlier Opus/Sonnet and all Haiku models, non-tool-result user block causes prior thinking blocks to be stripped; on Opus 4.5+/Sonnet 4.6+ they are keptAuf früheren Opus-/Sonnet-Modellen und allen Haiku-Modellen werden an dieser Stelle alle vorherigen Thinking-Blöcke aus dem Kontext entfernt. Auf Opus 4.5+ und Sonnet 4.6+ werden vorherige Thinking-Blöcke standardmäßig beibehalten und bleiben Teil des gecachten Präfixes.
Ausführlichere Informationen findest du unter Thinking und Prompt-Caching.
Cache-Speicherung und -Freigabe
-
Organisations- und Workspace-Isolation: Caches sind zwischen Organisationen isoliert. Verschiedene Organisationen teilen niemals Caches, selbst wenn sie identische Prompts verwenden. Caches sind auf der Claude API, Claude Platform on AWS und Microsoft Foundry außerdem pro Workspace innerhalb einer Organisation isoliert; Bedrock und Google Cloud verwenden nur Isolation auf Organisationsebene.
-
Exakte Übereinstimmung: Cache-Treffer erfordern 100 % identische Prompt-Segmente, einschließlich aller Texte und Bilder bis einschließlich des mit Cache-Control markierten Blocks.
-
Generierung von Ausgabe-Token: Prompt-Caching hat keine Auswirkung auf die Generierung von Ausgabe-Token. Die Antwort, die du erhältst, ist identisch mit der, die du ohne Prompt-Caching erhalten würdest.
Best Practices für effektives Caching
So optimierst du die Leistung von Prompt-Caching:
- Beginne bei mehrstufigen Gesprächen mit automatischem Caching. Es übernimmt die Breakpoint-Verwaltung automatisch.
- Verwende explizite Breakpoints auf Blockebene, wenn du verschiedene Abschnitte mit unterschiedlichen Änderungshäufigkeiten cachen musst.
- Cache stabile, wiederverwendbare Inhalte wie Systemanweisungen, Hintergrundinformationen, große Kontexte oder häufige Tool-Definitionen.
- Platziere gecachte Inhalte für die beste Leistung am Anfang des Prompts.
- Setze Cache-Breakpoints strategisch ein, um verschiedene cachefähige Präfixabschnitte zu trennen.
- Platziere den Breakpoint auf dem letzten Block, der über Anfragen hinweg identisch bleibt. Bei einem Prompt mit statischem Präfix und variierendem Suffix (Zeitstempel, anfragespezifischer Kontext, die eingehende Nachricht) ist das das Ende des Präfixes, nicht der variierende Block.
- Analysiere regelmäßig die Cache-Trefferraten und passe deine Strategie bei Bedarf an.
Optimierung für verschiedene Anwendungsfälle
Passe deine Prompt-Caching-Strategie an dein Szenario an:
- Konversationsagenten: Reduziere Kosten und Latenz bei längeren Gesprächen, insbesondere bei solchen mit langen Anweisungen oder hochgeladenen Dokumenten.
- Coding-Assistenten: Verbessere Autovervollständigung und Fragen & Antworten zur Codebasis, indem du relevante Abschnitte oder eine zusammengefasste Version der Codebasis im Prompt behältst.
- Verarbeitung großer Dokumente: Binde vollständiges Langform-Material einschließlich Bildern in deinen Prompt ein, ohne die Antwortlatenz zu erhöhen.
- Detaillierte Anweisungssätze: Teile umfangreiche Listen von Anweisungen, Verfahren und Beispielen, um Claudes Antworten zu verfeinern. Entwickler fügen oft ein oder zwei Beispiele in den Prompt ein, aber mit Prompt-Caching kannst du noch bessere Leistung erzielen, indem du 20+ vielfältige Beispiele hochwertiger Antworten einfügst.
- Agentische Tool-Nutzung: Verbessere die Leistung in Szenarien mit mehreren Tool-Aufrufen und iterativen Codeänderungen, bei denen jeder Schritt typischerweise einen neuen API-Aufruf erfordert.
- Sprich mit Büchern, Papers, Dokumentation, Podcast-Transkripten und anderen Langform-Inhalten: Erwecke jede Wissensbasis zum Leben, indem du das/die gesamte(n) Dokument(e) in den Prompt einbettest und Benutzer Fragen dazu stellen lässt.
Fehlerbehebung bei häufigen Problemen
Bei unerwartetem Verhalten:
- Stelle sicher, dass gecachte Abschnitte über Aufrufe hinweg identisch sind. Überprüfe bei expliziten Breakpoints, dass sich die
cache_control-Markierungen an denselben Stellen befinden - Prüfe, dass Aufrufe innerhalb der Cache-Lebensdauer erfolgen (standardmäßig 5 Minuten)
- Überprüfe, dass
tool_choice, Bildnutzung, die Thinking-Konfiguration undoutput_config.effortzwischen Aufrufen konsistent bleiben - Stelle sicher, dass du mindestens die Mindestanzahl an Token für dein Modell und deine Plattform cachst (siehe Cache-Einschränkungen)
- Vergewissere dich, dass dein Breakpoint auf einem Block liegt, der über Anfragen hinweg identisch bleibt. Cache-Schreibvorgänge erfolgen nur am Breakpoint, und wenn sich dieser Block ändert (Zeitstempel, anfragespezifischer Kontext, die eingehende Nachricht), stimmt der Präfix-Hash nie überein. Der Lookback findet keinen stabilen Inhalt hinter dem Breakpoint; er findet nur Einträge, die frühere Anfragen an ihren eigenen Breakpoints geschrieben haben
- Überprüfe, dass die Schlüssel in deinen
tool_use-Inhaltsblöcken eine stabile Reihenfolge haben, da einige Sprachen (zum Beispiel Swift, Go) die Schlüsselreihenfolge bei der JSON-Konvertierung randomisieren und damit Caches brechen - Verwende die Cache-Diagnose, damit die API aufeinanderfolgende Anfragen vergleicht und meldet, welcher Teil des Prompts abgewichen ist
Cache-Dauer von 1 Stunde
Falls dir 5 Minuten zu kurz sind, bietet Anthropic auch eine Cache-Dauer von 1 Stunde gegen Aufpreis an.
Um den erweiterten Cache zu verwenden, füge ttl wie folgt in die cache_control-Definition ein:
"cache_control": {
"type": "ephemeral",
"ttl": "1h"
}Die Antwort enthält detaillierte Cache-Informationen wie die folgenden:
{
"usage": {
"input_tokens": 2048,
"cache_read_input_tokens": 1800,
"cache_creation_input_tokens": 248,
"output_tokens": 503,
"cache_creation": {
"ephemeral_5m_input_tokens": 148,
"ephemeral_1h_input_tokens": 100
}
}
}Beachte, dass das aktuelle Feld cache_creation_input_tokens der Summe der Werte im Objekt cache_creation entspricht.
Wenn du bei der Verwendung von Server-Tools wie der Websuche ephemeral_5m_input_tokens-Schreibvorgänge siehst, die du nicht angefordert hast, siehe Tool-Nutzung mit Prompt-Caching.
Wann der 1-Stunden-Cache sinnvoll ist
Wenn du Prompts hast, die in regelmäßigem Rhythmus verwendet werden (das heißt, System-Prompts, die häufiger als alle 5 Minuten verwendet werden), verwende weiterhin den 5-Minuten-Cache, da dieser weiterhin ohne zusätzliche Kosten aufgefrischt wird.
Der 1-Stunden-Cache eignet sich am besten für die folgenden Szenarien:
- Wenn du Prompts hast, die wahrscheinlich seltener als alle 5 Minuten, aber häufiger als jede Stunde verwendet werden. Zum Beispiel, wenn ein agentischer Neben-Agent länger als 5 Minuten braucht, oder wenn du ein langes Chat-Gespräch mit einem Benutzer speicherst und allgemein erwartest, dass dieser Benutzer möglicherweise nicht innerhalb der nächsten 5 Minuten antwortet.
- Wenn Latenz wichtig ist und deine Folge-Prompts möglicherweise nach mehr als 5 Minuten gesendet werden.
- Wenn du die Auslastung deines Ratenlimits verbessern möchtest, da Cache-Treffer nicht von deinem Ratenlimit abgezogen werden.
Verschiedene TTLs mischen
Du kannst sowohl 1-Stunden- als auch 5-Minuten-Cache-Controls in derselben Anfrage verwenden, jedoch mit einer wichtigen Einschränkung: Cache-Einträge mit längerer TTL müssen vor kürzeren TTLs erscheinen (das heißt, ein 1-Stunden-Cache-Eintrag muss vor allen 5-Minuten-Cache-Einträgen erscheinen).
Beim Mischen von TTLs bestimmt die API drei Abrechnungspositionen in deinem Prompt:
- Position
A: Die Token-Anzahl beim höchsten Cache-Treffer (oder 0, wenn es keine Treffer gibt). - Position
B: Die Token-Anzahl beim höchsten 1-Stunden-cache_control-Block nachA(oder gleichA, wenn keiner existiert). - Position
C: Die Token-Anzahl beim letztencache_control-Block.
Dir wird Folgendes berechnet:
- Cache-Lese-Token für
A. - 1-Stunden-Cache-Schreib-Token für
(B - A). - 5-Minuten-Cache-Schreib-Token für
(C - B).
Hier sind drei Beispiele. Dargestellt sind die Eingabe-Token von 3 Anfragen, die jeweils unterschiedliche Cache-Treffer und Cache-Fehltreffer haben. Jede hat infolgedessen eine unterschiedlich berechnete Preisgestaltung, die in den farbigen Kästen gezeigt wird.
Vorwärmen des Caches
Das Vorwärmen des Caches („cache pre-warming“) ermöglicht es dir, deinen System-Prompt oder deine Tool-Definitionen in den Prompt-Cache zu laden, bevor ein Nutzer eine echte Anfrage auslöst. Dadurch entfällt die Latenzstrafe durch einen Cache-Miss bei der ersten Nutzerinteraktion, was die „time-to-first-token“ (Zeit bis zum ersten Token), oder TTFT, für latenzempfindliche Anwendungen reduziert.
So funktioniert es
Setze max_tokens: 0 in deiner Anfrage. Die API liest deinen Prompt in das Modell ein und schreibt den Cache an jedem cache_control-Breakpoint, kehrt dann sofort zurück, ohne eine Ausgabe zu generieren. Die Antwort hat ein leeres content-Array, stop_reason: "max_tokens" und einen vollständig befüllten usage-Block.
Platziere den cache_control-Breakpoint auf dem letzten Block, der mit der Folgeanfrage geteilt wird (typischerweise dein System-Prompt oder deine Tool-Definitionen), nicht auf der Platzhalter-Nutzernachricht. Andernfalls wird der Cache-Eintrag auf den Platzhalter geschlüsselt und die Folgeanfrage trifft ihn nicht. Verwende außerdem dieselbe Thinking-Konfiguration und denselben output_config.effort-Wert wie in deinen Folgeanfragen: Diese Werte werden in den Prompt gerendert (siehe Was den Cache invalidiert), sodass ein Vorwärmen mit einer anderen Konfiguration einen Eintrag schreiben kann, den dein echter Traffic nie trifft. Das bedeutet, einen expliziten Cache-Breakpoint statt automatischem Caching zu verwenden, da automatisches Caching den Breakpoint auf dem letzten Block platziert, der hier der Platzhalter ist. Die Platzhalter-Nutzernachricht kann eine beliebige Zeichenkette mit Nicht-Leerzeichen-Inhalt sein (die Beispiele hier verwenden "warmup"); ihr Inhalt wird in das Modell eingelesen, aber nie beantwortet.
client = anthropic.Anthropic()
# Führe dies aus, bevor Nutzer eintreffen, um den gemeinsamen System-Prompt-Cache vorzuwärmen.
prewarm = client.messages.create(
model="claude-opus-5",
max_tokens=0,
system=[
{
"type": "text",
"text": "You are an expert software engineer with deep knowledge of distributed systems...",
"cache_control": {"type": "ephemeral"},
}
],
messages=[{"role": "user", "content": "warmup"}],
)
print(prewarm.stop_reason) # "max_tokens"
print(prewarm.content) # []
print(prewarm.usage)Die API gibt ein leeres content-Array zurück:
{
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"content": [],
"model": "claude-opus-5",
"stop_reason": "max_tokens",
"stop_sequence": null,
"usage": {
"input_tokens": 8,
"cache_creation_input_tokens": 5120,
"cache_read_input_tokens": 0,
"cache_creation": {
"ephemeral_5m_input_tokens": 5120,
"ephemeral_1h_input_tokens": 0
},
"iterations": [
{
"input_tokens": 8,
"output_tokens": 0,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 5120,
"cache_creation": {
"ephemeral_5m_input_tokens": 5120,
"ephemeral_1h_input_tokens": 0
},
"type": "message"
}
],
"output_tokens": 0,
"service_tier": "standard",
"inference_geo": "global"
}
}Typisches Nutzungsmuster
Sende eine Vorwärm-Anfrage, wenn deine Anwendung startet (oder in einem geplanten Intervall), und sende dann echte Nutzeranfragen, nachdem das Vorwärmen abgeschlossen ist:
client = anthropic.Anthropic()
SYSTEM_PROMPT = [
{
"type": "text",
"text": "You are an expert software engineer with deep knowledge of distributed systems...",
"cache_control": {"type": "ephemeral"},
}
]
def prewarm_cache() -> None:
"""Call this at application startup or on a scheduled interval."""
client.messages.create(
model="claude-opus-5",
max_tokens=0,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": "warmup"}],
)
def respond(user_message: str) -> anthropic.types.Message:
"""The real user request; benefits from a warm cache."""
return client.messages.create(
model="claude-opus-5",
max_tokens=1024,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": user_message}],
)
# Wärme den Cache auf, bevor Nutzer-Traffic eintrifft.
prewarm_cache()
# Später, wenn der Nutzer eine Nachricht sendet, ist das System-Prompt-Präfix bereits gecacht.
response = respond("How do I implement a binary search tree?")
for block in response.content:
if block.type == "text":
print(block.text)Beachte, dass die Cache-TTL weiterhin gilt. Für den standardmäßigen 5-Minuten-Cache sende mindestens alle 5 Minuten eine neue Vorwärm-Anfrage, um den Cache warm zu halten. Für längere Pausen zwischen Nutzeranfragen verwende stattdessen die 1-Stunden-Cache-Dauer.
Einschränkungen
Eine max_tokens: 0-Anfrage wird mit einem invalid_request_error abgelehnt, wenn eine der folgenden Optionen gesetzt ist, da jede davon eine Ausgabe impliziert, die ein Null-Token-Budget nicht erzeugen kann:
stream: true- Erweitertes Denken (
thinking.type: "enabled") - Strukturierte Ausgaben (
output_config.format) tool_choicemit{"type": "tool", ...}oder{"type": "any"}
max_tokens: 0 wird auch innerhalb einer Message Batches-Anfrage abgelehnt. Das Vorwärmen zielt auf die Zeit bis zum ersten Token ab, was für die Batch-Verarbeitung nicht relevant ist, und ein während der Batch-Verarbeitung geschriebener Cache-Eintrag würde wahrscheinlich ablaufen, bevor die Folgeanfrage ausgeführt wird.
Ersetzen des max_tokens=1-Workarounds
Bevor max_tokens: 0 verfügbar war, verwendeten einige Anwendungen Aufwärm-Aufrufe mit max_tokens: 1, um denselben Effekt zu erzielen. Der Ansatz mit max_tokens: 0 ist vorzuziehen: Es wird keine Ausgabe erzeugt, sodass keine Ein-Token-Antwort verworfen werden muss, keine Output-Token abgerechnet werden und die Absicht der Anfrage eindeutig ist.
Prompt-Caching-Beispiele
Um dir den Einstieg in das Prompt-Caching zu erleichtern, bietet das Prompt-Caching-Cookbook detaillierte Beispiele und Best Practices.
Die folgenden Code-Snippets zeigen verschiedene Prompt-Caching-Muster. Diese Beispiele demonstrieren, wie Caching in unterschiedlichen Szenarien implementiert wird, und helfen dir, die praktischen Anwendungen dieser Funktion zu verstehen:
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
system=[
{
"type": "text",
"text": "You are an AI assistant tasked with analyzing legal documents.",
},
{
"type": "text",
"text": "Here is the full text of a complex legal agreement: [Insert full text of a 50-page legal agreement here]",
"cache_control": {"type": "ephemeral"},
},
],
messages=[
{
"role": "user",
"content": "What are the key terms and conditions in this agreement?",
}
],
)
print(response.usage.model_dump_json())Dieses Beispiel demonstriert die grundlegende Nutzung von Prompt-Caching, wobei der vollständige Text der rechtlichen Vereinbarung als Präfix gecacht wird, während die Nutzeranweisung ungecacht bleibt.
Für die erste Anfrage:
input_tokens: Anzahl der Token nur in der Nutzernachrichtcache_creation_input_tokens: Anzahl der Token in der gesamten Systemnachricht, einschließlich des rechtlichen Dokumentscache_read_input_tokens: 0 (kein Cache-Treffer bei der ersten Anfrage)
Für nachfolgende Anfragen innerhalb der Cache-Lebensdauer:
input_tokens: Anzahl der Token nur in der Nutzernachrichtcache_creation_input_tokens: 0 (keine neue Cache-Erstellung)cache_read_input_tokens: Anzahl der Token in der gesamten gecachten Systemnachricht
Tool-Definitionen können gecacht werden, indem cache_control auf dem letzten Tool in deinem tools-Array platziert wird. Alle Tools, die vor diesem Tool definiert sind, einschließlich dieses Tools selbst, werden als ein einziges Präfix gecacht.
{
"model": "claude-opus-5",
"max_tokens": 1024,
"tools": [
{
"name": "get_weather",
"description": "Get the current weather in a given location",
"input_schema": {
"type": "object",
"properties": { "location": { "type": "string" } },
"required": ["location"]
}
},
{
"name": "get_time",
"description": "Get the current time in a given time zone",
"input_schema": {
"type": "object",
"properties": { "timezone": { "type": "string" } },
"required": ["timezone"]
},
"cache_control": { "type": "ephemeral" }
}
],
"messages": [{ "role": "user", "content": "What is the weather and time in New York?" }]
}Bei der ersten Anfrage spiegelt cache_creation_input_tokens die Token-Anzahl aller Tool-Definitionen wider. Bei nachfolgenden Anfragen innerhalb der Cache-Lebensdauer erscheinen diese Token stattdessen unter cache_read_input_tokens.
Für das detaillierte Zusammenspiel zwischen Tool-Definitionen, defer_loading und Cache-Invalidierung siehe Tool-Nutzung mit Prompt-Caching.
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
system=[
{
"type": "text",
"text": "...long system prompt",
"cache_control": {"type": "ephemeral"},
}
],
messages=[
# ...bisherige lange Konversation
{
"role": "user",
"content": [
{
"type": "text",
"text": "Hello, can you tell me more about the solar system?",
}
],
},
{
"role": "assistant",
"content": "Certainly! The solar system is the collection of celestial bodies that orbit our Sun. It consists of eight planets, numerous moons, asteroids, comets, and other objects. The planets, in order from closest to farthest from the Sun, are: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune. Each planet has its own unique characteristics and features. Is there a specific aspect of the solar system you'd like to know more about?",
},
{
"role": "user",
"content": [
{"type": "text", "text": "Good to know."},
{
"type": "text",
"text": "Tell me more about Mars.",
"cache_control": {"type": "ephemeral"},
},
],
},
],
)
print(response.usage.model_dump_json())Dieses Beispiel demonstriert, wie Prompt-Caching in einer mehrstufigen Konversation verwendet wird.
In jedem Turn wird der letzte Block der letzten Nachricht mit cache_control markiert, sodass die Konversation inkrementell gecacht werden kann. Das System sucht automatisch die längste zuvor gecachte Sequenz von Blöcken und verwendet sie für Folgenachrichten. Das heißt, Blöcke, die zuvor mit einem cache_control-Block markiert waren, werden später nicht mehr damit markiert, gelten aber dennoch als Cache-Treffer (und auch als Cache-Auffrischung!), wenn sie innerhalb von 5 Minuten getroffen werden.
Beachte außerdem, dass der cache_control-Parameter auf der Systemnachricht platziert ist. Dies stellt sicher, dass sie, falls sie aus dem Cache verdrängt wird (nachdem sie mehr als 5 Minuten nicht verwendet wurde), bei der nächsten Anfrage wieder zum Cache hinzugefügt wird.
Dieser Ansatz ist nützlich, um den Kontext in laufenden Konversationen aufrechtzuerhalten, ohne dieselben Informationen wiederholt zu verarbeiten.
Wenn dies korrekt eingerichtet ist, solltest du in der Usage-Antwort jeder Anfrage Folgendes sehen:
input_tokens: Anzahl der Token in der neuen Nutzernachricht (wird minimal sein)cache_creation_input_tokens: Anzahl der Token in den neuen Assistant- und Nutzer-Turnscache_read_input_tokens: Anzahl der Token in der Konversation bis zum vorherigen Turn
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
tools=[
{
"name": "search_documents",
"description": "Search through the knowledge base",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Search query"}
},
"required": ["query"],
},
},
{
"name": "get_document",
"description": "Retrieve a specific document by ID",
"input_schema": {
"type": "object",
"properties": {
"doc_id": {"type": "string", "description": "Document ID"}
},
"required": ["doc_id"],
},
"cache_control": {"type": "ephemeral"},
},
],
system=[
{
"type": "text",
"text": "You are a helpful research assistant with access to a document knowledge base.\n\n# Instructions\n- Always search for relevant documents before answering\n- Provide citations for your sources\n- Be objective and accurate in your responses\n- If multiple documents contain relevant information, synthesize them\n- Acknowledge when information is not available in the knowledge base",
"cache_control": {"type": "ephemeral"},
},
{
"type": "text",
"text": "# Knowledge Base Context\n\nHere are the relevant documents for this conversation:\n\n## Document 1: Solar System Overview\nThe solar system consists of the Sun and all objects that orbit it...\n\n## Document 2: Planetary Characteristics\nEach planet has unique features. Mercury is the smallest planet...\n\n## Document 3: Mars Exploration\nMars has been a target of exploration for decades...\n\n[Additional documents...]",
"cache_control": {"type": "ephemeral"},
},
],
messages=[
{
"role": "user",
"content": "Can you search for information about Mars rovers?",
},
{
"role": "assistant",
"content": [
{
"type": "tool_use",
"id": "tool_1",
"name": "search_documents",
"input": {"query": "Mars rovers"},
}
],
},
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "tool_1",
"content": "Found 3 relevant documents: Document 3 (Mars Exploration), Document 7 (Rover Technology), Document 9 (Mission History)",
}
],
},
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I found 3 relevant documents about Mars rovers. Let me get more details from the Mars Exploration document.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "Yes, please tell me about the Perseverance rover specifically.",
"cache_control": {"type": "ephemeral"},
}
],
},
],
)
print(response.usage.model_dump_json())Dieses umfassende Beispiel demonstriert, wie alle 4 verfügbaren Cache-Breakpoints verwendet werden, um verschiedene Teile deines Prompts zu optimieren:
-
Tools-Cache (Cache-Breakpoint 1): Der
cache_control-Parameter auf der letzten Tool-Definition cacht alle Tool-Definitionen. -
Cache für wiederverwendbare Anweisungen (Cache-Breakpoint 2): Die statischen Anweisungen im System-Prompt werden separat gecacht. Diese Anweisungen ändern sich zwischen Anfragen selten.
-
RAG-Kontext-Cache (Cache-Breakpoint 3): Die Wissensdatenbank-Dokumente werden unabhängig gecacht, sodass du die RAG-Dokumente aktualisieren kannst, ohne den Tools- oder Anweisungs-Cache zu invalidieren.
-
Konversationsverlauf-Cache (Cache-Breakpoint 4): Die letzte Nutzernachricht wird mit
cache_controlmarkiert, um inkrementelles Caching der Konversation im weiteren Verlauf zu ermöglichen.
Dieser Ansatz bietet maximale Flexibilität:
- Wenn du einen neuen Turn an die Konversation anhängst, ohne früheren Inhalt zu ändern, werden alle vier Cache-Segmente wiederverwendet
- Wenn du die RAG-Dokumente aktualisierst, aber dieselben Tools und Anweisungen beibehältst, werden die ersten beiden Cache-Segmente wiederverwendet
- Wenn du die Konversation änderst, aber dieselben Tools, Anweisungen und Dokumente beibehältst, werden die ersten drei Segmente wiederverwendet
- Änderungen an einem beliebigen Breakpoint invalidieren dieses Segment und alles danach, während frühere gecachte Segmente gültig bleiben
Für die erste Anfrage:
input_tokens: Minimal (Token nach dem letzten Cache-Breakpoint, in diesem Beispiel nahe 0)cache_creation_input_tokens: Token in allen gecachten Segmenten (Tools + Anweisungen + RAG-Dokumente + Konversationsverlauf)cache_read_input_tokens: 0 (keine Cache-Treffer)
Für nachfolgende Anfragen mit nur einer neuen Nutzernachricht (und dem vierten Breakpoint, der wie im Beispiel auf diese neue letzte Nachricht verschoben wurde):
input_tokens: Minimal (Token nach dem letzten Cache-Breakpoint, in diesem Beispiel nahe 0)cache_creation_input_tokens: Token in der neuen Nutzernachricht und dem vorherigen Assistant-Turn (das neue Konversationssegment, das gecacht wird)cache_read_input_tokens: Alle zuvor gecachten Token (Tools + Anweisungen + RAG-Dokumente + vorherige Konversation)
Dieses Muster ist besonders leistungsfähig für:
- RAG-Anwendungen mit großen Dokumentkontexten
- Agentensysteme, die mehrere Tools verwenden
- Lang laufende Konversationen, die den Kontext aufrechterhalten müssen
- Anwendungen, die verschiedene Teile des Prompts unabhängig voneinander optimieren müssen
Datenaufbewahrung
Prompt-Caching (sowohl automatisch als auch explizit) ist ZDR-fähig. Anthropic speichert weder den Rohtext deiner Prompts noch die Antworten von Claude.
KV-Cache-Repräsentationen („key-value“, Schlüssel-Wert) und kryptografische Hashes gecachter Inhalte werden nur im Arbeitsspeicher gehalten und nicht dauerhaft gespeichert. Gecachte Einträge haben eine Mindestlebensdauer von 5 Minuten (Standard) oder 1 Stunde (erweitert), danach werden sie zeitnah, wenn auch nicht sofort, gelöscht. Cache-Einträge sind zwischen Organisationen isoliert und auf der Claude API, der Claude Platform auf AWS und Microsoft Foundry auch zwischen Workspaces innerhalb einer Organisation.
Zur ZDR-Fähigkeit aller Funktionen siehe API und Datenaufbewahrung.
FAQ
In den meisten Fällen reicht ein einzelner Cache-Breakpoint am Ende deines statischen Inhalts aus. Cache-Schreibvorgänge erfolgen nur an dem Block, den du markierst. Platziere ihn auf dem letzten Block, der über Anfragen hinweg identisch bleibt, und jede nachfolgende Anfrage liest denselben Eintrag. Wenn ein späterer Block pro Anfrage variiert (ein Zeitstempel, die eingehende Nachricht), belasse den Breakpoint davor, auf dem letzten stabilen Block.
Du brauchst mehrere Breakpoints nur, wenn:
- Eine wachsende Konversation deinen Breakpoint 20 oder mehr Blöcke über den letzten Cache-Schreibvorgang hinausschiebt, sodass der vorherige Eintrag außerhalb des Lookback-Fensters liegt
- Du Abschnitte, die sich mit unterschiedlicher Häufigkeit aktualisieren, unabhängig voneinander cachen möchtest
- Du zur Kostenoptimierung explizite Kontrolle darüber benötigst, was gecacht wird
Beispiel: Wenn du Systemanweisungen (ändern sich selten) und RAG-Kontext (ändert sich täglich) hast, könntest du zwei Breakpoints verwenden, um sie separat zu cachen.
Nein, Cache-Breakpoints selbst sind kostenlos. Du zahlst nur für:
- Das Schreiben von Inhalten in den Cache (25 % mehr als Basis-Input-Token bei 5-Minuten-TTL)
- Das Lesen aus dem Cache (ein Bruchteil des Basis-Input-Token-Preises, siehe Preise)
- Reguläre Input-Token für ungecachte Inhalte
Die Anzahl der Breakpoints beeinflusst die Preise nicht – nur die Menge der gecachten und gelesenen Inhalte zählt.
Die Usage-Antwort enthält drei separate Input-Token-Felder, die zusammen deinen gesamten Input darstellen:
total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokenscache_read_input_tokens: Aus dem Cache abgerufene Token (alles vor Cache-Breakpoints, das gecacht war)cache_creation_input_tokens: Neue Token, die in den Cache geschrieben werden (an Cache-Breakpoints)input_tokens: Token nach dem letzten Cache-Breakpoint, die nicht gecacht sind
Wichtig: input_tokens repräsentiert NICHT alle Input-Token – nur den Teil nach deinem letzten Cache-Breakpoint. Wenn du gecachte Inhalte hast, ist input_tokens typischerweise viel kleiner als dein gesamter Input.
Beispiel: Mit einem gecachten Dokument von 200k Token und einer Nutzerfrage von 50 Token:
cache_read_input_tokens: 200.000cache_creation_input_tokens: 0input_tokens: 50- Gesamt: 200.050 Token
Diese Aufschlüsselung ist entscheidend, um sowohl deine Kosten als auch deine Ratenlimit-Nutzung zu verstehen. Siehe Cache-Performance verfolgen für weitere Details.
Die standardmäßige Mindestlebensdauer (TTL) des Caches beträgt 5 Minuten. Diese Lebensdauer wird jedes Mal aufgefrischt, wenn der gecachte Inhalt verwendet wird.
Wenn dir 5 Minuten zu kurz sind, bietet Anthropic auch eine 1-Stunden-Cache-TTL an.
Die Lebensdauer wird ab dem Beginn der Anfrage gemessen, die den Cache-Eintrag schreibt oder liest, nicht ab dem Ende ihrer Antwort. Die für die Generierung einer Antwort aufgewendete Zeit wird auf die Lebensdauer angerechnet, sodass das Zeitfenster, in dem eine Folgeanfrage den Cache wiederverwenden kann, der Lebensdauer abzüglich der Generierungszeit entspricht.
Wenn deine Anfragen lange Antworten erzeugen und die nächste Anfrage möglicherweise erst nach Ablauf der Lebensdauer startet, verwende die 1-Stunden-Cache-TTL.
Du kannst bis zu 4 Cache-Breakpoints (mit cache_control-Parametern) in deinem Prompt definieren.
Prompt-Caching wird auf allen aktiven Claude-Modellen unterstützt.
Das Ändern von Thinking-Parametern (Wechsel des Modus oder Ändern des Budgets im erweiterten Modus) invalidiert gecachte Nachrichtenpräfixe und kann auch gecachte System-Prompts und Tools invalidieren, da die Thinking-Konfiguration in den Prompt gerendert wird. Der Wert output_config.effort verhält sich genauso.
Für weitere Details zur Cache-Invalidierung siehe Was den Cache invalidiert.
Mehr zu Thinking, einschließlich seines Zusammenspiels mit Tool-Nutzung und Prompt-Caching, findest du unter Thinking und Prompt-Caching.
Der einfachste Weg ist, "cache_control": {"type": "ephemeral"} auf der obersten Ebene deines Request-Bodys hinzuzufügen (automatisches Caching). Alternativ füge mindestens einen cache_control-Breakpoint auf einzelnen Content-Blöcken hinzu (explizite Cache-Breakpoints).
Ja, Prompt-Caching kann zusammen mit anderen API-Funktionen wie Tool-Nutzung und Vision-Fähigkeiten verwendet werden. Allerdings bricht das Ändern, ob Bilder in einem Prompt enthalten sind, oder das Modifizieren von Tool-Nutzungs-Einstellungen den Cache.
Für weitere Details zur Cache-Invalidierung siehe Was den Cache invalidiert.
Prompt-Caching führt eine neue Preisstruktur ein, bei der 5-Minuten-Cache-Schreibvorgänge 25 % mehr als Basis-Input-Token kosten, 1-Stunden-Cache-Schreibvorgänge das 2-Fache der Basis-Input-Token kosten und Cache-Treffer einen Bruchteil des Basis-Input-Token-Preises kosten (siehe Preise für den modellspezifischen Multiplikator).
Derzeit gibt es keine Möglichkeit, den Cache manuell zu leeren. Gecachte Präfixe laufen automatisch nach mindestens 5 Minuten Inaktivität ab.
Du kannst die Cache-Performance mithilfe der Felder cache_creation_input_tokens und cache_read_input_tokens in der API-Antwort überwachen.
Siehe Was den Cache invalidiert für weitere Details zur Cache-Invalidierung, einschließlich einer Liste von Änderungen, die das Erstellen eines neuen Cache-Eintrags erfordern.
Prompt-Caching ist mit starken Maßnahmen für Datenschutz und Datentrennung konzipiert:
-
Cache-Schlüssel werden mithilfe eines kryptografischen Hashes der Prompts bis zum Cache-Control-Punkt generiert. Das bedeutet, dass nur Anfragen mit identischen Prompts auf einen bestimmten Cache zugreifen können.
-
Auf der Claude API, der Claude Platform auf AWS und Microsoft Foundry sind Caches pro Workspace innerhalb einer Organisation isoliert. Auf Bedrock und Google Cloud sind Caches pro Organisation isoliert. In jedem Fall werden Caches niemals zwischen Organisationen geteilt, selbst bei identischen Prompts. Siehe Cache-Speicherung und -Freigabe für Details.
-
Der Caching-Mechanismus ist darauf ausgelegt, die Integrität und Vertraulichkeit jeder einzelnen Konversation oder jedes Kontexts zu wahren.
-
Es ist sicher,
cache_controlüberall in deinen Prompts zu verwenden. Damit Caching Lesevorgänge erzeugt, platziere den Breakpoint am Ende eines stabilen Präfixes: Wenn du ihn auf einem Block platzierst, der sich bei jeder Anfrage ändert (etwa ein Zeitstempel oder die beliebige Eingabe des Nutzers), wird jedes Mal ein neuer Eintrag geschrieben und nie getroffen.
Diese Maßnahmen stellen sicher, dass Prompt-Caching Datenschutz und Sicherheit wahrt und gleichzeitig Performance-Vorteile bietet.
Ja, es ist möglich, Prompt-Caching mit deinen Batches API-Anfragen zu verwenden. Da asynchrone Batch-Anfragen jedoch gleichzeitig und in beliebiger Reihenfolge verarbeitet werden können, werden Cache-Treffer nach dem Best-Effort-Prinzip bereitgestellt.
Der 1-Stunden-Cache kann helfen, deine Cache-Treffer zu verbessern. Die kosteneffektivste Art, ihn zu nutzen, ist die folgende:
- Sammle eine Menge von Nachrichtenanfragen, die ein gemeinsames Präfix haben.
- Sende eine Batch-Anfrage mit einer einzelnen Anfrage, die dieses gemeinsame Präfix und einen 1-Stunden-Cache-Block enthält. Dadurch wird das Präfix in den 1-Stunden-Cache geschrieben.
- Sobald dies abgeschlossen ist, reiche die restlichen Anfragen ein. Du musst den Job überwachen, um zu wissen, wann er abgeschlossen ist.
Dies ist typischerweise besser als die Verwendung des 5-Minuten-Caches, da Batch-Anfragen üblicherweise zwischen 5 Minuten und 1 Stunde bis zum Abschluss benötigen.
Dieser Fehler tritt typischerweise auf, wenn du dein SDK aktualisiert hast oder veraltete Codebeispiele verwendest. Prompt-Caching erfordert das Beta-Präfix nicht mehr. Statt:
client.beta.prompt_caching.messages.create(**params)Verwende:
client.messages.create(**params)Dieser Fehler tritt typischerweise auf, wenn du dein SDK aktualisiert hast oder veraltete Codebeispiele verwendest. Prompt-Caching erfordert das Beta-Präfix nicht mehr. Statt:
client.beta.promptCaching.messages.create(/* ... */);Verwende einfach:
client.messages.create(/* ... */);Was this page helpful?