Public Access
43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
import os
|
|
import tiktoken
|
|
from modules.logger import log_event
|
|
|
|
# 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
|
|
}
|
|
|
|
def compter_tokens(texte, modele="cl100k_base"):
|
|
"""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 comptage tokens : {e}")
|
|
return 0
|
|
|
|
def estimer_et_valider_consommation(prompt, modele_id, solde_disponible_utilisateur, utilisateur_vip=False):
|
|
"""
|
|
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 True, 0.0 # Gratuit
|
|
|
|
# Application de votre règle de marge commerciale (15%)
|
|
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}")
|
|
|
|
return True, prix_facture_ht |