feat: Léa humanisée — plus de jargon technique, ton chaleureux

- "Workflow" → "tâche" partout
- Vouvoiement, ton de collègue bienveillante
- Noms de tâches lisibles (Bloc-notes — Écriture et sauvegarde)
- Notifications féminisées (Connectée, prête)
- Boutons : Apprenez-moi, Lancer, Données, Arrêter, Aide
- Intent parser enrichi (langage naturel humain)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-03-17 23:36:28 +01:00
parent 4e217e30dd
commit 32c6808afb
2 changed files with 99 additions and 91 deletions

View File

@@ -92,10 +92,12 @@ class IntentParser:
],
IntentType.EXECUTE: [
# Verbes d'action explicites
r"(?:lance|exécute|démarre|fai[st]|run|start|execute)\s+(.+)",
r"(?:je veux|je voudrais|peux-tu)\s+(.+)",
r"(?:lance[rz]?|exécute[rz]?|démarre[rz]?|fai[st]|run|start|execute)\s+(.+)",
r"(?:je veux|je voudrais|peux-tu|pouvez-vous)\s+(.+)",
r"(?:facturer?|créer?|générer?|exporter?)\s+(.+)",
r"^(.+)\s+(?:maintenant|tout de suite|svp|stp)$",
# Langage humain — demande de replay
r"(?:refai[st](?:es)?|refaire|recommence[rz]?|rejoue[rz]?)\s+(?:la\s+)?(?:tâche\s+)?(.+)",
# Gestes courants (UI actions) — doivent rester EXECUTE
r"(?:ferme[rz]?|ouvr[eir]+[sz]?|clique[rz]?|sélectionne[rz]?|coche[rz]?|décoche[rz]?)\s+(.+)",
r"(?:copie[rz]?|colle[rz]?|coupe[rz]?|supprime[rz]?|efface[rz]?)\s+(.+)",
@@ -113,13 +115,19 @@ class IntentParser:
r"(?:déconnecte[rz]?|logout|log\s*out|sign\s*out)\s*(.+)?",
# Raccourcis clavier
r"(?:ctrl|alt|shift|maj)\s*\+\s*\w+",
# Langage humain — demande d'apprentissage (déclenche l'enregistrement)
r"(?:apprends|apprenez)[- ]moi\s+(.+)",
],
IntentType.LIST: [
r"(?:liste|montre|affiche|quels?\s+sont)\s+(?:les\s+|des\s+)?(?:workflows?|processus|automatisations?)",
r"(?:quels?|quelles?)\s+(?:workflows?|processus|automatisations?)",
r"liste\s+des\s+workflows?",
r"(?:workflows?|processus)\s+disponibles?",
r"(?:voir|afficher)\s+(?:les\s+|tous\s+les\s+)?workflows?",
r"(?:liste|montre|affiche|quels?\s+sont)\s+(?:les\s+|des\s+)?(?:workflows?|tâches?|processus|automatisations?)",
r"(?:quels?|quelles?)\s+(?:workflows?|tâches?|processus|automatisations?)",
r"liste\s+des\s+(?:workflows?|tâches?)",
r"(?:workflows?|tâches?|processus)\s+disponibles?",
r"(?:voir|afficher)\s+(?:les\s+|tous\s+les\s+|mes\s+)?(?:workflows?|tâches?)",
# Langage humain — demande de liste
r"(?:qu'est-ce que\s+(?:tu|vous)\s+sai[st]\s+faire)",
r"(?:que\s+sai[st]-(?:tu|vous)\s+faire)",
r"mes\s+tâches?",
],
IntentType.QUERY: [
# Questions directes avec mots interrogatifs
@@ -141,9 +149,9 @@ class IntentParser:
r"comment (?:utiliser|ça s'utilise|on fait)\s*\??",
r"\?{2,}",
# "que peux-tu faire", "quoi faire" = demande d'aide
r"(?:qu'est-ce que|que)\s+(?:je peux|tu peux)\s+faire",
r"(?:qu'est-ce que|que)\s+(?:je peux|tu peux|vous pouvez)\s+faire",
r"^quoi\s+faire\s*\??$",
r"(?:que\s+)?(?:puis-je|peux-tu|peut-on)\s+faire\s*\??",
r"(?:que\s+)?(?:puis-je|peux-tu|pouvez-vous|peut-on)\s+faire\s*\??",
r"(?:besoin\s+d'aide|j'ai\s+besoin\s+d'aide)",
],
IntentType.GREETING: [
@@ -156,8 +164,10 @@ class IntentParser:
r"(?:terminé|fini|done)\s*\?",
],
IntentType.CANCEL: [
r"(?:annule|stop|arrête|cancel|abort)",
r"(?:laisse tomber|oublie)",
r"(?:annule[rz]?|stop|arrête[rz]?|cancel|abort)",
r"(?:laisse[rz]?\s+tomber|oublie[rz]?)",
# Langage humain — stop courant
r"^(?:arrêtez|stoppe[rz]?)$",
],
IntentType.HISTORY: [
r"(?:historique|history|dernières?\s+commandes?)",
@@ -550,9 +560,9 @@ class IntentParser:
"""Vérifier si une clarification est nécessaire."""
if intent_type == IntentType.EXECUTE:
# Si pas de hint de workflow, demander clarification
# Si pas de hint de tâche, demander clarification
if not workflow_hint:
return True, "Quel workflow souhaitez-vous exécuter ?"
return True, "Quelle tâche souhaitez-vous lancer ?"
# Si le hint est trop vague
if len(workflow_hint.split()) <= 1:
@@ -571,18 +581,18 @@ class IntentParser:
workflow_names = [w.get("name", "") for w in self._workflows_cache[:15]]
workflows_context = f"\nWorkflows disponibles: {', '.join(workflow_names)}"
prompt = f"""Tu es un assistant RPA. Analyse cette requête utilisateur.
prompt = f"""Tu es Léa, une assistante chaleureuse. Analyse cette requête utilisateur.
REQUÊTE: "{query}"
{workflows_context}
{f"Contexte conversation: {json.dumps(context, ensure_ascii=False)}" if context else ""}
INTENTIONS POSSIBLES:
- execute: l'utilisateur veut lancer/exécuter un workflow ou une action UI (geste)
- list: l'utilisateur veut voir les workflows disponibles (mots-clés: liste, quels, workflows, disponibles, montrer)
- execute: l'utilisateur veut lancer/refaire une tâche ou une action UI (geste). Inclut "apprends-moi", "refais la tâche", "lance"
- list: l'utilisateur veut voir les tâches disponibles (mots-clés: liste, quels, tâches, qu'est-ce que tu sais faire, mes tâches)
- query: l'utilisateur pose une question (comment, pourquoi, c'est quoi, quel)
- status: l'utilisateur demande le statut d'exécution
- cancel: l'utilisateur veut annuler
- cancel: l'utilisateur veut arrêter/annuler (arrête, stop, annule)
- history: l'utilisateur veut voir l'historique
- help: l'utilisateur demande de l'aide ou ce qu'il peut faire
- greeting: l'utilisateur dit bonjour/salut/hello