La réflexion étendue donne à Claude des capacités de raisonnement améliorées pour les tâches complexes, tout en fournissant différents niveaux de transparence dans son processus de réflexion étape par étape avant de livrer sa réponse finale.

Modèles pris en charge

La réflexion étendue est prise en charge dans les modèles suivants :
  • Claude Sonnet 4.5 (claude-sonnet-4-5-20250929)
  • Claude Sonnet 4 (claude-sonnet-4-20250514)
  • Claude Sonnet 3.7 (claude-3-7-sonnet-20250219) (déprécié)
  • Claude Haiku 4.5 (claude-haiku-4-5-20251001)
  • Claude Opus 4.1 (claude-opus-4-1-20250805)
  • Claude Opus 4 (claude-opus-4-20250514)
Le comportement de l’API diffère entre les modèles Claude Sonnet 3.7 et Claude 4, mais les formes d’API restent exactement les mêmes.Pour plus d’informations, consultez Différences de réflexion entre les versions de modèles.

Comment fonctionne la réflexion étendue

Lorsque la réflexion étendue est activée, Claude crée des blocs de contenu thinking où il produit son raisonnement interne. Claude intègre les idées de ce raisonnement avant de formuler une réponse finale. La réponse de l’API inclura des blocs de contenu thinking, suivis de blocs de contenu text. Voici un exemple du format de réponse par défaut :
{
  "content": [
    {
      "type": "thinking",
      "thinking": "Let me analyze this step by step...",
      "signature": "WaUjzkypQ2mUEVM36O2TxuC06KN8xyfbJwyem2dw3URve/op91XWHOEBLLqIOMfFG/UvLEczmEsUjavL...."
    },
    {
      "type": "text",
      "text": "Based on my analysis..."
    }
  ]
}
Pour plus d’informations sur le format de réponse de la réflexion étendue, consultez la Référence de l’API Messages.

Comment utiliser la réflexion étendue

Voici un exemple d’utilisation de la réflexion étendue dans l’API Messages :
curl https://api.anthropic.com/v1/messages \
     --header "x-api-key: $ANTHROPIC_API_KEY" \
     --header "anthropic-version: 2023-06-01" \
     --header "content-type: application/json" \
     --data \
'{
    "model": "claude-sonnet-4-5",
    "max_tokens": 16000,
    "thinking": {
        "type": "enabled",
        "budget_tokens": 10000
    },
    "messages": [
        {
            "role": "user",
            "content": "Are there an infinite number of prime numbers such that n mod 4 == 3?"
        }
    ]
}'
Pour activer la réflexion étendue, ajoutez un objet thinking, avec le paramètre type défini sur enabled et le budget_tokens sur un budget de jetons spécifié pour la réflexion étendue. Le paramètre budget_tokens détermine le nombre maximum de jetons que Claude est autorisé à utiliser pour son processus de raisonnement interne. Dans les modèles Claude 4, cette limite s’applique aux jetons de réflexion complète, et non à la sortie résumée. Des budgets plus importants peuvent améliorer la qualité des réponses en permettant une analyse plus approfondie pour les problèmes complexes, bien que Claude n’utilise pas nécessairement l’intégralité du budget alloué, en particulier pour les plages supérieures à 32k. budget_tokens doit être défini sur une valeur inférieure à max_tokens. Cependant, lors de l’utilisation de la réflexion entrelacée avec des outils, vous pouvez dépasser cette limite car la limite de jetons devient votre fenêtre de contexte entière (200k jetons).

Réflexion résumée

Avec la réflexion étendue activée, l’API Messages pour les modèles Claude 4 retourne un résumé du processus de réflexion complet de Claude. La réflexion résumée fournit tous les avantages en termes d’intelligence de la réflexion étendue, tout en prévenant les abus. Voici quelques considérations importantes pour la réflexion résumée :
  • Vous êtes facturé pour les jetons de réflexion complets générés par la demande originale, pas les jetons de résumé.
  • Le nombre de jetons de sortie facturés ne correspondra pas au nombre de jetons que vous voyez dans la réponse.
  • Les premières lignes de la sortie de réflexion sont plus détaillées, fournissant un raisonnement détaillé qui est particulièrement utile à des fins d’ingénierie des invites.
  • Alors qu’Anthropic cherche à améliorer la fonctionnalité de réflexion étendue, le comportement de résumé est sujet à changement.
  • La résumé préserve les idées clés du processus de réflexion de Claude avec une latence minimale ajoutée, permettant une expérience utilisateur en continu et une migration facile de Claude Sonnet 3.7 vers les modèles Claude 4.
  • La résumé est traitée par un modèle différent de celui que vous ciblez dans vos demandes. Le modèle de réflexion ne voit pas la sortie résumée.
Claude Sonnet 3.7 continue de retourner la sortie de réflexion complète.Dans les rares cas où vous avez besoin d’accès à la sortie de réflexion complète pour les modèles Claude 4, contactez notre équipe commerciale.

Réflexion en continu

Vous pouvez diffuser les réponses de réflexion étendue en utilisant les événements envoyés par le serveur (SSE). Lorsque la diffusion en continu est activée pour la réflexion étendue, vous recevez le contenu de réflexion via les événements thinking_delta. Pour plus de documentation sur la diffusion en continu via l’API Messages, consultez Diffusion en continu des Messages. Voici comment gérer la diffusion en continu avec la réflexion :
curl https://api.anthropic.com/v1/messages \
     --header "x-api-key: $ANTHROPIC_API_KEY" \
     --header "anthropic-version: 2023-06-01" \
     --header "content-type: application/json" \
     --data \
'{
    "model": "claude-sonnet-4-5",
    "max_tokens": 16000,
    "stream": true,
    "thinking": {
        "type": "enabled",
        "budget_tokens": 10000
    },
    "messages": [
        {
            "role": "user",
            "content": "What is 27 * 453?"
        }
    ]
}'
Exemple de sortie de diffusion en continu :
event: message_start
data: {"type": "message_start", "message": {"id": "msg_01...", "type": "message", "role": "assistant", "content": [], "model": "claude-sonnet-4-5", "stop_reason": null, "stop_sequence": null}}

event: content_block_start
data: {"type": "content_block_start", "index": 0, "content_block": {"type": "thinking", "thinking": ""}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "Let me solve this step by step:\n\n1. First break down 27 * 453"}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\n2. 453 = 400 + 50 + 3"}}

// Additional thinking deltas...

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "signature_delta", "signature": "EqQBCgIYAhIM1gbcDa9GJwZA2b3hGgxBdjrkzLoky3dl1pkiMOYds..."}}

event: content_block_stop
data: {"type": "content_block_stop", "index": 0}

event: content_block_start
data: {"type": "content_block_start", "index": 1, "content_block": {"type": "text", "text": ""}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 1, "delta": {"type": "text_delta", "text": "27 * 453 = 12,231"}}

// Additional text deltas...

event: content_block_stop
data: {"type": "content_block_stop", "index": 1}

event: message_delta
data: {"type": "message_delta", "delta": {"stop_reason": "end_turn", "stop_sequence": null}}

event: message_stop
data: {"type": "message_stop"}
Lors de l’utilisation de la diffusion en continu avec la réflexion activée, vous remarquerez peut-être que le texte arrive parfois en plus gros morceaux alternant avec une livraison plus petite, jeton par jeton. C’est un comportement attendu, en particulier pour le contenu de réflexion.Le système de diffusion en continu doit traiter le contenu par lots pour des performances optimales, ce qui peut entraîner ce modèle de livraison « fragmentée », avec des délais possibles entre les événements de diffusion en continu. Nous travaillons continuellement à l’amélioration de cette expérience, avec des mises à jour futures axées sur la diffusion en continu plus fluide du contenu de réflexion.

Réflexion étendue avec utilisation d’outils

La réflexion étendue peut être utilisée aux côtés de l’utilisation d’outils, permettant à Claude de raisonner sur la sélection des outils et le traitement des résultats. Lors de l’utilisation de la réflexion étendue avec l’utilisation d’outils, soyez conscient des limitations suivantes :
  1. Limitation du choix d’outil : L’utilisation d’outils avec réflexion ne supporte que tool_choice: {"type": "auto"} (par défaut) ou tool_choice: {"type": "none"}. L’utilisation de tool_choice: {"type": "any"} ou tool_choice: {"type": "tool", "name": "..."} entraînera une erreur car ces options forcent l’utilisation d’outils, ce qui est incompatible avec la réflexion étendue.
  2. Préservation des blocs de réflexion : Lors de l’utilisation d’outils, vous devez repasser les blocs thinking à l’API pour le dernier message assistant. Incluez le bloc complet non modifié à l’API pour maintenir la continuité du raisonnement.

Basculer les modes de réflexion dans les conversations

Vous ne pouvez pas basculer la réflexion au milieu d’un tour assistant, y compris pendant les boucles d’utilisation d’outils. Le tour assistant entier doit fonctionner dans un seul mode de réflexion :
  • Si la réflexion est activée, le tour assistant final doit commencer par un bloc de réflexion.
  • Si la réflexion est désactivée, le tour assistant final ne doit pas contenir de blocs de réflexion
Du point de vue du modèle, les boucles d’utilisation d’outils font partie du tour assistant. Un tour assistant ne se termine pas jusqu’à ce que Claude termine sa réponse complète, qui peut inclure plusieurs appels d’outils et résultats. Par exemple, cette séquence fait partie d’un seul tour assistant :
User: "What's the weather in Paris?"
Assistant: [thinking] + [tool_use: get_weather]
User: [tool_result: "20°C, sunny"]
Assistant: [text: "The weather in Paris is 20°C and sunny"]
Bien qu’il y ait plusieurs messages d’API, la boucle d’utilisation d’outils fait conceptuellement partie d’une réponse assistant continue.

Scénarios d’erreur courants

Vous pourriez rencontrer cette erreur :
Expected `thinking` or `redacted_thinking`, but found `tool_use`.
When `thinking` is enabled, a final `assistant` message must start
with a thinking block (preceding the lastmost set of `tool_use` and
`tool_result` blocks).
Cela se produit généralement lorsque :
  1. Vous aviez la réflexion désactivée pendant une séquence d’utilisation d’outils
  2. Vous voulez activer la réflexion à nouveau
  3. Votre dernier message assistant contient des blocs d’utilisation d’outils mais pas de bloc de réflexion

Conseils pratiques

✗ Invalide : Basculer la réflexion immédiatement après l’utilisation d’outils
User: "What's the weather?"
Assistant: [tool_use] (thinking disabled)
User: [tool_result]
// Cannot enable thinking here - still in the same assistant turn
✓ Valide : Terminer d’abord le tour assistant
User: "What's the weather?"
Assistant: [tool_use] (thinking disabled)
User: [tool_result]
Assistant: [text: "It's sunny"] 
User: "What about tomorrow?" (thinking disabled)
Assistant: [thinking] + [text: "..."] (thinking enabled - new turn)
Meilleure pratique : Planifiez votre stratégie de réflexion au début de chaque tour plutôt que d’essayer de basculer en milieu de tour.
Le basculement des modes de réflexion invalide également la mise en cache des invites pour l’historique des messages. Pour plus de détails, consultez la section Réflexion étendue avec mise en cache des invites.
Voici un exemple pratique montrant comment préserver les blocs de réflexion lors de la fourniture de résultats d’outils :
weather_tool = {
    "name": "get_weather",
    "description": "Get current weather for a location",
    "input_schema": {
        "type": "object",
        "properties": {
            "location": {"type": "string"}
        },
        "required": ["location"]
    }
}

# First request - Claude responds with thinking and tool request
response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=16000,
    thinking={
        "type": "enabled",
        "budget_tokens": 10000
    },
    tools=[weather_tool],
    messages=[
        {"role": "user", "content": "What's the weather in Paris?"}
    ]
)
La réponse de l’API inclura les blocs de réflexion, de texte et d’utilisation d’outils :
{
    "content": [
        {
            "type": "thinking",
            "thinking": "The user wants to know the current weather in Paris. I have access to a function `get_weather`...",
            "signature": "BDaL4VrbR2Oj0hO4XpJxT28J5TILnCrrUXoKiiNBZW9P+nr8XSj1zuZzAl4egiCCpQNvfyUuFFJP5CncdYZEQPPmLxYsNrcs...."
        },
        {
            "type": "text",
            "text": "I can help you get the current weather information for Paris. Let me check that for you"
        },
        {
            "type": "tool_use",
            "id": "toolu_01CswdEQBMshySk6Y9DFKrfq",
            "name": "get_weather",
            "input": {
                "location": "Paris"
            }
        }
    ]
}
Maintenant, continuons la conversation et utilisons l’outil
# Extract thinking block and tool use block
thinking_block = next((block for block in response.content
                      if block.type == 'thinking'), None)
tool_use_block = next((block for block in response.content
                      if block.type == 'tool_use'), None)

# Call your actual weather API, here is where your actual API call would go
# let's pretend this is what we get back
weather_data = {"temperature": 88}

# Second request - Include thinking block and tool result
# No new thinking blocks will be generated in the response
continuation = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=16000,
    thinking={
        "type": "enabled",
        "budget_tokens": 10000
    },
    tools=[weather_tool],
    messages=[
        {"role": "user", "content": "What's the weather in Paris?"},
        # notice that the thinking_block is passed in as well as the tool_use_block
        # if this is not passed in, an error is raised
        {"role": "assistant", "content": [thinking_block, tool_use_block]},
        {"role": "user", "content": [{
            "type": "tool_result",
            "tool_use_id": tool_use_block.id,
            "content": f"Current temperature: {weather_data['temperature']}°F"
        }]}
    ]
)
La réponse de l’API inclura maintenant uniquement du texte
{
    "content": [
        {
            "type": "text",
            "text": "Currently in Paris, the temperature is 88°F (31°C)"
        }
    ]
}

Préservation des blocs de réflexion

Lors de l’utilisation d’outils, vous devez repasser les blocs thinking à l’API, et vous devez inclure le bloc complet non modifié à l’API. C’est critique pour maintenir le flux de raisonnement du modèle et l’intégrité de la conversation.
Bien que vous puissiez omettre les blocs thinking des tours assistant précédents, nous suggérons de toujours repasser tous les blocs de réflexion à l’API pour toute conversation multi-tour. L’API va :
  • Filtrer automatiquement les blocs de réflexion fournis
  • Utiliser les blocs de réflexion pertinents nécessaires pour préserver le raisonnement du modèle
  • Facturer uniquement les jetons d’entrée pour les blocs affichés à Claude
Lors du basculement des modes de réflexion pendant une conversation, rappelez-vous que le tour assistant entier (y compris les boucles d’utilisation d’outils) doit fonctionner dans un seul mode de réflexion. Pour plus de détails, consultez Basculer les modes de réflexion dans les conversations.
Lorsque Claude invoque des outils, il met en pause la construction d’une réponse pour attendre des informations externes. Lorsque les résultats des outils sont retournés, Claude continuera à construire cette réponse existante. Cela nécessite de préserver les blocs de réflexion lors de l’utilisation d’outils, pour quelques raisons :
  1. Continuité du raisonnement : Les blocs de réflexion capturent le raisonnement étape par étape de Claude qui a conduit aux demandes d’outils. Lorsque vous postez les résultats des outils, inclure la réflexion originale garantit que Claude peut continuer son raisonnement à partir de là où il s’était arrêté.
  2. Maintenance du contexte : Bien que les résultats des outils apparaissent comme des messages utilisateur dans la structure de l’API, ils font partie d’un flux de raisonnement continu. Préserver les blocs de réflexion maintient ce flux conceptuel à travers plusieurs appels d’API. Pour plus d’informations sur la gestion du contexte, consultez notre guide sur les fenêtres de contexte.
Important : Lors de la fourniture de blocs thinking, la séquence entière de blocs thinking consécutifs doit correspondre aux sorties générées par le modèle lors de la demande originale ; vous ne pouvez pas réorganiser ou modifier la séquence de ces blocs.

Réflexion entrelacée

La réflexion étendue avec utilisation d’outils dans les modèles Claude 4 supporte la réflexion entrelacée, qui permet à Claude de réfléchir entre les appels d’outils et de faire un raisonnement plus sophistiqué après avoir reçu les résultats des outils. Avec la réflexion entrelacée, Claude peut :
  • Raisonner sur les résultats d’un appel d’outil avant de décider quoi faire ensuite
  • Chaîner plusieurs appels d’outils avec des étapes de réflexion entre les deux
  • Prendre des décisions plus nuancées basées sur les résultats intermédiaires
Pour activer la réflexion entrelacée, ajoutez l’en-tête bêta interleaved-thinking-2025-05-14 à votre demande d’API. Voici quelques considérations importantes pour la réflexion entrelacée :
  • Avec la réflexion entrelacée, le budget_tokens peut dépasser le paramètre max_tokens, car il représente le budget total sur tous les blocs de réflexion dans un tour assistant.
  • La réflexion entrelacée n’est prise en charge que pour les outils utilisés via l’API Messages.
  • La réflexion entrelacée est prise en charge pour les modèles Claude 4 uniquement, avec l’en-tête bêta interleaved-thinking-2025-05-14.
  • Les appels directs à l’API Claude vous permettent de passer interleaved-thinking-2025-05-14 dans les demandes à n’importe quel modèle, sans effet.
  • Sur les plates-formes tierces (par exemple, Amazon Bedrock et Vertex AI), si vous passez interleaved-thinking-2025-05-14 à n’importe quel modèle autre que Claude Opus 4.1, Opus 4 ou Sonnet 4, votre demande échouera.
import anthropic

client = anthropic.Anthropic()

# Define tools
calculator_tool = {
    "name": "calculator",
    "description": "Perform mathematical calculations",
    "input_schema": {
        "type": "object",
        "properties": {
            "expression": {
                "type": "string",
                "description": "Mathematical expression to evaluate"
            }
        },
        "required": ["expression"]
    }
}

database_tool = {
    "name": "database_query",
    "description": "Query product database",
    "input_schema": {
        "type": "object",
        "properties": {
            "query": {
                "type": "string",
                "description": "SQL query to execute"
            }
        },
        "required": ["query"]
    }
}

# First request - Claude thinks once before all tool calls
response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=16000,
    thinking={
        "type": "enabled",
        "budget_tokens": 10000
    },
    tools=[calculator_tool, database_tool],
    messages=[{
        "role": "user",
        "content": "What's the total revenue if we sold 150 units of product A at $50 each, and how does this compare to our average monthly revenue from the database?"
    }]
)

# Response includes thinking followed by tool uses
# Note: Claude thinks once at the beginning, then makes all tool decisions
print("First response:")
for block in response.content:
    if block.type == "thinking":
        print(f"Thinking (summarized): {block.thinking}")
    elif block.type == "tool_use":
        print(f"Tool use: {block.name} with input {block.input}")
    elif block.type == "text":
        print(f"Text: {block.text}")

# You would execute the tools and return results...
# After getting both tool results back, Claude directly responds without additional thinking
Dans cet exemple sans réflexion entrelacée :
  1. Claude réfléchit une fois au début pour comprendre la tâche
  2. Prend toutes les décisions d’utilisation d’outils à l’avance
  3. Lorsque les résultats des outils sont retournés, Claude fournit immédiatement une réponse sans réflexion supplémentaire
import anthropic

client = anthropic.Anthropic()

# Same tool definitions as before
calculator_tool = {
    "name": "calculator",
    "description": "Perform mathematical calculations",
    "input_schema": {
        "type": "object",
        "properties": {
            "expression": {
                "type": "string",
                "description": "Mathematical expression to evaluate"
            }
        },
        "required": ["expression"]
    }
}

database_tool = {
    "name": "database_query",
    "description": "Query product database",
    "input_schema": {
        "type": "object",
        "properties": {
            "query": {
                "type": "string",
                "description": "SQL query to execute"
            }
        },
        "required": ["query"]
    }
}

# First request with interleaved thinking enabled
response = client.beta.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=16000,
    thinking={
        "type": "enabled",
        "budget_tokens": 10000
    },
    tools=[calculator_tool, database_tool],
    betas=["interleaved-thinking-2025-05-14"],
    messages=[{
        "role": "user",
        "content": "What's the total revenue if we sold 150 units of product A at $50 each, and how does this compare to our average monthly revenue from the database?"
    }]
)

print("Initial response:")
thinking_blocks = []
tool_use_blocks = []

for block in response.content:
    if block.type == "thinking":
        thinking_blocks.append(block)
        print(f"Thinking: {block.thinking}")
    elif block.type == "tool_use":
        tool_use_blocks.append(block)
        print(f"Tool use: {block.name} with input {block.input}")
    elif block.type == "text":
        print(f"Text: {block.text}")

# First tool result (calculator)
calculator_result = "7500"  # 150 * 50

# Continue with first tool result
response2 = client.beta.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=16000,
    thinking={
        "type": "enabled",
        "budget_tokens": 10000
    },
    tools=[calculator_tool, database_tool],
    betas=["interleaved-thinking-2025-05-14"],
    messages=[
        {
            "role": "user",
            "content": "What's the total revenue if we sold 150 units of product A at $50 each, and how does this compare to our average monthly revenue from the database?"
        },
        {
            "role": "assistant",
            "content": [thinking_blocks[0], tool_use_blocks[0]]
        },
        {
            "role": "user",
            "content": [{
                "type": "tool_result",
                "tool_use_id": tool_use_blocks[0].id,
                "content": calculator_result
            }]
        }
    ]
)

print("\nAfter calculator result:")
# With interleaved thinking, Claude can think about the calculator result
# before deciding to query the database
for block in response2.content:
    if block.type == "thinking":
        thinking_blocks.append(block)
        print(f"Interleaved thinking: {block.thinking}")
    elif block.type == "tool_use":
        tool_use_blocks.append(block)
        print(f"Tool use: {block.name} with input {block.input}")

# Second tool result (database)
database_result = "5200"  # Example average monthly revenue

# Continue with second tool result
response3 = client.beta.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=16000,
    thinking={
        "type": "enabled",
        "budget_tokens": 10000
    },
    tools=[calculator_tool, database_tool],
    betas=["interleaved-thinking-2025-05-14"],
    messages=[
        {
            "role": "user",
            "content": "What's the total revenue if we sold 150 units of product A at $50 each, and how does this compare to our average monthly revenue from the database?"
        },
        {
            "role": "assistant",
            "content": [thinking_blocks[0], tool_use_blocks[0]]
        },
        {
            "role": "user",
            "content": [{
                "type": "tool_result",
                "tool_use_id": tool_use_blocks[0].id,
                "content": calculator_result
            }]
        },
        {
            "role": "assistant",
            "content": thinking_blocks[1:] + tool_use_blocks[1:]
        },
        {
            "role": "user",
            "content": [{
                "type": "tool_result",
                "tool_use_id": tool_use_blocks[1].id,
                "content": database_result
            }]
        }
    ]
)

print("\nAfter database result:")
# With interleaved thinking, Claude can think about both results
# before formulating the final response
for block in response3.content:
    if block.type == "thinking":
        print(f"Final thinking: {block.thinking}")
    elif block.type == "text":
        print(f"Final response: {block.text}")
Dans cet exemple avec réflexion entrelacée :
  1. Claude réfléchit à la tâche initialement
  2. Après avoir reçu le résultat de la calculatrice, Claude peut réfléchir à nouveau à ce que ce résultat signifie
  3. Claude décide ensuite comment interroger la base de données en fonction du premier résultat
  4. Après avoir reçu le résultat de la base de données, Claude réfléchit une fois de plus aux deux résultats avant de formuler une réponse finale
  5. Le budget de réflexion est distribué sur tous les blocs de réflexion dans le tour
Ce modèle permet des chaînes de raisonnement plus sophistiquées où la sortie de chaque outil informe la décision suivante.

Réflexion étendue avec mise en cache des invites

La mise en cache des invites avec réflexion a plusieurs considérations importantes :
Les tâches de réflexion étendue prennent souvent plus de 5 minutes pour se terminer. Envisagez d’utiliser la durée de cache d’une heure pour maintenir les accès au cache sur les sessions de réflexion plus longues et les flux de travail multi-étapes.
Suppression du contexte des blocs de réflexion
  • Les blocs de réflexion des tours précédents sont supprimés du contexte, ce qui peut affecter les points d’arrêt du cache
  • Lors de la continuation des conversations avec utilisation d’outils, les blocs de réflexion sont mis en cache et comptent comme jetons d’entrée lorsqu’ils sont lus à partir du cache
  • Cela crée un compromis : bien que les blocs de réflexion ne consomment pas d’espace de fenêtre de contexte visuellement, ils comptent toujours vers votre utilisation de jetons d’entrée lorsqu’ils sont mis en cache
  • Si la réflexion devient désactivée, les demandes échoueront si vous transmettez du contenu de réflexion dans le tour d’utilisation d’outils actuel. Dans d’autres contextes, le contenu de réflexion transmis à l’API est simplement ignoré
Modèles d’invalidation du cache
  • Les modifications des paramètres de réflexion (activé/désactivé ou allocation de budget) invalident les points d’arrêt du cache de messages
  • La réflexion entrelacée amplifie l’invalidation du cache, car les blocs de réflexion peuvent se produire entre plusieurs appels d’outils
  • Les invites système et les outils restent mis en cache malgré les modifications des paramètres de réflexion ou la suppression de blocs
Bien que les blocs de réflexion soient supprimés pour la mise en cache et les calculs de contexte, ils doivent être préservés lors de la continuation des conversations avec utilisation d’outils, en particulier avec réflexion entrelacée.

Comprendre le comportement de mise en cache des blocs de réflexion

Lors de l’utilisation de la réflexion étendue avec utilisation d’outils, les blocs de réflexion présentent un comportement de mise en cache spécifique qui affecte le comptage des jetons : Comment cela fonctionne :
  1. La mise en cache ne se produit que lorsque vous effectuez une demande ultérieure qui inclut les résultats des outils
  2. Lorsque la demande ultérieure est effectuée, l’historique de conversation précédent (y compris les blocs de réflexion) peut être mis en cache
  3. Ces blocs de réflexion mis en cache comptent comme jetons d’entrée dans vos métriques d’utilisation lorsqu’ils sont lus à partir du cache
  4. Lorsqu’un bloc utilisateur non-résultat d’outil est inclus, tous les blocs de réflexion précédents sont ignorés et supprimés du contexte
Exemple de flux détaillé : Demande 1 :
User: "What's the weather in Paris?"
Réponse 1 :
[thinking_block_1] + [tool_use block 1]
Demande 2 :
User: ["What's the weather in Paris?"], 
Assistant: [thinking_block_1] + [tool_use block 1], 
User: [tool_result_1, cache=True]
Réponse 2 :
[thinking_block_2] + [text block 2]
La demande 2 écrit un cache du contenu de la demande (pas la réponse). Le cache inclut le message utilisateur original, le premier bloc de réflexion, le bloc d’utilisation d’outils et le résultat de l’outil. Demande 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]
Parce qu’un bloc utilisateur non-résultat d’outil a été inclus, tous les blocs de réflexion précédents sont ignorés. Cette demande sera traitée de la même manière que :
User: ["What's the weather in Paris?"], 
Assistant: [tool_use block 1], 
User: [tool_result_1, cache=True], 
Assistant: [text block 2], 
User: [Text response, cache=True]
Points clés :
  • Ce comportement de mise en cache se produit automatiquement, même sans marqueurs cache_control explicites
  • Ce comportement est cohérent, que vous utilisiez la réflexion régulière ou la réflexion entrelacée
from anthropic import Anthropic
import requests
from bs4 import BeautifulSoup

client = Anthropic()

def fetch_article_content(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # Remove script and style elements
    for script in soup(["script", "style"]):
        script.decompose()

    # Get text
    text = soup.get_text()

    # Break into lines and remove leading and trailing space on each
    lines = (line.strip() for line in text.splitlines())
    # Break multi-headlines into a line each
    chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
    # Drop blank lines
    text = '\n'.join(chunk for chunk in chunks if chunk)

    return text

# Fetch the content of the article
book_url = "https://www.gutenberg.org/cache/epub/1342/pg1342.txt"
book_content = fetch_article_content(book_url)
# Use just enough text for caching (first few chapters)
LARGE_TEXT = book_content[:5000]

SYSTEM_PROMPT=[
    {
        "type": "text",
        "text": "You are an AI assistant that is tasked with literary analysis. Analyze the following text carefully.",
    },
    {
        "type": "text",
        "text": LARGE_TEXT,
        "cache_control": {"type": "ephemeral"}
    }
]

MESSAGES = [
    {
        "role": "user",
        "content": "Analyze the tone of this passage."
    }
]

# First request - establish cache
print("First request - establishing cache")
response1 = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=20000,
    thinking={
        "type": "enabled",
        "budget_tokens": 4000
    },
    system=SYSTEM_PROMPT,
    messages=MESSAGES
)

print(f"First response usage: {response1.usage}")

MESSAGES.append({
    "role": "assistant",
    "content": response1.content
})
MESSAGES.append({
    "role": "user",
    "content": "Analyze the characters in this passage."
})
# Second request - same thinking parameters (cache hit expected)
print("\nSecond request - same thinking parameters (cache hit expected)")
response2 = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=20000,
    thinking={
        "type": "enabled",
        "budget_tokens": 4000
    },
    system=SYSTEM_PROMPT,
    messages=MESSAGES
)

print(f"Second response usage: {response2.usage}")

# Third request - different thinking parameters (cache miss for messages)
print("\nThird request - different thinking parameters (cache miss for messages)")
response3 = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=20000,
    thinking={
        "type": "enabled",
        "budget_tokens": 8000  # Changed thinking budget
    },
    system=SYSTEM_PROMPT,  # System prompt remains cached
    messages=MESSAGES  # Messages cache is invalidated
)

print(f"Third response usage: {response3.usage}")
from anthropic import Anthropic
import requests
from bs4 import BeautifulSoup

client = Anthropic()

def fetch_article_content(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # Remove script and style elements
    for script in soup(["script", "style"]):
        script.decompose()

    # Get text
    text = soup.get_text()

    # Break into lines and remove leading and trailing space on each
    lines = (line.strip() for line in text.splitlines())
    # Break multi-headlines into a line each
    chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
    # Drop blank lines
    text = '\n'.join(chunk for chunk in chunks if chunk)

    return text

# Fetch the content of the article
book_url = "https://www.gutenberg.org/cache/epub/1342/pg1342.txt"
book_content = fetch_article_content(book_url)
# Use just enough text for caching (first few chapters)
LARGE_TEXT = book_content[:5000]

# No system prompt - caching in messages instead
MESSAGES = [
    {
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": LARGE_TEXT,
                "cache_control": {"type": "ephemeral"},
            },
            {
                "type": "text",
                "text": "Analyze the tone of this passage."
            }
        ]
    }
]

# First request - establish cache
print("First request - establishing cache")
response1 = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=20000,
    thinking={
        "type": "enabled",
        "budget_tokens": 4000
    },
    messages=MESSAGES
)

print(f"First response usage: {response1.usage}")

MESSAGES.append({
    "role": "assistant",
    "content": response1.content
})
MESSAGES.append({
    "role": "user",
    "content": "Analyze the characters in this passage."
})
# Second request - same thinking parameters (cache hit expected)
print("\nSecond request - same thinking parameters (cache hit expected)")
response2 = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=20000,
    thinking={
        "type": "enabled",
        "budget_tokens": 4000  # Same thinking budget
    },
    messages=MESSAGES
)

print(f"Second response usage: {response2.usage}")

MESSAGES.append({
    "role": "assistant",
    "content": response2.content
})
MESSAGES.append({
    "role": "user",
    "content": "Analyze the setting in this passage."
})

# Third request - different thinking budget (cache miss expected)
print("\nThird request - different thinking budget (cache miss expected)")
response3 = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=20000,
    thinking={
        "type": "enabled",
        "budget_tokens": 8000  # Different thinking budget breaks cache
    },
    messages=MESSAGES
)

print(f"Third response usage: {response3.usage}")
Voici la sortie du script (vous pouvez voir des chiffres légèrement différents)
First request - establishing cache
First response usage: { cache_creation_input_tokens: 1370, cache_read_input_tokens: 0, input_tokens: 17, output_tokens: 700 }

Second request - same thinking parameters (cache hit expected)

Second response usage: { cache_creation_input_tokens: 0, cache_read_input_tokens: 1370, input_tokens: 303, output_tokens: 874 }

Third request - different thinking budget (cache miss expected)
Third response usage: { cache_creation_input_tokens: 1370, cache_read_input_tokens: 0, input_tokens: 747, output_tokens: 619 }
Cet exemple démontre que lorsque la mise en cache est configurée dans le tableau de messages, la modification des paramètres de réflexion (budget_tokens augmenté de 4000 à 8000) invalide le cache. La troisième demande ne montre pas d’accès au cache avec cache_creation_input_tokens=1370 et cache_read_input_tokens=0, prouvant que la mise en cache basée sur les messages est invalidée lorsque les paramètres de réflexion changent.

Jetons max et taille de la fenêtre de contexte avec réflexion étendue

Dans les anciens modèles Claude (antérieurs à Claude Sonnet 3.7), si la somme des jetons d’invite et de max_tokens dépassait la fenêtre de contexte du modèle, le système ajusterait automatiquement max_tokens pour s’adapter à la limite de contexte. Cela signifiait que vous pouviez définir une grande valeur max_tokens et le système la réduirait silencieusement selon les besoins. Avec les modèles Claude 3.7 et 4, max_tokens (qui inclut votre budget de réflexion lorsque la réflexion est activée) est appliqué comme une limite stricte. Le système retournera maintenant une erreur de validation si les jetons d’invite + max_tokens dépassent la taille de la fenêtre de contexte.
Vous pouvez consulter notre guide sur les fenêtres de contexte pour une plongée plus approfondie.

La fenêtre de contexte avec réflexion étendue

Lors du calcul de l’utilisation de la fenêtre de contexte avec la réflexion activée, il y a quelques considérations à connaître :
  • Les blocs de réflexion des tours précédents sont supprimés et ne comptent pas vers votre fenêtre de contexte
  • La réflexion du tour actuel compte vers votre limite max_tokens pour ce tour
Le diagramme ci-dessous illustre la gestion spécialisée des jetons lorsque la réflexion étendue est activée : Diagramme de la fenêtre de contexte avec réflexion étendue La fenêtre de contexte effective est calculée comme :
context window =
  (current input tokens - previous thinking tokens) +
  (thinking tokens + encrypted thinking tokens + text output tokens)
Nous recommandons d’utiliser l’API de comptage des jetons pour obtenir des comptages de jetons précis pour votre cas d’utilisation spécifique, en particulier lorsque vous travaillez avec des conversations multi-tour qui incluent la réflexion.

La fenêtre de contexte avec réflexion étendue et utilisation d’outils

Lors de l’utilisation de la réflexion étendue avec utilisation d’outils, les blocs de réflexion doivent être explicitement préservés et retournés avec les résultats des outils. Le calcul effectif de la fenêtre de contexte pour la réflexion étendue avec utilisation d’outils devient :
context window =
  (current input tokens + previous thinking tokens + tool use tokens) +
  (thinking tokens + encrypted thinking tokens + text output tokens)
Le diagramme ci-dessous illustre la gestion des jetons pour la réflexion étendue avec utilisation d’outils : Diagramme de la fenêtre de contexte avec réflexion étendue et outils

Gestion des jetons avec réflexion étendue

Compte tenu du comportement de la fenêtre de contexte et de max_tokens avec la réflexion étendue des modèles Claude 3.7 et 4, vous devrez peut-être :
  • Surveiller et gérer plus activement votre utilisation de jetons
  • Ajuster les valeurs max_tokens à mesure que la longueur de votre invite change
  • Potentiellement utiliser les points de terminaison de comptage des jetons plus fréquemment
  • Être conscient que les blocs de réflexion précédents ne s’accumulent pas dans votre fenêtre de contexte
Ce changement a été apporté pour fournir un comportement plus prévisible et transparent, en particulier à mesure que les limites de jetons maximaux ont augmenté considérablement.

Chiffrement de la réflexion

Le contenu de réflexion complet est chiffré et retourné dans le champ signature. Ce champ est utilisé pour vérifier que les blocs de réflexion ont été générés par Claude lorsqu’ils sont reppassés à l’API.
Il n’est strictement nécessaire d’envoyer les blocs de réflexion que lors de l’utilisation d’outils avec réflexion étendue. Sinon, vous pouvez omettre les blocs de réflexion des tours précédents, ou laisser l’API les supprimer pour vous si vous les repassez.Si vous renvoyez des blocs de réflexion, nous recommandons de repasser tout comme vous l’avez reçu pour la cohérence et pour éviter les problèmes potentiels.
Voici quelques considérations importantes sur le chiffrement de la réflexion :
  • Lors de la diffusion en continu des réponses, la signature est ajoutée via un signature_delta à l’intérieur d’un événement content_block_delta juste avant l’événement content_block_stop.
  • Les valeurs signature sont considérablement plus longues dans les modèles Claude 4 que dans les modèles précédents.
  • Le champ signature est un champ opaque et ne doit pas être interprété ou analysé - il existe uniquement à des fins de vérification.
  • Les valeurs signature sont compatibles entre les plates-formes (API Claude, Amazon Bedrock et Vertex AI). Les valeurs générées sur une plate-forme seront compatibles avec une autre.

Rédaction de la réflexion

Occasionnellement, le raisonnement interne de Claude sera signalé par nos systèmes de sécurité. Lorsque cela se produit, nous chiffrons une partie ou la totalité du bloc thinking et le retournons à vous en tant que bloc redacted_thinking. Les blocs redacted_thinking sont déchiffrés lorsqu’ils sont repassés à l’API, permettant à Claude de continuer sa réponse sans perdre le contexte. Lors de la création d’applications orientées client qui utilisent la réflexion étendue :
  • Soyez conscient que les blocs de réflexion rédactés contiennent du contenu chiffré qui n’est pas lisible par l’homme
  • Envisagez de fournir une explication simple comme : « Une partie du raisonnement interne de Claude a été automatiquement chiffrée pour des raisons de sécurité. Cela n’affecte pas la qualité des réponses. »
  • Si vous montrez les blocs de réflexion aux utilisateurs, vous pouvez filtrer les blocs rédactés tout en préservant les blocs de réflexion normaux
  • Soyez transparent que l’utilisation des fonctionnalités de réflexion étendue peut occasionnellement entraîner le chiffrement d’une partie du raisonnement
  • Implémentez une gestion d’erreur appropriée pour gérer gracieusement la réflexion rédactée sans casser votre interface utilisateur
Voici un exemple montrant à la fois les blocs de réflexion normaux et rédactés :
{
  "content": [
    {
      "type": "thinking",
      "thinking": "Let me analyze this step by step...",
      "signature": "WaUjzkypQ2mUEVM36O2TxuC06KN8xyfbJwyem2dw3URve/op91XWHOEBLLqIOMfFG/UvLEczmEsUjavL...."
    },
    {
      "type": "redacted_thinking",
      "data": "EmwKAhgBEgy3va3pzix/LafPsn4aDFIT2Xlxh0L5L8rLVyIwxtE3rAFBa8cr3qpPkNRj2YfWXGmKDxH4mPnZ5sQ7vB9URj2pLmN3kF8/dW5hR7xJ0aP1oLs9yTcMnKVf2wRpEGjH9XZaBt4UvDcPrQ..."
    },
    {
      "type": "text",
      "text": "Based on my analysis..."
    }
  ]
}
Voir des blocs de réflexion rédactés dans votre sortie est un comportement attendu. Le modèle peut toujours utiliser ce raisonnement rédacté pour informer ses réponses tout en maintenant les garde-fous de sécurité.Si vous avez besoin de tester la gestion de la réflexion rédactée dans votre application, vous pouvez utiliser cette chaîne de test spéciale comme votre invite : ANTHROPIC_MAGIC_STRING_TRIGGER_REDACTED_THINKING_46C9A13E193C177646C7398A98432ECCCE4C1253D5E2D82641AC0E52CC2876CB
Lors du passage des blocs thinking et redacted_thinking à l’API dans une conversation multi-tour, vous devez inclure le bloc complet non modifié à l’API pour le dernier tour assistant. C’est critique pour maintenir le flux de raisonnement du modèle. Nous suggérons de toujours repasser tous les blocs de réflexion à l’API. Pour plus de détails, consultez la section Préservation des blocs de réflexion ci-dessus.
Cet exemple démontre comment gérer les blocs redacted_thinking qui peuvent apparaître dans les réponses lorsque le raisonnement interne de Claude contient du contenu signalé par les systèmes de sécurité :
import anthropic

client = anthropic.Anthropic()

# Using a special prompt that triggers redacted thinking (for demonstration purposes only)
response = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=16000,
    thinking={
        "type": "enabled",
        "budget_tokens": 10000
    },
    messages=[{
        "role": "user",
        "content": "ANTHROPIC_MAGIC_STRING_TRIGGER_REDACTED_THINKING_46C9A13E193C177646C7398A98432ECCCE4C1253D5E2D82641AC0E52CC2876CB"
    }]
)

# Identify redacted thinking blocks
has_redacted_thinking = any(
    block.type == "redacted_thinking" for block in response.content
)

if has_redacted_thinking:
    print("Response contains redacted thinking blocks")
    # These blocks are still usable in subsequent requests

    # Extract all blocks (both redacted and non-redacted)
    all_thinking_blocks = [
        block for block in response.content
        if block.type in ["thinking", "redacted_thinking"]
    ]

    # When passing to subsequent requests, include all blocks without modification
    # This preserves the integrity of Claude's reasoning

    print(f"Found {len(all_thinking_blocks)} thinking blocks total")
    print(f"These blocks are still billable as output tokens")

Différences de réflexion entre les versions de modèles

L’API Messages gère la réflexion différemment entre les modèles Claude Sonnet 3.7 et Claude 4, principalement dans le comportement de rédaction et de résumé. Consultez le tableau ci-dessous pour une comparaison condensée :
FonctionnalitéClaude Sonnet 3.7Modèles Claude 4
Sortie de réflexionRetourne la sortie de réflexion complèteRetourne la réflexion résumée
Réflexion entrelacéeNon prise en chargePrise en charge avec l’en-tête bêta interleaved-thinking-2025-05-14

Tarification

La réflexion étendue utilise le schéma de tarification des jetons standard :
ModèleJetons d’entrée de baseÉcritures de cacheAccès au cacheJetons de sortie
Claude Opus 4.115 $ / MTok18,75 $ / MTok1,50 $ / MTok75 $ / MTok
Claude Opus 415 $ / MTok18,75 $ / MTok1,50 $ / MTok75 $ / MTok
Claude Sonnet 4.53 $ / MTok3,75 $ / MTok0,30 $ / MTok15 $ / MTok
Claude Sonnet 43 $ / MTok3,75 $ / MTok0,30 $ / MTok15 $ / MTok
Claude Sonnet 3.73 $ / MTok3,75 $ / MTok0,30 $ / MTok15 $ / MTok
Le processus de réflexion entraîne des frais pour :
  • Les jetons utilisés pendant la réflexion (jetons de sortie)
  • Les blocs de réflexion du dernier tour assistant inclus dans les demandes ultérieures (jetons d’entrée)
  • Les jetons de sortie de texte standard
Lorsque la réflexion étendue est activée, une invite système spécialisée est automatiquement incluse pour soutenir cette fonctionnalité.
Lors de l’utilisation de la réflexion résumée :
  • Jetons d’entrée : Jetons dans votre demande originale (exclut les jetons de réflexion des tours précédents)
  • Jetons de sortie (facturés) : Les jetons de réflexion originaux que Claude a générés en interne
  • Jetons de sortie (visibles) : Les jetons de réflexion résumés que vous voyez dans la réponse
  • Pas de frais : Jetons utilisés pour générer le résumé
Le nombre de jetons de sortie facturés ne correspondra pas au nombre de jetons visibles dans la réponse. Vous êtes facturé pour le processus de réflexion complet, pas le résumé que vous voyez.

Meilleures pratiques et considérations pour la réflexion étendue

Travailler avec les budgets de réflexion

  • Optimisation du budget : Le budget minimum est de 1 024 jetons. Nous suggérons de commencer par le minimum et d’augmenter progressivement le budget de réflexion pour trouver la plage optimale pour votre cas d’utilisation. Des comptages de jetons plus élevés permettent un raisonnement plus complet mais avec des rendements décroissants selon la tâche. L’augmentation du budget peut améliorer la qualité des réponses au détriment d’une latence accrue. Pour les tâches critiques, testez différents paramètres pour trouver l’équilibre optimal. Notez que le budget de réflexion est une cible plutôt qu’une limite stricte - l’utilisation réelle des jetons peut varier selon la tâche.
  • Points de départ : Commencez avec des budgets de réflexion plus importants (16k+ jetons) pour les tâches complexes et ajustez selon vos besoins.
  • Budgets importants : Pour les budgets de réflexion supérieurs à 32k, nous recommandons d’utiliser le traitement par lots pour éviter les problèmes de réseau. Les demandes poussant le modèle à réfléchir au-dessus de 32k jetons causent des demandes longues qui pourraient se heurter aux délais d’expiration du système et aux limites de connexion ouverte.
  • Suivi de l’utilisation des jetons : Surveillez l’utilisation des jetons de réflexion pour optimiser les coûts et les performances.

Considérations de performance

  • Temps de réponse : Soyez préparé à des temps de réponse potentiellement plus longs en raison du traitement supplémentaire requis pour le processus de raisonnement. Tenez compte du fait que la génération de blocs de réflexion peut augmenter le temps de réponse global.
  • Exigences de diffusion en continu : La diffusion en continu est requise lorsque max_tokens est supérieur à 21 333. Lors de la diffusion en continu, soyez préparé à gérer à la fois les blocs de contenu de réflexion et de texte à mesure qu’ils arrivent.

Compatibilité des fonctionnalités

  • La réflexion n’est pas compatible avec les modifications temperature ou top_k ainsi que l’utilisation forcée d’outils.
  • Lorsque la réflexion est activée, vous pouvez définir top_p sur des valeurs entre 1 et 0,95.
  • Vous ne pouvez pas pré-remplir les réponses lorsque la réflexion est activée.
  • Les modifications du budget de réflexion invalident les préfixes d’invite mis en cache qui incluent les messages. Cependant, les invites système mises en cache et les définitions d’outils continueront à fonctionner lorsque les paramètres de réflexion changent.

Directives d’utilisation

  • Sélection des tâches : Utilisez la réflexion étendue pour les tâches particulièrement complexes qui bénéficient d’un raisonnement étape par étape comme les mathématiques, le codage et l’analyse.
  • Gestion du contexte : Vous n’avez pas besoin de supprimer vous-même les blocs de réflexion précédents. L’API Claude ignore automatiquement les blocs de réflexion des tours précédents et ils ne sont pas inclus lors du calcul de l’utilisation du contexte.
  • Ingénierie des invites : Consultez nos conseils d’ingénierie des invites pour la réflexion étendue si vous souhaitez maximiser les capacités de réflexion de Claude.

Prochaines étapes