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:39:38 +02:00
1 parent 8516dd824e
commit b68f475241
3 files changed
+134 -19

No files matched your search

+21 -17
View File
@@ -2,42 +2,46 @@ import os
import tiktoken
from modules.logger import log_event
# Table de tarification OpenRouter par token (à synchroniser ou mettre à jour)
# Tarification indicative par token OpenRouter (à synchroniser avec l'API en temps réel)
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
}
def compter_tokens(texte, modele="cl100k_base"):
"""Compte localement les tokens pour estimer le coût avant l'envoi."""
def compter_tokens_local(prompt):
"""Compte localement les tokens pour estimer le coût de la requête."""
try:
enc = tiktoken.get_encoding(modele)
return len(enc.encode(texte))
enc = tiktoken.get_encoding("cl100k_base")
return len(enc.encode(prompt))
except Exception as e:
log_event("ERROR", "BILLING", f"Erreur comptage tokens : {e}")
return 0
def estimer_et_valider_consommation(prompt, modele_id, solde_disponible_utilisateur, utilisateur_vip=False):
def verifier_et_deduire_credit_utilisateur(prompt, modele_id, utilisateur_nom, solde_actuel_utilisateur):
"""
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.
Vérifie si l'utilisateur a suffisamment de crédit.
Applique la marge de 15% (Prix_HT = Coût_API / 0.85) pour les non-VIP.
Bloque la requête si le solde est insuffisant.
"""
tokens = compter_tokens(prompt)
utilisateurs_vip = ["xavier", "céline", "anaëlle", "renan", "audric"]
tokens = compter_tokens_local(prompt)
cout_brut_api = tokens * TARIFS_OPENROUTER.get(modele_id, 0.0)
if cout_brut_api <= 0.0:
return True, 0.0 # Gratuit
# Application de votre règle de marge commerciale (15%)
if utilisateur_nom.lower() in utilisateurs_vip:
log_event("INFO", "BILLING", f"Utilisateur VIP ({utilisateur_nom}) : Aucun prélèvement de marge ni de crédit.")
return True, 0.0
# Application de la règle comptable de marge (15% de marge brute)
prix_facture_ht = round(cout_brut_api / 0.85, 6)
if utilisateur_vip:
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}")
# Sécurité absolue : Empêche l'utilisateur de dépenser plus que son crédit versé
if solde_actuel_utilisateur < prix_facture_ht:
log_event("WARNING", "BILLING", f"Rejet requête pour {utilisateur_nom} : Solde insuffisant ({solde_actuel_utilisateur}$ < {prix_facture_ht}$).")
raise Exception(f"SOLDE_INSUFFISANT|{prix_facture_ht}|{solde_actuel_utilisateur}")
return True, prix_facture_ht