Public Access
Amélioration fonction RAG auto incrémentation
Build and Push Docker Image / build-and-push (push) Successful in 35s
Build and Push Docker Image / build-and-push (push) Successful in 35s
This commit is contained in:
1 parent
b88d693d69
commit
3b2cf51a24
2 files changed
+45
-4
No files matched your search
@@ -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.auth_manager import IDENTIFIANTS_ADMIN, verifier_mot_de_passe
|
||||||
from modules.logger import log_event
|
from modules.logger import log_event
|
||||||
from modules.billing_manager import charger_soldes, sauvegarder_soldes
|
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
|
# Lancement du module d'auto-mise à jour en arrière-plan
|
||||||
import modules.model_updater
|
import modules.model_updater
|
||||||
@@ -144,5 +145,12 @@ def post(cid: str):
|
|||||||
if cid_str in h: del h[cid_str]; save_history(h)
|
if cid_str in h: del h[cid_str]; save_history(h)
|
||||||
return render_sidebar()
|
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__':
|
if __name__ == '__main__':
|
||||||
serve(port=5001)
|
serve(port=5001)
|
||||||
+37
-4
@@ -5,6 +5,8 @@ import uuid
|
|||||||
import time
|
import time
|
||||||
import re
|
import re
|
||||||
import psutil
|
import psutil
|
||||||
|
import threading
|
||||||
|
import requests
|
||||||
from fasthtml.common import *
|
from fasthtml.common import *
|
||||||
from modules.database import load_history, save_history
|
from modules.database import load_history, save_history
|
||||||
from modules.scraper import rechercher_sur_google, extraire_contenu_urls
|
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.billing_manager import verifier_et_valider_budget, obtenir_solde
|
||||||
from modules.rag_manager import rechercher_contexte_rag, auto_apprendre_rag
|
from modules.rag_manager import rechercher_contexte_rag, auto_apprendre_rag
|
||||||
from modules.moderator import analyser_intention_illicite, appliquer_sanction_et_archiver
|
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):
|
def check_and_update_resource_quota(utilisateur_nom, role_utilisateur):
|
||||||
quota_file = "/DATA/AppData/MULTI-IA-AETHAS38/Utilisateurs/quotas_ressources.json"
|
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:
|
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)
|
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:
|
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:
|
if chat_id not in history:
|
||||||
history[chat_id] = {"title": (prompt[:30] if prompt else "Discussion") + "...", "pinned": False, "timestamp": time.time(), "messages": []}
|
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", "")
|
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)}"
|
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": "user", "content": display_msg})
|
||||||
history[chat_id]["messages"].append({
|
history[chat_id]["messages"].append({
|
||||||
"role": "ai",
|
"role": "ai",
|
||||||
@@ -173,11 +203,14 @@ async def handle_chat_request(request, session):
|
|||||||
"modele": modele,
|
"modele": modele,
|
||||||
"couleur": couleur,
|
"couleur": couleur,
|
||||||
"execution_time": execution_time,
|
"execution_time": execution_time,
|
||||||
"trace": trace_route
|
"trace": trace_route,
|
||||||
|
"prompt_associe": prompt,
|
||||||
|
"thematique": thematique_rag,
|
||||||
|
"msg_id": id_message_unique
|
||||||
})
|
})
|
||||||
save_history(history)
|
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:
|
except Exception as e:
|
||||||
log_event("CRITICAL", "SYSTEM", f"Erreur : {e}")
|
log_event("CRITICAL", "SYSTEM", f"Erreur : {e}")
|
||||||
|
|||||||
Reference in new issue
Block a user