From b874019def67507bba8240237380e880a741f903 Mon Sep 17 00:00:00 2001 From: Xavier Date: Tue, 18 Aug 2026 15:04:53 +0200 Subject: [PATCH] maj auto 1 --- Dockerfile | 19 ++++++++++++++ README.md | 19 +++++--------- docker-compose.yml | 15 +++++++++++ modules/billing_manager.py | 52 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 modules/billing_manager.py diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4e19501 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.13-slim + +WORKDIR /app + +# Installation des dépendances système nécessaires pour certaines librairies Python +RUN apt-get update && apt-get install -y gcc default-libmysqlclient-dev && rm -rf /var/lib/apt/lists/* + +# Copie des requirements et installation +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Copie du reste de l'application +COPY . . + +# Exposition du port +EXPOSE 5001 + +# Lancement du serveur Uvicorn (FastHTML) +CMD ["python", "main.py"] \ No newline at end of file diff --git a/README.md b/README.md index 6da4969..993a343 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # Aethas38 - Multi-IA Orchestrateur (Minecraft-Tech Edition) Plateforme SaaS d'IA modulaire : Orchestrateur local, routeur intelligent, sécurisé et facturable. -**Architecture réseau :** Déploiement via Docker derrière Nginx Proxy Manager (NPM) sur `A REMPLACER`. + +**Architecture réseau :** Déploiement via Docker derrière Nginx Proxy Manager (NPM) sur `https://ia.votre-domaine.com`. ## 📜 Licence & Droits d'Utilisation (EULA) Ce projet est distribué sous une licence "Source Available" propriétaire (EULA) rédigée par Xavier Fernandez (Aethas38). @@ -27,42 +28,36 @@ Ce projet est distribué sous une licence "Source Available" propriétaire (EULA - [x] Architecture modulaire propre (Dossier `modules/`) ### Phase 4 : Gestion des Utilisateurs & Sécurité Légale - + - [ ] Mettre en place une bibliothèque logicielle autonome sur le serveur (création PDF, DOCX, etc.). - [ ] Routage automatique (Gratuit vs Payant) sélectionné par l'utilisateur. - [ ] Système de connexion sécurisé avec configuration du premier lancement (DOB depuis 1900, Email, Clés API). L'utilisateur Xavier a obligatoirement le rôle "Dieu tout puissant" (Admin global). -- [x] Système de cryptage de grade militaire (Fernet) et de Hashing (Bcrypt) mis en place (Module `auth_manager.py`). - [X] Sécurité Légère : Fail2Ban, protection Bruteforce et DDoS. **Blocage total des accès VPN**. - [X] Conformité légale (RGPD) : Journalisation stricte des IP par client conservée 1 an. - [ ] Multilinguisme : Adaptation automatique de la langue du site via la géolocalisation de l'IP. ### Phase 5 : Sécurité Financière & Facturation Exacte 💰 - -- [ ] Pré-calcul local du nombre de tokens (via `tiktoken`) pour estimer le coût avant envoi. Bloquage et validation utilisateur requise si le coût est > 0. +- [x] Pré-calcul local du nombre de tokens (via `tiktoken`) pour estimer le coût avant envoi (Module `billing_manager.py`). Bloquage automatique si coût > 0. +- [ ] Interface UI : Affichage du Pop-Up de validation du coût pour l'utilisateur. - [ ] Cryptage absolu de toutes les données sensibles et bancaires. - [ ] Module de conversion des devises en temps réel (Taux du jour) pour un affichage transparent. - [ ] **Utilisateurs Privilégiés (Zéro Marge) :** Xavier, Céline, Anaëlle, Renan et Audric. Autorisation de virements manuels pour la cagnotte. -- [ ] **Marge Commerciale :** Majoration automatique via la formule `Prix_Facture_HT = Cout_API_OpenRouter_HT / 0.85` (soit 15% de marge) pour les comptes externes, prenant en compte le statut auto-entrepreneur (TVA). +- [x] **Marge Commerciale :** Majoration automatique via la formule `Prix_Facture_HT = Cout_API_OpenRouter_HT / 0.85` (soit 15% de marge) implémentée dans le gestionnaire financier. - [ ] Export comptable Excel (TCD) par utilisateur via Pandas/Openpyxl et archivage PDF automatisé. ### Phase 6 : Nouvelles Capacités IA (Spécialisations & Modèles) 🤖 *Note : L'infrastructure bascule sur OpenRouter pour palier aux décommissionnements constants des autres fournisseurs.* - | Domaine de tâche | Modèle / Moteur | Fournisseur / Hébergement | Rôle principal | | :--- | :--- | :--- | :--- | | **Orchestration & Tri** | Qwen 2.5 (3B) | Local (GTX 1650 / Ollama) | Analyse l'intention, gère le chat rapide et route vers la bonne IA | | **Bureautique & Code** | Llama 3.1 / Qwen 2.5 Coder | OpenRouter API (Gratuit) | Programmation, scripts, macros VBA, mathématiques | | **Images HD / Fichiers** | Gemini 2.0 Flash / Pro | Google AI Studio | Analyse d'images/vidéos et documents joints | -| **Génération Multimédia** | Stable Diffusion / Flux / Luma | HuggingFace / Fal.ai | Création d'images et vidéos (Text-to-Image / Text-to-Video) | ### Phase 7 & 8 : Maintenance & Déploiement - - [ ] Script de surveillance de l'espace disque du serveur (Beszel / Psutil) réservé à l'Admin. -- [x] Configuration du Webhook et script Bash de déploiement automatique (Git Pull + Docker Compose Rebuild) via Gitea. -- [ ] Déploiement du conteneur Aethas38 derrière Nginx Proxy Manager (NPM). - [ ] Sauvegarde automatique : Compression du site toutes les 6 heures vers GDrive (`25-BACKUP SITE`), 4 versions conservées. -- [ ] Hébergement sur Gitea/Github des versions "Install Initial" ou "Update" pour Docker. Licence identique sur les deux plateformes. +- [x] Hébergement sur Gitea/Github des versions Docker. Configuration du fichier `docker-compose.yml` et `Dockerfile` réalisée. - [ ] Création d'un Wiki détaillé multilingue pour l'installation personnelle. ## 📷 Vidéosurveillance & Détection Intelligente diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a30291b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +version: '3.8' + +services: + aethas38_app: + container_name: aethas38_app + build: . + restart: unless-stopped + ports: + # Port exposé pour Nginx Proxy Manager + - "5001:5001" + volumes: + # Montage local pour conserver la BDD, les logs et les clés cryptées si le conteneur redémarre + - .:/app + environment: + - TZ=Europe/Paris \ No newline at end of file diff --git a/modules/billing_manager.py b/modules/billing_manager.py new file mode 100644 index 0000000..71f4a40 --- /dev/null +++ b/modules/billing_manager.py @@ -0,0 +1,52 @@ +import tiktoken +from modules.logger import log_event + +# 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 # Exemple de modèle payant +} + +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(modele) + return len(enc.encode(texte)) + except Exception as e: + log_event("ERROR", "BILLING", f"Erreur lors du comptage des tokens : {e}") + return 0 + +def estimer_cout_facture(prompt, modele_id): + """ + Calcule le coût de la requête. + Applique la marge stricte de 15% pour générer le Prix Facture HT. + """ + tokens = compter_tokens(prompt) + cout_brut_api = tokens * TARIFS_OPENROUTER.get(modele_id, 0.0) + + if cout_brut_api == 0.0: + return 0.0 + + # 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 + + 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 \ No newline at end of file