Cache dei prompt
Memorizza nella cache i prefissi dei prompt con cache_control per ridurre costi e latenza, usando la cache automatica o punti di interruzione espliciti con TTL di 5 minuti o 1 ora.
Il "prompt caching" (cache dei prompt) ottimizza l'utilizzo dell'API consentendo di riprendere l'elaborazione da prefissi specifici dei tuoi prompt. Questo riduce in modo significativo i tempi di elaborazione e i costi per attività ripetitive o prompt con elementi costanti.
Ci sono due modi per abilitare la cache dei prompt:
- Cache automatica: aggiungi un singolo campo
cache_controlal livello superiore della richiesta. Il sistema applica automaticamente il "cache breakpoint" (punto di interruzione della cache) all'ultimo blocco memorizzabile nella cache e lo sposta in avanti man mano che la conversazione cresce. È la soluzione migliore per le conversazioni a più turni, in cui la cronologia crescente dei messaggi deve essere memorizzata automaticamente nella cache. - Punti di interruzione espliciti della cache: inserisci
cache_controldirettamente sui singoli blocchi di contenuto per un controllo granulare su cosa viene memorizzato esattamente nella cache.
Il modo più semplice per iniziare è con la cache automatica:
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5-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())Con la cache automatica, il sistema memorizza nella cache tutto il contenuto fino all'ultimo blocco memorizzabile incluso. Nelle richieste successive con lo stesso prefisso, il contenuto nella cache viene riutilizzato automaticamente.
Come funziona la cache dei prompt
Quando invii una richiesta con la cache dei prompt abilitata:
- Il sistema verifica se un prefisso del prompt, fino a un punto di interruzione della cache specificato, è già presente nella cache a seguito di una query recente.
- Se lo trova, utilizza la versione nella cache, riducendo tempi di elaborazione e costi.
- Altrimenti, elabora il prompt completo e memorizza il prefisso nella cache non appena inizia la risposta.
Questo è particolarmente utile per:
- Prompt con molti esempi
- Grandi quantità di contesto o informazioni di base
- Attività ripetitive con istruzioni costanti
- Lunghe conversazioni a più turni
Per impostazione predefinita, la cache ha una durata di 5 minuti. La cache viene aggiornata senza costi aggiuntivi ogni volta che il contenuto memorizzato viene utilizzato.
La durata viene misurata dall'inizio della richiesta che scrive o legge la voce della cache, non dalla fine della sua risposta. Il tempo impiegato per generare una risposta viene conteggiato nella durata: se una risposta impiega 4 minuti per lo streaming, una richiesta successiva che riutilizza lo stesso prefisso nella cache deve iniziare entro circa 1 minuto dal completamento di quella risposta.
Prezzi
La cache dei prompt introduce una nuova struttura dei prezzi. La tabella seguente mostra il prezzo per milione di token per ciascun modello supportato:
| Model | Base tokens | Prompt caching | |||
|---|---|---|---|---|---|
| Name | Input | Output | 5m writes | 1h writes | Hits and refreshes |
Claude Fable 5.1For demanding reasoning and long-horizon agentic work | $10 / MTok | $50 / MTok | $12.50 / MTok | $20 / MTok | $0.25 / MTok1 |
Claude Opus 5.5For long-running agentic coding and knowledge work | $4 / MTok | $20 / MTok | $5 / MTok | $8 / MTok | $0.20 / MTok2 |
Claude Sonnet 5.5The best combination of speed and intelligence | $2 / MTok | $10 / MTok | $2.50 / MTok | $4 / MTok | $0.20 / MTok |
Claude Haiku 4.5The fastest model with near-frontier intelligence | $1 / MTok | $5 / MTok | $1.25 / MTok | $2 / MTok | $0.10 / MTok |
$10 / MTok | $50 / MTok | $12.50 / MTok | $20 / MTok | $0.25 / MTok1 | |
$10 / MTok | $50 / MTok | $12.50 / MTok | $20 / MTok | $1 / MTok | |
$10 / MTok | $50 / MTok | $12.50 / MTok | $20 / MTok | $1 / MTok | |
$5 / MTok | $25 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | |
$5 / MTok | $25 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | |
$5 / MTok | $25 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | |
$5 / MTok | $25 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | |
$5 / MTok | $25 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | |
Claude Opus 4.1 | $15 / MTok | $75 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok |
Claude Opus 4 | $15 / MTok | $75 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok |
$2 / MTok | $10 / MTok | $2.50 / MTok | $4 / MTok | $0.20 / MTok | |
$3 / MTok | $15 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | |
$3 / MTok | $15 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | |
Claude Sonnet 4 | $3 / MTok | $15 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok |
Claude Haiku 3.5 | $0.80 / MTok | $4 / MTok | $1 / MTok | $1.60 / MTok | $0.08 / MTok |
1 Cache hits and refreshes on Claude Fable 5.1 and Claude Mythos 5.1 are priced at 0.025x the base input price.
2 Cache hits and refreshes on Claude Opus 5.5 are priced at 0.05x the base input price.
All other models use the standard 0.1x multiplier.
Modelli supportati
La cache dei prompt (sia automatica che esplicita) è supportata su tutti i modelli Claude attivi.
Cache automatica
La cache automatica è il modo più semplice per abilitare la cache dei prompt. Invece di inserire cache_control sui singoli blocchi di contenuto, aggiungi un singolo campo cache_control al livello superiore del corpo della richiesta. Il sistema applica automaticamente il punto di interruzione della cache all'ultimo blocco memorizzabile nella cache.
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5-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())Come funziona la cache automatica nelle conversazioni a più turni
Con la cache automatica, il punto della cache si sposta in avanti automaticamente man mano che la conversazione cresce. Ogni nuova richiesta memorizza nella cache tutto fino all'ultimo blocco memorizzabile, e il contenuto precedente viene letto dalla cache.
| Richiesta | Contenuto | Comportamento della cache |
|---|---|---|
| Richiesta 1 | System + User(1) + Asst(1) + User(2) ◀ cache | Tutto viene scritto nella cache |
| Richiesta 2 | System + User(1) + Asst(1) + User(2) + Asst(2) + User(3) ◀ cache | Da System a User(2) letto dalla cache; Asst(2) + User(3) scritti nella cache |
| Richiesta 3 | System + User(1) + Asst(1) + User(2) + Asst(2) + User(3) + Asst(3) + User(4) ◀ cache | Da System a User(3) letto dalla cache; Asst(3) + User(4) scritti nella cache |
Il punto di interruzione della cache si sposta automaticamente sull'ultimo blocco memorizzabile in ogni richiesta, quindi non è necessario aggiornare alcun marcatore cache_control man mano che la conversazione cresce.
Supporto TTL
Per impostazione predefinita, la cache automatica utilizza un "TTL" (time-to-live, durata) di 5 minuti. Puoi specificare un TTL di 1 ora a 2 volte il prezzo base dei token di input:
{ "cache_control": { "type": "ephemeral", "ttl": "1h" } }Combinazione con la cache a livello di blocco
La cache automatica è compatibile con i punti di interruzione espliciti della cache. Quando vengono usati insieme, il punto di interruzione automatico della cache occupa uno dei 4 slot disponibili per i punti di interruzione.
Questo ti consente di combinare entrambi gli approcci. Ad esempio, usa un punto di interruzione esplicito per memorizzare nella cache il tuo prompt di sistema, mentre la cache automatica gestisce la conversazione:
{
"model": "claude-opus-5-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?" }]
}Cosa rimane invariato
La cache automatica utilizza la stessa infrastruttura di cache sottostante. Prezzi, soglie minime di token, requisiti di ordinamento del contesto e la finestra di ricerca a ritroso di 20 blocchi si applicano tutti allo stesso modo dei punti di interruzione espliciti.
Casi limite
- Se l'ultimo blocco ha già un
cache_controlesplicito con lo stesso TTL, la cache automatica non ha alcun effetto. - Se l'ultimo blocco ha un
cache_controlesplicito con un TTL diverso, l'API restituisce un errore 400. - Se esistono già 4 punti di interruzione espliciti a livello di blocco, l'API restituisce un errore 400 (non rimangono slot per la cache automatica).
- Se l'ultimo blocco non è idoneo come destinazione di un punto di interruzione automatico della cache, il sistema risale silenziosamente all'indietro per trovare il blocco idoneo più vicino. Se non ne trova nessuno, la cache viene saltata.
Punti di interruzione espliciti della cache
Per un maggiore controllo sulla cache, puoi inserire cache_control direttamente sui singoli blocchi di contenuto. Questo è utile quando devi memorizzare nella cache sezioni diverse che cambiano con frequenze diverse, o quando hai bisogno di un controllo granulare su cosa viene memorizzato esattamente.
Strutturare il prompt
Posiziona il contenuto statico (definizioni degli strumenti, istruzioni di sistema, contesto, esempi) all'inizio del prompt. Contrassegna la fine del contenuto riutilizzabile da memorizzare nella cache usando il parametro cache_control.
I prefissi della cache vengono creati nel seguente ordine: tools, system, poi messages. Questo ordine forma una gerarchia in cui ogni livello si basa sui precedenti.
Come funziona il controllo automatico dei prefissi
Puoi usare un solo punto di interruzione della cache alla fine del contenuto statico, e il sistema troverà automaticamente il prefisso più lungo che una richiesta precedente ha già scritto nella cache. Capire come funziona ti aiuta a ottimizzare la tua strategia di cache.
Tre principi fondamentali:
-
Le scritture nella cache avvengono solo in corrispondenza del punto di interruzione. Contrassegnare un blocco con
cache_controlscrive esattamente una voce nella cache: un hash del prefisso che termina in quel blocco. Il sistema non scrive voci per nessuna posizione precedente. Poiché l'hash è cumulativo e copre tutto fino al punto di interruzione incluso, modificare qualsiasi blocco in corrispondenza o prima del punto di interruzione produce un hash diverso nella richiesta successiva. -
Le letture dalla cache cercano a ritroso le voci scritte dalle richieste precedenti. A ogni richiesta il sistema calcola l'hash del prefisso in corrispondenza del punto di interruzione e verifica se esiste una voce corrispondente nella cache. Se non esiste, risale all'indietro un blocco alla volta, verificando se l'hash del prefisso in ciascuna posizione precedente corrisponde a qualcosa già presente nella cache. Cerca scritture precedenti, non contenuto stabile.
-
La "lookback window" (finestra di ricerca a ritroso) è di 20 blocchi. Il sistema controlla al massimo 20 posizioni per punto di interruzione, contando il punto di interruzione stesso come prima posizione. Se il sistema non trova alcuna voce corrispondente in quella finestra, il controllo si interrompe (o riprende dal successivo punto di interruzione esplicito, se presente). Sulla Claude API, una sequenza di blocchi
tool_useconsecutivi conta come una sola posizione, così come una sequenza di blocchitool_resultconsecutivi, quindi un turno con molte chiamate parallele agli strumenti non spinge da solo la voce della richiesta precedente fuori dalla finestra.
Esempio: ricerca a ritroso in una conversazione in crescita
Aggiungi nuovi blocchi a ogni turno e imposti cache_control sul blocco finale di ogni richiesta:
- Turno 1: 10 blocchi, punto di interruzione sul blocco 10. Non esistono voci precedenti nella cache. Il sistema scrive una voce al blocco 10.
- Turno 2: 15 blocchi, punto di interruzione sul blocco 15. Il blocco 15 non ha alcuna voce, quindi il sistema risale al blocco 10 e trova la voce del turno 1. "Cache hit" (corrispondenza nella cache) al blocco 10; il sistema elabora da zero solo i blocchi da 11 a 15 e scrive una nuova voce al blocco 15.
- Turno 3: 35 blocchi, punto di interruzione sul blocco 35. Il sistema controlla 20 posizioni (blocchi da 35 a 16) e non trova nulla. La voce del turno 2 al blocco 15 si trova una posizione fuori dalla finestra, quindi non c'è alcun cache hit. Aggiungere un secondo punto di interruzione al blocco 15 avvia lì una seconda finestra di ricerca a ritroso, che trova la voce del turno 2.
Errore comune: punto di interruzione su contenuto che cambia a ogni richiesta
Il tuo prompt ha un ampio contesto di sistema statico (blocchi da 1 a 5) seguito da un blocco specifico per ogni richiesta contenente un timestamp e il messaggio dell'utente (blocco 6). Imposti cache_control sul blocco 6:
- Richiesta 1: scrittura nella cache al blocco 6. L'hash include il timestamp.
- Richiesta 2: il timestamp è diverso, quindi l'hash del prefisso al blocco 6 è diverso. La ricerca a ritroso attraversa i blocchi 5, 4, 3, 2 e 1, ma il sistema non ha mai scritto una voce in nessuna di quelle posizioni. Nessun cache hit. Paghi una nuova scrittura nella cache a ogni richiesta e non ottieni mai una lettura.
La ricerca a ritroso non trova il contenuto stabile dietro il punto di interruzione per memorizzarlo nella cache. Trova le voci che le richieste precedenti hanno già scritto, e le scritture avvengono solo in corrispondenza dei punti di interruzione. Sposta cache_control sul blocco 5, l'ultimo blocco che rimane invariato tra le richieste, e ogni richiesta successiva leggerà il prefisso dalla cache. La cache automatica cade nella stessa trappola: posiziona il punto di interruzione sull'ultimo blocco memorizzabile, che in questa struttura è quello che cambia a ogni richiesta, quindi usa invece un punto di interruzione esplicito sul blocco 5.
Punto chiave: posiziona cache_control sull'ultimo blocco il cui prefisso è identico tra le richieste che vuoi far condividere una cache. In una conversazione in crescita il blocco finale funziona purché ogni turno aggiunga meno di 20 blocchi: il contenuto precedente non cambia mai, quindi la ricerca a ritroso della richiesta successiva trova la scrittura precedente. Per un prompt con un suffisso variabile (timestamp, contesto specifico per richiesta, il messaggio in arrivo), posiziona il punto di interruzione alla fine del prefisso statico, non sul blocco variabile.
Quando usare più punti di interruzione
Puoi definire fino a 4 punti di interruzione della cache se vuoi:
- Memorizzare nella cache sezioni diverse che cambiano con frequenze diverse (ad esempio, gli strumenti cambiano raramente, ma il contesto si aggiorna ogni giorno)
- Avere un maggiore controllo su cosa viene memorizzato esattamente nella cache
- Garantire un cache hit quando una conversazione in crescita sposta il punto di interruzione di 20 o più blocchi oltre l'ultima scrittura nella cache
Comprendere i costi dei punti di interruzione della cache
I punti di interruzione della cache di per sé non aggiungono alcun costo. Ti vengono addebitati solo:
- Scritture nella cache: quando nuovo contenuto viene scritto nella cache (25% in più rispetto ai token di input base per il TTL di 5 minuti)
- Letture dalla cache: quando viene utilizzato contenuto memorizzato nella cache (10% del prezzo base dei token di input, oppure 2,5% su Claude Fable 5.1 e Claude Mythos 5.1, e 5% su Claude Opus 5.5)
- Token di input normali: per qualsiasi contenuto non memorizzato nella cache
Aggiungere più punti di interruzione cache_control non aumenta i costi; paghi comunque lo stesso importo in base al contenuto effettivamente memorizzato e letto dalla cache. I punti di interruzione ti danno il controllo su quali sezioni possono essere memorizzate nella cache in modo indipendente.
Strategie e considerazioni sulla cache
Limitazioni della cache
Sulla Claude API, su Claude Platform on AWS, Google Cloud e Microsoft Foundry, la lunghezza minima del prompt memorizzabile nella cache è:
- 512 token per Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5.5, Claude Opus 5, Claude Sonnet 5.5, Claude Fable 5, e Claude Mythos 5
- 2.048 token per Claude Mythos Preview e Claude Opus 4.7
- 4.096 token per Claude Opus 4.6 e Claude Opus 4.5
- 1.024 token per Claude Opus 4.8, Claude Sonnet 5, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Opus 4.1 (ritirato, tranne su Bedrock e Google Cloud), Claude Opus 4 (ritirato, tranne su Google Cloud) e Claude Sonnet 4 (ritirato, tranne su Bedrock e Google Cloud)
- 4.096 token per Claude Haiku 4.5
- 2.048 token per Claude Haiku 3.5 (ritirato, tranne su Bedrock e Google Cloud)
Questi minimi si applicano su ogni piattaforma in cui ciascun modello è disponibile.
I prompt più brevi non possono essere memorizzati nella cache, anche se contrassegnati con cache_control. Qualsiasi richiesta di memorizzare nella cache un numero di token inferiore a questo verrà elaborata senza cache, e non viene restituito alcun errore. Per verificare se un prompt è stato memorizzato nella cache, controlla i campi di utilizzo della risposta: se sia cache_creation_input_tokens che cache_read_input_tokens sono 0, il prompt non è stato memorizzato nella cache (probabilmente perché non soddisfaceva il requisito di lunghezza minima).
Se il tuo prompt è appena al di sotto del minimo per il tuo modello e la tua piattaforma, spesso conviene ampliare il contenuto memorizzato nella cache per raggiungere la soglia. Le letture dalla cache costano molto meno dei token di input non memorizzati, quindi raggiungere il minimo può ridurre i costi per i prompt riutilizzati di frequente.
Per le richieste simultanee, tieni presente che una voce della cache diventa disponibile solo dopo l'inizio della prima risposta. Se hai bisogno di cache hit per richieste parallele, attendi la prima risposta prima di inviare le richieste successive.
Attualmente, "ephemeral" è l'unico tipo di cache supportato, che per impostazione predefinita ha una durata di 5 minuti.
Cosa può essere memorizzato nella cache
La maggior parte dei blocchi nella richiesta può essere memorizzata nella cache. Questo include:
- Strumenti: definizioni degli strumenti nell'array
tools - Messaggi di sistema: blocchi di contenuto nell'array
system - Messaggi di testo: blocchi di contenuto nell'array
messages.content, sia per i turni dell'utente che per quelli dell'assistente - Immagini e documenti: blocchi di contenuto nell'array
messages.content, nei turni dell'utente - Uso degli strumenti e risultati degli strumenti: blocchi di contenuto nell'array
messages.content, sia nei turni dell'utente che in quelli dell'assistente
Ciascuno di questi elementi può essere memorizzato nella cache, automaticamente oppure contrassegnandolo con cache_control.
Cosa non può essere memorizzato nella cache
Sebbene la maggior parte dei blocchi della richiesta possa essere memorizzata nella cache, ci sono alcune eccezioni:
-
I blocchi di ragionamento non possono essere memorizzati direttamente nella cache con
cache_control. Tuttavia, i blocchi di ragionamento POSSONO essere memorizzati nella cache insieme ad altro contenuto quando compaiono nei turni precedenti dell'assistente. Quando vengono memorizzati in questo modo, VENGONO conteggiati come token di input quando letti dalla cache. -
I blocchi di sotto-contenuto (come le citazioni) non possono essere memorizzati direttamente nella cache. Memorizza invece il blocco di livello superiore.
Nel caso delle citazioni, i blocchi di contenuto del documento di livello superiore che fungono da materiale di origine per le citazioni possono essere memorizzati nella cache. Questo ti consente di usare efficacemente la cache dei prompt con le citazioni, memorizzando nella cache i documenti a cui le citazioni faranno riferimento.
-
I blocchi di testo vuoti non possono essere memorizzati nella cache.
Cosa invalida la cache
Le modifiche al contenuto memorizzato nella cache possono invalidare la cache in parte o del tutto.
Come descritto in Strutturare il prompt, la cache segue la gerarchia: tools → system → messages. Le modifiche a ciascun livello invalidano quel livello e tutti i livelli successivi.
La tabella seguente mostra quali parti della cache vengono invalidate dai diversi tipi di modifiche. ✘ indica che la cache viene invalidata, mentre ✓ indica che la cache rimane valida.
| Cosa cambia | Cache degli strumenti | Cache di sistema | Cache dei messaggi | Impatto |
|---|---|---|---|---|
| Definizioni degli strumenti | ✘ | ✘ | ✘ | Modificare le definizioni degli strumenti (nomi, descrizioni, parametri) invalida l'intera cache |
| Attivazione della ricerca web | ✓ | ✘ | ✘ | Abilitare/disabilitare la ricerca web modifica il prompt di sistema |
| Attivazione delle citazioni | ✓ | ✘ | ✘ | Abilitare/disabilitare le citazioni modifica il prompt di sistema |
| Impostazione della velocità | ✓ | ✘ | ✘ | Passare da speed: "fast" alla velocità standard e viceversa invalida le cache di sistema e dei messaggi |
| Scelta dello strumento | ✓ | ✓ | ✘ | Le modifiche al parametro tool_choice influiscono solo sui blocchi dei messaggi |
| Immagini | ✓ | ✓ | ✘ | Aggiungere/rimuovere immagini in qualsiasi punto del prompt influisce sui blocchi dei messaggi |
| Parametri di ragionamento | Specifico per modello | Specifico per modello | ✘ | La configurazione del ragionamento (modalità e budget_tokens in modalità estesa) viene inserita nel prompt, quindi modificarla invalida sempre i blocchi dei messaggi; anche le cache degli strumenti e di sistema vengono invalidate sui modelli che inseriscono la configurazione prima di esse. Consulta Ragionamento e cache dei prompt. |
| Impostazione dell'effort | Specifico per modello | Specifico per modello | ✘ | Modificare il valore di output_config.effort invalida sempre i blocchi dei messaggi, con lo stesso effetto specifico per modello sulle cache degli strumenti e di sistema dei parametri di ragionamento. Impostare esplicitamente l'effort sul valore predefinito del modello equivale a ometterlo e non invalida la cache. Sui modelli che supportano l'effort per messaggio, una modifica dell'effort trasmessa in un messaggio role: "system" all'interno di messages lascia intatto il prefisso nella cache. |
| Risultati non di strumenti passati a richieste con ragionamento esteso | ✓ | ✓ | Specifico per modello | Su Opus 4.5+ e Sonnet 4.6+, i blocchi di ragionamento vengono preservati per impostazione predefinita, quindi la cache rimane valida (✓). Sui modelli Opus/Sonnet precedenti e su tutti i modelli Haiku, tutti i blocchi di ragionamento precedentemente memorizzati nella cache vengono rimossi dal contesto, e tutti i messaggi che seguono tali blocchi di ragionamento vengono rimossi dalla cache (✘). Per maggiori dettagli, consulta Cache con i blocchi di ragionamento. |
| Blocchi di ragionamento scartati | ✓ | ✓ | ✘ | Quando l'API scarta un blocco di ragionamento di Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5.5 o Claude Sonnet 5.5 che non è preservato in quella richiesta (ad esempio, uno che ripassi a un modello che non è in grado di leggerlo), il prefisso nella cache cambia a partire dalla posizione di quel blocco in quella richiesta. I blocchi che il modello ricevente è in grado di leggere, ripassati senza modifiche, mantengono intatta la cache. |
Sui modelli che supportano le modifiche agli strumenti a metà conversazione, l'header beta inline-tools-2026-09-15 ti consente di aggiungere uno strumento, o modificare la definizione di uno strumento, a metà di una conversazione senza modificare tools. Invia la definizione in un blocco tool_addition in un messaggio di sistema a metà conversazione e lascia tools esattamente come l'hai inviato la prima volta. Il prefisso nella cache continua a corrispondere, quindi solo il messaggio aggiunto viene elaborato come nuovo input. L'unica eccezione è un array tools senza alcuno strumento non differito, in cui il primo strumento definito in questo modo comporta un cache miss completo in quella richiesta. Consulta Definire gli strumenti in un messaggio.
Monitorare le prestazioni della cache
Monitora le prestazioni della cache usando questi campi della risposta dell'API, all'interno di usage nella risposta (o nell'evento message_start se usi lo streaming):
cache_creation_input_tokens: numero di token scritti nella cache durante la creazione di una nuova voce.cache_read_input_tokens: numero di token recuperati dalla cache per questa richiesta.input_tokens: numero di token di input che non sono stati letti dalla cache né usati per crearla (ovvero, i token dopo l'ultimo punto di interruzione della cache).
Cache con i blocchi di ragionamento
Quando usi il ragionamento con la cache dei prompt, i blocchi di ragionamento hanno un comportamento speciale:
Cache automatica insieme ad altro contenuto: sebbene i blocchi di ragionamento non possano essere contrassegnati esplicitamente con cache_control, vengono memorizzati nella cache come parte del contenuto della richiesta quando effettui chiamate API successive con risultati degli strumenti. Questo accade comunemente durante l'uso degli strumenti, quando ripassi i blocchi di ragionamento per continuare la conversazione.
Conteggio dei token di input: quando i blocchi di ragionamento vengono letti dalla cache, vengono conteggiati come token di input nelle metriche di utilizzo. Questo è importante per il calcolo dei costi e la pianificazione del budget di token.
Schemi di invalidazione della cache:
- La cache rimane valida quando vengono forniti solo risultati degli strumenti come messaggi dell'utente
- Su Opus 4.5+ e Sonnet 4.6+, i blocchi di ragionamento vengono preservati per impostazione predefinita anche quando viene aggiunto contenuto dell'utente diverso dai risultati degli strumenti, quindi la cache rimane valida
- Sui modelli Opus/Sonnet precedenti e su tutti i modelli Haiku, la cache viene invalidata quando viene aggiunto contenuto dell'utente diverso dai risultati degli strumenti, causando la rimozione dal contesto di tutti i blocchi di ragionamento precedenti
- Questo comportamento della cache si verifica anche senza marcatori
cache_controlespliciti
Per maggiori dettagli sull'invalidazione della cache, consulta Cosa invalida la cache.
Esempio con uso degli strumenti:
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 keptSui modelli Opus/Sonnet precedenti e su tutti i modelli Haiku, a questo punto tutti i blocchi di ragionamento precedenti vengono rimossi dal contesto. Su Opus 4.5+ e Sonnet 4.6+, i blocchi di ragionamento precedenti vengono mantenuti per impostazione predefinita e restano parte del prefisso nella cache.
Per informazioni più dettagliate, consulta Ragionamento e cache dei prompt.
Archiviazione e condivisione della cache
-
Isolamento per organizzazione e workspace: le cache sono isolate tra le organizzazioni. Organizzazioni diverse non condividono mai le cache, anche se usano prompt identici. Le cache sono inoltre isolate per workspace all'interno di un'organizzazione sulla Claude API, su Claude Platform on AWS e su Microsoft Foundry; Bedrock e Google Cloud usano solo l'isolamento a livello di organizzazione.
-
Corrispondenza esatta: i cache hit richiedono segmenti di prompt identici al 100%, inclusi tutto il testo e tutte le immagini fino al blocco contrassegnato con il controllo della cache incluso.
-
Generazione dei token di output: la cache dei prompt non ha alcun effetto sulla generazione dei token di output. La risposta che ricevi è identica a quella che otterresti se la cache dei prompt non fosse utilizzata.
Best practice per una cache efficace
Per ottimizzare le prestazioni della cache dei prompt:
- Inizia con la cache automatica per le conversazioni a più turni. Gestisce automaticamente i punti di interruzione.
- Usa i punti di interruzione espliciti a livello di blocco quando devi memorizzare nella cache sezioni diverse con frequenze di modifica diverse.
- Memorizza nella cache contenuto stabile e riutilizzabile, come istruzioni di sistema, informazioni di base, contesti ampi o definizioni di strumenti usate di frequente.
- Posiziona il contenuto da memorizzare nella cache all'inizio del prompt per ottenere le migliori prestazioni.
- Usa i punti di interruzione della cache in modo strategico per separare le diverse sezioni di prefisso memorizzabili.
- Posiziona il punto di interruzione sull'ultimo blocco che rimane identico tra le richieste. Per un prompt con un prefisso statico e un suffisso variabile (timestamp, contesto specifico per richiesta, il messaggio in arrivo), si tratta della fine del prefisso, non del blocco variabile.
- Analizza regolarmente i tassi di cache hit e adatta la tua strategia secondo necessità.
Ottimizzazione per diversi casi d'uso
Adatta la tua strategia di cache dei prompt al tuo scenario:
- Agenti conversazionali: riduci costi e "latency" (latenza) per conversazioni estese, in particolare quelle con istruzioni lunghe o documenti caricati.
- Assistenti di programmazione: migliora il completamento automatico e le domande e risposte sulla codebase mantenendo nel prompt le sezioni rilevanti o una versione riassunta della codebase.
- Elaborazione di documenti di grandi dimensioni: incorpora nel prompt materiale completo di lunga durata, incluse le immagini, senza aumentare la latenza della risposta.
- Set di istruzioni dettagliati: condividi elenchi estesi di istruzioni, procedure ed esempi per perfezionare le risposte di Claude. Gli sviluppatori spesso includono uno o due esempi nel prompt, ma con la cache dei prompt puoi ottenere prestazioni ancora migliori includendo più di 20 esempi diversificati di risposte di alta qualità.
- Uso degli strumenti in modalità agentica: migliora le prestazioni per scenari che prevedono più chiamate agli strumenti e modifiche iterative al codice, in cui ogni passaggio richiede in genere una nuova chiamata API.
- Conversare con libri, articoli, documentazione, trascrizioni di podcast e altri contenuti di lunga durata: dai vita a qualsiasi base di conoscenza incorporando l'intero documento (o gli interi documenti) nel prompt e consentendo agli utenti di porre domande.
Risoluzione dei problemi comuni
Se riscontri un comportamento inatteso:
- Assicurati che le sezioni memorizzate nella cache siano identiche tra le chiamate. Per i punti di interruzione espliciti, verifica che i marcatori
cache_controlsi trovino nelle stesse posizioni - Controlla che le chiamate vengano effettuate entro la durata della cache (5 minuti per impostazione predefinita)
- Verifica che
tool_choice, l'uso delle immagini, la configurazione del ragionamento eoutput_config.effortrimangano coerenti tra le chiamate - Verifica di memorizzare nella cache almeno il numero minimo di token per il tuo modello e la tua piattaforma (consulta Limitazioni della cache)
- Conferma che il punto di interruzione si trovi su un blocco che rimane identico tra le richieste. Le scritture nella cache avvengono solo in corrispondenza del punto di interruzione e, se quel blocco cambia (timestamp, contesto specifico per richiesta, il messaggio in arrivo), l'hash del prefisso non corrisponde mai. La ricerca a ritroso non trova il contenuto stabile dietro il punto di interruzione; trova solo le voci che le richieste precedenti hanno scritto in corrispondenza dei propri punti di interruzione
- Verifica che le chiavi nei blocchi di contenuto
tool_useabbiano un ordinamento stabile, poiché alcuni linguaggi (ad esempio Swift, Go) rendono casuale l'ordine delle chiavi durante la conversione in JSON, compromettendo le cache - Usa la diagnostica della cache per far sì che l'API confronti richieste consecutive e segnali quale parte del prompt è divergente
Durata della cache di 1 ora
Se ritieni che 5 minuti siano troppo pochi, Anthropic offre anche una durata della cache di 1 ora a un costo aggiuntivo.
Per usare la cache estesa, includi ttl nella definizione di cache_control in questo modo:
"cache_control": {
"type": "ephemeral",
"ttl": "1h"
}La risposta include informazioni dettagliate sulla cache come le seguenti:
{
"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
}
}
}Tieni presente che l'attuale campo cache_creation_input_tokens è uguale alla somma dei valori nell'oggetto cache_creation.
Se vedi scritture ephemeral_5m_input_tokens che non hai richiesto mentre usi strumenti server come la ricerca web, consulta Uso degli strumenti con la cache dei prompt.
Quando usare la cache di 1 ora
Se hai prompt utilizzati con cadenza regolare (ovvero, prompt di sistema utilizzati più spesso di ogni 5 minuti), continua a usare la cache di 5 minuti, poiché continuerà a essere aggiornata senza costi aggiuntivi.
La cache di 1 ora è più indicata nei seguenti scenari:
- Quando hai prompt che probabilmente vengono utilizzati meno spesso di ogni 5 minuti, ma più spesso di ogni ora. Ad esempio, quando un agente secondario in un flusso agentico impiegherà più di 5 minuti, oppure quando memorizzi una lunga conversazione di chat con un utente e in genere prevedi che quell'utente potrebbe non rispondere nei 5 minuti successivi.
- Quando la latenza è importante e i tuoi prompt successivi potrebbero essere inviati dopo più di 5 minuti.
- Quando vuoi migliorare l'utilizzo del tuo "rate limit" (limite di velocità), poiché i cache hit non vengono detratti dal tuo limite di velocità.
Combinare TTL diversi
Puoi usare sia controlli della cache da 1 ora sia da 5 minuti nella stessa richiesta, ma con un vincolo importante: le voci della cache con TTL più lungo devono comparire prima di quelle con TTL più breve (ovvero, una voce della cache da 1 ora deve comparire prima di qualsiasi voce della cache da 5 minuti).
Quando combini TTL diversi, l'API determina tre posizioni di fatturazione nel tuo prompt:
- Posizione
A: il conteggio dei token in corrispondenza del cache hit più alto (o 0 se non ci sono hit). - Posizione
B: il conteggio dei token in corrispondenza del bloccocache_controlda 1 ora più alto dopoA(oppure uguale adAse non ne esistono). - Posizione
C: il conteggio dei token in corrispondenza dell'ultimo bloccocache_control.
Ti verranno addebitati:
- Token di lettura della cache per
A. - Token di scrittura della cache da 1 ora per
(B - A). - Token di scrittura della cache da 5 minuti per
(C - B).
Ecco tre esempi. L'immagine mostra i token di input di 3 richieste, ciascuna con cache hit e cache miss diversi. Di conseguenza, ciascuna ha un prezzo calcolato diverso, mostrato nei riquadri colorati.
Preriscaldare la cache
Il "cache pre-warming" (preriscaldamento della cache) ti consente di caricare il tuo prompt di sistema o le definizioni degli strumenti nella cache dei prompt prima che un utente attivi una richiesta reale. Questo elimina la penalità di latenza dovuta al cache miss alla prima interazione dell'utente, riducendo il "time-to-first-token" (tempo al primo token), o TTFT, per le applicazioni sensibili alla latenza.
Come funziona
Imposta max_tokens: 0 nella tua richiesta. L'API legge il tuo prompt nel modello e scrive la cache in corrispondenza di qualsiasi breakpoint cache_control, quindi restituisce immediatamente una risposta senza generare alcun output. La risposta ha un array content vuoto, stop_reason: "max_tokens" e un blocco usage completamente popolato.
Posiziona il breakpoint cache_control sull'ultimo blocco condiviso con la richiesta successiva (in genere il tuo prompt di sistema o le definizioni degli strumenti), non sul messaggio utente segnaposto. Altrimenti la voce della cache viene associata al segnaposto e la richiesta successiva non la colpirà. Usa anche la stessa configurazione del ragionamento e lo stesso output_config.effort delle tue richieste successive: questi valori vengono inseriti nel prompt (vedi Cosa invalida la cache), quindi un preriscaldamento con una configurazione diversa può scrivere una voce che il tuo traffico reale non colpirà mai. Ciò significa usare un breakpoint della cache esplicito anziché la cache automatica, poiché la cache automatica posiziona il breakpoint sull'ultimo blocco, che in questo caso è il segnaposto. Il messaggio utente segnaposto può essere qualsiasi stringa con contenuto diverso da spazi bianchi (gli esempi qui usano "warmup"); il suo contenuto viene letto nel modello ma non riceve mai risposta.
client = anthropic.Anthropic()
# Esegui questa chiamata prima dell'arrivo degli utenti per preriscaldare la cache condivisa del prompt di sistema.
prewarm = client.messages.create(
model="claude-opus-5-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 restituisce un array content vuoto:
{
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"content": [],
"model": "claude-opus-5-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"
}
}Schema di utilizzo tipico
Invia una richiesta di preriscaldamento all'avvio della tua applicazione (o a intervalli programmati), quindi invia le richieste reali degli utenti dopo il completamento del preriscaldamento:
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-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-5",
max_tokens=1024,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": user_message}],
)
# Prepara la cache prima che arrivi il traffico degli utenti.
prewarm_cache()
# In seguito, quando l'utente invia un messaggio, il prefisso del prompt di sistema è già in cache.
response = respond("How do I implement a binary search tree?")
for block in response.content:
if block.type == "text":
print(block.text)Tieni presente che il TTL della cache continua ad applicarsi. Per la cache predefinita da 5 minuti, invia una nuova richiesta di preriscaldamento almeno ogni 5 minuti per mantenere la cache calda. Per intervalli più lunghi tra le richieste degli utenti, usa invece la durata della cache di 1 ora.
Limitazioni
Una richiesta con max_tokens: 0 viene rifiutata con un invalid_request_error se è impostato uno qualsiasi dei seguenti elementi, poiché ciascuno implica un output che un budget di zero token non può produrre:
stream: true- Ragionamento esteso (
thinking.type: "enabled") - Output strutturati (
output_config.format) tool_choicecon valore{"type": "tool", ...}o{"type": "any"}
max_tokens: 0 viene rifiutato anche all'interno di una richiesta Message Batches. Il preriscaldamento mira al time-to-first-token, che non si applica all'elaborazione in batch, e una voce della cache scritta durante l'elaborazione in batch probabilmente scadrebbe prima dell'esecuzione della richiesta successiva.
Sostituire la soluzione alternativa max_tokens=1
Prima che max_tokens: 0 fosse disponibile, alcune applicazioni usavano chiamate di riscaldamento con max_tokens: 1 per ottenere lo stesso effetto. L'approccio con max_tokens: 0 è preferibile: non viene prodotto alcun output, quindi non c'è una risposta di un singolo token da scartare, non vengono fatturati token di output e l'intento della richiesta è inequivocabile.
Esempi di cache dei prompt
Per aiutarti a iniziare con il "prompt caching" (cache dei prompt), il cookbook sulla cache dei prompt fornisce esempi dettagliati e best practice.
I seguenti frammenti di codice mostrano vari schemi di cache dei prompt. Questi esempi dimostrano come implementare la cache in diversi scenari, aiutandoti a comprendere le applicazioni pratiche di questa funzionalità:
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
system=[
{
"type": "text",
"text": "You are an AI assistant tasked with analyzing legal documents.",
},
{
"type": "text",
"text": "Here is the full text of a complex legal agreement: [Insert full text of a 50-page legal agreement here]",
"cache_control": {"type": "ephemeral"},
},
],
messages=[
{
"role": "user",
"content": "What are the key terms and conditions in this agreement?",
}
],
)
print(response.usage.model_dump_json())Questo esempio dimostra l'utilizzo di base della cache dei prompt, memorizzando nella cache il testo completo dell'accordo legale come prefisso e lasciando l'istruzione dell'utente fuori dalla cache.
Per la prima richiesta:
input_tokens: numero di token solo nel messaggio dell'utentecache_creation_input_tokens: numero di token nell'intero messaggio di sistema, incluso il documento legalecache_read_input_tokens: 0 (nessun cache hit alla prima richiesta)
Per le richieste successive entro la durata della cache:
input_tokens: numero di token solo nel messaggio dell'utentecache_creation_input_tokens: 0 (nessuna nuova creazione di cache)cache_read_input_tokens: numero di token nell'intero messaggio di sistema memorizzato nella cache
Le definizioni degli strumenti possono essere memorizzate nella cache posizionando cache_control sull'ultimo strumento del tuo array tools. Tutti gli strumenti definiti prima di quello strumento, incluso quest'ultimo, vengono memorizzati nella cache come un unico prefisso.
{
"model": "claude-opus-5-5",
"max_tokens": 1024,
"tools": [
{
"name": "get_weather",
"description": "Get the current weather in a given location",
"input_schema": {
"type": "object",
"properties": { "location": { "type": "string" } },
"required": ["location"]
}
},
{
"name": "get_time",
"description": "Get the current time in a given time zone",
"input_schema": {
"type": "object",
"properties": { "timezone": { "type": "string" } },
"required": ["timezone"]
},
"cache_control": { "type": "ephemeral" }
}
],
"messages": [{ "role": "user", "content": "What is the weather and time in New York?" }]
}Alla prima richiesta, cache_creation_input_tokens riflette il conteggio dei token di tutte le definizioni degli strumenti. Nelle richieste successive entro la durata della cache, quei token compaiono invece in cache_read_input_tokens.
Per i dettagli sull'interazione tra definizioni degli strumenti, defer_loading e invalidazione della cache, consulta Uso degli strumenti con la cache dei prompt.
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
system=[
{
"type": "text",
"text": "...long system prompt",
"cache_control": {"type": "ephemeral"},
}
],
messages=[
# ...lunga conversazione fin qui
{
"role": "user",
"content": [
{
"type": "text",
"text": "Hello, can you tell me more about the solar system?",
}
],
},
{
"role": "assistant",
"content": "Certainly! The solar system is the collection of celestial bodies that orbit our Sun. It consists of eight planets, numerous moons, asteroids, comets, and other objects. The planets, in order from closest to farthest from the Sun, are: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune. Each planet has its own unique characteristics and features. Is there a specific aspect of the solar system you'd like to know more about?",
},
{
"role": "user",
"content": [
{"type": "text", "text": "Good to know."},
{
"type": "text",
"text": "Tell me more about Mars.",
"cache_control": {"type": "ephemeral"},
},
],
},
],
)
print(response.usage.model_dump_json())Questo esempio dimostra come usare la cache dei prompt in una conversazione a più turni.
A ogni turno, il blocco finale del messaggio finale viene contrassegnato con cache_control in modo che la conversazione possa essere memorizzata nella cache in modo incrementale. Il sistema cerca e usa automaticamente la sequenza di blocchi più lunga precedentemente memorizzata nella cache per i messaggi successivi. In altre parole, i blocchi che in precedenza erano contrassegnati con un blocco cache_control in seguito non vengono più contrassegnati, ma verranno comunque considerati un cache hit (e anche un aggiornamento della cache!) se vengono colpiti entro 5 minuti.
Inoltre, nota che il parametro cache_control è posizionato sul messaggio di sistema. Questo serve a garantire che, se viene rimosso dalla cache (dopo non essere stato usato per più di 5 minuti), venga aggiunto nuovamente alla cache alla richiesta successiva.
Questo approccio è utile per mantenere il contesto nelle conversazioni in corso senza elaborare ripetutamente le stesse informazioni.
Quando è configurato correttamente, dovresti vedere quanto segue nella risposta di utilizzo di ogni richiesta:
input_tokens: numero di token nel nuovo messaggio dell'utente (sarà minimo)cache_creation_input_tokens: numero di token nei nuovi turni dell'assistente e dell'utentecache_read_input_tokens: numero di token nella conversazione fino al turno precedente
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
tools=[
{
"name": "search_documents",
"description": "Search through the knowledge base",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Search query"}
},
"required": ["query"],
},
},
{
"name": "get_document",
"description": "Retrieve a specific document by ID",
"input_schema": {
"type": "object",
"properties": {
"doc_id": {"type": "string", "description": "Document ID"}
},
"required": ["doc_id"],
},
"cache_control": {"type": "ephemeral"},
},
],
system=[
{
"type": "text",
"text": "You are a helpful research assistant with access to a document knowledge base.\n\n# Instructions\n- Always search for relevant documents before answering\n- Provide citations for your sources\n- Be objective and accurate in your responses\n- If multiple documents contain relevant information, synthesize them\n- Acknowledge when information is not available in the knowledge base",
"cache_control": {"type": "ephemeral"},
},
{
"type": "text",
"text": "# Knowledge Base Context\n\nHere are the relevant documents for this conversation:\n\n## Document 1: Solar System Overview\nThe solar system consists of the Sun and all objects that orbit it...\n\n## Document 2: Planetary Characteristics\nEach planet has unique features. Mercury is the smallest planet...\n\n## Document 3: Mars Exploration\nMars has been a target of exploration for decades...\n\n[Additional documents...]",
"cache_control": {"type": "ephemeral"},
},
],
messages=[
{
"role": "user",
"content": "Can you search for information about Mars rovers?",
},
{
"role": "assistant",
"content": [
{
"type": "tool_use",
"id": "tool_1",
"name": "search_documents",
"input": {"query": "Mars rovers"},
}
],
},
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "tool_1",
"content": "Found 3 relevant documents: Document 3 (Mars Exploration), Document 7 (Rover Technology), Document 9 (Mission History)",
}
],
},
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I found 3 relevant documents about Mars rovers. Let me get more details from the Mars Exploration document.",
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "Yes, please tell me about the Perseverance rover specifically.",
"cache_control": {"type": "ephemeral"},
}
],
},
],
)
print(response.usage.model_dump_json())Questo esempio completo dimostra come usare tutti e 4 i "cache breakpoint" (punti di interruzione della cache) disponibili per ottimizzare diverse parti del tuo prompt:
-
Cache degli strumenti (breakpoint della cache 1): il parametro
cache_controlsull'ultima definizione di strumento memorizza nella cache tutte le definizioni degli strumenti. -
Cache delle istruzioni riutilizzabili (breakpoint della cache 2): le istruzioni statiche nel prompt di sistema vengono memorizzate nella cache separatamente. Queste istruzioni cambiano raramente tra una richiesta e l'altra.
-
Cache del contesto RAG (breakpoint della cache 3): i documenti della knowledge base vengono memorizzati nella cache in modo indipendente, consentendoti di aggiornare i documenti RAG senza invalidare la cache degli strumenti o delle istruzioni.
-
Cache della cronologia della conversazione (breakpoint della cache 4): il messaggio finale dell'utente è contrassegnato con
cache_controlper abilitare la memorizzazione incrementale nella cache della conversazione man mano che procede.
Questo approccio offre la massima flessibilità:
- Se aggiungi un nuovo turno alla conversazione senza modificare il contenuto precedente, tutti e quattro i segmenti della cache vengono riutilizzati
- Se aggiorni i documenti RAG ma mantieni gli stessi strumenti e istruzioni, i primi due segmenti della cache vengono riutilizzati
- Se modifichi la conversazione ma mantieni gli stessi strumenti, istruzioni e documenti, i primi tre segmenti vengono riutilizzati
- Le modifiche in corrispondenza di qualsiasi breakpoint invalidano quel segmento e tutto ciò che segue, mentre i segmenti precedenti memorizzati nella cache restano validi
Per la prima richiesta:
input_tokens: minimo (token dopo l'ultimo breakpoint della cache, vicino a 0 in questo esempio)cache_creation_input_tokens: token in tutti i segmenti memorizzati nella cache (strumenti + istruzioni + documenti RAG + cronologia della conversazione)cache_read_input_tokens: 0 (nessun cache hit)
Per le richieste successive con solo un nuovo messaggio dell'utente (e il quarto breakpoint spostato su quel nuovo messaggio finale, come nell'esempio):
input_tokens: minimo (token dopo l'ultimo breakpoint della cache, vicino a 0 in questo esempio)cache_creation_input_tokens: token nel nuovo messaggio dell'utente e nel turno precedente dell'assistente (il nuovo segmento di conversazione che viene memorizzato nella cache)cache_read_input_tokens: tutti i token precedentemente memorizzati nella cache (strumenti + istruzioni + documenti RAG + conversazione precedente)
Questo schema è particolarmente efficace per:
- Applicazioni RAG con contesti documentali ampi
- Sistemi di agenti che usano più strumenti
- Conversazioni di lunga durata che devono mantenere il contesto
- Applicazioni che devono ottimizzare diverse parti del prompt in modo indipendente
Conservazione dei dati
La cache dei prompt (sia automatica sia esplicita) è idonea per ZDR. Anthropic non memorizza il testo grezzo dei tuoi prompt né delle risposte di Claude.
Le rappresentazioni della cache KV (chiave-valore) e gli hash crittografici del contenuto memorizzato nella cache sono conservati solo in memoria e non vengono archiviati in modo persistente. Le voci della cache hanno una durata minima di 5 minuti (standard) o 1 ora (estesa), dopo la quale vengono eliminate tempestivamente, anche se non immediatamente. Le voci della cache sono isolate tra organizzazioni e, sulla Claude API, su Claude Platform on AWS e su Microsoft Foundry, tra i workspace all'interno di un'organizzazione.
Per l'idoneità ZDR di tutte le funzionalità, consulta API e conservazione dei dati.
Domande frequenti
Nella maggior parte dei casi, è sufficiente un singolo breakpoint della cache alla fine del tuo contenuto statico. Le scritture nella cache avvengono solo in corrispondenza del blocco che contrassegni. Posizionalo sull'ultimo blocco che rimane identico tra le richieste, e ogni richiesta successiva leggerà quella stessa voce. Se un blocco successivo varia a ogni richiesta (un timestamp, il messaggio in arrivo), mantieni il breakpoint prima di esso, sull'ultimo blocco stabile.
Hai bisogno di più breakpoint solo se:
- Una conversazione in crescita sposta il tuo breakpoint di 20 o più blocchi oltre l'ultima scrittura nella cache, portando la voce precedente fuori dalla finestra di ricerca a ritroso
- Vuoi memorizzare nella cache in modo indipendente sezioni che si aggiornano con frequenze diverse
- Hai bisogno di un controllo esplicito su ciò che viene memorizzato nella cache per ottimizzare i costi
Esempio: se hai istruzioni di sistema (che cambiano raramente) e un contesto RAG (che cambia ogni giorno), potresti usare due breakpoint per memorizzarli nella cache separatamente.
No, i breakpoint della cache in sé sono gratuiti. Paghi solo per:
- La scrittura di contenuti nella cache (25% in più rispetto ai token di input base per il TTL di 5 minuti)
- La lettura dalla cache (una frazione del prezzo base dei token di input, vedi Prezzi)
- I normali token di input per i contenuti non memorizzati nella cache
Il numero di breakpoint non influisce sui prezzi; conta solo la quantità di contenuto memorizzato nella cache e letto.
La risposta di utilizzo include tre campi separati per i token di input che insieme rappresentano il tuo input totale:
total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokenscache_read_input_tokens: token recuperati dalla cache (tutto ciò che precede i breakpoint della cache ed è stato memorizzato nella cache)cache_creation_input_tokens: nuovi token scritti nella cache (in corrispondenza dei breakpoint della cache)input_tokens: token dopo l'ultimo breakpoint della cache che non sono memorizzati nella cache
Importante: input_tokens NON rappresenta tutti i token di input, ma solo la parte successiva al tuo ultimo breakpoint della cache. Se hai contenuti memorizzati nella cache, input_tokens sarà in genere molto più piccolo del tuo input totale.
Esempio: con un documento da 200k token memorizzato nella cache e una domanda dell'utente da 50 token:
cache_read_input_tokens: 200.000cache_creation_input_tokens: 0input_tokens: 50- Totale: 200.050 token
Questa suddivisione è fondamentale per comprendere sia i tuoi costi sia l'utilizzo del "rate limit" (limite di velocità). Consulta Monitorare le prestazioni della cache per maggiori dettagli.
La durata minima predefinita della cache (TTL) è di 5 minuti. Questa durata viene rinnovata ogni volta che il contenuto memorizzato nella cache viene utilizzato.
Se ritieni che 5 minuti siano troppo pochi, Anthropic offre anche un TTL della cache di 1 ora.
La durata viene misurata dall'inizio della richiesta che scrive o legge la voce della cache, non dalla fine della sua risposta. Il tempo impiegato per generare una risposta viene conteggiato nella durata, quindi la finestra entro cui una richiesta successiva può riutilizzare la cache è pari alla durata meno il tempo di generazione.
Se le tue richieste producono risposte lunghe e la richiesta successiva potrebbe non iniziare prima che la durata sia trascorsa, usa il TTL della cache di 1 ora.
Puoi definire fino a 4 breakpoint della cache (usando i parametri cache_control) nel tuo prompt.
La cache dei prompt è supportata su tutti i modelli Claude attivi.
La modifica dei parametri del "thinking" (ragionamento) (cambio di modalità o modifica del budget nella modalità estesa) invalida i prefissi dei messaggi memorizzati nella cache e può invalidare anche i prompt di sistema e gli strumenti memorizzati nella cache, perché la configurazione del ragionamento viene inserita nel prompt. Il valore output_config.effort si comporta allo stesso modo.
Per maggiori dettagli sull'invalidazione della cache, consulta Cosa invalida la cache.
Per saperne di più sul ragionamento, inclusa la sua interazione con l'uso degli strumenti e la cache dei prompt, consulta Ragionamento e cache dei prompt.
Il modo più semplice è aggiungere "cache_control": {"type": "ephemeral"} al livello superiore del corpo della tua richiesta (cache automatica). In alternativa, includi almeno un breakpoint cache_control su singoli blocchi di contenuto (breakpoint della cache espliciti).
Sì, la cache dei prompt può essere usata insieme ad altre funzionalità dell'API come l'uso degli strumenti e le capacità di visione. Tuttavia, modificare la presenza di immagini in un prompt o cambiare le impostazioni dell'uso degli strumenti invaliderà la cache.
Per maggiori dettagli sull'invalidazione della cache, consulta Cosa invalida la cache.
La cache dei prompt introduce una nuova struttura di prezzi in cui le scritture nella cache da 5 minuti costano il 25% in più rispetto ai token di input base, le scritture nella cache da 1 ora costano 2 volte i token di input base e i cache hit costano una frazione del prezzo base dei token di input (vedi Prezzi per il moltiplicatore di ciascun modello).
Attualmente non è possibile svuotare manualmente la cache. I prefissi memorizzati nella cache scadono automaticamente dopo un minimo di 5 minuti di inattività.
Puoi monitorare le prestazioni della cache usando i campi cache_creation_input_tokens e cache_read_input_tokens nella risposta dell'API.
Consulta Cosa invalida la cache per maggiori dettagli sull'invalidazione della cache, incluso un elenco delle modifiche che richiedono la creazione di una nuova voce della cache.
La cache dei prompt è progettata con solide misure di privacy e separazione dei dati:
-
Le chiavi della cache vengono generate usando un hash crittografico dei prompt fino al punto di controllo della cache. Ciò significa che solo le richieste con prompt identici possono accedere a una specifica cache.
-
Sulla Claude API, su Claude Platform on AWS e su Microsoft Foundry, le cache sono isolate per workspace all'interno di un'organizzazione. Su Bedrock e Google Cloud, le cache sono isolate per organizzazione. In ogni caso, le cache non vengono mai condivise tra organizzazioni, nemmeno per prompt identici. Consulta Archiviazione e condivisione della cache per i dettagli.
-
Il meccanismo di cache è progettato per mantenere l'integrità e la privacy di ogni conversazione o contesto univoco.
-
È sicuro usare
cache_controlin qualsiasi punto dei tuoi prompt. Affinché la cache produca letture, posiziona il breakpoint alla fine di un prefisso stabile: posizionarlo su un blocco che cambia a ogni richiesta (come un timestamp o l'input arbitrario dell'utente) scrive ogni volta una nuova voce e non produce mai hit.
Queste misure garantiscono che la cache dei prompt mantenga la privacy e la sicurezza dei dati offrendo al contempo vantaggi in termini di prestazioni.
Sì, è possibile usare la cache dei prompt con le tue richieste alla Batches API. Tuttavia, poiché le richieste batch asincrone possono essere elaborate in parallelo e in qualsiasi ordine, i cache hit vengono forniti secondo il principio del massimo impegno.
La cache da 1 ora può aiutarti a migliorare i tuoi cache hit. Il modo più conveniente per usarla è il seguente:
- Raccogli un insieme di richieste di messaggi che hanno un prefisso condiviso.
- Invia una richiesta batch con una singola richiesta che contiene questo prefisso condiviso e un blocco di cache da 1 ora. Questo scrive il prefisso nella cache da 1 ora.
- Non appena questa è completata, invia le restanti richieste. Dovrai monitorare il job per sapere quando viene completato.
In genere questo approccio è migliore rispetto all'uso della cache da 5 minuti, perché è comune che le richieste batch impieghino tra 5 minuti e 1 ora per essere completate.
Questo errore compare in genere quando hai aggiornato il tuo SDK o stai usando esempi di codice obsoleti. La cache dei prompt non richiede più il prefisso beta. Invece di:
client.beta.prompt_caching.messages.create(**params)Usa:
client.messages.create(**params)Questo errore compare in genere quando hai aggiornato il tuo SDK o stai usando esempi di codice obsoleti. La cache dei prompt non richiede più il prefisso beta. Invece di:
client.beta.promptCaching.messages.create(/* ... */);Usa:
client.messages.create(/* ... */);Was this page helpful?