Public Access
This commit is contained in:
1 parent
1424cb7ab4
commit
1eb619a50b
3 files changed
+185
-55
No files matched your search
+2
-1
@@ -8,4 +8,5 @@ Echange GEMINY.txt
|
|||||||
aethas_logs.txt
|
aethas_logs.txt
|
||||||
Important/
|
Important/
|
||||||
ARCHIVAGE ECHANGE GEMINY.txt
|
ARCHIVAGE ECHANGE GEMINY.txt
|
||||||
test financier/
|
test financier/
|
||||||
|
SAVE/
|
||||||
@@ -1,81 +1,87 @@
|
|||||||
# Aethas38 - Multi-IA Orchestrateur (Minecraft-Tech Edition)
|
# Aethas38 - Multi-IA Orchestrateur (Minecraft-Tech Edition)
|
||||||
|
|
||||||
Plateforme SaaS d'IA modulaire : Orchestrateur local, routeur intelligent, sécurisé et facturable.
|
Plateforme SaaS d'IA modulaire : Orchestrateur local, routeur intelligent, sécurisé et facturable[cite: 13].
|
||||||
<!-- MAJ 23/08/2026 : URL de production masquée pour raisons de cybersécurité (Information Disclosure) -->
|
<!-- MAJ 23/08/2026 : URL de production masquée pour raisons de cybersécurité (Information Disclosure) -->
|
||||||
**Architecture réseau :** Déploiement via Docker derrière Nginx Proxy Manager (NPM) sur `https://ia.votre-domaine.com`. Timeout proxy ajusté à 300s pour le calcul lourd.
|
**Architecture réseau :** Déploiement via Docker derrière Nginx Proxy Manager (NPM) sur `https://ia.votre-domaine.com`[cite: 13]. Timeout proxy ajusté à 300s pour le calcul lourd[cite: 13].
|
||||||
|
|
||||||
## 📜 Licence & Droits d'Utilisation (EULA)
|
## 📜 Licence & Droits d'Utilisation (EULA)
|
||||||
Ce projet est distribué sous une licence "Source Available" propriétaire (EULA) rédigée par Xavier Fernandez (Aethas38).
|
Ce projet est distribué sous une licence "Source Available" propriétaire (EULA) rédigée par Xavier Fernandez (Aethas38)[cite: 13].
|
||||||
* **Modifications & Partage :** Les utilisateurs sont autorisés à modifier et améliorer le code, à condition de partager ces améliorations avec la communauté.
|
* **Modifications & Partage :** Les utilisateurs sont autorisés à modifier et améliorer le code, à condition de partager ces améliorations avec la communauté[cite: 13].
|
||||||
* **Restrictions strictes :** Il est **strictement interdit** de modifier ou supprimer les crédits de l'auteur originel, de retirer le module de dons dédié au créateur, ou de désactiver la télémétrie de sécurité. L'installation requiert l'acceptation explicite de ces termes.
|
* **Restrictions strictes :** Il est **strictement interdit** de modifier ou supprimer les crédits de l'auteur originel, de retirer le module de dons dédié au créateur, ou de désactiver la télémétrie de sécurité[cite: 13]. L'installation requiert l'acceptation explicite de ces termes[cite: 13].
|
||||||
* **Donations obligatoires :** Le système intègre nativement deux modules de dons. L'un est modifiable par l'hébergeur du projet. L'autre (marqué "Soutenir le créateur de ce projet") est inaltérable et relié directement au créateur originel.
|
* **Donations obligatoires :** Le système intègre nativement deux modules de dons[cite: 13]. L'un est modifiable par l'hébergeur du projet[cite: 13]. L'autre (marqué "Soutenir le créateur de ce projet") est inaltérable et relié directement au créateur originel[cite: 13].
|
||||||
|
|
||||||
## ⚠️ Pré-requis Matériels (Important)
|
## ⚠️ Pré-requis Matériels (Important)
|
||||||
Pour fonctionner de manière optimale, l'Orchestrateur Local nécessite au minimum **une carte graphique avec 4 Go de VRAM dédiée** (ex: GTX 1650). Il est possible de configurer l'application pour utiliser le CPU, mais les performances seront considérablement réduites. **L'auteur décline toute responsabilité en cas de surcharge matérielle liée à une utilisation CPU intensive.**
|
Pour fonctionner de manière optimale, l'Orchestrateur Local nécessite au minimum **une carte graphique avec 4 Go de VRAM dédiée** (ex: GTX 1650)[cite: 13]. Il est possible de configurer l'application pour utiliser le CPU, mais les performances seront considérablement réduites[cite: 13]. **L'auteur décline toute responsabilité en cas de surcharge matérielle liée à une utilisation CPU intensive[cite: 13].**
|
||||||
|
|
||||||
## 📋 To-Do List (Roadmap)
|
## 📋 To-Do List (Roadmap)
|
||||||
|
|
||||||
### Phase 1 & 2 : Infrastructure & Backend de Base ✅
|
### Phase 1 & 2 : Infrastructure & Backend de Base ✅
|
||||||
- [x] Installation Docker, Nginx (NPM), Pare-feu, Gitea/GitHub
|
- [x] Installation Docker, Nginx (NPM), Pare-feu, Gitea/GitHub[cite: 13]
|
||||||
- [x] Serveur Local Ollama (Abliterated 3B) + FastHTML
|
- [x] Serveur Local Ollama (Abliterated 3B) + FastHTML[cite: 13]
|
||||||
- [x] Routeur Multi-IA (OpenRouter, Gemini, Local) avec système de cascade et directives d'aiguillage strictes
|
- [x] Routeur Multi-IA (OpenRouter, Gemini, Local) avec système de cascade et directives d'aiguillage strictes[cite: 13]
|
||||||
- [x] Continuité de service : IA de secours automatique et Timeout à 300s.
|
- [x] Continuité de service : IA de secours automatique et Timeout à 300s[cite: 13].
|
||||||
|
|
||||||
### Phase 3 : Refonte UI & Expérience Utilisateur ✅
|
### Phase 3 : Refonte UI & Expérience Utilisateur ✅
|
||||||
- [x] Thème "Minecraft-Tech" (Inspiré serveurs/redstone) compatible Mobile (Responsive / Contraste OLED élevé)
|
- [x] Thème "Minecraft-Tech" (Inspiré serveurs/redstone) compatible Mobile (Responsive / Contraste OLED élevé)[cite: 13]
|
||||||
- [x] Historique (Sidebar) avec Renommage, Épinglage, Suppression et Navigation isolée par session
|
- [x] Historique (Sidebar) avec Renommage, Épinglage, Suppression et Navigation isolée par session[cite: 13]
|
||||||
- [x] Zone de saisie intelligente (Drag & Drop, Collage multi-fichiers)
|
- [x] Zone de saisie intelligente (Drag & Drop, Collage multi-fichiers)[cite: 13]
|
||||||
- [x] Export modulaire et propre (PDF, DOC, TXT, JSON, ZIP)
|
- [x] Export modulaire et propre (PDF, DOC, TXT, JSON, ZIP)[cite: 13]
|
||||||
- [x] Boutons de partage direct (WhatsApp, Email) et Déconnexion.
|
- [x] Boutons de partage direct (WhatsApp, Email) et Déconnexion[cite: 13].
|
||||||
- [x] Indicateur d'avancement dynamique (Loader Néon) pendant le traitement des IA.
|
- [x] Indicateur d'avancement dynamique (Loader Néon) pendant le traitement des IA[cite: 13].
|
||||||
- [x] Transparence du Routage : Affichage visuel (Badges) du parcours multi-IA (Succès, Échecs, Erreurs 404/503) pour chaque requête.
|
- [x] Transparence du Routage : Affichage visuel (Badges) du parcours multi-IA (Succès, Échecs, Erreurs 404/503) pour chaque requête[cite: 13].
|
||||||
|
|
||||||
### Phase 4 : Gestion des Utilisateurs & Sécurité Légale
|
### 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.).
|
- [ ] Mettre en place une bibliothèque logicielle autonome sur le serveur (création PDF, DOCX, etc.)[cite: 13].
|
||||||
- [x] Routage automatique (Gratuit vs Payant) sélectionné par l'utilisateur avec solution de repli.
|
- [x] Routage automatique (Gratuit vs Payant) sélectionné par l'utilisateur avec solution de repli[cite: 13].
|
||||||
- [x] Système de cryptage de grade militaire (Fernet) et de Hashing (Bcrypt) mis en place.
|
- [x] Système de cryptage de grade militaire (Fernet) et de Hashing (Bcrypt) mis en place[cite: 13].
|
||||||
- [X] Sécurité Légère : Fail2Ban, protection Bruteforce et DDoS. **Blocage total des accès VPN**. Ping silencieux.
|
- [x] Sécurité Légère : Fail2Ban, protection Bruteforce et DDoS[cite: 13]. **Blocage total des accès VPN**[cite: 13]. Ping silencieux[cite: 13].
|
||||||
- [X] Conformité légale (LCEN/RGPD) : Création de dossiers utilisateurs isolés. Journalisation stricte des IP et de l'activité conservée 365 jours. Purge automatique des comptes inactifs > 1 an.
|
- [x] Conformité légale (LCEN/RGPD) : Création de dossiers utilisateurs isolés[cite: 13]. Journalisation stricte des IP et de l'activité conservée 365 jours[cite: 13]. Purge automatique des comptes inactifs > 1 an[cite: 13].
|
||||||
- [ ] Multilinguisme : Adaptation automatique de la langue du site via la géolocalisation de l'IP.
|
- [ ] Multilinguisme : Adaptation automatique de la langue du site via la géolocalisation de l'IP[cite: 13].
|
||||||
|
- [ ] Cadre Légal (SaaS) : Rédaction ASAP des CGV (crédits non-remboursables, facturation de tokens, gestion des litiges) et CGU (interdiction de contenus illicites, logs IP conservés 1 an, politiques de confidentialité Google/OpenRouter).
|
||||||
|
- [ ] Notifications SMTP : Intégration de `debug_mailer.py` via un service transactionnel (Brevo/SendGrid) pour l'envoi automatisé des CGU/CGV, confirmations d'inscription, alertes de quotas RAG et reçus.
|
||||||
|
- [ ] Audit de Sécurité Global : Isolation stricte des historiques utilisateurs dans des fichiers JSON distincts, sécurisation `.gitignore` des clés (API/SMTP), vérification de l'étanchéité web des volumes `/DATA/AppData/`, et tests anti-injection de prompts sur le Superviseur IA.
|
||||||
|
|
||||||
### Phase 5 : Sécurité Financière & Facturation Exacte 💰
|
### Phase 5 : Sécurité Financière & Facturation Exacte 💰
|
||||||
- [x] Pré-calcul local du nombre de tokens (via `tiktoken`) pour estimer le coût avant envoi.
|
- [x] Pré-calcul local du nombre de tokens (via `tiktoken`) pour estimer le coût avant envoi[cite: 13].
|
||||||
- [x] Catalogue tarifaire dynamique (mise à jour auto) supprimant les coûts écrits en dur.
|
- [x] Catalogue tarifaire dynamique (mise à jour auto) supprimant les coûts écrits en dur[cite: 13].
|
||||||
- [x] Affichage du Pop-Up OBLIGATOIRE de validation du coût pour TOUS les utilisateurs.
|
- [x] Affichage du Pop-Up OBLIGATOIRE de validation du coût pour TOUS les utilisateurs[cite: 13].
|
||||||
- [x] Télémétrie Admin : Suivi en temps réel de la consommation (Jour/Mois) et du solde restant sur l'API distante.
|
- [x] Télémétrie Admin : Suivi en temps réel de la consommation (Jour/Mois) et du solde restant sur l'API distante[cite: 13].
|
||||||
- [ ] Module de conversion des devises en temps réel (Taux du jour) pour un affichage transparent.
|
- [x] Module de conversion des devises en temps réel (API Frankfurter) pour un affichage transparent.
|
||||||
- [ ] **Utilisateurs Privilégiés (Zéro Marge) :** A définir par Admin/Super Admin.
|
- [x] **Utilisateurs Privilégiés (Zéro Marge) :** Application de tarifs coûtants pour les rôles Super Admin (Xavier), Admin (Céline) et Famille (Audric, Renan, Anaëlle). Marge appliquée pour VIP (7.5%) et Standard (15%).
|
||||||
- [x] **Marge Commerciale :** Majoration automatique via la formule `Prix_Facture_HT = Cout_API_OpenRouter_HT / x.xx`.
|
- [x] Export comptable Excel (TCD) par utilisateur via Pandas/Openpyxl (Optimisé pour les déclarations URSSAF)[cite: 13].
|
||||||
- [x] Export comptable Excel (TCD) par utilisateur via Pandas/Openpyxl (Optimisé pour les déclarations URSSAF).
|
- [ ] Subventions & Accompagnement : Lancement des dossiers de financement d'infrastructure auprès de la CCI Nord Isère (Pass Création), BPI France (Bourse French Tech jusqu'à 30k€), et demande d'ACRE à l'URSSAF.
|
||||||
|
|
||||||
### Phase 6 : Nouvelles Capacités IA (Spécialisations & Modèles) 🤖
|
### Phase 6 : Nouvelles Capacités IA (Spécialisations & Modèles) 🤖
|
||||||
*L'infrastructure bascule sur un catalogue dynamique mis à jour toutes les 2h pour pallier les décommissionnements.*
|
*L'infrastructure bascule sur un catalogue dynamique mis à jour toutes les 2h pour pallier les décommissionnements[cite: 13].*
|
||||||
*Filtrage actif des modèles OpenRouter restreints (ex: Politiques de confidentialité strictes ignorées).*
|
*Filtrage actif des modèles OpenRouter restreints (ex: Politiques de confidentialité strictes ignorées)[cite: 13].*
|
||||||
|
|
||||||
| Domaine de tâche | Modèle / Moteur | Fournisseur / Hébergement | Rôle principal |
|
| Domaine de tâche | Modèle / Moteur | Fournisseur / Hébergement | Rôle principal |
|
||||||
| :--- | :--- | :--- | :--- |
|
| :--- | :--- | :--- | :--- |
|
||||||
| **Orchestration & Tri** | Llama 3.2 3B Instruct Abliterated | Local (GTX 1650 4Go) | Analyse l'intention, juge de sécurité sans censure et route vers la bonne IA |
|
| **Orchestration & Tri** | Llama 3.2 3B Instruct Abliterated | Local (GTX 1650 4Go) | Analyse l'intention, juge de sécurité sans censure et route vers la bonne IA[cite: 13] |
|
||||||
| **Bureautique & Code** | Catalogue Dynamique (ex: Sonnet 3.5) | OpenRouter | Programmation KubeJS, scripts, mathématiques |
|
| **Bureautique & Code** | Catalogue Dynamique (ex: Sonnet 3.5) | OpenRouter | Programmation KubeJS, scripts, mathématiques[cite: 13] |
|
||||||
| **Images HD / Fichiers** | Gemini / Vision | Google API | Analyse d'images/vidéos et documents joints |
|
| **Images HD / Fichiers** | Gemini / Vision | Google API | Analyse d'images/vidéos et documents joints[cite: 13] |
|
||||||
|
|
||||||
### Phase 7 & 8 : Maintenance & Déploiement
|
### Phase 7 & 8 : Maintenance & Déploiement
|
||||||
- [ ] Script de surveillance de l'espace disque du serveur réservé à l'Admin.
|
- [x] Script de surveillance de l'espace disque du serveur avec sonde en direct et remontée d'alerte UI.
|
||||||
- [ ] File d'attente asynchrone (Queue List) et Timer en temps réel pour gérer la charge serveur.
|
- [x] Sauvegarde automatique asynchrone : Compression du site toutes les 6 heures et export vers GDrive via `rclone` et CRON.
|
||||||
- [ ] Sauvegarde automatique : Compression du site toutes les 6 heures vers un GDrive.
|
- [x] Hébergement Gitea Docker[cite: 13]. Injection des clés via `env_file`[cite: 13]. Volumes persistants configurés[cite: 13].
|
||||||
- [x] Hébergement Gitea Docker. Injection des clés via `env_file`. Volumes persistants configurés.
|
- [x] Persistance absolue et sécurité : Fichiers d'historique, logs, facturation et dossiers RAG isolés sur volume RAID mdadm externe[cite: 13].
|
||||||
- [x] Persistance absolue et sécurité : Fichiers d'historique, logs, facturation et dossiers RAG isolés sur volume RAID mdadm externe.
|
- [x] Synchronisation temporelle : Conteneurs Docker synchronisés sur l'horloge système du serveur Debian hôte (NTP via montage en lecture seule)[cite: 13].
|
||||||
- [x] Synchronisation temporelle : Conteneurs Docker synchronisés sur l'horloge système du serveur Debian hôte (NTP via montage en lecture seule).
|
- [ ] Protection Intellectuelle : Création d'un fichier LICENSE strict (BSL/EULA) à la racine du dépôt pour bloquer l'usage commercial non autorisé.
|
||||||
|
- [ ] Déploiement du Wiki : Mise en place sur Gitea/MkDocs d'une documentation segmentée (Déploiement Administrateur, Architecture Technique, et Guide Utilisateur).
|
||||||
|
|
||||||
### Phase 9 : Modération Automatisée & Conformité Pénale 🚨
|
### Phase 9 : Modération Automatisée & Conformité Pénale 🚨
|
||||||
- [x] Système hiérarchique : `Super Admin`, `Admin`, `VIP` (Famille) et `Standard`. Quotas de ressources (60% CPU/RAM) applicables selon le rang.
|
- [x] Système hiérarchique : `Super Admin`, `Admin`, `VIP` (Famille) et `Standard`[cite: 13]. Quotas de ressources (60% CPU/RAM) applicables selon le rang[cite: 13].
|
||||||
- [x] Modération préventive "Anti-Zèle" : Filtrage par IA Locale tolérant la fiction et les jeux vidéo.
|
- [x] Modération préventive "Anti-Zèle" : Filtrage par IA Locale tolérant la fiction et les jeux vidéo[cite: 13].
|
||||||
- [x] Système d'Avertissements (Strikes) automatisé et preuve d'audit manuscrite.
|
- [x] Système d'Avertissements (Strikes) automatisé et preuve d'audit manuscrite[cite: 13].
|
||||||
|
|
||||||
### Phase 10 : Base de Connaissances Vectorielle (RAG FAISS) 📚
|
### Phase 10 : Base de Connaissances Vectorielle (RAG FAISS) 📚
|
||||||
- [x] Initialisation de l'arborescence dynamique (`RAG/`) sur le stockage RAID.
|
- [x] Initialisation de l'arborescence dynamique (`RAG/`) sur le stockage RAID[cite: 13].
|
||||||
- [x] Moteur Vectoriel Local : Remplacement de la lecture brute par une base **FAISS** haute performance.
|
- [x] Moteur Vectoriel Local : Remplacement de la lecture brute par une base **FAISS** haute performance[cite: 13].
|
||||||
- [x] Embeddings IA : Vectorisation mathématique via modèle local (Ollama / `nomic-embed-text`) pour une recherche sémantique ultra-rapide.
|
- [x] Embeddings IA : Vectorisation mathématique via modèle local (Ollama / `nomic-embed-text`) pour une recherche sémantique ultra-rapide[cite: 13].
|
||||||
- [x] Ingestion Multi-Formats : Support étendu aux PDF institutionnels et aux fichiers de code/configuration (`.js`, `.yml`, `.json`, `.md`, `.txt`) pour la documentation de mods (ex: KubeJS).
|
- [x] Ingestion Multi-Formats : Support étendu aux PDF institutionnels et aux fichiers de code/configuration (`.js`, `.yml`, `.json`, `.md`, `.txt`) pour la documentation de mods (ex: KubeJS)[cite: 13].
|
||||||
- [x] Superviseur IA (Arrière-plan) : Évaluation silencieuse de la pertinence technique des réponses avant indexation via Threading (zéro latence pour l'utilisateur).
|
- [x] Superviseur IA (Arrière-plan) : Évaluation silencieuse de la pertinence technique des réponses avant indexation via Threading (zéro latence pour l'utilisateur)[cite: 13].
|
||||||
- [x] Forçage Manuel (UI) : Ajout d'un bouton HTMX "💾 Mémoriser" pour forcer l'apprentissage vectoriel à la volée.
|
- [x] Forçage Manuel (UI) : Ajout d'un bouton HTMX "💾 Mémoriser" pour forcer l'apprentissage vectoriel à la volée[cite: 13].
|
||||||
- [x] Interface UI : Ajout d'une vue Administrateur pour téléverser de nouveaux documents RAG directement depuis le navigateur.
|
- [x] Interface UI : Ajout d'une vue Administrateur pour téléverser de nouveaux documents RAG directement depuis le navigateur[cite: 13].
|
||||||
|
- [ ] Isolation des Quotas RAG : Segmentation des dossiers et index FAISS par utilisateur avec sonde de blocage d'upload fixée à 1 Go (Les rôles `Super Admin`, `Admin` et `Famille` sont exemptés de cette restriction).
|
||||||
|
- [ ] Extension de Stockage RAG (5€/mois) : Automatisation d'un CRON mensuel vérifiant les paiements Stripe/PayPal. En cas d'impayé, purge LIFO (Last In, First Out : suppression physique des fichiers les plus récents) pour repasser sous les 1 Go, suivie du nettoyage des vecteurs orphelins via ré-indexation complète.
|
||||||
@@ -26,6 +26,112 @@ import modules.model_updater
|
|||||||
dossier_media = "/DATA/AppData/MULTI-IA-AETHAS38/RAG/Media"
|
dossier_media = "/DATA/AppData/MULTI-IA-AETHAS38/RAG/Media"
|
||||||
os.makedirs(dossier_media, exist_ok=True)
|
os.makedirs(dossier_media, exist_ok=True)
|
||||||
|
|
||||||
|
# --- NOUVEAUX COMPOSANTS UI (SIDEBAR & PAYPAL) ---
|
||||||
|
def render_paypal_recharge_widget(montant_usd: float = 10.00):
|
||||||
|
client_id = os.getenv("PAYPAL_CLIENT_ID", "test")
|
||||||
|
|
||||||
|
script_paypal = Script(src=f"https://www.paypal.com/sdk/js?client-id={client_id}¤cy=USD")
|
||||||
|
container_id = f"paypal-button-container-{str(montant_usd).replace('.', '')}"
|
||||||
|
|
||||||
|
script_logique = Script(f"""
|
||||||
|
function chargerBoutonPayPal() {{
|
||||||
|
if (typeof paypal !== 'undefined') {{
|
||||||
|
paypal.Buttons({{
|
||||||
|
style: {{ layout: 'vertical', height: 35, shape: 'rect', label: 'paypal' }},
|
||||||
|
createOrder: function(data, actions) {{
|
||||||
|
return actions.order.create({{
|
||||||
|
purchase_units: [{{ amount: {{ value: '{montant_usd}' }} }}]
|
||||||
|
}});
|
||||||
|
}},
|
||||||
|
onApprove: function(data, actions) {{
|
||||||
|
return actions.order.capture().then(function(details) {{
|
||||||
|
alert('Paiement validé par ' + details.payer.name.given_name + ' ! Vos crédits vont être ajoutés.');
|
||||||
|
|
||||||
|
fetch('/api/paypal/success', {{
|
||||||
|
method: 'POST',
|
||||||
|
headers: {{ 'Content-Type': 'application/json' }},
|
||||||
|
body: JSON.stringify({{ orderID: data.orderID }})
|
||||||
|
}}).then(res => {{
|
||||||
|
if(res.ok) {{
|
||||||
|
document.getElementById('modal-recharge-paypal').style.display = 'none';
|
||||||
|
window.location.reload();
|
||||||
|
}} else {{
|
||||||
|
alert("Erreur lors de la validation serveur.");
|
||||||
|
}}
|
||||||
|
}});
|
||||||
|
}});
|
||||||
|
}}
|
||||||
|
}}).render('#{container_id}');
|
||||||
|
}} else {{
|
||||||
|
setTimeout(chargerBoutonPayPal, 100);
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
chargerBoutonPayPal();
|
||||||
|
""")
|
||||||
|
|
||||||
|
paypal_box = Div(
|
||||||
|
H4(f"Recharge : {montant_usd} $", style="color: #fff; margin: 0 0 10px 0; font-size: 1.1em; text-align: center;"),
|
||||||
|
Div(id=container_id, style="min-height: 100px; width: 100%;"),
|
||||||
|
Button("Annuler", type="button", onclick="document.getElementById('modal-recharge-paypal').style.display='none'",
|
||||||
|
style="background: transparent; border: 1px solid #555; color: #aaa; width: 100%; margin-top: 5px; padding: 6px; border-radius: 6px; font-size: 0.85em; cursor: pointer;"),
|
||||||
|
style="background: #1a1a1a; padding: 20px; border-radius: 10px; border: 1px solid #333; width: 320px; max-width: 90vw; box-shadow: 0 8px 24px rgba(0,0,0,0.9);"
|
||||||
|
)
|
||||||
|
|
||||||
|
modal_overlay = Div(
|
||||||
|
script_paypal, paypal_box, script_logique,
|
||||||
|
id="modal-recharge-paypal",
|
||||||
|
style="display: none; position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0,0,0,0.6); backdrop-filter: blur(3px); align-items: center; justify-content: center; z-index: 10000;"
|
||||||
|
)
|
||||||
|
return modal_overlay
|
||||||
|
|
||||||
|
def render_sidebar_menu():
|
||||||
|
sidebar_style = Style("""
|
||||||
|
:root { --nav-sidebar-width: 260px; }
|
||||||
|
#nav-app-sidebar {
|
||||||
|
position: fixed; top: 0; left: 0; width: var(--nav-sidebar-width); height: 100vh;
|
||||||
|
background: rgba(17, 17, 17, 0.95); backdrop-filter: blur(5px); border-right: 1px solid #333; overflow-y: auto;
|
||||||
|
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
z-index: 9000; padding: 60px 20px 20px 20px;
|
||||||
|
}
|
||||||
|
#nav-app-sidebar.collapsed { transform: translateX(-100%); }
|
||||||
|
#nav-app-sidebar::-webkit-scrollbar { width: 6px; }
|
||||||
|
#nav-app-sidebar::-webkit-scrollbar-thumb { background: #444; border-radius: 3px; }
|
||||||
|
|
||||||
|
#nav-sidebar-toggle {
|
||||||
|
position: fixed; top: 15px; left: 15px; z-index: 9001;
|
||||||
|
background: rgba(0, 0, 0, 0.5); border: 1px solid #333; color: #fff; font-size: 1.2em;
|
||||||
|
cursor: pointer; padding: 5px 10px; border-radius: 5px;
|
||||||
|
transition: left 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
}
|
||||||
|
body:has(#nav-app-sidebar:not(.collapsed)) #nav-sidebar-toggle {
|
||||||
|
left: calc(var(--nav-sidebar-width) - 50px);
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
|
||||||
|
sidebar_js = Script("""
|
||||||
|
function toggleNavSidebar() {
|
||||||
|
document.getElementById('nav-app-sidebar').classList.toggle('collapsed');
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
|
||||||
|
toggle_btn = Button("☰ Menu", id="nav-sidebar-toggle", onclick="toggleNavSidebar()")
|
||||||
|
|
||||||
|
sidebar_content = Div(
|
||||||
|
H3("Interface Multi-IA", style="color: #888; font-size: 0.9em; text-transform: uppercase; margin-bottom: 15px;"),
|
||||||
|
Div("Comptabilité (Export)", style="padding: 10px; color: #ddd; cursor: pointer; border-radius: 5px; margin-bottom: 5px; background: #222;", onclick="window.location.href='/admin/export_comptable'"),
|
||||||
|
Div("Gestion RAG", style="padding: 10px; color: #ddd; cursor: pointer; border-radius: 5px; margin-bottom: 5px;", onclick="window.location.href='/admin/rag_modal'"),
|
||||||
|
Hr(style="border-color: #333; margin: 20px 0;"),
|
||||||
|
Button(
|
||||||
|
"Recharger des crédits",
|
||||||
|
onclick="document.getElementById('modal-recharge-paypal').style.display='flex'",
|
||||||
|
style="width: 100%; padding: 10px; background: #00e5ff; color: #000; border: none; border-radius: 6px; font-weight: bold; cursor: pointer;"
|
||||||
|
),
|
||||||
|
id="nav-app-sidebar",
|
||||||
|
cls="collapsed"
|
||||||
|
)
|
||||||
|
|
||||||
|
return Div(sidebar_style, sidebar_js, toggle_btn, sidebar_content)
|
||||||
|
|
||||||
# --- MIDDLEWARE DE SÉCURITÉ & SERVEUR MÉDIA UNIFIÉ ---
|
# --- MIDDLEWARE DE SÉCURITÉ & SERVEUR MÉDIA UNIFIÉ ---
|
||||||
class SecurityMiddleware(BaseHTTPMiddleware):
|
class SecurityMiddleware(BaseHTTPMiddleware):
|
||||||
async def dispatch(self, request, call_next):
|
async def dispatch(self, request, call_next):
|
||||||
@@ -98,7 +204,16 @@ def get(session, request):
|
|||||||
session['user'] = utilisateur
|
session['user'] = utilisateur
|
||||||
if 'current_chat_id' not in session or not session['current_chat_id']:
|
if 'current_chat_id' not in session or not session['current_chat_id']:
|
||||||
session['current_chat_id'] = str(uuid.uuid4())
|
session['current_chat_id'] = str(uuid.uuid4())
|
||||||
return render_main_page(session['current_chat_id'], utilisateur_nom=session['user'])
|
|
||||||
|
# Génération de la page principale existante
|
||||||
|
main_page = render_main_page(session['current_chat_id'], utilisateur_nom=session['user'])
|
||||||
|
|
||||||
|
# Génération des nouveaux composants
|
||||||
|
nav_sidebar = render_sidebar_menu()
|
||||||
|
paypal_modal = render_paypal_recharge_widget(10.00)
|
||||||
|
|
||||||
|
# Renvoi combiné (les éléments fixed/absolute s'afficheront par-dessus)
|
||||||
|
return nav_sidebar, paypal_modal, main_page
|
||||||
|
|
||||||
@rt('/chat')
|
@rt('/chat')
|
||||||
async def post(request, session):
|
async def post(request, session):
|
||||||
@@ -147,6 +262,14 @@ def post(cid: str):
|
|||||||
if cid_str in h: del h[cid_str]; save_history(h)
|
if cid_str in h: del h[cid_str]; save_history(h)
|
||||||
return render_sidebar()
|
return render_sidebar()
|
||||||
|
|
||||||
|
# --- NOUVELLE ROUTE WEBHOOK PAYPAL ---
|
||||||
|
@rt('/api/paypal/success')
|
||||||
|
async def post(request):
|
||||||
|
data = await request.json()
|
||||||
|
order_id = data.get("orderID")
|
||||||
|
log_event("INFO", "FINANCE", f"Recharge PayPal validée - OrderID: {order_id}")
|
||||||
|
return {"status": "success"}
|
||||||
|
|
||||||
# --- NOUVELLE ROUTE POUR LE RAG (BOUTON MANUEL) ---
|
# --- NOUVELLE ROUTE POUR LE RAG (BOUTON MANUEL) ---
|
||||||
@rt('/api/forcer_rag')
|
@rt('/api/forcer_rag')
|
||||||
def post(prompt: str, reponse: str, theme: str):
|
def post(prompt: str, reponse: str, theme: str):
|
||||||
|
|||||||
Reference in new issue
Block a user