🚀 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:
Augustin 2025-09-26 11:51:08 +02:00
parent b85e6d3a25
commit 2846d2feef
4 changed files with 526 additions and 180 deletions

305
README.md
View File

@ -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

View File

@ -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',

View File

@ -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();
} }
}); });

View File

@ -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;">