Aller au contenu principal

Travailler avec les messages

Objectifs

  • Comprendre le format de l’API Messages
  • Manipuler les objets de reponse
  • Construire un chatbot multi-tours

Le format des messages

Chaque appel a client.messages.create() attend une liste de messages. Chaque message est un dictionnaire avec deux cles :

  • role : "user" (vos messages) ou "assistant" (messages de Claude)
  • content : le texte du message
messages = [
    {"role": "user", "content": "Quels sont les ingredients du Dr. Pepper ?"}
]

Pour une conversation multi-tours :

messages = [
    {"role": "user", "content": "Bonjour Claude !"},
    {"role": "assistant", "content": "Bonjour ! Comment puis-je vous aider ?"},
    {"role": "user", "content": "Raconte-moi un fait sur les furets."},
]

Les messages doivent toujours alterner entre user et assistant.

Quiz : Quelles sont les deux cles requises dans chaque message ?

Reponse : role et content

Inspecter la reponse

L’objet Message retourne par Claude contient plusieurs proprietes :

response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1000,
    messages=[
        {"role": "user", "content": "Traduis bonjour en anglais. Reponds en un seul mot."}
    ]
)

Les proprietes principales :

ProprieteDescription
contentLe contenu genere (liste de blocs)
idIdentifiant unique du message
modelLe modele utilise
stop_reasonRaison de l’arret (end_turn, max_tokens, stop_sequence)
usageTokens d’entree (input_tokens) et de sortie (output_tokens)

Pour acceder au texte genere :

print(response.content[0].text)

Erreurs courantes

Commencer par un message assistant

La liste doit toujours commencer par un message user :

# ERREUR : commence par assistant
messages = [
    {"role": "assistant", "content": "Bonjour !"}
]

Ne pas alterner les roles

Deux messages consecutifs du meme role provoquent une erreur :

# ERREUR : deux messages user consecutifs
messages = [
    {"role": "user", "content": "Salut !"},
    {"role": "user", "content": "Ca va ?"}
]

Techniques avancees avec les messages

Mettre des mots dans la bouche de Claude

Vous pouvez fournir un message assistant pour que Claude continue a partir de ce point :

response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=500,
    messages=[
        {"role": "user", "content": "Genere un beau haiku"},
        {"role": "assistant", "content": "l'air frais de montagne"}
    ]
)
# Claude completera le haiku a partir de cette premiere ligne
print("l'air frais de montagne" + response.content[0].text)

Prompting few-shot

Fournir des exemples via l’historique de conversation guide le format de sortie de Claude :

response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=500,
    messages=[
        {"role": "user", "content": "Ce produit est nul, je deteste !"},
        {"role": "assistant", "content": "NEGATIF"},
        {"role": "user", "content": "J'adore ce produit, il est genial !"},
        {"role": "assistant", "content": "POSITIF"},
        {"role": "user", "content": "Le nouveau modele est vraiment top !"},
    ]
)
print(response.content[0].text)  # POSITIF

Exercice : construire un chatbot

Construisez un chatbot en ligne de commande :

  1. Maintenez une liste pour l’historique
  2. Demandez une entree utilisateur avec input()
  3. Envoyez l’historique a Claude
  4. Affichez la reponse
  5. Ajoutez la reponse a l’historique
  6. Repetez (avec une condition de sortie)
Voir la solution
from anthropic import Anthropic

client = Anthropic()
conversation_history = []

while True:
    user_input = input("Vous : ")

    if user_input.lower() == "quit":
        print("Conversation terminee.")
        break

    conversation_history.append({"role": "user", "content": user_input})

    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        messages=conversation_history,
        max_tokens=500
    )

    assistant_response = response.content[0].text
    print(f"Claude : {assistant_response}")
    conversation_history.append({"role": "assistant", "content": assistant_response})