Exercices Projets guidés Conversation interactive
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Conversation interactive

Un bon assistant ne se contente pas de repondre a une question et de quitter. Il reste disponible pour la suite. Tu lui poses une question, il repond, tu enchaines, il se souvient du contexte. C'est le mode REPL : Read-Eval-Print-Loop.

Claude Code fonctionne exactement comme ca. Tu ouvres le terminal, tu lui parles, il repond, tu continues. Tu peux taper des commandes speciales comme /quit pour sortir, /clear pour effacer l'historique, ou /cost pour voir combien tu as depense en tokens.

Ecris une classe SessionInteractive qui gere une session de conversation. Elle ne fait pas les appels API (ca, c'est le role du ClientLLM) mais elle orchestre tout le reste : historique, commandes speciales, cout estime.

La classe prend un system_prompt a la construction.

Methodes :

traiter_entree(texte) : prend le texte saisi par l'utilisateur et renvoie un dictionnaire decrivant quoi faire.

ajouter_echange(question, reponse) : enregistre un echange dans l'historique.

obtenir_messages() : renvoie les messages au format API OpenAI (system + historique).

obtenir_stats() : renvoie les statistiques de la session.

Le traitement d'entree doit gerer ces cas :

Texte vide : {"action": "ignorer"}
/quit ou /exit : {"action": "quitter"}
/clear : {"action": "effacer"} et l'historique est vide
/stats : {"action": "stats", "donnees": {...}} avec nombre de messages, tokens estimes, etc.
/files : {"action": "lister_fichiers"}
Texte normal : {"action": "envoyer", "prompt": "le texte"}

Pour estimer les tokens, utilise la regle simple : 1 token = environ 4 caracteres.

Exemple :

session = SessionInteractive("Tu es un assistant Python.")

session.traiter_entree("/quit")
renvoie {"action": "quitter"}

session.traiter_entree("Explique les decorateurs")
renvoie {"action": "envoyer", "prompt": "Explique les decorateurs"}

session.ajouter_echange("Explique les decorateurs", "Un decorateur c'est...")
session.obtenir_stats()
renvoie {"messages": 2, "tokens_estimes": 25, "cout_estime": 0.000025}

Tests (4/5)

Commandes speciales
session = SessionInteractive("Sys")
assert session.traiter_entree("/quit")["action"] == "quitter"
assert session.traiter_entree("/exit")["action"] == "quitter"
assert session.traiter_entree("/clear")["action"] == "effacer"
assert session.traiter_entree("/stats")["action"] == "stats"
assert session.traiter_entree("/files")["action"] == "lister_fichiers"
Texte normal et vide
session = SessionInteractive("Sys")
r = session.traiter_entree("Bonjour")
assert r["action"] == "envoyer"
assert r["prompt"] == "Bonjour"

r2 = session.traiter_entree("  ")
assert r2["action"] == "ignorer"
Historique et messages
session = SessionInteractive("Tu es un assistant.")
session.ajouter_echange("Q1", "R1")
session.ajouter_echange("Q2", "R2")
messages = session.obtenir_messages()
assert len(messages) == 5, f"Attendu 5 (1 system + 4 historique), obtenu {len(messages)}"
assert messages[0]["role"] == "system"
assert messages[1]["content"] == "Q1"
assert messages[2]["content"] == "R1"
Clear vide l'historique
session = SessionInteractive("Sys")
session.ajouter_echange("Q", "R")
session.traiter_entree("/clear")
messages = session.obtenir_messages()
assert len(messages) == 1, "Apres /clear, seul le system prompt doit rester"

+ 0 tests cachés

Indices (3 disponibles)

solution.py