From 3b2cf51a24ff831d5d106553d4e07f0af351bbfe Mon Sep 17 00:00:00 2001 From: Xavier Date: Fri, 28 Aug 2026 20:13:17 +0200 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20fonction=20RAG=20auto=20inc?= =?UTF-8?q?r=C3=A9mentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 8 ++++++++ modules/chat_handler.py | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/main.py b/main.py index 0ac71d6..a956f46 100644 --- a/main.py +++ b/main.py @@ -16,6 +16,7 @@ from modules.security import verifier_et_bloquer_vpn, journaliser_ip from modules.auth_manager import IDENTIFIANTS_ADMIN, verifier_mot_de_passe from modules.logger import log_event from modules.billing_manager import charger_soldes, sauvegarder_soldes +from modules.rag_manager import auto_apprendre_rag # Lancement du module d'auto-mise à jour en arrière-plan import modules.model_updater @@ -144,5 +145,12 @@ def post(cid: str): if cid_str in h: del h[cid_str]; save_history(h) return render_sidebar() +# --- NOUVELLE ROUTE POUR LE RAG (BOUTON MANUEL) --- +@rt('/api/forcer_rag') +def post(prompt: str, reponse: str, theme: str): + """Intercepte la demande manuelle, lance l'indexation et renvoie un badge vert.""" + auto_apprendre_rag(prompt, reponse, theme) + return Span("✅ Indexé", cls="msg-action-btn", style="background-color: #4caf50; color: white; border: none; cursor: default;") + if __name__ == '__main__': serve(port=5001) \ No newline at end of file diff --git a/modules/chat_handler.py b/modules/chat_handler.py index 123392d..351795f 100644 --- a/modules/chat_handler.py +++ b/modules/chat_handler.py @@ -5,6 +5,8 @@ import uuid import time import re import psutil +import threading +import requests from fasthtml.common import * from modules.database import load_history, save_history from modules.scraper import rechercher_sur_google, extraire_contenu_urls @@ -16,7 +18,25 @@ from modules.logger import log_event from modules.billing_manager import verifier_et_valider_budget, obtenir_solde from modules.rag_manager import rechercher_contexte_rag, auto_apprendre_rag from modules.moderator import analyser_intention_illicite, appliquer_sanction_et_archiver -from modules.ai_media import router_media # <--- IMPORT DU NOUVEAU MODULE +from modules.ai_media import router_media + +def evaluer_pertinence_pour_rag(prompt_utilisateur: str, reponse_ia: str) -> bool: + """Juge si la réponse est suffisamment technique/factuelle pour être indexée.""" + prompt_superviseur = f"""Tu es un bibliothécaire strict. Évalue si cet échange mérite d'être conservé. + Règle 1 : Si la réponse contient des infos factuelles, du code, des règles ou des configurations techniques, réponds UNIQUEMENT "OUI". + Règle 2 : Si c'est conversationnel, vague, ou une erreur, réponds UNIQUEMENT "NON". + Question : {prompt_utilisateur} + Réponse : {reponse_ia[:800]} + """ + try: + reponse = requests.post("http://172.19.0.1:11434/api/generate", json={ + "model": "llama3.1", # Modèle rapide local via Ollama + "prompt": prompt_superviseur, + "stream": False + }, timeout=10).json() + return "OUI" in reponse.get("response", "").strip().upper() + except Exception: + return False def check_and_update_resource_quota(utilisateur_nom, role_utilisateur): quota_file = "/DATA/AppData/MULTI-IA-AETHAS38/Utilisateurs/quotas_ressources.json" @@ -154,8 +174,16 @@ async def handle_chat_request(request, session): if "openrouter" in fournisseur_nom.lower() and mode_payant: verifier_et_valider_budget(full_prompt, modele, utilisateur_nom=utilisateur_nom, rang_utilisateur=role_utilisateur, multi_ia=mode_multi_ia) + # --- SUPERVISEUR IA EN ARRIÈRE-PLAN --- if thematique_rag != "aucun" and reponse: - auto_apprendre_rag(prompt, reponse, thematique_rag) + def superviseur_et_rag(p, r, t): + if evaluer_pertinence_pour_rag(p, r): + log_event("INFO", "SUPERVISEUR", f"Réponse validée. Indexation dans {t}") + auto_apprendre_rag(p, r, t) + else: + log_event("INFO", "SUPERVISEUR", "Échange ignoré pour le RAG (non pertinent).") + + threading.Thread(target=superviseur_et_rag, args=(prompt, reponse, thematique_rag)).start() if chat_id not in history: history[chat_id] = {"title": (prompt[:30] if prompt else "Discussion") + "...", "pinned": False, "timestamp": time.time(), "messages": []} @@ -164,6 +192,8 @@ async def handle_chat_request(request, session): display_msg = prompt.replace("[SYSTÈME] RÈGLE ÉDUCATION NATIONALE : Agis comme un expert de l'Éducation Nationale française. Pédagogie stricte, respect du B.O.\n\n", "") if file_names: display_msg += f"\n\n📎 **Fichiers joints :** {', '.join(file_names)}" + id_message_unique = str(uuid.uuid4()) + history[chat_id]["messages"].append({"role": "user", "content": display_msg}) history[chat_id]["messages"].append({ "role": "ai", @@ -173,11 +203,14 @@ async def handle_chat_request(request, session): "modele": modele, "couleur": couleur, "execution_time": execution_time, - "trace": trace_route + "trace": trace_route, + "prompt_associe": prompt, + "thematique": thematique_rag, + "msg_id": id_message_unique }) save_history(history) - return render_user_msg(display_msg), render_ai_msg(reponse, intention, fournisseur_nom, modele, couleur, execution_time), Script("renderMarkdown();"), render_sidebar() + return render_user_msg(display_msg), render_ai_msg(reponse, intention, fournisseur_nom, modele, couleur, execution_time, trace_route, prompt, thematique_rag, id_message_unique), Script("renderMarkdown();"), render_sidebar() except Exception as e: log_event("CRITICAL", "SYSTEM", f"Erreur : {e}")