cache_control pour réduire les coûts et la latence, en utilisant la mise en cache automatique ou des points de rupture explicites avec des TTL de 5 minutes ou 1 heure.Le « prompt caching » (mise en cache des prompts) optimise votre utilisation de l'API en permettant de reprendre à partir de préfixes spécifiques dans vos prompts. Cela réduit considérablement le temps de traitement et les coûts pour les tâches répétitives ou les prompts comportant des éléments constants.
Pour savoir comment la « zero data retention » (rétention zéro des données), ou ZDR, s'applique à cette fonctionnalité, consultez API et rétention des données.
Il existe deux façons d'activer la mise en cache des prompts :
cache_control au niveau supérieur de votre requête. Le système applique automatiquement le point de rupture de cache au dernier bloc pouvant être mis en cache et le fait avancer au fur et à mesure que les conversations s'allongent. Idéal pour les conversations multi-tours où l'historique croissant des messages doit être mis en cache automatiquement.cache_control directement sur des blocs de contenu individuels pour un contrôle précis sur ce qui est exactement mis en cache.La façon la plus simple de commencer est la mise en cache automatique :
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())Avec la mise en cache automatique, le système met en cache tout le contenu jusqu'au dernier bloc pouvant être mis en cache, inclus. Lors des requêtes suivantes avec le même préfixe, le contenu mis en cache est réutilisé automatiquement.
Lorsque vous envoyez une requête avec la mise en cache des prompts activée :
Ceci est particulièrement utile pour :
Par défaut, le cache a une durée de vie de 5 minutes. Le cache est actualisé sans coût supplémentaire chaque fois que le contenu mis en cache est utilisé.
Si vous trouvez que 5 minutes est trop court, Anthropic propose également une durée de cache d'une heure moyennant un coût supplémentaire.
Pour plus d'informations, consultez Durée de cache d'une heure.
La mise en cache des prompts met en cache le préfixe complet
La mise en cache des prompts référence l'intégralité du prompt - tools, system et messages (dans cet ordre) jusqu'au bloc désigné avec cache_control, inclus.
La mise en cache des prompts introduit une nouvelle structure tarifaire. Le tableau suivant montre le prix par million de tokens pour chaque modèle pris en charge :
| Modèle | Tokens d'entrée de base | Écritures en cache 5 min | Écritures en cache 1 h | Accès et actualisations du cache | Tokens de sortie |
|---|---|---|---|---|---|
| Claude Fable 5 | $10 / MTok | $12.50 / MTok | $20 / MTok | $1 / MTok | $50 / MTok |
| Claude Mythos 5 (disponibilité limitée) | $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 (obsolète) | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Opus 4 (retiré, sauf sur Google Cloud) | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Sonnet 5 jusqu'au 31 août 2026 | $2 / MTok | $2.50 / MTok | $4 / MTok | $0.20 / MTok | $10 / MTok |
| Claude Sonnet 5 à partir du 1er septembre 2026 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / 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 (retiré, sauf sur Bedrock et 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 (retiré, sauf sur Bedrock et Google Cloud) | $0.80 / MTok | $1 / MTok | $1.60 / MTok | $0.08 / MTok | $4 / MTok |
Le tableau précédent reflète les multiplicateurs de prix suivants pour la mise en cache des prompts :
Ces multiplicateurs se cumulent avec d'autres modificateurs de prix tels que la remise de l'API Batch et la résidence des données. Consultez la tarification pour tous les détails.
La mise en cache des prompts (automatique et explicite) est prise en charge sur tous les modèles Claude actifs.
La mise en cache automatique est la façon la plus simple d'activer la mise en cache des prompts. Au lieu de placer cache_control sur des blocs de contenu individuels, ajoutez un seul champ cache_control au niveau supérieur du corps de votre requête. Le système applique automatiquement le point de rupture de cache au dernier bloc pouvant être mis en cache.
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())Avec la mise en cache automatique, le point de cache avance automatiquement au fur et à mesure que les conversations s'allongent. Chaque nouvelle requête met en cache tout ce qui précède le dernier bloc pouvant être mis en cache, inclus, et le contenu précédent est lu depuis le cache.
| Requête | Contenu | Comportement du cache |
|---|---|---|
| Requête 1 | System + User(1) + Asst(1) + User(2) ◀ cache | Tout est écrit dans le cache |
| Requête 2 | System + User(1) + Asst(1) + User(2) + Asst(2) + User(3) ◀ cache | System jusqu'à User(2) lu depuis le cache ; Asst(2) + User(3) écrits dans le cache |
| Requête 3 | System + User(1) + Asst(1) + User(2) + Asst(2) + User(3) + Asst(3) + User(4) ◀ cache | System jusqu'à User(3) lu depuis le cache ; Asst(3) + User(4) écrits dans le cache |
Le point de rupture de cache se déplace automatiquement vers le dernier bloc pouvant être mis en cache dans chaque requête, vous n'avez donc pas besoin de mettre à jour les marqueurs cache_control au fur et à mesure que la conversation s'allonge.
Par défaut, la mise en cache automatique utilise un TTL de 5 minutes. Vous pouvez spécifier un TTL d'une heure à 2 fois le prix de base des tokens d'entrée :
{ "cache_control": { "type": "ephemeral", "ttl": "1h" } }La mise en cache automatique est compatible avec les points de rupture de cache explicites. Lorsqu'ils sont utilisés ensemble, le point de rupture de cache automatique utilise l'un des 4 emplacements de points de rupture disponibles.
Cela vous permet de combiner les deux approches. Par exemple, utilisez un point de rupture explicite pour mettre en cache votre invite système, tandis que la mise en cache automatique gère la conversation :
{
"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?" }]
}La mise en cache automatique utilise la même infrastructure de mise en cache sous-jacente. La tarification, les seuils minimaux de tokens, les exigences d'ordre du contexte et la fenêtre de recherche arrière de 20 blocs s'appliquent tous de la même manière qu'avec les points de rupture explicites.
cache_control explicite avec le même TTL, la mise en cache automatique est sans effet.cache_control explicite avec un TTL différent, l'API renvoie une erreur 400.La mise en cache automatique est disponible sur l'API Claude, Claude Platform on AWS, Google Cloud et Microsoft Foundry. Amazon Bedrock ne prend pas en charge la mise en cache automatique.
Pour plus de contrôle sur la mise en cache, vous pouvez placer cache_control directement sur des blocs de contenu individuels. Ceci est utile lorsque vous devez mettre en cache différentes sections qui changent à des fréquences différentes, ou lorsque vous avez besoin d'un contrôle précis sur ce qui est exactement mis en cache.
Placez le contenu statique (définitions d'outils, instructions système, contexte, exemples) au début de votre prompt. Marquez la fin du contenu réutilisable pour la mise en cache à l'aide du paramètre cache_control.
Les préfixes de cache sont créés dans l'ordre suivant : tools, system, puis messages. Cet ordre forme une hiérarchie où chaque niveau s'appuie sur les précédents.
Vous pouvez utiliser un seul point de rupture de cache à la fin de votre contenu statique, et le système trouvera automatiquement le préfixe le plus long qu'une requête antérieure a déjà écrit dans le cache. Comprendre comment cela fonctionne vous aide à optimiser votre stratégie de mise en cache.
Trois principes fondamentaux :
Les écritures de cache se produisent uniquement à votre point de rupture. Marquer un bloc avec cache_control écrit exactement une entrée de cache : un hachage du préfixe se terminant à ce bloc. Le système n'écrit pas d'entrées pour une position antérieure. Comme le hachage est cumulatif, couvrant tout ce qui précède le point de rupture, inclus, modifier n'importe quel bloc au niveau du point de rupture ou avant produit un hachage différent lors de la requête suivante.
Les lectures de cache recherchent en arrière les entrées que les requêtes antérieures ont écrites. À chaque requête, le système calcule le hachage du préfixe à votre point de rupture et vérifie s'il existe une entrée de cache correspondante. Si aucune n'existe, il remonte en arrière bloc par bloc, vérifiant si le hachage du préfixe à chaque position antérieure correspond à quelque chose déjà présent dans le cache. Il recherche des écritures antérieures, pas du contenu stable.
La fenêtre de recherche arrière est de 20 blocs. Le système vérifie au maximum 20 positions par point de rupture, en comptant le point de rupture lui-même comme la première. Si le système ne trouve aucune entrée correspondante dans cette fenêtre, la vérification s'arrête (ou reprend à partir du prochain point de rupture explicite, le cas échéant).
Exemple : Recherche arrière dans une conversation croissante
Vous ajoutez de nouveaux blocs à chaque tour et définissez cache_control sur le dernier bloc de chaque requête :
Erreur courante : Point de rupture sur du contenu qui change à chaque requête
Votre prompt comporte un grand contexte système statique (blocs 1 à 5) suivi d'un bloc propre à chaque requête contenant un horodatage et le message de l'utilisateur (bloc 6). Vous définissez cache_control sur le bloc 6 :
La recherche arrière ne trouve pas le contenu stable derrière votre point de rupture pour le mettre en cache. Elle trouve les entrées que les requêtes antérieures ont déjà écrites, et les écritures ne se produisent qu'aux points de rupture. Déplacez cache_control vers le bloc 5, le dernier bloc qui reste identique d'une requête à l'autre, et chaque requête suivante lira le préfixe mis en cache. La mise en cache automatique tombe dans le même piège : elle place le point de rupture sur le dernier bloc pouvant être mis en cache, qui dans cette structure est celui qui change à chaque requête, utilisez donc plutôt un point de rupture explicite sur le bloc 5.
Point clé : Placez cache_control sur le dernier bloc dont le préfixe est identique entre les requêtes qui doivent partager un cache. Dans une conversation croissante, le dernier bloc fonctionne tant que chaque tour ajoute moins de 20 blocs : le contenu antérieur ne change jamais, donc la recherche arrière de la requête suivante trouve l'écriture précédente. Pour un prompt avec un suffixe variable (horodatages, contexte propre à chaque requête, le message entrant), placez le point de rupture à la fin du préfixe statique, pas sur le bloc variable.
Vous pouvez définir jusqu'à 4 points de rupture de cache si vous souhaitez :
Limitation importante : La recherche arrière ne peut trouver que les entrées que des requêtes antérieures ont déjà écrites. Si une conversation croissante pousse votre point de rupture à 20 blocs ou plus au-delà de la dernière écriture, la fenêtre de recherche arrière la manque. Ajoutez dès le départ un deuxième point de rupture plus proche de cette position afin qu'une écriture s'y accumule avant que vous n'en ayez besoin.
Les points de rupture de cache eux-mêmes n'ajoutent aucun coût. Vous n'êtes facturé que pour :
L'ajout de points de rupture cache_control supplémentaires n'augmente pas vos coûts - vous payez toujours le même montant en fonction du contenu réellement mis en cache et lu. Les points de rupture vous donnent le contrôle sur les sections qui peuvent être mises en cache indépendamment.
Sur l'API Claude, Claude Platform on AWS, Google Cloud et Microsoft Foundry, la longueur minimale de prompt pouvant être mise en cache est de :
Ces minimums s'appliquent sur chaque plateforme où chaque modèle est disponible.
Les prompts plus courts ne peuvent pas être mis en cache, même s'ils sont marqués avec cache_control. Toute requête visant à mettre en cache moins que ce nombre de tokens sera traitée sans mise en cache, et aucune erreur n'est renvoyée. Pour vérifier si un prompt a été mis en cache, consultez les champs d'utilisation de la réponse : si cache_creation_input_tokens et cache_read_input_tokens sont tous deux à 0, le prompt n'a pas été mis en cache (probablement parce qu'il n'a pas atteint la longueur minimale requise).
Si votre prompt est juste en dessous du minimum pour votre modèle et votre plateforme, il est souvent intéressant d'étendre le contenu mis en cache pour atteindre le seuil. Les lectures de cache coûtent nettement moins cher que les tokens d'entrée non mis en cache, donc atteindre le minimum peut réduire les coûts pour les prompts fréquemment réutilisés.
Bedrock est une plateforme exploitée par AWS. Sur Bedrock, consultez la documentation de mise en cache des prompts de Bedrock pour les minimums par modèle, le comportement en cas d'échec et les noms des champs d'utilisation applicables.
Pour les requêtes simultanées, notez qu'une entrée de cache ne devient disponible qu'après le début de la première réponse. Si vous avez besoin de succès de cache pour des requêtes parallèles, attendez la première réponse avant d'envoyer les requêtes suivantes.
Actuellement, « ephemeral » est le seul type de cache pris en charge, qui a par défaut une durée de vie de 5 minutes.
La plupart des blocs de la requête peuvent être mis en cache. Cela inclut :
toolssystemmessages.content, pour les tours utilisateur et assistantmessages.content, dans les tours utilisateurmessages.content, dans les tours utilisateur et assistantChacun de ces éléments peut être mis en cache, soit automatiquement, soit en les marquant avec cache_control.
Bien que la plupart des blocs de requête puissent être mis en cache, il existe quelques exceptions :
Les blocs de réflexion ne peuvent pas être mis en cache directement avec cache_control. Cependant, les blocs de réflexion PEUVENT être mis en cache avec d'autres contenus lorsqu'ils apparaissent dans des tours assistant précédents. Lorsqu'ils sont mis en cache de cette manière, ils comptent BIEN comme tokens d'entrée lorsqu'ils sont lus depuis le cache.
Les blocs de sous-contenu (comme les citations) ne peuvent pas eux-mêmes être mis en cache directement. Mettez plutôt en cache le bloc de niveau supérieur.
Dans le cas des citations, les blocs de contenu de document de niveau supérieur qui servent de matériau source pour les citations peuvent être mis en cache. Cela vous permet d'utiliser efficacement la mise en cache des prompts avec les citations en mettant en cache les documents que les citations référenceront.
Les blocs de texte vides ne peuvent pas être mis en cache.
Les modifications du contenu mis en cache peuvent invalider une partie ou la totalité du cache.
Comme décrit dans Structurer votre prompt, le cache suit la hiérarchie : tools → system → messages. Les modifications à chaque niveau invalident ce niveau et tous les niveaux suivants.
Le tableau suivant montre quelles parties du cache sont invalidées par différents types de modifications. ✘ indique que le cache est invalidé, tandis que ✓ indique que le cache reste valide.
| Ce qui change | Cache des outils | Cache système | Cache des messages | Impact |
|---|---|---|---|---|
| Définitions d'outils | ✘ | ✘ | ✘ | La modification des définitions d'outils (noms, descriptions, paramètres) invalide l'intégralité du cache |
| Activation de la recherche web | ✓ | ✘ | ✘ | L'activation/désactivation de la recherche web modifie l'invite système |
| Activation des citations | ✓ | ✘ | ✘ | L'activation/désactivation des citations modifie l'invite système |
| Paramètre de vitesse | ✓ | ✘ | ✘ | Le passage entre speed: "fast" et la vitesse standard invalide les caches système et des messages |
| Choix d'outil | ✓ | ✓ | ✘ | Les modifications du paramètre tool_choice n'affectent que les blocs de messages |
| Images | ✓ | ✓ | ✘ | L'ajout/la suppression d'images n'importe où dans le prompt affecte les blocs de messages |
| Paramètres de réflexion | Selon le modèle | Selon le modèle | ✘ | La configuration de réflexion (mode, et budget_tokens en mode étendu) est rendue dans le prompt, donc sa modification invalide toujours les blocs de messages ; les caches des outils et système sont également invalidés sur les modèles qui rendent la configuration avant eux. Consultez Réflexion et mise en cache des prompts. |
| Paramètre d'effort | Selon le modèle | Selon le modèle | ✘ | La modification de la valeur output_config.effort invalide toujours les blocs de messages, avec le même effet selon le modèle sur les caches des outils et système que les paramètres de réflexion. Définir explicitement l'effort à la valeur par défaut du modèle équivaut à l'omettre et n'invalide pas. |
| Résultats non liés aux outils transmis aux requêtes de réflexion étendue | ✓ | ✓ | Selon le modèle | Sur Opus 4.5+ et Sonnet 4.6+, les blocs de réflexion sont conservés par défaut, donc le cache reste valide (✓). Sur les modèles Opus/Sonnet antérieurs et tous les modèles Haiku, tous les blocs de réflexion précédemment mis en cache sont retirés du contexte, et tous les messages qui suivent ces blocs de réflexion sont supprimés du cache (✘). Pour plus de détails, consultez Mise en cache avec des blocs de réflexion. |
Sur Claude Fable 5, Claude Mythos 5, Claude Opus 4.8 et Claude Opus 5, vous pouvez ajouter une nouvelle instruction système en cours de conversation sans invalider les caches système ou des messages. Ajoutez un message {"role": "system"} à messages au lieu de modifier le champ system de niveau supérieur, afin que le préfixe mis en cache reste inchangé. Cette fonctionnalité n'est pas disponible sur Claude Sonnet 5 ; utilisez plutôt le champ system de niveau supérieur. Consultez Messages système en cours de conversation.
Surveillez les performances du cache à l'aide de ces champs de réponse de l'API, dans usage dans la réponse (ou l'événement message_start en cas de streaming) :
cache_creation_input_tokens : Nombre de tokens écrits dans le cache lors de la création d'une nouvelle entrée.cache_read_input_tokens : Nombre de tokens récupérés depuis le cache pour cette requête.input_tokens : Nombre de tokens d'entrée qui n'ont pas été lus depuis le cache ni utilisés pour en créer un (c'est-à-dire les tokens après le dernier point de rupture de cache).Comprendre la répartition des tokens
Le champ input_tokens représente uniquement les tokens qui viennent après le dernier point de rupture de cache dans votre requête - pas tous les tokens d'entrée que vous avez envoyés.
Pour calculer le total des tokens d'entrée :
total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokensExplication spatiale :
cache_read_input_tokens = tokens avant le point de rupture déjà mis en cache (lectures)cache_creation_input_tokens = tokens avant le point de rupture en cours de mise en cache (écritures)input_tokens = tokens après votre dernier point de rupture (non éligibles au cache)Exemple : Si vous avez une requête avec 100 000 tokens de contenu mis en cache (lus depuis le cache), 0 token de nouveau contenu en cours de mise en cache, et 50 tokens dans votre message utilisateur (après le point de rupture de cache) :
cache_read_input_tokens : 100 000cache_creation_input_tokens : 0input_tokens : 50Ceci est important pour comprendre à la fois les coûts et les limites de débit, car input_tokens sera généralement beaucoup plus petit que votre entrée totale lorsque vous utilisez efficacement la mise en cache.
Lorsque vous utilisez la réflexion avec la mise en cache des prompts, les blocs de réflexion ont un comportement particulier :
Mise en cache automatique avec d'autres contenus : Bien que les blocs de réflexion ne puissent pas être explicitement marqués avec cache_control, ils sont mis en cache dans le cadre du contenu de la requête lorsque vous effectuez des appels API ultérieurs avec des résultats d'outils. Cela se produit couramment lors de l'utilisation d'outils lorsque vous renvoyez des blocs de réflexion pour poursuivre la conversation.
Comptage des tokens d'entrée : Lorsque les blocs de réflexion sont lus depuis le cache, ils comptent comme tokens d'entrée dans vos métriques d'utilisation. Ceci est important pour le calcul des coûts et la budgétisation des tokens.
Schémas d'invalidation du cache :
cache_control explicitesPour plus de détails sur l'invalidation du cache, consultez Ce qui invalide le cache.
Exemple avec utilisation d'outils :
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 keptSur les modèles Opus/Sonnet antérieurs et tous les modèles Haiku, tous les blocs de réflexion précédents sont retirés du contexte à ce stade. Sur Opus 4.5+ et Sonnet 4.6+, les blocs de réflexion antérieurs sont conservés par défaut et restent partie intégrante du préfixe mis en cache.
Pour des informations plus détaillées, consultez Réflexion et mise en cache des prompts.
Depuis le 5 février 2026, la mise en cache des prompts utilise une isolation au niveau de l'espace de travail au lieu d'une isolation au niveau de l'organisation. Les caches sont isolés par espace de travail, garantissant la séparation des données entre les espaces de travail au sein d'une même organisation. Cela s'applique à l'API Claude, Claude Platform on AWS et Microsoft Foundry ; Bedrock et Google Cloud conservent une isolation du cache au niveau de l'organisation. Si vous utilisez plusieurs espaces de travail, révisez votre stratégie de mise en cache pour tenir compte de cette différence.
Isolation des organisations et des espaces de travail : Les caches sont isolés entre les organisations. Des organisations différentes ne partagent jamais de caches, même si elles utilisent des prompts identiques. Depuis le 5 février 2026, les caches sont également isolés par espace de travail au sein d'une organisation sur l'API Claude, Claude Platform on AWS et Microsoft Foundry ; Bedrock et Google Cloud continuent d'utiliser uniquement l'isolation au niveau de l'organisation.
Correspondance exacte : Les succès de cache nécessitent des segments de prompt 100 % identiques, y compris tout le texte et les images jusqu'au bloc marqué avec le contrôle de cache, inclus.
Génération de tokens de sortie : La mise en cache des prompts n'a aucun effet sur la génération de tokens de sortie. La réponse que vous recevez est identique à celle que vous obtiendriez si la mise en cache des prompts n'était pas utilisée.
Pour optimiser les performances de la mise en cache des prompts :
Adaptez votre stratégie de mise en cache des prompts à votre scénario :
En cas de comportement inattendu :
Les diagnostics de cache (bêta) permettent à l'API de comparer des requêtes consécutives et de signaler exactement où le préfixe du prompt a divergé, ce qui gère automatiquement de nombreuses étapes de cette liste.
cache_control sont aux mêmes emplacementstool_choice, l'utilisation d'images, la configuration de réflexion et output_config.effort restent cohérents entre les appelstool_use ont un ordre stable, car certains langages (par exemple, Swift, Go) randomisent l'ordre des clés lors de la conversion JSON, ce qui casse les cachesLes modifications de tool_choice ou la présence/absence d'images n'importe où dans le prompt invalideront le cache, nécessitant la création d'une nouvelle entrée de cache. Pour plus de détails sur l'invalidation du cache, consultez Ce qui invalide le cache.
Si vous trouvez que 5 minutes est trop court, Anthropic propose également une durée de cache d'une heure moyennant un coût supplémentaire.
La durée de cache d'une heure est disponible sur l'API Claude, Amazon Bedrock, Amazon Bedrock (Opus 4.6 et antérieurs), Claude Platform on AWS, Google Cloud et Microsoft Foundry.
Pour utiliser le cache étendu, incluez ttl dans la définition de cache_control comme ceci :
"cache_control": {
"type": "ephemeral",
"ttl": "1h"
}La réponse inclut des informations détaillées sur le cache comme ce qui suit :
{
"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
}
}
}Notez que le champ actuel cache_creation_input_tokens est égal à la somme des valeurs de l'objet cache_creation.
Si vous voyez des écritures ephemeral_5m_input_tokens que vous n'avez pas demandées lors de l'utilisation d'outils serveur tels que la recherche web, consultez Utilisation d'outils avec la mise en cache des prompts.
Si vous avez des prompts utilisés à une cadence régulière (c'est-à-dire des invites système utilisées plus fréquemment que toutes les 5 minutes), continuez à utiliser le cache de 5 minutes, car celui-ci continuera d'être actualisé sans frais supplémentaires.
Le cache d'une heure est le plus utile dans les scénarios suivants :
Le cache de 5 minutes et celui d'une heure se comportent de la même manière en ce qui concerne la latence. Vous constaterez généralement une amélioration du délai jusqu'au premier token pour les documents longs.
Vous pouvez utiliser à la fois des contrôles de cache d'une heure et de 5 minutes dans la même requête, mais avec une contrainte importante : les entrées de cache avec un TTL plus long doivent apparaître avant les TTL plus courts (c'est-à-dire qu'une entrée de cache d'une heure doit apparaître avant toute entrée de cache de 5 minutes).
Lors du mélange de TTL, l'API détermine trois emplacements de facturation dans votre prompt :
A : Le nombre de tokens au succès de cache le plus élevé (ou 0 s'il n'y a aucun succès).B : Le nombre de tokens au bloc cache_control d'une heure le plus élevé après A (ou égal à A s'il n'en existe aucun).C : Le nombre de tokens au dernier bloc cache_control.Si B et/ou C sont supérieurs à A, ce seront nécessairement des échecs de cache, car A est le succès de cache le plus élevé.
Vous serez facturé pour :
A.(B - A).(C - B).Voici trois exemples. Ceci représente les tokens d'entrée de 3 requêtes, chacune ayant des succès et des échecs de cache différents. Chacune a une tarification calculée différente, indiquée dans les cases colorées, en conséquence.
Le préchauffage du cache vous permet de charger votre invite système ou vos définitions d'outils dans le cache de prompts avant qu'un utilisateur ne déclenche une requête réelle. Cela élimine la pénalité de latence due à un échec de cache lors de la première interaction utilisateur, réduisant le « time-to-first-token » (délai jusqu'au premier token), ou TTFT, pour les applications sensibles à la latence.
Définissez max_tokens: 0 dans votre requête. L'API lit votre prompt dans le modèle et écrit le cache à chaque point de rupture cache_control, puis retourne immédiatement sans générer aucune sortie. La réponse contient un tableau content vide, stop_reason: "max_tokens", et un bloc usage entièrement renseigné.
Placez le point de rupture cache_control sur le dernier bloc qui est partagé avec la requête de suivi (généralement votre invite système ou vos définitions d'outils), et non sur le message utilisateur de substitution. Sinon, l'entrée de cache est indexée sur le message de substitution et la requête de suivi ne l'atteindra pas. Utilisez également la même configuration de réflexion et le même output_config.effort que vos requêtes de suivi : ces valeurs sont rendues dans le prompt (voir Ce qui invalide le cache), donc un préchauffage avec une configuration différente peut écrire une entrée que votre trafic réel n'atteindra jamais. Cela signifie utiliser un point de rupture de cache explicite plutôt que la mise en cache automatique, puisque la mise en cache automatique place le point de rupture sur le dernier bloc, qui est ici le message de substitution. Le message utilisateur de substitution peut être n'importe quelle chaîne avec un contenu non vide (les exemples ici utilisent "warmup") ; son contenu est lu dans le modèle mais jamais traité en réponse.
Une requête de préchauffage entraîne des frais d'écriture de cache si le préfixe n'est pas déjà mis en cache, comme toute autre requête. Vérifiez usage.cache_creation_input_tokens dans la réponse pour confirmer qu'une écriture a eu lieu. Zéro token de sortie n'est facturé.
client = anthropic.Anthropic()
# Déclenchez ceci avant l'arrivée des utilisateurs pour préchauffer le cache partagé de l'invite système.
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)L'API retourne un tableau content vide :
{
"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"
}
}Envoyez une requête de préchauffage au démarrage de votre application (ou à intervalle régulier), puis envoyez les vraies requêtes utilisateur une fois le préchauffage terminé :
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}],
)
# Préchauffer le cache avant l'arrivée du trafic utilisateur.
prewarm_cache()
# Plus tard, lorsque l'utilisateur envoie un message, le préfixe de l'invite système est déjà en cache.
response = respond("How do I implement a binary search tree?")
for block in response.content:
if block.type == "text":
print(block.text)Gardez à l'esprit que le TTL du cache s'applique toujours. Pour le cache par défaut de 5 minutes, envoyez une nouvelle requête de préchauffage au moins toutes les 5 minutes pour maintenir le cache actif. Pour des intervalles plus longs entre les requêtes utilisateur, utilisez plutôt la durée de cache d'1 heure.
Une requête max_tokens: 0 est rejetée avec une erreur invalid_request_error si l'un des éléments suivants est défini, car chacun implique une sortie qu'un budget de zéro token ne peut pas produire :
stream: truethinking.type: "enabled")output_config.format)tool_choice de {"type": "tool", ...} ou {"type": "any"}max_tokens: 0 est également rejeté dans une requête Message Batches. Le préchauffage cible le temps jusqu'au premier token, ce qui ne s'applique pas au traitement par lots, et une entrée de cache écrite pendant le traitement par lots expirerait probablement avant l'exécution de la requête de suivi.
Avant que max_tokens: 0 ne soit disponible, certaines applications utilisaient des appels de préchauffage avec max_tokens: 1 pour obtenir le même effet. L'approche max_tokens: 0 est préférable : aucune sortie n'est produite, il n'y a donc pas de réponse d'un seul token à ignorer, aucun token de sortie n'est facturé, et l'intention de la requête est sans ambiguïté.
Pour vous aider à démarrer avec la mise en cache des prompts, le cookbook sur la mise en cache des prompts fournit des exemples détaillés et des bonnes pratiques.
Les extraits de code suivants présentent divers modèles de mise en cache des prompts. Ces exemples montrent comment implémenter la mise en cache dans différents scénarios, vous aidant à comprendre les applications pratiques de cette fonctionnalité :
La mise en cache des prompts (automatique et explicite) est éligible au ZDR. Anthropic ne stocke pas le texte brut de vos prompts ni les réponses de Claude.
Les représentations de cache KV (clé-valeur) et les hachages cryptographiques du contenu mis en cache sont conservés uniquement en mémoire et ne sont pas stockés au repos. Les entrées mises en cache ont une durée de vie minimale de 5 minutes (standard) ou 1 heure (étendue), après quoi elles sont rapidement, mais pas immédiatement, supprimées. Les entrées de cache sont isolées entre les organisations et, sur l'API Claude, Claude Platform sur AWS et Microsoft Foundry, entre les espaces de travail au sein d'une organisation.
Pour l'éligibilité au ZDR pour toutes les fonctionnalités, consultez API et conservation des données.
Was this page helpful?