Exercices Projets guidés Interface CLI avec Rich
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Interface CLI avec Rich

Ton agent est fonctionnel, mais pour le moment il vit dans un fichier Python qu'on execute dans un terminal triste. Pour en faire un vrai outil utilisable, il lui faut une interface en ligne de commande (CLI) agreable. La librairie Rich transforme ton terminal en interface coloree avec des spinners, des tableaux, et du texte formate.

pip install rich

Rich, c'est comme du CSS pour le terminal. Tu peux afficher du texte en couleur, des panneaux encadres, des barres de progression, et meme du code avec coloration syntaxique. Voici les composants qu'on va utiliser :

from rich.console import Console
from rich.panel import Panel
from rich.table import Table
from rich.markdown import Markdown

console = Console()
console.print("[bold green]Succes ![/bold green]")
console.print(Panel("Contenu", title="Titre"))

Pour cet exercice, on ne va pas construire la boucle interactive (ca viendra dans le projet final). On va construire les fonctions de formatage qui preparent l'affichage.

Ecris une fonction formater_reponse_agent(reponse, sources) qui prend la reponse de l'agent (string) et la liste des sources (list de dicts avec "numero", "titre", "url"). Elle renvoie un dictionnaire avec deux cles : "reponse_formatee" (la reponse avec un en-tete) et "sources_formatees" (les sources en texte lisible).

Ecris une fonction formater_statistiques(stats) qui prend un dictionnaire de statistiques (iterations, outils_utilises, temps si disponible) et renvoie un texte resume sur une ligne.

Ecris aussi une fonction traiter_commande(commande, historique_cout=None) qui gere les commandes speciales :
/help renvoie le texte d'aide
/clear renvoie {"action": "clear"}
/cost renvoie un resume des couts (basee sur historique_cout, une liste de nombres)
Tout autre texte renvoie {"action": "question", "texte": commande}

Exemple :

formater_reponse_agent("Python est genial.", [{"numero": 1, "titre": "Doc", "url": "https://..."}])
renvoie {
"reponse_formatee": "...",
"sources_formatees": "Sources :\n[1] Doc - https://..."
}

traiter_commande("/help")
renvoie {"action": "help", "texte": "..."}

Tests (4/5)

Formatage avec sources
sources = [
    {"numero": 1, "titre": "Python.org", "url": "https://python.org"},
    {"numero": 2, "titre": "Docs", "url": "https://docs.python.org"},
]
r = formater_reponse_agent("Python est genial.", sources)
assert "reponse_formatee" in r and "sources_formatees" in r
assert "Python est genial" in r["reponse_formatee"]
assert "[1]" in r["sources_formatees"] and "[2]" in r["sources_formatees"]
assert "https://python.org" in r["sources_formatees"]
Formatage sans sources
r = formater_reponse_agent("Reponse directe.", [])
assert "sources_formatees" in r
assert len(r["sources_formatees"]) > 0, "Doit afficher un message meme sans sources"
Commandes speciales
r_help = traiter_commande("/help")
assert r_help["action"] == "help"
assert "texte" in r_help and len(r_help["texte"]) > 0

r_clear = traiter_commande("/clear")
assert r_clear["action"] == "clear"

r_cost = traiter_commande("/cost", historique_cout=[0.01, 0.02, 0.015])
assert r_cost["action"] == "cost"
assert r_cost["nb_requetes"] == 3
assert abs(r_cost["total"] - 0.045) < 0.001
Question normale
r = traiter_commande("Qui a cree Python ?")
assert r["action"] == "question"
assert r["texte"] == "Qui a cree Python ?"

+ 0 tests cachés

Indices (3 disponibles)

solution.py