🚀 Mode Liberté Total + Documentation technique complète
## ✨ Mode Liberté Total Révolutionnaire - Contrôle de précision : 30% (créatif) à 90% (précis) - Streaming temps réel avec Server-Sent Events - Interface progressive avec barre de progression - Temperature dynamique selon la précision - Enrichissement complet du document à chaque itération ## 📖 Documentation technique professionnelle - Architecture détaillée avec diagrammes Mermaid - Structure de projet complète et annotée - Flux de données documentés (streaming, journaux) - Stack technique avec versions et utilités - Guide d'utilisation mis à jour - 18 templates organisés par domaines ## 🎨 Interface améliorée - Sélecteurs d'itérations (1-10) et précision (30-90%) - Affichage temps réel des explications IA - Feedback visuel avec progression et statut - Mode streaming non-bloquant 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
b85e6d3a25
commit
2846d2feef
305
README.md
305
README.md
@ -26,12 +26,13 @@ Un assistant intelligent de conception technique avec fonctionnalités IA avanc
|
|||||||
- **Vérification de doublons** et redondances
|
- **Vérification de doublons** et redondances
|
||||||
- **Conseils d'amélioration** personnalisés
|
- **Conseils d'amélioration** personnalisés
|
||||||
|
|
||||||
#### 🧠 **Mode Liberté Intelligent** (Nouveau !)
|
#### 🚀 **Mode Liberté Total** (Révolutionnaire !)
|
||||||
|
|
||||||
- **Jusqu'à 15 itérations** d'amélioration automatique
|
- **Jusqu'à 10 itérations** d'enrichissement progressif
|
||||||
- **Analyse itérative** : chaque amélioration enrichit le document
|
- **Contrôle de précision** : 30% (très créatif) à 90% (très précis)
|
||||||
- **Arrêt intelligent** quand plus rien d'évident à améliorer
|
- **Streaming temps réel** : voir chaque amélioration en direct
|
||||||
- **Confiance 90%+** : ne modifie que ce qui est certain
|
- **Feedback instantané** : explications détaillées pour chaque itération
|
||||||
|
- **Document complet** : enrichit TOUT le document à chaque passage
|
||||||
|
|
||||||
### 🎨 Interface & Expérience
|
### 🎨 Interface & Expérience
|
||||||
|
|
||||||
@ -39,24 +40,30 @@ Un assistant intelligent de conception technique avec fonctionnalités IA avanc
|
|||||||
|
|
||||||
- **Mode sombre/clair** avec persistance des préférences
|
- **Mode sombre/clair** avec persistance des préférences
|
||||||
- **Variables CSS** cohérentes pour tous les composants
|
- **Variables CSS** cohérentes pour tous les composants
|
||||||
|
- **Basculement instantané** sans rechargement
|
||||||
|
|
||||||
#### 👁️ **Mode Prévisualisation**
|
#### 👁️ **Mode Prévisualisation**
|
||||||
|
|
||||||
- **Toggle édition/visualisation** en un clic
|
- **Toggle édition/visualisation** en un clic
|
||||||
- **Rendu Markdown complet** : titres, listes, code, liens, citations
|
- **Rendu GitHub Markdown** : titres, listes, code, liens, citations, tables
|
||||||
|
- **Support Mermaid** : diagrammes intégrés
|
||||||
- **Styling professionnel** pour présentation finale
|
- **Styling professionnel** pour présentation finale
|
||||||
|
|
||||||
#### 🧭 **Navigation Avancée**
|
#### 🧭 **Navigation Avancée**
|
||||||
|
|
||||||
- **Table des matières** générée automatiquement
|
- **Table des matières** générée automatiquement
|
||||||
- **Scroll intelligent** vers les sections
|
- **Scroll intelligent** vers les sections avec surbrillance
|
||||||
- **Raccourcis clavier** (Ctrl+S pour sauvegarde)
|
- **Historique complet** : Ctrl+Z/Y pour toutes les actions IA
|
||||||
|
- **Raccourcis clavier** : Ctrl+S sauvegarde, Tab indentation
|
||||||
|
|
||||||
### 📤 Export & Import
|
### 📤 Export & Import
|
||||||
|
|
||||||
- **Export Markdown** (.md) natif
|
- **Export Markdown** (.md) natif avec préservation formatage
|
||||||
- **Import de fichiers** Markdown
|
- **Export PDF/HTML** professionnel via Puppeteer
|
||||||
- **Templates prédéfinis** pour démarrage rapide
|
- **Import de fichiers** Markdown avec détection automatique
|
||||||
|
- **Templates prédéfinis** (6 domaines × 3 niveaux = 18 templates)
|
||||||
|
- 💻 Informatique • 💼 Business • 🎨 Design
|
||||||
|
- ⚙️ Ingénierie • 📊 Mathématiques • 🔬 Recherche
|
||||||
|
|
||||||
## ⚙️ Installation
|
## ⚙️ Installation
|
||||||
|
|
||||||
@ -76,30 +83,34 @@ cd conception-assistant
|
|||||||
# Installer les dépendances
|
# Installer les dépendances
|
||||||
npm install
|
npm install
|
||||||
|
|
||||||
# Copier et configurer les variables d'environnement
|
# Créer le fichier de configuration (optionnel)
|
||||||
cp config/.env.example config/.env
|
echo "PORT=3000
|
||||||
|
MISTRAL_API_KEY=your_key_here
|
||||||
|
AI_ENABLED=true" > .env
|
||||||
```
|
```
|
||||||
|
|
||||||
### Configuration
|
### Configuration (Optionnelle)
|
||||||
|
|
||||||
Éditez `config/.env` avec vos paramètres :
|
L'application fonctionne sans configuration. Pour activer l'IA, éditez `.env` :
|
||||||
|
|
||||||
```env
|
```env
|
||||||
# Server Configuration
|
# 🌐 Serveur (optionnel)
|
||||||
PORT=3000
|
PORT=3000
|
||||||
|
|
||||||
# Mistral AI Configuration
|
# 🤖 Mistral AI (requis pour l'IA)
|
||||||
MISTRAL_API_KEY=votre_clé_api_mistral_ici
|
MISTRAL_API_KEY=your_mistral_api_key_here
|
||||||
MISTRAL_MODEL=mistral-large-latest
|
MISTRAL_MODEL=mistral-large-latest
|
||||||
MISTRAL_BASE_URL=https://api.mistral.ai/v1
|
MISTRAL_BASE_URL=https://api.mistral.ai/v1
|
||||||
|
|
||||||
# AI Features Configuration
|
# ⚙️ Configuration IA avancée (optionnel)
|
||||||
AI_ENABLED=true
|
AI_ENABLED=true
|
||||||
AI_MAX_TOKENS=35000
|
AI_MAX_TOKENS=35000
|
||||||
AI_TEMPERATURE=0.3
|
AI_TEMPERATURE=0.3
|
||||||
AI_TOP_P=0.85
|
AI_TOP_P=0.85
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> **💡 Sans clé API** : L'application fonctionne parfaitement pour la gestion des journaux, seules les fonctions IA sont désactivées.
|
||||||
|
|
||||||
### Lancement
|
### Lancement
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@ -123,26 +134,47 @@ http://localhost:3000
|
|||||||
- **Reformulation** : 0.2 (très précise)
|
- **Reformulation** : 0.2 (très précise)
|
||||||
- **Analyses** : 0.1 (factuelle)
|
- **Analyses** : 0.1 (factuelle)
|
||||||
- **Conseils** : 0.4 (équilibrée)
|
- **Conseils** : 0.4 (équilibrée)
|
||||||
- **Mode Liberté** : 0.2 (itératif intelligent)
|
- **Mode Liberté Total** : 0.1-0.9 (dynamique selon précision)
|
||||||
|
|
||||||
## 🧠 Mode Liberté - Fonctionnement Avancé
|
## 🚀 Mode Liberté Total - Fonctionnement Révolutionnaire
|
||||||
|
|
||||||
Le **Mode Liberté Intelligent** analyse votre document de manière itérative :
|
Le **Mode Liberté Total** transforme votre document avec un contrôle précis de la créativité :
|
||||||
|
|
||||||
1. **Analyse** du contenu actuel
|
### 🎯 **Contrôle de Précision**
|
||||||
2. **Identification** du point le plus évident à améliorer
|
|
||||||
3. **Application** de l'amélioration avec 90%+ de confiance
|
|
||||||
4. **Mise à jour** du document avec le nouveau contenu
|
|
||||||
5. **Répétition** du processus sur le document enrichi
|
|
||||||
6. **Arrêt automatique** quand plus rien d'évident
|
|
||||||
|
|
||||||
### Exemple de Session
|
| Niveau | Précision | Comportement | Usage |
|
||||||
|
|--------|-----------|--------------|--------|
|
||||||
|
| **30%** | Très Créatif | Peut créer 70% de contenu nouveau logique | Brainstorming initial |
|
||||||
|
| **50%** | Équilibré | Balance déduction/création 50/50 | Développement standard |
|
||||||
|
| **70%** | Conservateur | Principalement basé sur l'existant | Raffinement document |
|
||||||
|
| **90%** | Très Précis | Seulement déductions évidentes | Finalisation technique |
|
||||||
|
|
||||||
|
### 🔄 **Processus Itératif en Temps Réel**
|
||||||
|
|
||||||
|
1. **📊 Analyse** : L'IA évalue le document selon la précision choisie
|
||||||
|
2. **🎯 Enrichissement** : Ajoute sections, détails, diagrammes conceptuels
|
||||||
|
3. **📡 Streaming** : Vous voyez l'explication en temps réel
|
||||||
|
4. **✏️ Application** : Le document est automatiquement mis à jour
|
||||||
|
5. **🔄 Itération** : Répétition sur le document enrichi
|
||||||
|
6. **✅ Finalisation** : Sauvegarde automatique avec historique
|
||||||
|
|
||||||
|
### 📈 **Exemple de Session (Précision 70%)**
|
||||||
|
|
||||||
```
|
```
|
||||||
Itération 1 : Ajout section "Contraintes techniques"
|
🔄 Itération 1/3 : Analyse du document...
|
||||||
Itération 2 : Détail des "Risques identifiés"
|
✅ Ajout section "Architecture technique détaillée"
|
||||||
Itération 3 : Complétion "Plan de tests"
|
✅ Développement des "Contraintes de performance"
|
||||||
Itération 4 : STOP - Aucune amélioration évidente
|
|
||||||
|
🔄 Itération 2/3 : Enrichissement du contenu...
|
||||||
|
✅ Diagrammes de séquence pour les flux principaux
|
||||||
|
✅ Matrice de risques avec plans d'atténuation
|
||||||
|
|
||||||
|
🔄 Itération 3/3 : Finalisation...
|
||||||
|
✅ Plan de tests complet avec critères d'acceptation
|
||||||
|
✅ Métriques de performance et indicateurs clés
|
||||||
|
|
||||||
|
✅ Mode Liberté Total terminé !
|
||||||
|
Document enrichi de 85% avec 3 itérations
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📖 Utilisation
|
## 📖 Utilisation
|
||||||
@ -155,9 +187,12 @@ Itération 4 : STOP - Aucune amélioration évidente
|
|||||||
|
|
||||||
### Utiliser l'IA
|
### Utiliser l'IA
|
||||||
|
|
||||||
1. **Reformulation** : Sélectionnez du texte → bouton "Reformuler"
|
1. **Reformulation** : Sélectionnez du texte → bouton "🔄 Reformuler"
|
||||||
2. **Analyse** : Boutons "Incohérences", "Doublons", "Conseils"
|
2. **Analyse** : Boutons "🔍 Incohérences", "📋 Doublons", "💡 Conseils"
|
||||||
3. **Mode Liberté** : Choisir le nombre d'itérations → "Mode Liberté"
|
3. **Mode Liberté Total** :
|
||||||
|
- Choisir **itérations** (1-10) et **précision** (30-90%)
|
||||||
|
- Clic sur "🚀 Mode Liberté Total"
|
||||||
|
- Suivre le **streaming en temps réel**
|
||||||
|
|
||||||
### Mode Prévisualisation
|
### Mode Prévisualisation
|
||||||
|
|
||||||
@ -167,36 +202,184 @@ Itération 4 : STOP - Aucune amélioration évidente
|
|||||||
|
|
||||||
## 🏗️ Architecture Technique
|
## 🏗️ Architecture Technique
|
||||||
|
|
||||||
### Backend
|
### 📁 Structure du Projet
|
||||||
|
|
||||||
- **Express.js** : Serveur web
|
|
||||||
- **Mistral AI** : Modèles de langage avancés
|
|
||||||
- **Multer** : Upload de fichiers
|
|
||||||
- **dotenv** : Gestion configuration
|
|
||||||
|
|
||||||
### Frontend
|
|
||||||
|
|
||||||
- **Vanilla JavaScript** : Interface réactive
|
|
||||||
- **CSS Variables** : Thèmes dynamiques
|
|
||||||
- **Markdown Parser** : Rendu intelligent
|
|
||||||
- **LocalStorage** : Persistance locale
|
|
||||||
|
|
||||||
### Structure
|
|
||||||
|
|
||||||
```
|
```
|
||||||
conception-assistant/
|
conception-assistant/
|
||||||
app.js # Serveur principal
|
├── app.js # ⚡ Serveur principal Express
|
||||||
routes/
|
├── package.json # 📦 Dépendances et scripts
|
||||||
ai.js # Routes IA avec logique avancée
|
├── package-lock.json # 🔒 Verrouillage des versions
|
||||||
upload.js # Upload de fichiers
|
├── README.md # 📖 Documentation du projet
|
||||||
assets/
|
│
|
||||||
js/app.js # Application frontend
|
├── 📂 routes/ # 🛣️ Routes API et logique métier
|
||||||
css/style.css # Styles et thèmes
|
│ ├── index.js # 🏠 Page d'accueil et routes de base
|
||||||
views/ # Composants d'interface
|
│ ├── api.js # 📝 CRUD journaux (create, read, update, delete)
|
||||||
uploads/ # Fichiers uploadés
|
│ ├── ai.js # 🤖 Intelligence Artificielle (Mistral AI)
|
||||||
config/ # Configuration
|
│ ├── templates.js # 📄 Gestion des templates prédéfinis
|
||||||
|
│ └── export.js # 📤 Export PDF/HTML (Puppeteer)
|
||||||
|
│
|
||||||
|
├── 📂 views/ # 🎨 Composants d'interface modulaires
|
||||||
|
│ ├── page.js # 📄 Structure HTML principale
|
||||||
|
│ ├── header.js # 🔝 En-tête avec navigation
|
||||||
|
│ ├── main.js # 🎯 Zone principale (éditeur + assistant IA)
|
||||||
|
│ └── footer.js # 🔽 Pied de page minimal
|
||||||
|
│
|
||||||
|
├── 📂 assets/ # 🎨 Ressources statiques
|
||||||
|
│ ├── css/
|
||||||
|
│ │ ├── style.css # 🎨 Styles principaux et thèmes
|
||||||
|
│ │ └── github-preview.css # 👁️ Style GitHub pour prévisualisation
|
||||||
|
│ └── js/
|
||||||
|
│ └── app.js # ⚙️ Application frontend (4000+ lignes)
|
||||||
|
│
|
||||||
|
├── 📂 templates/ # 📝 Templates de conception prédéfinis
|
||||||
|
│ ├── informatique/ # 💻 Templates IT (simple, détaillé, complet)
|
||||||
|
│ ├── business/ # 💼 Templates business
|
||||||
|
│ ├── design/ # 🎨 Templates design
|
||||||
|
│ ├── ingenierie/ # ⚙️ Templates ingénierie
|
||||||
|
│ ├── math/ # 📊 Templates mathématiques
|
||||||
|
│ └── recherche/ # 🔬 Templates recherche
|
||||||
|
│
|
||||||
|
└── 📂 data/ # 💾 Stockage des journaux utilisateur
|
||||||
|
└── journals_*.json # 📔 Fichiers JSON des journaux
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 🔧 Architecture Technique Détaillée
|
||||||
|
|
||||||
|
#### 🖥️ **Backend (Node.js + Express.js)**
|
||||||
|
|
||||||
|
| Composant | Fichier | Responsabilité | Technologies |
|
||||||
|
|-----------|---------|----------------|--------------|
|
||||||
|
| **Serveur Principal** | `app.js` | Configuration Express, middleware, routes | Express.js 4.18+ |
|
||||||
|
| **API Journaux** | `routes/api.js` | CRUD journaux, stockage JSON | File System, UUID |
|
||||||
|
| **Intelligence Artificielle** | `routes/ai.js` | Intégration Mistral AI, streaming | Mistral AI API, Server-Sent Events |
|
||||||
|
| **Templates** | `routes/templates.js` | Gestion templates par domaine | File System |
|
||||||
|
| **Export** | `routes/export.js` | Génération PDF/HTML | Puppeteer |
|
||||||
|
|
||||||
|
#### 🎨 **Frontend (Vanilla JavaScript)**
|
||||||
|
|
||||||
|
| Composant | Fichier | Responsabilité | Fonctionnalités |
|
||||||
|
|-----------|---------|----------------|-----------------|
|
||||||
|
| **Application Principale** | `assets/js/app.js` | Logique métier frontend | Éditeur, IA, historique, navigation |
|
||||||
|
| **Interface Modulaire** | `views/*.js` | Composants HTML | Header, main, footer |
|
||||||
|
| **Styles** | `assets/css/*.css` | Thèmes et présentation | CSS Variables, GitHub Preview |
|
||||||
|
|
||||||
|
#### 🤖 **Système IA Avancé**
|
||||||
|
|
||||||
|
| Fonctionnalité | Endpoint | Méthode | Streaming | Précision |
|
||||||
|
|---------------|----------|---------|-----------|-----------|
|
||||||
|
| **Reformulation** | `/api/ai/rephrase` | POST | ❌ | 90%+ |
|
||||||
|
| **Incohérences** | `/api/ai/check-inconsistencies` | POST | ❌ | Factuelle |
|
||||||
|
| **Doublons** | `/api/ai/check-duplications` | POST | ❌ | Factuelle |
|
||||||
|
| **Conseils** | `/api/ai/give-advice` | POST | ❌ | Équilibrée |
|
||||||
|
| **Mode Liberté Total** | `/api/ai/liberty-mode` | POST | ✅ SSE | Configurable 30-90% |
|
||||||
|
|
||||||
|
### ⚡ **Technologies & Stack**
|
||||||
|
|
||||||
|
#### **Core Dependencies**
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"express": "^4.18.2", // 🌐 Serveur web
|
||||||
|
"dotenv": "^17.2.2", // ⚙️ Variables d'environnement
|
||||||
|
"puppeteer": "^24.22.3", // 📄 Génération PDF
|
||||||
|
"uuid": "^13.0.0" // 🆔 Identifiants uniques
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **API Externes**
|
||||||
|
|
||||||
|
- **Mistral AI** : Modèles de langage avancés
|
||||||
|
- `mistral-large-latest` : Analyse et génération
|
||||||
|
- Temperature dynamique : 0.1-0.9 selon la tâche
|
||||||
|
- Max tokens : 35000 pour longs documents
|
||||||
|
|
||||||
|
#### **Stockage & Persistance**
|
||||||
|
|
||||||
|
- **Journaux** : Fichiers JSON avec UUID
|
||||||
|
- **Préférences** : LocalStorage navigateur
|
||||||
|
- **Templates** : Fichiers Markdown statiques
|
||||||
|
- **Exports** : Génération temporaire PDF/HTML
|
||||||
|
|
||||||
|
### 🔄 **Flux de Données**
|
||||||
|
|
||||||
|
#### **Mode Liberté Total (Streaming)**
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
participant User as 👤 Utilisateur
|
||||||
|
participant Frontend as 🌐 Frontend
|
||||||
|
participant Backend as ⚙️ Backend
|
||||||
|
participant AI as 🤖 Mistral AI
|
||||||
|
|
||||||
|
User->>Frontend: Clic "Mode Liberté Total"
|
||||||
|
Frontend->>Backend: POST /api/ai/liberty-mode (SSE)
|
||||||
|
|
||||||
|
loop Pour chaque itération
|
||||||
|
Backend->>AI: Envoi document + précision
|
||||||
|
AI->>Backend: Explication + Markdown amélioré
|
||||||
|
Backend->>Frontend: Stream données (SSE)
|
||||||
|
Frontend->>User: Affichage temps réel + MAJ éditeur
|
||||||
|
end
|
||||||
|
|
||||||
|
Backend->>Frontend: Signal fin (completed: true)
|
||||||
|
Frontend->>User: Notification terminée
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Gestion des Journaux**
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart TD
|
||||||
|
A[👤 Utilisateur] --> B[✏️ Éditeur]
|
||||||
|
B --> C[💾 Sauvegarde Auto]
|
||||||
|
C --> D[📁 data/journals_UUID.json]
|
||||||
|
|
||||||
|
A --> E[📂 Charger Journal]
|
||||||
|
E --> F[📋 Liste Journaux]
|
||||||
|
F --> G[🔄 Chargement Contenu]
|
||||||
|
G --> B
|
||||||
|
|
||||||
|
B --> H[👁️ Mode Prévisualisation]
|
||||||
|
H --> I[🎨 Rendu GitHub Markdown]
|
||||||
|
I --> B
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🛡️ **Sécurité & Configuration**
|
||||||
|
|
||||||
|
#### **Variables d'Environnement**
|
||||||
|
|
||||||
|
```env
|
||||||
|
# Serveur
|
||||||
|
PORT=3000
|
||||||
|
|
||||||
|
# Mistral AI
|
||||||
|
MISTRAL_API_KEY=your_key_here
|
||||||
|
MISTRAL_MODEL=mistral-large-latest
|
||||||
|
MISTRAL_BASE_URL=https://api.mistral.ai/v1
|
||||||
|
|
||||||
|
# IA
|
||||||
|
AI_ENABLED=true
|
||||||
|
AI_MAX_TOKENS=35000
|
||||||
|
AI_TEMPERATURE=0.3
|
||||||
|
AI_TOP_P=0.85
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Gestion d'Erreur Robuste**
|
||||||
|
|
||||||
|
- **Backend** : Try-catch sur toutes les routes
|
||||||
|
- **Frontend** : Gestion d'erreur asynchrone
|
||||||
|
- **IA** : Fallback et retry automatique
|
||||||
|
- **Streaming** : Gestion déconnexion SSE
|
||||||
|
|
||||||
|
### 🚀 **Performance & Optimisations**
|
||||||
|
|
||||||
|
| Aspect | Implémentation | Bénéfice |
|
||||||
|
|--------|----------------|----------|
|
||||||
|
| **Debouncing** | Table des matières, sauvegarde | Réduit calculs inutiles |
|
||||||
|
| **Streaming SSE** | Mode Liberté Total | Feedback temps réel |
|
||||||
|
| **Cache LocalStorage** | Préférences thème | Persistance locale |
|
||||||
|
| **Lazy Loading** | Templates à la demande | Chargement optimisé |
|
||||||
|
| **CSS Variables** | Thèmes dynamiques | Basculement instantané |
|
||||||
|
|
||||||
## 🤝 Contribution
|
## 🤝 Contribution
|
||||||
|
|
||||||
1. **Fork** le projet
|
1. **Fork** le projet
|
||||||
|
186
assets/js/app.js
186
assets/js/app.js
@ -742,39 +742,24 @@ class ConceptionAssistant {
|
|||||||
this.saveState(true);
|
this.saveState(true);
|
||||||
|
|
||||||
const count = document.getElementById('liberty-repeat-count')?.value || 3;
|
const count = document.getElementById('liberty-repeat-count')?.value || 3;
|
||||||
// Mode liberté utilise toujours le document complet
|
const precision = document.getElementById('liberty-precision')?.value || 70;
|
||||||
result = await this.callAI('/api/ai/liberty-mode', { content: fullContent, iterations: count, focus: 'conception' });
|
|
||||||
|
|
||||||
// Utiliser le contenu final mis à jour par le backend
|
// Initialiser l'affichage de progression
|
||||||
if (result.finalContent) {
|
this.showAIFeedback(`
|
||||||
this.editor.innerText = result.finalContent;
|
<div id="liberty-progress">
|
||||||
this.generateTOC();
|
<strong>🚀 Mode Liberté Total</strong><br>
|
||||||
// Sauvegarder l'état après les modifications de l'IA
|
<div style="margin: 0.5rem 0; font-size: 0.9rem; color: var(--text-light);">
|
||||||
this.saveState(true);
|
${count} itérations • Précision: ${precision}% • Focus: conception
|
||||||
}
|
|
||||||
|
|
||||||
let libertyHTML = `<strong>Mode Liberté Intelligent (${result.iterations} itérations)</strong><br><br>`;
|
|
||||||
|
|
||||||
// Vérifier si l'IA s'est arrêtée prématurément
|
|
||||||
const lastIteration = result.results[result.results.length - 1];
|
|
||||||
if (lastIteration && lastIteration.stopped) {
|
|
||||||
libertyHTML += `<p>Analyse terminée après ${result.iterations} itérations - Aucune amélioration évidente supplémentaire détectée.</p>`;
|
|
||||||
} else {
|
|
||||||
libertyHTML += `<p>Les ${result.iterations} itérations d'amélioration ont été automatiquement appliquées au document.</p>`;
|
|
||||||
}
|
|
||||||
|
|
||||||
result.results.forEach(iteration => {
|
|
||||||
const borderColor = iteration.stopped ? 'var(--warning-color)' : 'var(--success-color)';
|
|
||||||
const icon = iteration.stopped ? 'STOP' : 'OK';
|
|
||||||
|
|
||||||
libertyHTML += `
|
|
||||||
<div style="background: var(--background-color); padding: 1rem; border-radius: 8px; margin: 0.5rem 0; border-left: 4px solid ${borderColor};">
|
|
||||||
<strong>${icon} Itération ${iteration.iteration} ${iteration.stopped ? '(Arrêt)' : '(Appliquée)'} :</strong><br><br>
|
|
||||||
${this.formatAIResponse(iteration.content)}
|
|
||||||
</div>
|
</div>
|
||||||
`;
|
<div class="progress-bar" style="width: 100%; height: 4px; background: var(--background-color); border-radius: 2px; margin: 1rem 0;">
|
||||||
});
|
<div id="liberty-progress-fill" style="height: 100%; background: var(--primary-color); border-radius: 2px; width: 0%; transition: width 0.3s ease;"></div>
|
||||||
this.showAIFeedback(libertyHTML);
|
</div>
|
||||||
|
<div id="liberty-iterations"></div>
|
||||||
|
</div>
|
||||||
|
`);
|
||||||
|
|
||||||
|
// Utiliser EventSource pour le streaming
|
||||||
|
await this.handleLibertyModeStreaming(fullContent, count, precision);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -783,6 +768,145 @@ class ConceptionAssistant {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async handleLibertyModeStreaming(content, iterations, precision) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
// Préparer les données à envoyer
|
||||||
|
const requestData = {
|
||||||
|
content: content,
|
||||||
|
iterations: iterations,
|
||||||
|
precision: precision,
|
||||||
|
focus: 'conception'
|
||||||
|
};
|
||||||
|
|
||||||
|
// Créer une requête fetch pour le streaming
|
||||||
|
fetch('/api/ai/liberty-mode', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(requestData)
|
||||||
|
})
|
||||||
|
.then(response => {
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`Erreur HTTP: ${response.status}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const reader = response.body.getReader();
|
||||||
|
const decoder = new TextDecoder();
|
||||||
|
let buffer = '';
|
||||||
|
|
||||||
|
const processStream = () => {
|
||||||
|
return reader.read().then(({ done, value }) => {
|
||||||
|
if (done) {
|
||||||
|
resolve();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Décoder les données reçues
|
||||||
|
buffer += decoder.decode(value, { stream: true });
|
||||||
|
|
||||||
|
// Traiter chaque ligne reçue
|
||||||
|
const lines = buffer.split('\n');
|
||||||
|
buffer = lines.pop() || ''; // Garder la dernière ligne incomplète
|
||||||
|
|
||||||
|
for (const line of lines) {
|
||||||
|
if (line.trim().startsWith('data: ')) {
|
||||||
|
try {
|
||||||
|
const data = JSON.parse(line.slice(6)); // Supprimer "data: "
|
||||||
|
this.handleLibertyStreamData(data);
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Erreur parsing JSON:', e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return processStream();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return processStream();
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Erreur streaming:', error);
|
||||||
|
this.showAIFeedback(`<strong>Erreur</strong><br><br>Erreur de streaming: ${error.message}`);
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
handleLibertyStreamData(data) {
|
||||||
|
const progressFill = document.getElementById('liberty-progress-fill');
|
||||||
|
const iterationsDiv = document.getElementById('liberty-iterations');
|
||||||
|
|
||||||
|
if (data.error) {
|
||||||
|
// Afficher l'erreur
|
||||||
|
const errorHTML = `
|
||||||
|
<div style="background: var(--danger-color); color: white; padding: 1rem; border-radius: 8px; margin: 0.5rem 0;">
|
||||||
|
<strong>❌ Erreur:</strong> ${data.error}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
iterationsDiv.innerHTML += errorHTML;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.iteration) {
|
||||||
|
// Mettre à jour la barre de progression
|
||||||
|
const totalIterations = parseInt(document.getElementById('liberty-repeat-count')?.value || 3);
|
||||||
|
const progressPercent = (data.iteration / totalIterations) * 100;
|
||||||
|
|
||||||
|
if (progressFill) {
|
||||||
|
progressFill.style.width = `${progressPercent}%`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Afficher l'explication de cette itération
|
||||||
|
const iterationHTML = `
|
||||||
|
<div style="background: var(--surface-color); border-left: 4px solid var(--primary-color); padding: 1rem; border-radius: 8px; margin: 0.5rem 0;">
|
||||||
|
<strong>🔄 Itération ${data.iteration}</strong><br><br>
|
||||||
|
${this.formatAIResponse(data.explanation)}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
iterationsDiv.innerHTML += iterationHTML;
|
||||||
|
|
||||||
|
// Mettre à jour l'éditeur avec le nouveau markdown si disponible
|
||||||
|
if (data.markdown && data.markdown !== this.editor.innerText) {
|
||||||
|
this.editor.innerText = data.markdown;
|
||||||
|
this.generateTOC();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scroller vers le bas du feedback pour voir la nouvelle itération
|
||||||
|
const feedback = document.getElementById('ai-assistant-feedback');
|
||||||
|
feedback.scrollTop = feedback.scrollHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.completed) {
|
||||||
|
// Finaliser l'affichage
|
||||||
|
if (progressFill) {
|
||||||
|
progressFill.style.width = '100%';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.finalMarkdown) {
|
||||||
|
// S'assurer que le contenu final est bien dans l'éditeur
|
||||||
|
this.editor.innerText = data.finalMarkdown;
|
||||||
|
this.generateTOC();
|
||||||
|
// Sauvegarder l'état final
|
||||||
|
this.saveState(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message de fin
|
||||||
|
const completedHTML = `
|
||||||
|
<div style="background: var(--success-color); color: white; padding: 1rem; border-radius: 8px; margin: 1rem 0; text-align: center;">
|
||||||
|
<strong>✅ Mode Liberté Total terminé !</strong><br>
|
||||||
|
${data.totalIterations || 'Toutes les'} itération(s) complétée(s)
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
iterationsDiv.innerHTML += completedHTML;
|
||||||
|
|
||||||
|
this.showNotification('Mode Liberté Total terminé', 'success');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async callAI(endpoint, data) {
|
async callAI(endpoint, data) {
|
||||||
const response = await fetch(endpoint, {
|
const response = await fetch(endpoint, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
|
165
routes/ai.js
165
routes/ai.js
@ -263,10 +263,10 @@ router.post('/give-advice', checkAIEnabled, async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// POST /api/ai/liberty-mode - Mode liberté (génération créative)
|
// POST /api/ai/liberty-mode - Mode liberté total (génération itérative)
|
||||||
router.post('/liberty-mode', checkAIEnabled, async (req, res) => {
|
router.post('/liberty-mode', checkAIEnabled, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const { content, iterations = 1, focus = 'général' } = req.body;
|
const { content, iterations = 1, precision = 70, focus = 'conception' } = req.body;
|
||||||
|
|
||||||
if (!content || content.trim().length === 0) {
|
if (!content || content.trim().length === 0) {
|
||||||
return res.status(400).json({
|
return res.status(400).json({
|
||||||
@ -275,91 +275,124 @@ router.post('/liberty-mode', checkAIEnabled, async (req, res) => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const maxIterations = Math.min(parseInt(iterations), 15); // Limite à 15 itérations
|
const maxIterations = Math.min(parseInt(iterations), 10); // Limite à 10 itérations
|
||||||
const results = [];
|
const precisionPercent = Math.min(Math.max(parseInt(precision), 10), 100); // Entre 10% et 100%
|
||||||
|
|
||||||
|
// Configuration streaming pour réponses en temps réel
|
||||||
|
res.writeHead(200, {
|
||||||
|
'Content-Type': 'text/event-stream',
|
||||||
|
'Cache-Control': 'no-cache',
|
||||||
|
'Connection': 'keep-alive',
|
||||||
|
'Access-Control-Allow-Origin': '*'
|
||||||
|
});
|
||||||
|
|
||||||
let currentContent = content;
|
let currentContent = content;
|
||||||
|
|
||||||
for (let i = 0; i < maxIterations; i++) {
|
for (let i = 0; i < maxIterations; i++) {
|
||||||
const messages = [
|
try {
|
||||||
{
|
const messages = [
|
||||||
role: 'system',
|
{
|
||||||
content: `Tu es un assistant créatif spécialisé en conception technique avec une approche itérative intelligente.
|
role: 'system',
|
||||||
|
content: `Tu es un expert en conception technique avec mode "Liberté Total".
|
||||||
|
|
||||||
MISSION: Analyse le document et identifie LE PREMIER point que tu peux compléter, créer ou modifier avec plus de 90% de confiance basé sur les informations existantes dans le texte.
|
MISSION: Améliore et enrichis le document en respectant EXACTEMENT ce niveau de précision: ${precisionPercent}%
|
||||||
|
|
||||||
RÈGLES STRICTES:
|
RÈGLES DE PRÉCISION:
|
||||||
1. Ne traite qu'UN SEUL point par itération
|
- À ${precisionPercent}%: Tu peux déduire et ajouter du contenu à hauteur de ${precisionPercent}% basé sur les informations existantes
|
||||||
2. Choisis le point le plus évident et logique à améliorer
|
- À ${100 - precisionPercent}%: Tu peux créer du contenu logique et pertinent même sans info explicite dans le texte
|
||||||
3. Utilise uniquement les informations déjà présentes dans le document
|
|
||||||
4. Si rien ne peut être amélioré avec 90%+ de confiance, indique "STOP"
|
|
||||||
|
|
||||||
STRUCTURE OBLIGATOIRE:
|
CONSIGNES:
|
||||||
|
1. Enrichis TOUT le document de manière cohérente
|
||||||
|
2. Ajoute sections, détails, explications, diagrammes conceptuels
|
||||||
|
3. Développe les idées existantes avec la créativité autorisée
|
||||||
|
4. Maintiens la structure logique
|
||||||
|
|
||||||
## 🧠 Analyse (Itération ${i + 1}/${maxIterations})
|
RÉPONSE OBLIGATOIRE EN 2 PARTIES SÉPARÉES PAR "---SPLIT---":
|
||||||
[Identifie et explique le point le plus évident à améliorer]
|
|
||||||
|
|
||||||
## 🎯 Point identifié
|
## 📊 Explication (Itération ${i + 1}/${maxIterations})
|
||||||
[Le point spécifique que tu vas traiter]
|
[Explique les améliorations apportées, les sections ajoutées, le raisonnement]
|
||||||
|
|
||||||
## ✅ Amélioration
|
---SPLIT---
|
||||||
[Le contenu précis à ajouter/modifier, avec 90%+ de confiance]
|
|
||||||
|
|
||||||
OU si rien ne peut être amélioré avec assez de confiance:
|
[LE DOCUMENT MARKDOWN COMPLET ET AMÉLIORÉ - SANS TITRE "## Document" - DIRECTEMENT LE CONTENU]
|
||||||
|
|
||||||
## 🛑 STOP
|
Focus: ${focus}
|
||||||
[Explication pourquoi aucune amélioration évidente n'est possible]
|
Précision: ${precisionPercent}%`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'user',
|
||||||
|
content: `Document à améliorer (Itération ${i + 1}):\n\n${currentContent}`
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
Focus: ${focus}`
|
// Temperature basée sur la précision (plus créatif = température plus élevée)
|
||||||
},
|
const temperature = (100 - precisionPercent) / 100 * 0.8 + 0.1; // Entre 0.1 et 0.9
|
||||||
{
|
|
||||||
role: 'user',
|
const result = await callMistralAPI(messages, temperature);
|
||||||
content: `Document à analyser (Itération ${i + 1}):\n\n${currentContent}`
|
|
||||||
|
// Séparer l'explication du markdown
|
||||||
|
const parts = result.split('---SPLIT---');
|
||||||
|
|
||||||
|
let explanation = '';
|
||||||
|
let newMarkdown = currentContent; // Par défaut, garder l'ancien contenu
|
||||||
|
|
||||||
|
if (parts.length >= 2) {
|
||||||
|
explanation = parts[0].trim();
|
||||||
|
newMarkdown = parts[1].trim();
|
||||||
|
// Mettre à jour pour la prochaine itération
|
||||||
|
currentContent = newMarkdown;
|
||||||
|
} else {
|
||||||
|
// Fallback si pas de split trouvé
|
||||||
|
explanation = result;
|
||||||
}
|
}
|
||||||
];
|
|
||||||
|
|
||||||
const result = await callMistralAPI(messages, 0.2); // Mode itératif intelligent et précis
|
// Envoyer la réponse de cette itération
|
||||||
|
const iterationData = {
|
||||||
// Vérifier si l'IA indique qu'il faut s'arrêter
|
|
||||||
if (result.toLowerCase().includes('🛑 stop') || result.toLowerCase().includes('## 🛑 stop')) {
|
|
||||||
results.push({
|
|
||||||
iteration: i + 1,
|
iteration: i + 1,
|
||||||
content: result,
|
explanation: explanation,
|
||||||
stopped: true
|
markdown: newMarkdown,
|
||||||
});
|
completed: false
|
||||||
|
};
|
||||||
|
|
||||||
|
res.write(`data: ${JSON.stringify(iterationData)}\n\n`);
|
||||||
|
|
||||||
|
// Petit délai pour permettre l'affichage côté client
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 500));
|
||||||
|
|
||||||
|
} catch (iterationError) {
|
||||||
|
console.error(`Erreur itération ${i + 1}:`, iterationError);
|
||||||
|
|
||||||
|
const errorData = {
|
||||||
|
iteration: i + 1,
|
||||||
|
error: `Erreur itération ${i + 1}: ${iterationError.message}`,
|
||||||
|
completed: true
|
||||||
|
};
|
||||||
|
|
||||||
|
res.write(`data: ${JSON.stringify(errorData)}\n\n`);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extraire l'amélioration de la réponse de l'IA
|
|
||||||
let improvement = '';
|
|
||||||
const improvementMatch = result.match(/## ✅ Amélioration\s*([\s\S]*?)(?=##|$)/i);
|
|
||||||
if (improvementMatch) {
|
|
||||||
improvement = improvementMatch[1].trim();
|
|
||||||
// Mettre à jour le contenu pour la prochaine itération
|
|
||||||
currentContent += '\n\n' + improvement;
|
|
||||||
}
|
|
||||||
|
|
||||||
results.push({
|
|
||||||
iteration: i + 1,
|
|
||||||
content: result,
|
|
||||||
improvement: improvement
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
res.json({
|
// Signal de fin
|
||||||
success: true,
|
const finalData = {
|
||||||
data: {
|
completed: true,
|
||||||
iterations: results.length,
|
totalIterations: maxIterations,
|
||||||
results: results,
|
finalMarkdown: currentContent
|
||||||
finalContent: currentContent
|
};
|
||||||
}
|
|
||||||
});
|
res.write(`data: ${JSON.stringify(finalData)}\n\n`);
|
||||||
|
res.end();
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Erreur mode liberté:', error);
|
console.error('Erreur mode liberté total:', error);
|
||||||
res.status(500).json({
|
|
||||||
success: false,
|
const errorData = {
|
||||||
error: 'Erreur lors de la génération: ' + error.message
|
error: 'Erreur lors de la génération: ' + error.message,
|
||||||
});
|
completed: true
|
||||||
|
};
|
||||||
|
|
||||||
|
res.write(`data: ${JSON.stringify(errorData)}\n\n`);
|
||||||
|
res.end();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -55,29 +55,35 @@ function getMain() {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="liberty-mode" style="border-top: 1px solid var(--border-color); padding-top: 1rem;">
|
<div class="liberty-mode" style="border-top: 1px solid var(--border-color); padding-top: 1rem;">
|
||||||
<div style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;">
|
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 0.5rem; margin-bottom: 0.5rem;">
|
||||||
<label for="liberty-repeat-count" style="font-size: 0.9rem; color: var(--text-light);">Itérations:</label>
|
<div style="display: flex; align-items: center; gap: 0.25rem;">
|
||||||
<select id="liberty-repeat-count" style="padding: 0.25rem; border: 1px solid var(--border-color); border-radius: 4px; background: var(--surface-color); color: var(--text-color);">
|
<label for="liberty-repeat-count" style="font-size: 0.85rem; color: var(--text-light);">Itérations:</label>
|
||||||
<option value="1">1</option>
|
<select id="liberty-repeat-count" style="padding: 0.25rem; border: 1px solid var(--border-color); border-radius: 4px; background: var(--surface-color); color: var(--text-color); font-size: 0.85rem;">
|
||||||
<option value="2">2</option>
|
<option value="1">1</option>
|
||||||
<option value="3" selected>3</option>
|
<option value="2">2</option>
|
||||||
<option value="4">4</option>
|
<option value="3" selected>3</option>
|
||||||
<option value="5">5</option>
|
<option value="4">4</option>
|
||||||
<option value="6">6</option>
|
<option value="5">5</option>
|
||||||
<option value="7">7</option>
|
<option value="6">6</option>
|
||||||
<option value="8">8</option>
|
<option value="7">7</option>
|
||||||
<option value="9">9</option>
|
<option value="8">8</option>
|
||||||
<option value="10">10</option>
|
<option value="9">9</option>
|
||||||
<option value="11">11</option>
|
<option value="10">10</option>
|
||||||
<option value="12">12</option>
|
</select>
|
||||||
<option value="13">13</option>
|
</div>
|
||||||
<option value="14">14</option>
|
<div style="display: flex; align-items: center; gap: 0.25rem;">
|
||||||
<option value="15">15</option>
|
<label for="liberty-precision" style="font-size: 0.85rem; color: var(--text-light);">Précision:</label>
|
||||||
</select>
|
<select id="liberty-precision" style="padding: 0.25rem; border: 1px solid var(--border-color); border-radius: 4px; background: var(--surface-color); color: var(--text-color); font-size: 0.85rem;">
|
||||||
<button id="liberty-mode" class="btn" style="flex: 1;" title="Génération créative">
|
<option value="30">30% (Très créatif)</option>
|
||||||
🚀 Mode Liberté
|
<option value="50">50% (Équilibré)</option>
|
||||||
</button>
|
<option value="70" selected>70% (Conservateur)</option>
|
||||||
|
<option value="90">90% (Très précis)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<button id="liberty-mode" class="btn" style="width: 100%;" title="Mode Liberté Total - Génération itérative en temps réel">
|
||||||
|
🚀 Mode Liberté Total
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="ai-assistant-feedback" style="flex: 1; padding: 1rem; overflow-y: auto; min-height: 200px;">
|
<div id="ai-assistant-feedback" style="flex: 1; padding: 1rem; overflow-y: auto; min-height: 200px;">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user