feat: Intégration du gestionnaire financier strict et sécurisation des crédits utilisateur
Build and Push Docker Image / build-and-push (push) Canceled after 0s

This commit is contained in:
xavier committed 2026-08-18 20:31:09 +02:00
1 parent 6dd64283ea
commit 8516dd824e
4 files changed
+196 -28

No files matched your search

+18 -27
View File
@@ -1,52 +1,43 @@
import os
import tiktoken
from modules.logger import log_event
# Tarification indicative par token (À synchroniser avec OpenRouter)
# Table de tarification OpenRouter par token (à synchroniser ou mettre à jour)
TARIFS_OPENROUTER = {
"meta-llama/llama-3.1-8b-instruct:free": 0.0,
"qwen/qwen-2.5-coder-32b-instruct:free": 0.0,
"google/gemini-2.5-pro": 0.000005 # Exemple de modèle payant
"google/gemini-2.5-pro": 0.000005
}
def compter_tokens(texte, modele="cl100k_base"):
"""Compte le nombre de tokens en local pour éviter les requêtes API inutiles."""
"""Compte localement les tokens pour estimer le coût avant l'envoi."""
try:
enc = tiktoken.get_encoding(modele)
return len(enc.encode(texte))
except Exception as e:
log_event("ERROR", "BILLING", f"Erreur lors du comptage des tokens : {e}")
log_event("ERROR", "BILLING", f"Erreur comptage tokens : {e}")
return 0
def estimer_cout_facture(prompt, modele_id):
def estimer_et_valider_consommation(prompt, modele_id, solde_disponible_utilisateur, utilisateur_vip=False):
"""
Calcule le coût de la requête.
Applique la marge stricte de 15% pour générer le Prix Facture HT.
Simule le coût de la requête, applique la majoration de marge (15% via / 0.85)
et vérifie que l'utilisateur possède un solde suffisant.
"""
tokens = compter_tokens(prompt)
cout_brut_api = tokens * TARIFS_OPENROUTER.get(modele_id, 0.0)
if cout_brut_api == 0.0:
return 0.0
if cout_brut_api <= 0.0:
return True, 0.0 # Gratuit
# Application stricte de votre formule comptable
prix_facture_ht = cout_brut_api / 0.85
# Application de votre règle de marge commerciale (15%)
prix_facture_ht = round(cout_brut_api / 0.85, 6)
return round(prix_facture_ht, 6)
def verifier_et_valider_budget(prompt, modele_id, utilisateur_vip=False):
"""
Fonction appelée avant chaque requête par le Chat Handler.
Si le coût > 0 et que l'utilisateur n'a pas explicitement validé, on stoppe tout.
"""
cout_estime = estimer_cout_facture(prompt, modele_id)
# Les VIP ne paient pas de marge, on affiche juste le coût brut pour information
if utilisateur_vip:
log_event("INFO", "BILLING", f"Utilisateur VIP. Coût brut estimé de la requête : {cout_estime * 0.85} $")
log_event("INFO", "BILLING", f"Utilisateur VIP : Pas de prélèvement de marge.")
return True, 0.0
# Vérification stricte du solde
if solde_disponible_utilisateur < prix_facture_ht:
raise Exception(f"SOLDE_INSUFFISANT|{prix_facture_ht}|{solde_disponible_utilisateur}")
if cout_estime > 0.0:
# Lève une exception spécifique que l'interface FastHTML devra attraper pour afficher le pop-up
raise Exception(f"VALIDATION_PAIEMENT_REQUISE|{cout_estime}")
return True, cout_estime
return True, prix_facture_ht