Public Access
MAJ Globale : Chemins absolus (NAS), Model Updater auto, Timeout 90s OpenRouter, Pop-up et traçabilité financière
Build and Push Docker Image / build-and-push (push) Successful in 1m48s
Build and Push Docker Image / build-and-push (push) Successful in 1m48s
This commit is contained in:
1 parent
b4ed2947d4
commit
632c23069a
9 files changed
+66
-89
No files matched your search
+4
-47
@@ -1,10 +1,6 @@
|
||||
import os
|
||||
import json
|
||||
from datetime import date
|
||||
import uuid
|
||||
import time
|
||||
import re
|
||||
import psutil
|
||||
from fasthtml.common import *
|
||||
from modules.database import load_history, save_history
|
||||
from modules.scraper import rechercher_sur_google, extraire_contenu_urls
|
||||
@@ -17,41 +13,10 @@ 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
|
||||
|
||||
def check_and_update_resource_quota(utilisateur_nom, role_utilisateur):
|
||||
"""Vérifie si l'utilisateur a dépassé son quota quotidien d'utilisation intensive du serveur (>60%)."""
|
||||
quota_file = "/DATA/AppData/MULTI-IA-AETHAS38/Utilisateurs/quotas_ressources.json"
|
||||
today = str(date.today())
|
||||
|
||||
limites = {"super admin": 10, "admin": 10, "vip": 5, "famille": 5, "standard": 3}
|
||||
limite_max = limites.get(role_utilisateur.lower(), 3)
|
||||
|
||||
try:
|
||||
if os.path.exists(quota_file):
|
||||
with open(quota_file, "r") as f:
|
||||
data = json.load(f)
|
||||
else:
|
||||
data = {}
|
||||
except Exception:
|
||||
data = {}
|
||||
|
||||
if data.get("date") != today:
|
||||
data = {"date": today, "users": {}}
|
||||
|
||||
user_uses = data["users"].get(utilisateur_nom, 0)
|
||||
|
||||
if user_uses >= limite_max:
|
||||
return False # Quota dépassé
|
||||
|
||||
data["users"][utilisateur_nom] = user_uses + 1
|
||||
os.makedirs(os.path.dirname(quota_file), exist_ok=True)
|
||||
with open(quota_file, "w") as f:
|
||||
json.dump(data, f)
|
||||
|
||||
return True
|
||||
|
||||
async def handle_chat_request(request, session):
|
||||
start_time = time.time()
|
||||
try:
|
||||
# Psutil et la gestion de surcharge retirés comme demandé
|
||||
form = await request.form()
|
||||
prompt = form.get("prompt", "")
|
||||
chat_id = form.get("chat_id", str(uuid.uuid4()))
|
||||
@@ -65,7 +30,7 @@ async def handle_chat_request(request, session):
|
||||
if choix_utilisateur != "aucun":
|
||||
log_event("INFO", "BILLING", f"Décision utilisateur face au pop-up : {choix_utilisateur}")
|
||||
if choix_utilisateur == "gratuit_force":
|
||||
mode_payant = False # Le client a reculé devant le prix
|
||||
mode_payant = False
|
||||
|
||||
session["current_chat_id"] = chat_id
|
||||
history = load_history()
|
||||
@@ -74,16 +39,6 @@ async def handle_chat_request(request, session):
|
||||
role_utilisateur = "Super Admin" if utilisateur_nom.lower() == "xavier" else ("VIP" if utilisateur_nom.lower() in ["céline", "anaëlle", "renan", "audric"] else "standard")
|
||||
ip_client = request.client.host if request.client else "Inconnue"
|
||||
|
||||
# Protection CPU/RAM (60%) combinée au Quota Utilisateur
|
||||
cpu_usage = psutil.cpu_percent(interval=0.1)
|
||||
ram_usage = psutil.virtual_memory().percent
|
||||
if cpu_usage > 60.0 or ram_usage > 60.0:
|
||||
if not check_and_update_resource_quota(utilisateur_nom, role_utilisateur):
|
||||
log_event("WARNING", "SYSTEM", f"Surcharge (CPU: {cpu_usage}%, RAM: {ram_usage}%) + Quota intensif dépassé pour {utilisateur_nom}.")
|
||||
return Div(H3("⚠️ Limite de requêtes intensives atteinte", style="color:#ff9800;"), P(f"Le serveur est actuellement très sollicité (>60%). En tant que '{role_utilisateur}', vous avez épuisé votre quota de passages en force pour aujourd'hui."), style="background:#333; padding:15px; border-radius:10px; border: 1px solid #ff9800;")
|
||||
else:
|
||||
log_event("INFO", "SYSTEM", f"Serveur en charge (>60%), mais quota intensif autorisé utilisé par {utilisateur_nom}.")
|
||||
|
||||
est_illicite, raison = analyser_intention_illicite(prompt)
|
||||
if est_illicite:
|
||||
sanction = appliquer_sanction_et_archiver(utilisateur_nom, prompt, raison, ip_client)
|
||||
@@ -162,8 +117,10 @@ async def handle_chat_request(request, session):
|
||||
if prix_estime > obtenir_solde(utilisateur_nom):
|
||||
return Div(H3("❌ Solde Insuffisant", style="color:red;"), P("Veuillez recharger votre compte."), style="background:#300; padding:15px; border-radius:10px;")
|
||||
|
||||
# CRUCIAL : Transmission du chat_id à l'Engine
|
||||
reponse, couleur, fournisseur_nom, modele = executer_requete_ia(fournisseur, full_prompt, mode_payant=mode_payant, multi_ia=mode_multi_ia, chat_id=chat_id)
|
||||
|
||||
# Le paiement véritable s'exécute APRÈS la réponse de l'IA OpenRouter
|
||||
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)
|
||||
|
||||
|
||||
Reference in new issue
Block a user