Public Access
fix: Résolution de l'import circulaire, ajout des boutons UI et étiquetage Gitea
Build and Push Docker Image / build-and-push (push) Successful in 33s
Build and Push Docker Image / build-and-push (push) Successful in 33s
This commit is contained in:
1 parent
b20ce7e903
commit
34163a630c
5 files changed
+363
-29
No files matched your search
+32
-27
@@ -1,47 +1,52 @@
|
||||
import os
|
||||
import tiktoken
|
||||
from modules.logger import log_event
|
||||
|
||||
# Tarification indicative par token OpenRouter (à synchroniser avec l'API en temps réel)
|
||||
# Tarification indicative par token (À synchroniser avec OpenRouter)
|
||||
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
|
||||
"google/gemini-2.5-pro": 0.000005 # Exemple de modèle payant
|
||||
}
|
||||
|
||||
def compter_tokens_local(prompt):
|
||||
"""Compte localement les tokens pour estimer le coût de la requête."""
|
||||
def compter_tokens(texte, modele="cl100k_base"):
|
||||
"""Compte le nombre de tokens en local pour éviter les requêtes API inutiles."""
|
||||
try:
|
||||
enc = tiktoken.get_encoding("cl100k_base")
|
||||
return len(enc.encode(prompt))
|
||||
enc = tiktoken.get_encoding(modele)
|
||||
return len(enc.encode(texte))
|
||||
except Exception as e:
|
||||
log_event("ERROR", "BILLING", f"Erreur comptage tokens : {e}")
|
||||
log_event("ERROR", "BILLING", f"Erreur lors du comptage des tokens : {e}")
|
||||
return 0
|
||||
|
||||
def verifier_et_deduire_credit_utilisateur(prompt, modele_id, utilisateur_nom, solde_actuel_utilisateur):
|
||||
def estimer_cout_facture(prompt, modele_id):
|
||||
"""
|
||||
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.
|
||||
Calcule le coût de la requête.
|
||||
Applique la marge stricte de 15% pour générer le Prix Facture HT.
|
||||
"""
|
||||
utilisateurs_vip = ["xavier", "céline", "anaëlle", "renan", "audric"]
|
||||
|
||||
tokens = compter_tokens_local(prompt)
|
||||
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
|
||||
if cout_brut_api == 0.0:
|
||||
return 0.0
|
||||
|
||||
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.")
|
||||
# Application stricte de votre formule comptable
|
||||
prix_facture_ht = cout_brut_api / 0.85
|
||||
|
||||
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} $")
|
||||
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}")
|
||||
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, prix_facture_ht
|
||||
return True, cout_estime
|
||||
@@ -69,7 +69,10 @@ def render_main_page(chat_id):
|
||||
Div(
|
||||
A("+ Nouvelle discussion", href="/new_chat", cls="new-chat-btn"),
|
||||
A("💾 Exporter JSON", href="/export_json", target="_blank", cls="export-btn"),
|
||||
# Module de don modifiable par l'hébergeur
|
||||
render_paypal_donation_widget(),
|
||||
# Module inaltérable (Licence EULA Aethas38)
|
||||
A("❤️ Soutenir le créateur de ce projet", href="https://www.paypal.com/donate/?hosted_button_id=2B6T9UESCN2W6", target="_blank", style="margin-left: 10px; padding: 10px; background-color: #e2e8f0; color: #1a202c; border-radius: 5px; text-decoration: none; font-weight: bold; border: 1px solid #cbd5e0;"),
|
||||
cls="nav-buttons"
|
||||
),
|
||||
cls="sidebar-top"
|
||||
|
||||
Reference in new issue
Block a user