cache_control pour réduire les coûts et la latence, en utilisant la mise en cache automatique ou des points d'arrêt explicites avec des TTL de 5 minutes ou 1 heure.La 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.
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 d'arrêt de cache au dernier bloc pouvant être mis en cache et le déplace vers l'avant à 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 d'utiliser 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é.
La durée de vie est mesurée à partir du début de la requête qui écrit ou lit l'entrée de cache, et non à partir de la fin de sa réponse. Le temps passé à générer une réponse est décompté de la durée de vie : si une réponse prend 4 minutes à être diffusée en streaming, une requête de suivi qui réutilise le même préfixe mis en cache doit démarrer dans un délai d'environ 1 minute après la fin de cette réponse.
La mise en cache des prompts introduit une nouvelle structure tarifaire. Le tableau suivant indique 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 au cache et actualisations | 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 (retiré, sauf sur Bedrock et Google Cloud) | 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 | 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 (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 |
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 d'arrêt 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 à mesure que les conversations s'allongent. Chaque nouvelle requête met en cache tout le contenu jusqu'au dernier bloc pouvant être mis en cache, 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 d'arrêt 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 à 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 de 1 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 d'arrêt de cache explicites. Lorsqu'ils sont utilisés ensemble, le point d'arrêt de cache automatique utilise l'un des 4 emplacements de points d'arrêt disponibles.
Cela vous permet de combiner les deux approches. Par exemple, utilisez un point d'arrêt 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 d'arrêt explicites.
cache_control explicite avec le même TTL, la mise en cache automatique n'a aucun effet.cache_control explicite avec un TTL différent, l'API renvoie une erreur 400.Pour un contrôle plus fin 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 d'arrêt 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 ce fonctionnement vous aide à optimiser votre stratégie de mise en cache.
Trois principes fondamentaux :
Les écritures de cache se produisent uniquement à votre point d'arrêt. 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 jusqu'au point d'arrêt inclus, modifier n'importe quel bloc situé au niveau du point d'arrêt ou avant celui-ci produit un hachage différent lors de la requête suivante.
Les lectures de cache recherchent en arrière les entrées que des requêtes antérieures ont écrites. À chaque requête, le système calcule le hachage du préfixe à votre point d'arrêt et vérifie s'il existe une entrée de cache correspondante. Si aucune n'existe, il remonte 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 d'arrêt, en comptant le point d'arrêt 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 point d'arrêt explicite suivant, 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 d'arrêt sur du contenu qui change à chaque requête
Votre prompt comporte un grand contexte système statique (blocs 1 à 5) suivi d'un bloc par requête contenant un horodatage et le message utilisateur (bloc 6). Vous définissez cache_control sur le bloc 6 :
La recherche arrière ne trouve pas de contenu stable derrière votre point d'arrêt pour le mettre en cache. Elle trouve des entrées que des requêtes antérieures ont déjà écrites, et les écritures se produisent uniquement aux points d'arrêt. Déplacez cache_control vers le bloc 5, le dernier bloc qui reste identique entre les requêtes, 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 d'arrêt 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 d'arrêt explicite sur le bloc 5.
Point clé à retenir : placez cache_control sur le dernier bloc dont le préfixe est identique entre les requêtes que vous souhaitez faire 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 par requête, message entrant), placez le point d'arrêt à la fin du préfixe statique, pas sur le bloc variable.
Vous pouvez définir jusqu'à 4 points d'arrêt de cache si vous souhaitez :
Les points d'arrêt de cache eux-mêmes n'ajoutent aucun coût. Vous êtes facturé uniquement pour :
Ajouter plus de points d'arrêt cache_control 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 d'arrêt 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 :
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'atteignait pas la longueur minimale requise).
Si votre prompt est juste en dessous du minimum pour votre modèle et votre plateforme, étendre le contenu mis en cache pour atteindre le seuil est souvent rentable. 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.
Pour les requêtes concurrentes, 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 correspondances 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 d'assistant précédents. Lorsqu'ils sont mis en cache de cette manière, ils COMPTENT comme des tokens d'entrée lorsqu'ils sont lus depuis le cache.
Les sous-blocs de contenu (comme les citations) eux-mêmes ne peuvent pas ê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ériel 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 apportées au contenu mis en cache peuvent invalider tout ou partie 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 | ✘ | ✘ | ✘ | Modifier les définitions d'outils (noms, descriptions, paramètres) invalide l'intégralité du cache |
| Activation/désactivation de la recherche web | ✓ | ✘ | ✘ | Activer/désactiver la recherche web modifie l'invite système |
| Activation/désactivation des citations | ✓ | ✘ | ✘ | Activer/désactiver les citations modifie l'invite système |
| Paramètre de vitesse | ✓ | ✘ | ✘ | Basculer entre speed: "fast" et la vitesse standard invalide les caches système et messages |
| Choix d'outil | ✓ | ✓ | ✘ | Les modifications du paramètre tool_choice n'affectent que les blocs de messages |
| Images | ✓ | ✓ | ✘ | Ajouter/supprimer des 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 la modifier invalide toujours les blocs de messages ; les caches d'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 | ✘ | Modifier la valeur output_config.effort invalide toujours les blocs de messages, avec le même effet spécifique au modèle sur les caches d'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 le cache. |
| Résultats non-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 préservé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 supprimé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 les blocs de réflexion. |
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 si vous utilisez le 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 d'arrêt de 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 des 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 supprimé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.
Isolation par organisation et workspace : 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. Les caches sont également isolés par workspace au sein d'une organisation sur l'API Claude, Claude Platform on AWS et Microsoft Foundry ; Bedrock et Google Cloud utilisent uniquement une isolation au niveau de l'organisation.
Correspondance exacte : les correspondances de cache nécessitent des segments de prompt 100 % identiques, y compris tout le texte et les images jusqu'au bloc marqué avec cache control 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 :
Si vous rencontrez un comportement inattendu :
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 cachesSi vous trouvez que 5 minutes est trop court, Anthropic propose également une durée de cache de 1 heure moyennant un coût supplémentaire.
Pour utiliser le cache étendu, incluez ttl dans la définition cache_control comme ceci :
"cache_control": {
"type": "ephemeral",
"ttl": "1h"
}La réponse inclut des informations détaillées sur le cache comme 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 cache_creation_input_tokens actuel est égal à la somme des valeurs dans 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 à être actualisé sans frais supplémentaires.
Le cache de 1 heure est le mieux adapté aux scénarios suivants :
Vous pouvez utiliser à la fois des contrôles de cache de 1 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 de 1 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 à la correspondance de cache la plus élevée (ou 0 s'il n'y a pas de correspondance).B : le nombre de tokens au bloc cache_control de 1 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.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 correspondances 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 à l'échec de cache lors de la première interaction utilisateur, réduisant le « time-to-first-token » (temps 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 d'arrêt cache_control, puis retourne immédiatement sans générer de sortie. La réponse contient un tableau content vide, stop_reason: "max_tokens", et un bloc usage entièrement renseigné.
Placez le point d'arrêt cache_control sur le dernier bloc 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 servant de substitut. Sinon, l'entrée de cache est associée au substitut et la requête de suivi ne la trouvera pas. Utilisez également la même configuration de réflexion et la même valeur 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 implique d'utiliser un point d'arrêt de cache explicite plutôt que la mise en cache automatique, car la mise en cache automatique place le point d'arrêt sur le dernier bloc, qui est ici le substitut. Le message utilisateur servant de substitut peut être n'importe quelle chaîne contenant des caractères autres que des espaces (les exemples ici utilisent "warmup") ; son contenu est lu dans le modèle mais ne reçoit jamais de réponse.
client = anthropic.Anthropic()
# Lancez 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"
}
}Lancez une requête de préchauffage au démarrage de votre application (ou à intervalle planifié), puis envoyez les requêtes utilisateur réelles 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échauffez le cache avant l'arrivée de tout trafic utilisateur.
prewarm_cache()
# Plus tard, lorsque l'utilisateur envoie un message, le préfixe de l'invite système est déjà mis 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'une heure.
Une requête avec 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 avec {"type": "tool", ...} ou {"type": "any"}max_tokens: 0 est également rejeté à l'intérieur d'une requête Message Batches. Le préchauffage cible le délai avant le 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 schémas 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 de manière persistante. Les entrées mises en cache ont une durée de vie minimale de 5 minutes (standard) ou d'une heure (étendue), après quoi elles sont supprimées rapidement, bien que pas immédiatement. 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é ZDR sur l'ensemble des fonctionnalités, consultez API et conservation des données.
Was this page helpful?