refonte
Build and Push Docker Image / build-and-push (push) Successful in 38s

This commit is contained in:
xavier committed 2026-08-29 09:41:27 +02:00
1 parent 1424cb7ab4
commit 1eb619a50b
3 files changed
+184 -54

No files matched your search

+1
View File
@@ -9,3 +9,4 @@ aethas_logs.txt
Important/
ARCHIVAGE ECHANGE GEMINY.txt
test financier/
SAVE/
+59 -53
View File
@@ -1,81 +1,87 @@
# 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) -->
**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)
Ce projet est distribué sous une licence "Source Available" propriétaire (EULA) rédigée par Xavier Fernandez (Aethas38).
* **Modifications & Partage :** Les utilisateurs sont autorisés à modifier et améliorer le code, à condition de partager ces améliorations avec la communauté.
* **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.
* **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.
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é[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é[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[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)
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)
### Phase 1 & 2 : Infrastructure & Backend de Base ✅
- [x] Installation Docker, Nginx (NPM), Pare-feu, Gitea/GitHub
- [x] Serveur Local Ollama (Abliterated 3B) + FastHTML
- [x] Routeur Multi-IA (OpenRouter, Gemini, Local) avec système de cascade et directives d'aiguillage strictes
- [x] Continuité de service : IA de secours automatique et Timeout à 300s.
- [x] Installation Docker, Nginx (NPM), Pare-feu, Gitea/GitHub[cite: 13]
- [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[cite: 13]
- [x] Continuité de service : IA de secours automatique et Timeout à 300s[cite: 13].
### Phase 3 : Refonte UI & Expérience Utilisateur ✅
- [x] Thème "Minecraft-Tech" (Inspiré serveurs/redstone) compatible Mobile (Responsive / Contraste OLED élevé)
- [x] Historique (Sidebar) avec Renommage, Épinglage, Suppression et Navigation isolée par session
- [x] Zone de saisie intelligente (Drag & Drop, Collage multi-fichiers)
- [x] Export modulaire et propre (PDF, DOC, TXT, JSON, ZIP)
- [x] Boutons de partage direct (WhatsApp, Email) et Déconnexion.
- [x] Indicateur d'avancement dynamique (Loader Néon) pendant le traitement des IA.
- [x] Transparence du Routage : Affichage visuel (Badges) du parcours multi-IA (Succès, Échecs, Erreurs 404/503) pour chaque requête.
- [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[cite: 13]
- [x] Zone de saisie intelligente (Drag & Drop, Collage multi-fichiers)[cite: 13]
- [x] Export modulaire et propre (PDF, DOC, TXT, JSON, ZIP)[cite: 13]
- [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[cite: 13].
- [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
- [ ] Mettre en place une bibliothèque logicielle autonome sur le serveur (création PDF, DOCX, etc.).
- [x] Routage automatique (Gratuit vs Payant) sélectionné par l'utilisateur avec solution de repli.
- [x] Système de cryptage de grade militaire (Fernet) et de Hashing (Bcrypt) mis en place.
- [X] Sécurité Légère : Fail2Ban, protection Bruteforce et DDoS. **Blocage total des accès VPN**. Ping silencieux.
- [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.
- [ ] Multilinguisme : Adaptation automatique de la langue du site via la géolocalisation de l'IP.
- [ ] 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[cite: 13].
- [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[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[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[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 💰
- [x] Pré-calcul local du nombre de tokens (via `tiktoken`) pour estimer le coût avant envoi.
- [x] Catalogue tarifaire dynamique (mise à jour auto) supprimant les coûts écrits en dur.
- [x] Affichage du Pop-Up OBLIGATOIRE de validation du coût pour TOUS les utilisateurs.
- [x] Télémétrie Admin : Suivi en temps réel de la consommation (Jour/Mois) et du solde restant sur l'API distante.
- [ ] Module de conversion des devises en temps réel (Taux du jour) pour un affichage transparent.
- [ ] **Utilisateurs Privilégiés (Zéro Marge) :** A définir par Admin/Super Admin.
- [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).
- [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[cite: 13].
- [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[cite: 13].
- [x] Module de conversion des devises en temps réel (API Frankfurter) pour un affichage transparent.
- [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] Export comptable Excel (TCD) par utilisateur via Pandas/Openpyxl (Optimisé pour les déclarations URSSAF)[cite: 13].
- [ ] 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) 🤖
*L'infrastructure bascule sur un catalogue dynamique mis à jour toutes les 2h pour pallier les décommissionnements.*
*Filtrage actif des modèles OpenRouter restreints (ex: Politiques de confidentialité strictes ignorées).*
*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)[cite: 13].*
| 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 |
| **Bureautique & Code** | Catalogue Dynamique (ex: Sonnet 3.5) | OpenRouter | Programmation KubeJS, scripts, mathématiques |
| **Images HD / Fichiers** | Gemini / Vision | Google API | Analyse d'images/vidéos et documents joints |
| **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[cite: 13] |
| **Images HD / Fichiers** | Gemini / Vision | Google API | Analyse d'images/vidéos et documents joints[cite: 13] |
### Phase 7 & 8 : Maintenance & Déploiement
- [ ] Script de surveillance de l'espace disque du serveur réservé à l'Admin.
- [ ] File d'attente asynchrone (Queue List) et Timer en temps réel pour gérer la charge serveur.
- [ ] Sauvegarde automatique : Compression du site toutes les 6 heures vers un GDrive.
- [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.
- [x] Synchronisation temporelle : Conteneurs Docker synchronisés sur l'horloge système du serveur Debian hôte (NTP via montage en lecture seule).
- [x] Script de surveillance de l'espace disque du serveur avec sonde en direct et remontée d'alerte UI.
- [x] Sauvegarde automatique asynchrone : Compression du site toutes les 6 heures et export vers GDrive via `rclone` et CRON.
- [x] Hébergement Gitea Docker[cite: 13]. Injection des clés via `env_file`[cite: 13]. Volumes persistants configurés[cite: 13].
- [x] Persistance absolue et sécurité : Fichiers d'historique, logs, facturation et dossiers RAG isolés sur volume RAID mdadm externe[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)[cite: 13].
- [ ] 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 🚨
- [x] Système hiérarchique : `Super Admin`, `Admin`, `VIP` (Famille) et `Standard`. Quotas de ressources (60% CPU/RAM) applicables selon le rang.
- [x] Modération préventive "Anti-Zèle" : Filtrage par IA Locale tolérant la fiction et les jeux vidéo.
- [x] Système d'Avertissements (Strikes) automatisé et preuve d'audit manuscrite.
- [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[cite: 13].
- [x] Système d'Avertissements (Strikes) automatisé et preuve d'audit manuscrite[cite: 13].
### Phase 10 : Base de Connaissances Vectorielle (RAG FAISS) 📚
- [x] Initialisation de l'arborescence dynamique (`RAG/`) sur le stockage RAID.
- [x] Moteur Vectoriel Local : Remplacement de la lecture brute par une base **FAISS** haute performance.
- [x] Embeddings IA : Vectorisation mathématique via modèle local (Ollama / `nomic-embed-text`) pour une recherche sémantique ultra-rapide.
- [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] 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] Forçage Manuel (UI) : Ajout d'un bouton HTMX "💾 Mémoriser" pour forcer l'apprentissage vectoriel à la volée.
- [x] Interface UI : Ajout d'une vue Administrateur pour téléverser de nouveaux documents RAG directement depuis le navigateur.
- [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[cite: 13].
- [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)[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)[cite: 13].
- [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[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.
+124 -1
View File
@@ -26,6 +26,112 @@ import modules.model_updater
dossier_media = "/DATA/AppData/MULTI-IA-AETHAS38/RAG/Media"
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}&currency=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É ---
class SecurityMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
@@ -98,7 +204,16 @@ def get(session, request):
session['user'] = utilisateur
if 'current_chat_id' not in session or not session['current_chat_id']:
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')
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)
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) ---
@rt('/api/forcer_rag')
def post(prompt: str, reponse: str, theme: str):