import os import tiktoken from modules.logger import log_event # 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_local(prompt): """Compte localement les tokens pour estimer le coût de la requête.""" try: 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 verifier_et_deduire_credit_utilisateur(prompt, modele_id, utilisateur_nom, solde_actuel_utilisateur): """ 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. """ 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 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) # 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