Conversations multi-tours
Sur cette page
Claude ne garde aucun souvenir d’une requête à l’autre. Pour tenir une conversation, c’est votre code qui conserve l’historique et le renvoie en entier à chaque appel. Cette leçon montre pourquoi, puis écrit les trois fonctions utilitaires que le cours réutilise jusqu’aux agents : add_user_message, add_assistant_message et chat.
Claude est sans état
Chaque appel à l’API est totalement indépendant. Le cours officiel le montre simplement : demandez « Qu’est-ce que l’informatique quantique ? », puis, dans une seconde requête, « Écris une autre phrase » ; Claude écrit une phrase sur n’importe quoi, car il ne sait pas de quoi vous parliez. Ce n’est pas une limite à contourner mais une propriété à exploiter : puisque vous détenez l’historique, vous pouvez le relire, en retirer un échange raté, le résumer ou le stocker.
Le principe
Pour qu’une conversation tienne, deux règles : garder la liste de tous les messages, et l’envoyer en entier à chaque requête. Le déroulé est toujours le même :
- Envoyer le premier message
user. - Ajouter la réponse de Claude à la liste, comme message
assistant. - Ajouter la question suivante, comme nouveau message
user. - Envoyer toute la liste.
Les fonctions utilitaires
from anthropic import AnthropicVertex
client = AnthropicVertex(project_id="votre-projet", region="global")
model = "claude-sonnet-5-5"
def add_user_message(messages, text):
messages.append({"role": "user", "content": text})
def add_assistant_message(messages, text):
messages.append({"role": "assistant", "content": text})
def chat(messages):
message = client.messages.create(
model=model,
max_tokens=4096,
messages=messages,
)
# un bloc de réflexion peut précéder le texte : on ne garde que les blocs text
return "".join(block.text for block in message.content if block.type == "text")
Ce sont les fonctions du cours officiel, à deux détails près. max_tokens vaut 4 096 et non 1 000, parce que Sonnet 5.5 réfléchit avant de répondre et que sa réflexion compte dans ce plafond. Et chat lit les blocs de type text au lieu de message.content[0].text, pour la même raison. La conversation ne garde que le texte des réponses de Claude : hors appel d’outil, la documentation l’autorise, même si elle recommande de renvoyer chaque tour tel quel (la section 5, sur les outils, y reviendra, car là c’est obligatoire).
Une conversation complète
messages = []
add_user_message(messages, "Définis l'informatique quantique en une phrase.")
answer = chat(messages)
add_assistant_message(messages, answer)
add_user_message(messages, "Écris une autre phrase.")
final_answer = chat(messages)
print(final_answer)
Cette fois, « Écris une autre phrase » prolonge la définition : Claude voit tout l’historique.
for msg in messages:
role = "Vous" if msg["role"] == "user" else "Claude"
print(f"{role} : {msg['content'][:80]}…")
Le coût d’une longue conversation
Puisque tout l’historique repart à chaque requête, le vingtième échange ne coûte pas un message mais la somme de tous ceux qui précèdent : le coût cumulé d’une conversation croît bien plus vite que son nombre de tours, et la fenêtre de contexte finit par se remplir. Trois parades, vues plus loin dans le cours : tronquer les messages les plus anciens, résumer périodiquement la conversation, et mettre en cache le début de l’historique (section 7).
À vous de jouer
Vérifier l’absence de mémoire. Envoyez « Je m’appelle Camille » puis, dans une requête séparée, « Comment je m’appelle ? ». Recommencez avec les fonctions utilitaires et la même liste : la réponse change.
Compter les tokens. Modifiez chat pour afficher message.usage.input_tokens à chaque appel, puis tenez une conversation de six tours. Observez la croissance des tokens d’entrée.
Sources officielles : Multi-turn conversations (Claude Academy) · Create a Message et Thinking (documentation Claude : historique, blocs de réflexion d’un tour à l’autre)
Points clés à retenir
- Claude est sans état : chaque requête est indépendante.
- Votre code garde la liste des messages et l’envoie en entier à chaque appel.
- Trois utilitaires :
add_user_message,add_assistant_message,chat, qui lit les blocs de typetext. - Le coût d’une conversation croît avec la longueur de l’historique : tronquer, résumer, mettre en cache.