This commit is contained in:
2026-04-27 15:50:17 +02:00
parent 410f1acd5d
commit 7fb709811c

76
app.py
View File

@@ -179,6 +179,20 @@ def detecter_action_directe(texte):
texte_nettoye = texte.strip() texte_nettoye = texte.strip()
texte_min = texte_nettoye.lower() texte_min = texte_nettoye.lower()
clients_a_ajouter = extraire_liste_clients(texte_nettoye)
if clients_a_ajouter:
return {
"actions": [
{
"action": "ajouter_client",
"nom": nom,
"notes": "Ajoute depuis une liste dictee par Laurent.",
"statut": "actif",
}
for nom in clients_a_ajouter
]
}
recherche_match = re.search( recherche_match = re.search(
r"(?:qu(?:'| )?est[- ]?ce que tu sais sur|que sais[- ]?tu sur|cherche dans la memoire|memoire sur)\s+(.+)", r"(?:qu(?:'| )?est[- ]?ce que tu sais sur|que sais[- ]?tu sur|cherche dans la memoire|memoire sur)\s+(.+)",
texte_nettoye, texte_nettoye,
@@ -247,6 +261,61 @@ def detecter_action_directe(texte):
return {"actions": actions} return {"actions": actions}
def extraire_liste_clients(texte):
if not re.search(r"\bclients?\b", texte, flags=re.IGNORECASE):
return []
if not re.search(r"\b(voici|liste|note|notes|noter|memorise|ajoute|ajoutes)\b", texte, flags=re.IGNORECASE):
return []
lignes = [ligne.strip(" -\t\r.,;") for ligne in texte.splitlines()]
candidats = []
apres_entete = False
for ligne in lignes:
if not ligne:
continue
ligne_min = ligne.lower()
if "client" in ligne_min:
apres_entete = True
apres_deux_points = ligne.split(":", 1)[1].strip() if ":" in ligne else ""
if apres_deux_points:
candidats.extend(separer_noms_clients(apres_deux_points))
continue
if not apres_entete:
continue
if re.search(r"\b(note|notes|noter|quelque part|merci|stp|s'il te plait)\b", ligne_min):
continue
candidats.extend(separer_noms_clients(ligne))
noms = []
deja_vus = set()
for candidat in candidats:
nom = nettoyer_nom_client(candidat)
if not nom:
continue
cle = nom.lower()
if cle not in deja_vus:
noms.append(nom)
deja_vus.add(cle)
return noms
def separer_noms_clients(texte):
morceaux = re.split(r"[,;/]|\s+\bet\b\s+", texte)
return [morceau.strip() for morceau in morceaux if morceau.strip()]
def nettoyer_nom_client(nom):
nom = nom.strip(" -\t\r.,;:")
if not nom or len(nom) < 2:
return ""
if re.search(r"\b(liste|clients?|voici|note|notes|noter|quelque|part)\b", nom, flags=re.IGNORECASE):
return ""
if len(nom.split()) > 4:
return ""
return nom
def transcrire_audio(fichier): def transcrire_audio(fichier):
suffix = Path(fichier.filename or "voice.webm").suffix or ".webm" suffix = Path(fichier.filename or "voice.webm").suffix or ".webm"
with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as tmp: with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as tmp:
@@ -375,15 +444,22 @@ def executer_actions(action_data):
"memorySaved": False, "memorySaved": False,
"memoryRead": False, "memoryRead": False,
} }
actions_executees = []
for action in actions: for action in actions:
if not isinstance(action, dict): if not isinstance(action, dict):
continue continue
reponse, action_flags = executer_action(action) reponse, action_flags = executer_action(action)
actions_executees.append(action)
if reponse: if reponse:
reponses.append(reponse) reponses.append(reponse)
for cle in flags: for cle in flags:
flags[cle] = flags[cle] or bool(action_flags.get(cle)) flags[cle] = flags[cle] or bool(action_flags.get(cle))
if actions_executees and all(action.get("action") == "ajouter_client" for action in actions_executees):
noms = [action.get("nom", "").strip() for action in actions_executees if action.get("nom", "").strip()]
if len(noms) > 1:
return f"C'est note : {len(noms)} clients ajoutes ({', '.join(noms)}).", flags
return " ".join(reponses), flags return " ".join(reponses), flags