cache_control, um Kosten und Latenz zu senken – mit automatischem Caching oder expliziten Breakpoints mit 5-Minuten- oder 1-Stunden-TTLs.Prompt-Caching optimiert deine API-Nutzung, indem es das Fortsetzen ab bestimmten Präfixen in deinen Prompts ermöglicht. Dies reduziert die Verarbeitungszeit und Kosten für sich wiederholende Aufgaben oder Prompts mit gleichbleibenden Elementen erheblich.
Es gibt zwei Möglichkeiten, Prompt-Caching zu aktivieren:
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 Konversationen wachsen. Am besten geeignet für mehrstufige Konversationen, bei denen der wachsende Nachrichtenverlauf automatisch gecacht werden soll.cache_control direkt auf einzelnen Content-Blöcken für eine feingranulare Kontrolle darüber, 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 wird der gecachte Inhalt automatisch wiederverwendet.
Wenn du eine Anfrage mit aktiviertem Prompt-Caching sendest:
Dies ist besonders nützlich für:
Standardmäßig hat der Cache eine Lebensdauer von 5 Minuten. Der Cache wird ohne zusätzliche Kosten jedes Mal aktualisiert, wenn der gecachte Inhalt verwendet wird.
Die Lebensdauer wird ab dem Start 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 zählt gegen die Lebensdauer: 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 starten.
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 | 5-Min.-Cache-Schreibvorgänge | 1-Std.-Cache-Schreibvorgänge | Cache-Treffer & -Aktualisierungen | Output-Token |
|---|---|---|---|---|---|
| Claude Fable 5 | 10 $ / MTok | 12,50 $ / MTok | 20 $ / MTok | 1 $ / MTok | 50 $ / MTok |
| Claude Mythos 5 (begrenzte 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 |
Prompt-Caching (sowohl automatisch als auch explizit) wird auf allen aktiven Claude-Modellen unterstützt.
Automatisches Caching ist der einfachste Weg, Prompt-Caching zu aktivieren. Anstatt cache_control auf einzelnen Content-Blöcken zu platzieren, fügst du ein einzelnes cache_control-Feld auf der obersten Ebene deines Request-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())Beim automatischen Caching bewegt sich der Cache-Punkt automatisch nach vorne, wenn Konversationen wachsen. Jede neue Anfrage cacht alles bis zum letzten cachefähigen Block, und vorheriger Inhalt wird 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 bewegt sich automatisch zum letzten cachefähigen Block in jeder Anfrage, sodass du keine cache_control-Markierungen aktualisieren musst, wenn die Konversation wächst.
Standardmäßig verwendet automatisches Caching eine 5-Minuten-TTL. Du kannst eine 1-Stunden-TTL zum 2-fachen Basispreis für Input-Token angeben:
{ "cache_control": { "type": "ephemeral", "ttl": "1h" } }Automatisches Caching ist mit expliziten Cache-Breakpoints kompatibel. Wenn beide zusammen verwendet werden, belegt der automatische Cache-Breakpoint einen der 4 verfügbaren Breakpoint-Slots.
So kannst du beide Ansätze kombinieren. Verwende zum Beispiel einen expliziten Breakpoint, um deinen System-Prompt zu cachen, während das automatische Caching die Konversation ü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?" }]
}Automatisches Caching verwendet dieselbe zugrunde liegende Caching-Infrastruktur. Preise, Mindest-Token-Schwellenwerte, Anforderungen an die Kontextreihenfolge und das 20-Block-Lookback-Fenster gelten alle genauso wie bei expliziten Breakpoints.
cache_control mit derselben TTL hat, ist das automatische Caching eine No-Op.cache_control mit einer anderen TTL hat, gibt die API einen 400-Fehler zurück.Für mehr Kontrolle über das Caching kannst du cache_control direkt auf einzelnen Content-Blöcken platzieren. Dies ist nützlich, wenn du verschiedene Abschnitte cachen musst, die sich mit unterschiedlicher Häufigkeit ändern, oder wenn du eine feingranulare Kontrolle darüber benötigst, was genau gecacht wird.
Platziere statischen Inhalt (Tool-Definitionen, Systemanweisungen, Kontext, Beispiele) am Anfang deines Prompts. Markiere das Ende des wiederverwendbaren Inhalts für das Caching mit dem cache_control-Parameter.
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.
Du kannst nur einen 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-Writes erfolgen nur an deinem Breakpoint. Das Markieren eines Blocks mit cache_control schreibt 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 das Ändern eines beliebigen Blocks an oder vor dem Breakpoint bei der nächsten Anfrage einen anderen Hash.
Cache-Reads 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 auf einen passenden Cache-Eintrag. Wenn 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 ist. Es sucht nach früheren Writes, 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. Wenn das System in diesem Fenster keinen passenden Eintrag findet, stoppt die Prüfung (oder wird ab dem nächsten expliziten Breakpoint fortgesetzt, falls vorhanden).
Beispiel: Lookback in einer wachsenden Konversation
Du hängst bei jedem Turn neue Blöcke an und setzt cache_control auf den letzten Block jeder Anfrage:
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 Block pro Anfrage, der einen Zeitstempel und die Benutzernachricht enthält (Block 6). Du setzt cache_control auf Block 6:
Der Lookback findet keinen stabilen Inhalt hinter deinem Breakpoint und cacht ihn. Er findet Einträge, die frühere Anfragen bereits geschrieben haben, und Writes 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 einer wachsenden Konversation funktioniert der letzte Block, solange jeder Turn weniger als 20 Blöcke hinzufügt: Früherer Inhalt ändert sich nie, sodass der Lookback der nächsten Anfrage den vorherigen Write findet. Bei einem Prompt mit einem variierenden Suffix (Zeitstempel, anfragespezifischer Kontext, die eingehende Nachricht) platziere den Breakpoint am Ende des statischen Präfixes, nicht auf dem variierenden Block.
Du kannst bis zu 4 Cache-Breakpoints definieren, wenn du:
Cache-Breakpoints selbst verursachen keine zusätzlichen Kosten. Dir wird nur Folgendes berechnet:
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.
Auf der Claude API, Claude Platform on AWS, Google Cloud und Microsoft Foundry beträgt die minimale cachefähige Prompt-Länge:
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 zum Cachen von weniger als dieser Anzahl von Token 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 in 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ängenanforderung nicht erfüllt hat).
Wenn dein Prompt knapp unter dem Minimum für dein Modell und deine Plattform liegt, lohnt es sich oft, den gecachten Inhalt zu erweitern, um den Schwellenwert zu erreichen. Cache-Reads kosten deutlich weniger als nicht gecachte Input-Token, sodass das Erreichen des Minimums die Kosten für häufig wiederverwendete Prompts senken kann.
Bei gleichzeitigen Anfragen ist zu beachten, dass ein Cache-Eintrag erst verfügbar wird, nachdem die erste Antwort begonnen hat. Wenn du Cache-Hits 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.
Die meisten Blöcke in der Anfrage können gecacht werden. Dazu gehören:
tools-Arraysystem-Arraymessages.content-Array, sowohl für User- als auch Assistant-Turnsmessages.content-Array, in User-Turnsmessages.content-Array, sowohl in User- als auch Assistant-TurnsJedes dieser Elemente kann gecacht werden, entweder automatisch oder durch Markierung mit cache_control.
Während die meisten Request-Blöcke gecacht werden können, gibt es einige Ausnahmen:
Thinking-Blöcke können nicht direkt mit cache_control gecacht werden. Thinking-Blöcke KÖNNEN jedoch zusammen mit anderem Inhalt gecacht werden, wenn sie in vorherigen Assistant-Turns erscheinen. Wenn sie auf diese Weise gecacht werden, ZÄHLEN sie als Input-Token, wenn sie aus dem Cache gelesen werden.
Sub-Content-Blöcke (wie Zitate) selbst können nicht direkt gecacht werden. Cache stattdessen den übergeordneten Block.
Im Fall von Zitaten können die übergeordneten Dokument-Content-Blöcke, die als Quellmaterial für Zitate dienen, gecacht werden. Dies ermöglicht es dir, Prompt-Caching effektiv mit Zitaten zu verwenden, indem du die Dokumente cachst, auf die Zitate verweisen werden.
Leere Textblöcke können nicht gecacht werden.
Änderungen an gecachtem Inhalt können einen Teil oder den gesamten Cache invalidieren.
Wie in Strukturierung deines Prompts beschrieben, folgt der Cache der Hierarchie: tools → system → messages. Änderungen auf jeder Ebene invalidieren diese Ebene und alle nachfolgenden Ebenen.
Die folgende Tabelle zeigt, welche Teile des Caches durch verschiedene Arten von Änderungen invalidiert werden. ✘ zeigt an, dass der Cache invalidiert wird, während ✓ anzeigt, 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-Umschaltung | ✓ | ✘ | ✘ | Das Aktivieren/Deaktivieren der Websuche ändert den System-Prompt |
| Zitate-Umschaltung | ✓ | ✘ | ✘ | Das Aktivieren/Deaktivieren von Zitaten ändert den System-Prompt |
| Speed-Einstellung | ✓ | ✘ | ✘ | Das Wechseln zwischen speed: "fast" und Standardgeschwindigkeit invalidiert System- und Message-Caches |
| Tool-Auswahl | ✓ | ✓ | ✘ | Änderungen am tool_choice-Parameter betreffen nur Message-Blöcke |
| Bilder | ✓ | ✓ | ✘ | Das Hinzufügen/Entfernen von Bildern irgendwo im Prompt betrifft Message-Blöcke |
| Thinking-Parameter | Modellspezifisch | Modellspezifisch | ✘ | Die Thinking-Konfiguration (Modus und budget_tokens im erweiterten Modus) wird in den Prompt gerendert, sodass eine Änderung immer Message-Blöcke invalidiert; Tool- und System-Caches werden ebenfalls bei Modellen invalidiert, die die Konfiguration vor ihnen rendern. Siehe Thinking und Prompt-Caching. |
| Effort-Einstellung | Modellspezifisch | Modellspezifisch | ✘ | Das Ändern des output_config.effort-Werts invalidiert immer Message-Blöcke, mit derselben modellspezifischen Auswirkung auf Tool- und System-Caches wie Thinking-Parameter. Das explizite Setzen von Effort auf den Standardwert des Modells entspricht dem Weglassen und invalidiert nicht. |
| Nicht-Tool-Ergebnisse, die an Anfragen mit erweitertem Denken übergeben werden | ✓ | ✓ | Modellspezifisch | Bei Opus 4.5+ und Sonnet 4.6+ werden Thinking-Blöcke standardmäßig beibehalten, sodass der Cache gültig bleibt (✓). Bei 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. |
Überwache die Cache-Performance mit diesen API-Antwortfeldern 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 Input-Token, die nicht aus dem Cache gelesen oder zum Erstellen eines Caches verwendet wurden (das heißt, Token nach dem letzten Cache-Breakpoint).Bei der Verwendung von Thinking mit Prompt-Caching haben Thinking-Blöcke ein besonderes Verhalten:
Automatisches Caching zusammen mit anderem Inhalt: Während 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. Dies geschieht häufig bei der Tool-Nutzung, wenn du Thinking-Blöcke zurückgibst, um die Konversation fortzusetzen.
Input-Token-Zählung: Wenn Thinking-Blöcke aus dem Cache gelesen werden, zählen sie als Input-Token in deinen Nutzungsmetriken. Dies ist wichtig für die Kostenberechnung und Token-Budgetierung.
Cache-Invalidierungsmuster:
cache_control-Markierungen aufWeitere 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 keptBei früheren Opus/Sonnet-Modellen und allen Haiku-Modellen werden an diesem Punkt alle vorherigen Thinking-Blöcke aus dem Kontext entfernt. Bei Opus 4.5+ und Sonnet 4.6+ werden frühere Thinking-Blöcke standardmäßig beibehalten und bleiben Teil des gecachten Präfixes.
Ausführlichere Informationen findest du unter Thinking und Prompt-Caching.
Organisations- und Workspace-Isolation: Caches sind zwischen Organisationen isoliert. Verschiedene Organisationen teilen niemals Caches, selbst wenn sie identische Prompts verwenden. Caches sind auch pro Workspace innerhalb einer Organisation auf der Claude API, Claude Platform on AWS und Microsoft Foundry isoliert; Bedrock und Google Cloud verwenden nur Isolation auf Organisationsebene.
Exakte Übereinstimmung: Cache-Hits erfordern 100 % identische Prompt-Segmente, einschließlich aller Texte und Bilder bis einschließlich des mit cache_control markierten Blocks.
Output-Token-Generierung: Prompt-Caching hat keine Auswirkung auf die Output-Token-Generierung. Die Antwort, die du erhältst, ist identisch mit dem, was du erhalten würdest, wenn Prompt-Caching nicht verwendet würde.
Um die Prompt-Caching-Performance zu optimieren:
Passe deine Prompt-Caching-Strategie an dein Szenario an:
Bei unerwartetem Verhalten:
cache_control-Markierungen an denselben Stellen sindtool_choice, Bildnutzung, die Thinking-Konfiguration und output_config.effort zwischen Aufrufen konsistent bleibentool_use-Content-Blöcken eine stabile Reihenfolge haben, da einige Sprachen (zum Beispiel Swift, Go) die Schlüsselreihenfolge während der JSON-Konvertierung randomisieren, was Caches brichtWenn dir 5 Minuten zu kurz sind, bietet Anthropic auch eine 1-Stunden-Cache-Dauer gegen zusätzliche Kosten an.
Um den erweiterten Cache zu verwenden, füge ttl in die cache_control-Definition wie folgt 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 cache_creation_input_tokens-Feld der Summe der Werte im cache_creation-Objekt entspricht.
Wenn du ephemeral_5m_input_tokens-Writes siehst, die du nicht angefordert hast, während du Server-Tools wie die Websuche verwendest, siehe Tool-Nutzung mit Prompt-Caching.
Wenn du Prompts hast, die in regelmäßigen Abständen verwendet werden (das heißt, System-Prompts, die häufiger als alle 5 Minuten verwendet werden), verwende weiterhin den 5-Minuten-Cache, da dieser ohne zusätzliche Kosten weiterhin aktualisiert wird.
Der 1-Stunden-Cache wird am besten in den folgenden Szenarien verwendet:
Du kannst sowohl 1-Stunden- als auch 5-Minuten-Cache-Controls in derselben Anfrage verwenden, aber 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:
A: Die Token-Anzahl beim höchsten Cache-Hit (oder 0, wenn keine Hits).B: Die Token-Anzahl beim höchsten 1-Stunden-cache_control-Block nach A (oder gleich A, wenn keiner existiert).C: Die Token-Anzahl beim letzten cache_control-Block.Dir wird Folgendes berechnet:
A.(B - A).(C - B).Hier sind drei Beispiele. Dies zeigt die Input-Token von 3 Anfragen, von denen jede unterschiedliche Cache-Hits und Cache-Misses hat. Jede hat eine unterschiedlich berechnete Preisgestaltung, die in den farbigen Kästchen dargestellt ist.
Cache-Vorwärmen ermöglicht es dir, deinen System-Prompt oder deine Tool-Definitionen in den Prompt-Cache zu laden, bevor ein Benutzer eine echte Anfrage auslöst. Dies eliminiert die Cache-Miss-Latenzstrafe bei der ersten Benutzerinteraktion und reduziert die „time-to-first-token" (Zeit bis zum ersten Token), oder TTFT, für latenzempfindliche Anwendungen.
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, gibt dann sofort zurück, ohne eine Ausgabe zu generieren. Die Antwort hat ein leeres content-Array, stop_reason: "max_tokens" und einen vollständig ausgefü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-User-Nachricht. Andernfalls wird der Cache-Eintrag an den Platzhalter gebunden und die Folgeanfrage wird ihn nicht treffen. Verwende auch dieselbe Thinking-Konfiguration und denselben output_config.effort wie deine Folgeanfragen: Diese Werte werden in den Prompt gerendert (siehe Was den Cache ungültig macht), sodass ein Pre-Warm mit einer anderen Konfiguration einen Eintrag schreiben kann, den dein echter Traffic nie trifft. Das bedeutet, dass du einen expliziten Cache-Breakpoint anstelle von automatischem Caching verwenden solltest, da automatisches Caching den Breakpoint auf den letzten Block setzt, der hier der Platzhalter ist. Die Platzhalter-User-Nachricht kann ein beliebiger String mit Nicht-Whitespace-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"
}
}Sende eine Pre-Warm-Anfrage, wenn deine Anwendung startet (oder in einem geplanten Intervall), und sende dann echte User-Anfragen, nachdem das Pre-Warm 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 Pre-Warm-Anfrage, um den Cache warm zu halten. Für längere Abstände zwischen User-Anfragen verwende stattdessen die 1-Stunden-Cache-Dauer.
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: truethinking.type: "enabled")output_config.format)tool_choice mit {"type": "tool", ...} oder {"type": "any"}max_tokens: 0 wird auch innerhalb einer Message Batches-Anfrage abgelehnt. Pre-Warming zielt auf die Time-to-First-Token ab, was für 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.
Bevor max_tokens: 0 verfügbar war, verwendeten einige Anwendungen max_tokens: 1-Warm-up-Aufrufe, um denselben Effekt zu erzielen. Der max_tokens: 0-Ansatz wird bevorzugt: Es wird keine Ausgabe erzeugt, sodass es keine Ein-Token-Antwort zum Verwerfen gibt, keine Output-Token berechnet werden und die Absicht der Anfrage eindeutig ist.
Um dir den Einstieg in 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 du Caching in verschiedenen Szenarien implementierst, und helfen dir, die praktischen Anwendungen dieser Funktion zu verstehen:
Prompt-Caching (sowohl automatisch als auch explizit) ist ZDR-fähig. Anthropic speichert nicht den Rohtext deiner Prompts oder die Antworten von Claude.
KV-Cache-Repräsentationen (Key-Value) und kryptografische Hashes von gecachten Inhalten werden nur im Arbeitsspeicher gehalten und nicht dauerhaft gespeichert. Gecachte Einträge haben eine Mindestlebensdauer von 5 Minuten (Standard) oder 1 Stunde (erweitert), nach der sie zeitnah, wenn auch nicht sofort, gelöscht werden. Cache-Einträge sind zwischen Organisationen isoliert und, auf der Claude API, Claude Platform on AWS und Microsoft Foundry, zwischen Workspaces innerhalb einer Organisation.
Für ZDR-Fähigkeit über alle Funktionen hinweg siehe API und Datenspeicherung.
Was this page helpful?