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:
@@ -92,10 +92,12 @@ class IntentParser:
|
|||||||
],
|
],
|
||||||
IntentType.EXECUTE: [
|
IntentType.EXECUTE: [
|
||||||
# Verbes d'action explicites
|
# Verbes d'action explicites
|
||||||
r"(?:lance|exécute|démarre|fai[st]|run|start|execute)\s+(.+)",
|
r"(?:lance[rz]?|exécute[rz]?|démarre[rz]?|fai[st]|run|start|execute)\s+(.+)",
|
||||||
r"(?:je veux|je voudrais|peux-tu)\s+(.+)",
|
r"(?:je veux|je voudrais|peux-tu|pouvez-vous)\s+(.+)",
|
||||||
r"(?:facturer?|créer?|générer?|exporter?)\s+(.+)",
|
r"(?:facturer?|créer?|générer?|exporter?)\s+(.+)",
|
||||||
r"^(.+)\s+(?:maintenant|tout de suite|svp|stp)$",
|
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
|
# 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"(?: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+(.+)",
|
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*(.+)?",
|
r"(?:déconnecte[rz]?|logout|log\s*out|sign\s*out)\s*(.+)?",
|
||||||
# Raccourcis clavier
|
# Raccourcis clavier
|
||||||
r"(?:ctrl|alt|shift|maj)\s*\+\s*\w+",
|
r"(?:ctrl|alt|shift|maj)\s*\+\s*\w+",
|
||||||
|
# Langage humain — demande d'apprentissage (déclenche l'enregistrement)
|
||||||
|
r"(?:apprends|apprenez)[- ]moi\s+(.+)",
|
||||||
],
|
],
|
||||||
IntentType.LIST: [
|
IntentType.LIST: [
|
||||||
r"(?:liste|montre|affiche|quels?\s+sont)\s+(?:les\s+|des\s+)?(?:workflows?|processus|automatisations?)",
|
r"(?:liste|montre|affiche|quels?\s+sont)\s+(?:les\s+|des\s+)?(?:workflows?|tâches?|processus|automatisations?)",
|
||||||
r"(?:quels?|quelles?)\s+(?:workflows?|processus|automatisations?)",
|
r"(?:quels?|quelles?)\s+(?:workflows?|tâches?|processus|automatisations?)",
|
||||||
r"liste\s+des\s+workflows?",
|
r"liste\s+des\s+(?:workflows?|tâches?)",
|
||||||
r"(?:workflows?|processus)\s+disponibles?",
|
r"(?:workflows?|tâches?|processus)\s+disponibles?",
|
||||||
r"(?:voir|afficher)\s+(?:les\s+|tous\s+les\s+)?workflows?",
|
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: [
|
IntentType.QUERY: [
|
||||||
# Questions directes avec mots interrogatifs
|
# Questions directes avec mots interrogatifs
|
||||||
@@ -141,9 +149,9 @@ class IntentParser:
|
|||||||
r"comment (?:utiliser|ça s'utilise|on fait)\s*\??",
|
r"comment (?:utiliser|ça s'utilise|on fait)\s*\??",
|
||||||
r"\?{2,}",
|
r"\?{2,}",
|
||||||
# "que peux-tu faire", "quoi faire" = demande d'aide
|
# "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"^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)",
|
r"(?:besoin\s+d'aide|j'ai\s+besoin\s+d'aide)",
|
||||||
],
|
],
|
||||||
IntentType.GREETING: [
|
IntentType.GREETING: [
|
||||||
@@ -156,8 +164,10 @@ class IntentParser:
|
|||||||
r"(?:terminé|fini|done)\s*\?",
|
r"(?:terminé|fini|done)\s*\?",
|
||||||
],
|
],
|
||||||
IntentType.CANCEL: [
|
IntentType.CANCEL: [
|
||||||
r"(?:annule|stop|arrête|cancel|abort)",
|
r"(?:annule[rz]?|stop|arrête[rz]?|cancel|abort)",
|
||||||
r"(?:laisse tomber|oublie)",
|
r"(?:laisse[rz]?\s+tomber|oublie[rz]?)",
|
||||||
|
# Langage humain — stop courant
|
||||||
|
r"^(?:arrêtez|stoppe[rz]?)$",
|
||||||
],
|
],
|
||||||
IntentType.HISTORY: [
|
IntentType.HISTORY: [
|
||||||
r"(?:historique|history|dernières?\s+commandes?)",
|
r"(?:historique|history|dernières?\s+commandes?)",
|
||||||
@@ -550,9 +560,9 @@ class IntentParser:
|
|||||||
"""Vérifier si une clarification est nécessaire."""
|
"""Vérifier si une clarification est nécessaire."""
|
||||||
|
|
||||||
if intent_type == IntentType.EXECUTE:
|
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:
|
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
|
# Si le hint est trop vague
|
||||||
if len(workflow_hint.split()) <= 1:
|
if len(workflow_hint.split()) <= 1:
|
||||||
@@ -571,18 +581,18 @@ class IntentParser:
|
|||||||
workflow_names = [w.get("name", "") for w in self._workflows_cache[:15]]
|
workflow_names = [w.get("name", "") for w in self._workflows_cache[:15]]
|
||||||
workflows_context = f"\nWorkflows disponibles: {', '.join(workflow_names)}"
|
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}"
|
REQUÊTE: "{query}"
|
||||||
{workflows_context}
|
{workflows_context}
|
||||||
{f"Contexte conversation: {json.dumps(context, ensure_ascii=False)}" if context else ""}
|
{f"Contexte conversation: {json.dumps(context, ensure_ascii=False)}" if context else ""}
|
||||||
|
|
||||||
INTENTIONS POSSIBLES:
|
INTENTIONS POSSIBLES:
|
||||||
- execute: l'utilisateur veut lancer/exécuter un workflow ou une action UI (geste)
|
- 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 workflows disponibles (mots-clés: liste, quels, workflows, disponibles, montrer)
|
- 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)
|
- query: l'utilisateur pose une question (comment, pourquoi, c'est quoi, quel)
|
||||||
- status: l'utilisateur demande le statut d'exécution
|
- 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
|
- history: l'utilisateur veut voir l'historique
|
||||||
- help: l'utilisateur demande de l'aide ou ce qu'il peut faire
|
- help: l'utilisateur demande de l'aide ou ce qu'il peut faire
|
||||||
- greeting: l'utilisateur dit bonjour/salut/hello
|
- greeting: l'utilisateur dit bonjour/salut/hello
|
||||||
|
|||||||
@@ -60,39 +60,40 @@ class ResponseGenerator:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# Templates de réponses par type d'intention
|
# Templates de réponses par type d'intention
|
||||||
|
# Ton : collègue chaleureuse et professionnelle, vouvoiement
|
||||||
RESPONSE_TEMPLATES = {
|
RESPONSE_TEMPLATES = {
|
||||||
IntentType.EXECUTE: {
|
IntentType.EXECUTE: {
|
||||||
"success": [
|
"success": [
|
||||||
"J'ai lancé le workflow '{workflow}'. {details}",
|
"C'est parti, je lance '{workflow}'. {details}",
|
||||||
"Le workflow '{workflow}' est en cours d'exécution. {details}",
|
"Je m'occupe de '{workflow}'. {details}",
|
||||||
"C'est parti pour '{workflow}' ! {details}"
|
"'{workflow}' est en cours ! {details}"
|
||||||
],
|
],
|
||||||
"error": [
|
"error": [
|
||||||
"Impossible d'exécuter '{workflow}': {error}",
|
"Hmm, je n'ai pas réussi à faire '{workflow}' : {error}",
|
||||||
"Erreur lors du lancement de '{workflow}': {error}",
|
"Désolée, '{workflow}' a rencontré un souci : {error}",
|
||||||
"Le workflow '{workflow}' a échoué: {error}"
|
"Oups, '{workflow}' n'a pas fonctionné : {error}"
|
||||||
],
|
],
|
||||||
"not_found": [
|
"not_found": [
|
||||||
"Je ne sais pas encore faire '{query}'. Montre-moi comment faire et je l'apprendrai !",
|
"Je ne connais pas encore '{query}'. Montrez-moi comment faire et je l'apprendrai !",
|
||||||
"'{query}' m'est inconnu pour l'instant. Tu peux me montrer en enregistrant un workflow.",
|
"'{query}' m'est inconnu pour l'instant. Vous pouvez me montrer en cliquant sur « Apprenez-moi ».",
|
||||||
"Je ne connais pas '{query}'. Montre-moi et je m'en souviendrai !"
|
"Je ne sais pas encore faire '{query}'. Montrez-moi et je m'en souviendrai !"
|
||||||
],
|
],
|
||||||
"gesture": [
|
"gesture": [
|
||||||
"{gesture_name} ({gesture_keys}) envoyé !",
|
"{gesture_name} ({gesture_keys}) envoyé !",
|
||||||
"Raccourci {gesture_name} ({gesture_keys}) exécuté.",
|
"Raccourci {gesture_name} ({gesture_keys}) exécuté.",
|
||||||
],
|
],
|
||||||
"copilot": [
|
"copilot": [
|
||||||
"Mode pas-à-pas activé pour '{workflow}'. Validez chaque étape.",
|
"Mode pas-à-pas activé pour '{workflow}'. Je vous demande de valider chaque étape.",
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
IntentType.LIST: {
|
IntentType.LIST: {
|
||||||
"success": [
|
"success": [
|
||||||
"Voici les workflows disponibles :\n{list}",
|
"Voici les tâches que je sais faire :\n{list}",
|
||||||
"J'ai trouvé {count} workflows :\n{list}",
|
"J'ai {count} tâches en mémoire :\n{list}",
|
||||||
],
|
],
|
||||||
"empty": [
|
"empty": [
|
||||||
"Aucun workflow n'est configuré pour le moment.",
|
"Je n'ai encore appris aucune tâche. Montrez-moi quelque chose !",
|
||||||
"La liste des workflows est vide."
|
"Ma liste est vide pour le moment. Apprenez-moi une première tâche !"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
IntentType.QUERY: {
|
IntentType.QUERY: {
|
||||||
@@ -101,77 +102,78 @@ class ResponseGenerator:
|
|||||||
"À propos de '{topic}' :\n{answer}"
|
"À propos de '{topic}' :\n{answer}"
|
||||||
],
|
],
|
||||||
"not_found": [
|
"not_found": [
|
||||||
"Je n'ai pas d'information sur '{topic}'.",
|
"Je n'ai pas d'information sur '{topic}'. Pouvez-vous préciser ?",
|
||||||
"Je ne peux pas répondre à cette question sur '{topic}'."
|
"Désolée, je ne peux pas vous répondre sur '{topic}'."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
IntentType.HELP: {
|
IntentType.HELP: {
|
||||||
"general": [
|
"general": [
|
||||||
"Je suis votre assistant RPA. Voici ce que je peux faire :\n\n"
|
"Je suis Léa, votre assistante. Voici ce que je peux faire :\n\n"
|
||||||
"• Exécuter des workflows : \"lance facturation client Acme\"\n"
|
"• Apprendre une tâche : cliquez sur « Apprenez-moi »\n"
|
||||||
"• Lister les workflows : \"quels workflows sont disponibles ?\"\n"
|
"• Refaire une tâche : \"lance facturation\" ou cliquez sur « Lancer »\n"
|
||||||
"• Voir le statut : \"où en est l'exécution ?\"\n"
|
"• Voir mes tâches : \"qu'est-ce que tu sais faire ?\"\n"
|
||||||
"• Annuler : \"annule\"\n\n"
|
"• Importer des données : \"importe le fichier Excel\"\n"
|
||||||
"Tapez votre commande en langage naturel !",
|
"• Arrêter : \"arrête\"\n\n"
|
||||||
|
"Parlez-moi naturellement, je fais de mon mieux pour comprendre !",
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
IntentType.GREETING: {
|
IntentType.GREETING: {
|
||||||
"default": [
|
"default": [
|
||||||
"Bonjour ! Je suis votre assistant RPA. Comment puis-je vous aider ?",
|
"Bonjour ! Je suis Léa. Que puis-je faire pour vous ?",
|
||||||
"Salut ! Que puis-je faire pour vous ?",
|
"Bonjour ! Comment puis-je vous aider aujourd'hui ?",
|
||||||
"Bonjour ! Tapez une commande ou 'aide' pour voir ce que je peux faire.",
|
"Bonjour ! Dites-moi ce dont vous avez besoin, ou tapez « aide ».",
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
IntentType.STATUS: {
|
IntentType.STATUS: {
|
||||||
"running": [
|
"running": [
|
||||||
"Exécution en cours : '{workflow}'\nProgression : {progress}%\n{message}",
|
"Je suis en train de faire '{workflow}' — progression : {progress}%\n{message}",
|
||||||
"Le workflow '{workflow}' s'exécute ({progress}%): {message}"
|
"'{workflow}' est en cours ({progress}%) : {message}"
|
||||||
],
|
],
|
||||||
"idle": [
|
"idle": [
|
||||||
"Aucune exécution en cours. Système prêt.",
|
"Tout est calme, je suis disponible. Que puis-je faire pour vous ?",
|
||||||
"Tout est calme. Que puis-je faire pour vous ?"
|
"Rien en cours. Je suis prête !"
|
||||||
],
|
],
|
||||||
"completed": [
|
"completed": [
|
||||||
"Dernière exécution : '{workflow}' - {status}",
|
"La dernière tâche '{workflow}' est terminée : {status}",
|
||||||
"'{workflow}' est terminé : {status}"
|
"'{workflow}' est terminé : {status}"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
IntentType.CANCEL: {
|
IntentType.CANCEL: {
|
||||||
"success": [
|
"success": [
|
||||||
"Exécution annulée.",
|
"C'est arrêté.",
|
||||||
"J'ai arrêté le workflow en cours.",
|
"J'ai tout arrêté.",
|
||||||
"Annulation effectuée."
|
"Annulation faite."
|
||||||
],
|
],
|
||||||
"nothing": [
|
"nothing": [
|
||||||
"Rien à annuler, aucune exécution en cours.",
|
"Il n'y a rien en cours à arrêter.",
|
||||||
"Il n'y a pas d'exécution active."
|
"Rien à annuler, je suis disponible."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
IntentType.HISTORY: {
|
IntentType.HISTORY: {
|
||||||
"success": [
|
"success": [
|
||||||
"Voici vos dernières commandes :\n{history}",
|
"Voici vos dernières actions :\n{history}",
|
||||||
"Historique récent :\n{history}"
|
"Historique récent :\n{history}"
|
||||||
],
|
],
|
||||||
"empty": [
|
"empty": [
|
||||||
"Pas encore d'historique.",
|
"Pas encore d'historique.",
|
||||||
"Vous n'avez pas encore exécuté de commandes."
|
"Vous n'avez encore rien fait avec moi."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
IntentType.CONFIRM: {
|
IntentType.CONFIRM: {
|
||||||
"accepted": [
|
"accepted": [
|
||||||
"Très bien, j'exécute '{workflow}'.",
|
"Très bien, je m'en occupe : '{workflow}'.",
|
||||||
"C'est parti pour '{workflow}' !",
|
"C'est parti pour '{workflow}' !",
|
||||||
"Confirmé. Lancement de '{workflow}'."
|
"Entendu. Je lance '{workflow}'."
|
||||||
],
|
],
|
||||||
"no_pending": [
|
"no_pending": [
|
||||||
"Il n'y a rien à confirmer.",
|
"Il n'y a rien à confirmer pour le moment.",
|
||||||
"Aucune action en attente de confirmation."
|
"Aucune action en attente."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
IntentType.DENY: {
|
IntentType.DENY: {
|
||||||
"cancelled": [
|
"cancelled": [
|
||||||
"Action annulée.",
|
"D'accord, c'est annulé.",
|
||||||
"D'accord, j'annule.",
|
"Entendu, j'annule.",
|
||||||
"Compris, on oublie."
|
"Compris, on oublie."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -186,15 +188,15 @@ class ResponseGenerator:
|
|||||||
"Fichier **{filename}** prêt : {total_rows} lignes avec les colonnes {columns}. On crée la table '{table_name}' ?",
|
"Fichier **{filename}** prêt : {total_rows} lignes avec les colonnes {columns}. On crée la table '{table_name}' ?",
|
||||||
],
|
],
|
||||||
"imported": [
|
"imported": [
|
||||||
"Table **'{table_name}'** créée avec {row_count} lignes et {col_count} colonnes ({columns}). Vous pouvez maintenant utiliser 'Pour chaque ligne' dans un workflow !",
|
"Table **'{table_name}'** créée avec {row_count} lignes et {col_count} colonnes ({columns}). Vous pouvez maintenant l'utiliser dans une tâche !",
|
||||||
"Import réussi ! Table **'{table_name}'** : {row_count} lignes, {col_count} colonnes ({columns}).",
|
"Import réussi ! Table **'{table_name}'** : {row_count} lignes, {col_count} colonnes ({columns}).",
|
||||||
],
|
],
|
||||||
"list_tables": [
|
"list_tables": [
|
||||||
"Voici les tables disponibles :\n{tables_list}",
|
"Voici vos tables de données :\n{tables_list}",
|
||||||
"Tables dans la base :\n{tables_list}",
|
"Tables disponibles :\n{tables_list}",
|
||||||
],
|
],
|
||||||
"no_tables": [
|
"no_tables": [
|
||||||
"Aucune table n'a été importée pour l'instant. Envoyez-moi un fichier Excel pour commencer !",
|
"Vous n'avez pas encore de données importées. Envoyez-moi un fichier Excel pour commencer !",
|
||||||
"La base est vide. Importez un fichier Excel pour créer votre première table.",
|
"La base est vide. Importez un fichier Excel pour créer votre première table.",
|
||||||
],
|
],
|
||||||
"table_info": [
|
"table_info": [
|
||||||
@@ -204,15 +206,15 @@ class ResponseGenerator:
|
|||||||
"J'ai trouvé {count} fichiers Excel dans le dossier :\n{files_list}\n\nDites-moi lequel importer !",
|
"J'ai trouvé {count} fichiers Excel dans le dossier :\n{files_list}\n\nDites-moi lequel importer !",
|
||||||
],
|
],
|
||||||
"folder_empty": [
|
"folder_empty": [
|
||||||
"Aucun fichier Excel trouvé dans le dossier '{folder}'. Vérifiez le chemin.",
|
"Je n'ai trouvé aucun fichier Excel dans '{folder}'. Vérifiez le chemin.",
|
||||||
],
|
],
|
||||||
"file_not_found": [
|
"file_not_found": [
|
||||||
"Je n'ai pas trouvé le fichier '{file_path}'. Vérifiez le chemin ou envoyez-le via le bouton 📎.",
|
"Je n'ai pas trouvé le fichier '{file_path}'. Vérifiez le chemin ou envoyez-le directement.",
|
||||||
"Fichier introuvable : '{file_path}'. Vous pouvez aussi glisser un fichier dans le chat.",
|
"Fichier introuvable : '{file_path}'. Vous pouvez aussi glisser un fichier dans le chat.",
|
||||||
],
|
],
|
||||||
"error": [
|
"error": [
|
||||||
"Erreur lors de l'import : {error}",
|
"Désolée, l'import a échoué : {error}",
|
||||||
"L'import a échoué : {error}",
|
"Oups, un souci lors de l'import : {error}",
|
||||||
],
|
],
|
||||||
"uploaded": [
|
"uploaded": [
|
||||||
"Fichier **{filename}** reçu ! Je l'analyse...",
|
"Fichier **{filename}** reçu ! Je l'analyse...",
|
||||||
@@ -220,9 +222,9 @@ class ResponseGenerator:
|
|||||||
},
|
},
|
||||||
IntentType.UNKNOWN: {
|
IntentType.UNKNOWN: {
|
||||||
"default": [
|
"default": [
|
||||||
"Je n'ai pas compris. Pouvez-vous reformuler ?",
|
"Je n'ai pas bien compris. Pouvez-vous reformuler ?",
|
||||||
"Désolé, je ne comprends pas '{query}'. Tapez 'aide' pour voir les commandes.",
|
"Désolée, je ne comprends pas. Tapez « aide » pour voir ce que je sais faire.",
|
||||||
"'{query}' ? Je ne suis pas sûr de comprendre."
|
"Hmm, je n'ai pas saisi votre demande. Pouvez-vous préciser ?"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -231,21 +233,21 @@ class ResponseGenerator:
|
|||||||
CONTEXTUAL_SUGGESTIONS = {
|
CONTEXTUAL_SUGGESTIONS = {
|
||||||
"after_execute": [
|
"after_execute": [
|
||||||
"voir le statut",
|
"voir le statut",
|
||||||
"annuler",
|
"arrêter",
|
||||||
"liste des workflows"
|
"mes tâches"
|
||||||
],
|
],
|
||||||
"after_error": [
|
"after_error": [
|
||||||
"aide",
|
"aide",
|
||||||
"liste des workflows",
|
"mes tâches",
|
||||||
"réessayer"
|
"réessayer"
|
||||||
],
|
],
|
||||||
"after_list": [
|
"after_list": [
|
||||||
"exécuter un workflow",
|
"lancer une tâche",
|
||||||
"aide"
|
"aide"
|
||||||
],
|
],
|
||||||
"idle": [
|
"idle": [
|
||||||
"facturer client X",
|
"qu'est-ce que tu sais faire ?",
|
||||||
"liste des workflows",
|
"apprenez-moi",
|
||||||
"aide"
|
"aide"
|
||||||
],
|
],
|
||||||
"after_import": [
|
"after_import": [
|
||||||
@@ -334,7 +336,7 @@ class ResponseGenerator:
|
|||||||
Générer un message de progression.
|
Générer un message de progression.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
workflow_name: Nom du workflow
|
workflow_name: Nom de la tâche
|
||||||
progress: Pourcentage de progression
|
progress: Pourcentage de progression
|
||||||
step: Étape actuelle
|
step: Étape actuelle
|
||||||
current: Numéro de l'étape
|
current: Numéro de l'étape
|
||||||
@@ -348,11 +350,11 @@ class ResponseGenerator:
|
|||||||
filled = int(bar_length * progress / 100)
|
filled = int(bar_length * progress / 100)
|
||||||
bar = "█" * filled + "░" * (bar_length - filled)
|
bar = "█" * filled + "░" * (bar_length - filled)
|
||||||
|
|
||||||
message = f"**{workflow_name}** [{bar}] {progress}%\n\nÉtape {current}/{total}: {step}"
|
message = f"**{workflow_name}** [{bar}] {progress}%\n\nÉtape {current}/{total} : {step}"
|
||||||
|
|
||||||
return GeneratedResponse(
|
return GeneratedResponse(
|
||||||
message=message,
|
message=message,
|
||||||
suggestions=["annuler"] if progress < 100 else [],
|
suggestions=["arrêter"] if progress < 100 else [],
|
||||||
action_required=False,
|
action_required=False,
|
||||||
metadata={
|
metadata={
|
||||||
"workflow": workflow_name,
|
"workflow": workflow_name,
|
||||||
@@ -372,7 +374,7 @@ class ResponseGenerator:
|
|||||||
Générer un message de résultat d'exécution.
|
Générer un message de résultat d'exécution.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
workflow_name: Nom du workflow
|
workflow_name: Nom de la tâche
|
||||||
success: Succès ou échec
|
success: Succès ou échec
|
||||||
message: Message détaillé
|
message: Message détaillé
|
||||||
duration: Durée d'exécution en secondes
|
duration: Durée d'exécution en secondes
|
||||||
@@ -381,18 +383,14 @@ class ResponseGenerator:
|
|||||||
GeneratedResponse avec le résultat
|
GeneratedResponse avec le résultat
|
||||||
"""
|
"""
|
||||||
if success:
|
if success:
|
||||||
emoji = "✅"
|
response_message = f"C'est fait ! **{workflow_name}** s'est bien passé.\n\n{message}"
|
||||||
status = "terminé avec succès"
|
|
||||||
suggestions = self.CONTEXTUAL_SUGGESTIONS["idle"]
|
suggestions = self.CONTEXTUAL_SUGGESTIONS["idle"]
|
||||||
else:
|
else:
|
||||||
emoji = "❌"
|
response_message = f"Hmm, **{workflow_name}** n'a pas fonctionné.\n\n{message}"
|
||||||
status = "échoué"
|
|
||||||
suggestions = self.CONTEXTUAL_SUGGESTIONS["after_error"]
|
suggestions = self.CONTEXTUAL_SUGGESTIONS["after_error"]
|
||||||
|
|
||||||
response_message = f"{emoji} **{workflow_name}** {status}\n\n{message}"
|
|
||||||
|
|
||||||
if duration:
|
if duration:
|
||||||
response_message += f"\n\nDurée: {duration:.1f}s"
|
response_message += f"\n\nDurée : {duration:.1f}s"
|
||||||
|
|
||||||
return GeneratedResponse(
|
return GeneratedResponse(
|
||||||
message=response_message,
|
message=response_message,
|
||||||
@@ -446,7 +444,7 @@ class ResponseGenerator:
|
|||||||
template = random.choice(templates["not_found"])
|
template = random.choice(templates["not_found"])
|
||||||
query = result.get("query", intent.raw_query)
|
query = result.get("query", intent.raw_query)
|
||||||
message = template.format(query=query)
|
message = template.format(query=query)
|
||||||
suggestions = ["lister les workflows", "aide", "enregistrer un workflow"]
|
suggestions = ["mes tâches", "aide", "apprenez-moi"]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
template = random.choice(templates["error"])
|
template = random.choice(templates["error"])
|
||||||
@@ -764,7 +762,7 @@ class ResponseGenerator:
|
|||||||
suggestions = self.CONTEXTUAL_SUGGESTIONS["after_error"]
|
suggestions = self.CONTEXTUAL_SUGGESTIONS["after_error"]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
message = "Je n'ai pas compris la demande d'import. Précisez le fichier ou dites 'montre les tables'."
|
message = "Je n'ai pas compris votre demande. Précisez le fichier ou dites « montre les tables »."
|
||||||
suggestions = ["montre les tables", "aide"]
|
suggestions = ["montre les tables", "aide"]
|
||||||
|
|
||||||
return GeneratedResponse(
|
return GeneratedResponse(
|
||||||
@@ -788,7 +786,7 @@ class ResponseGenerator:
|
|||||||
|
|
||||||
return GeneratedResponse(
|
return GeneratedResponse(
|
||||||
message=message,
|
message=message,
|
||||||
suggestions=["aide", "liste des workflows"],
|
suggestions=["aide", "mes tâches"],
|
||||||
action_required=False
|
action_required=False
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user