seogeneratorserver/lib/selective-enhancement/demo-modulaire.js
StillHammer dbf1a3de8c Add technical plan for multi-format export system
Added plan.md with complete architecture for format-agnostic content generation:
- Support for Markdown, HTML, Plain Text, JSON formats
- New FormatExporter module with neutral data structure
- Integration strategy with existing ContentAssembly and ArticleStorage
- Bonus features: SEO metadata generation, readability scoring, WordPress Gutenberg format
- Implementation roadmap with 4 phases (6h total estimated)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 16:14:29 +08:00

349 lines
14 KiB
JavaScript

// ========================================
// DÉMONSTRATION ARCHITECTURE MODULAIRE SELECTIVE
// Usage: node lib/selective-enhancement/demo-modulaire.js
// Objectif: Valider l'intégration modulaire selective enhancement
// ========================================
const { logSh } = require('../ErrorReporting');
// Import modules selective modulaires
const { applySelectiveLayer } = require('./SelectiveCore');
const {
applyPredefinedStack,
applyAdaptiveLayers,
getAvailableStacks
} = require('./SelectiveLayers');
const {
analyzeTechnicalQuality,
analyzeTransitionFluidity,
analyzeStyleConsistency,
generateImprovementReport
} = require('./SelectiveUtils');
/**
* EXEMPLE D'UTILISATION MODULAIRE SELECTIVE
*/
async function demoModularSelective() {
console.log('\n🔧 === DÉMONSTRATION SELECTIVE MODULAIRE ===\n');
// Contenu d'exemple avec problèmes de qualité
const exempleContenu = {
'|Titre_Principal_1|': 'Guide complet pour choisir votre plaque personnalisée',
'|Introduction_1|': 'La personnalisation d\'une plaque signalétique représente un enjeu important pour votre entreprise. Cette solution permet de créer une identité visuelle.',
'|Texte_1|': 'Il est important de noter que les matériaux utilisés sont de qualité. Par ailleurs, la qualité est bonne. En effet, nos solutions sont bonnes et robustes. Par ailleurs, cela fonctionne bien.',
'|FAQ_Question_1|': 'Quels sont les matériaux disponibles ?',
'|FAQ_Reponse_1|': 'Nos matériaux sont de qualité : ils conviennent parfaitement. Ces solutions garantissent une qualité et un rendu optimal.'
};
console.log('📊 CONTENU ORIGINAL:');
Object.entries(exempleContenu).forEach(([tag, content]) => {
console.log(` ${tag}: "${content}"`);
});
// Analyser qualité originale
const fullOriginal = Object.values(exempleContenu).join(' ');
const qualiteOriginale = {
technical: analyzeTechnicalQuality(fullOriginal, ['dibond', 'aluminium', 'pmma', 'impression']),
transitions: analyzeTransitionFluidity(fullOriginal),
style: analyzeStyleConsistency(fullOriginal)
};
console.log(`\n📈 QUALITÉ ORIGINALE:`);
console.log(` 🔧 Technique: ${qualiteOriginale.technical.score}/100`);
console.log(` 🔗 Transitions: ${qualiteOriginale.transitions.score}/100`);
console.log(` 🎨 Style: ${qualiteOriginale.style.score}/100`);
try {
// ========================================
// TEST 1: COUCHE TECHNIQUE SEULE
// ========================================
console.log('\n🔧 TEST 1: Application couche technique');
const result1 = await applySelectiveLayer(exempleContenu, {
layerType: 'technical',
llmProvider: 'gpt4',
intensity: 0.9,
csvData: {
personality: { nom: 'Marc', style: 'technique' },
mc0: 'plaque personnalisée'
}
});
console.log(`✅ Résultat: ${result1.stats.enhanced}/${result1.stats.processed} éléments améliorés`);
console.log(` ⏱️ Durée: ${result1.stats.duration}ms`);
// ========================================
// TEST 2: STACK PRÉDÉFINI
// ========================================
console.log('\n📦 TEST 2: Application stack prédéfini');
// Lister stacks disponibles
const stacks = getAvailableStacks();
console.log(' Stacks disponibles:');
stacks.forEach(stack => {
console.log(` - ${stack.name}: ${stack.description}`);
});
const result2 = await applyPredefinedStack(exempleContenu, 'standardEnhancement', {
csvData: {
personality: {
nom: 'Sophie',
style: 'professionnel',
vocabulairePref: 'signalétique,personnalisation,qualité,expertise',
niveauTechnique: 'standard'
},
mc0: 'plaque personnalisée'
}
});
console.log(`✅ Stack standard: ${result2.stats.totalModifications} modifications totales`);
console.log(` 📊 Couches: ${result2.stats.layers.filter(l => l.success).length}/${result2.stats.layers.length} réussies`);
// ========================================
// TEST 3: COUCHES ADAPTATIVES
// ========================================
console.log('\n🧠 TEST 3: Application couches adaptatives');
const result3 = await applyAdaptiveLayers(exempleContenu, {
maxIntensity: 1.2,
analysisThreshold: 0.3,
csvData: {
personality: {
nom: 'Laurent',
style: 'commercial',
vocabulairePref: 'expertise,solution,performance,innovation',
niveauTechnique: 'accessible'
},
mc0: 'signalétique personnalisée'
}
});
if (result3.stats.adaptive) {
console.log(`✅ Adaptatif: ${result3.stats.layersApplied} couches appliquées`);
console.log(` 📊 Modifications: ${result3.stats.totalModifications}`);
}
// ========================================
// COMPARAISON QUALITÉ FINALE
// ========================================
console.log('\n📊 ANALYSE QUALITÉ FINALE:');
const contenuFinal = result2.content; // Prendre résultat stack standard
const fullEnhanced = Object.values(contenuFinal).join(' ');
const qualiteFinale = {
technical: analyzeTechnicalQuality(fullEnhanced, ['dibond', 'aluminium', 'pmma', 'impression']),
transitions: analyzeTransitionFluidity(fullEnhanced),
style: analyzeStyleConsistency(fullEnhanced, result2.csvData?.personality)
};
console.log('\n📈 AMÉLIORATION QUALITÉ:');
console.log(` 🔧 Technique: ${qualiteOriginale.technical.score}${qualiteFinale.technical.score} (+${(qualiteFinale.technical.score - qualiteOriginale.technical.score).toFixed(1)})`);
console.log(` 🔗 Transitions: ${qualiteOriginale.transitions.score}${qualiteFinale.transitions.score} (+${(qualiteFinale.transitions.score - qualiteOriginale.transitions.score).toFixed(1)})`);
console.log(` 🎨 Style: ${qualiteOriginale.style.score}${qualiteFinale.style.score} (+${(qualiteFinale.style.score - qualiteOriginale.style.score).toFixed(1)})`);
// Rapport détaillé
const rapport = generateImprovementReport(exempleContenu, contenuFinal, 'selective');
console.log('\n📋 RAPPORT AMÉLIORATION:');
console.log(` 📈 Amélioration moyenne: ${rapport.summary.averageImprovement.toFixed(1)}%`);
console.log(` ✅ Éléments améliorés: ${rapport.summary.elementsImproved}/${rapport.summary.elementsProcessed}`);
if (rapport.details.recommendations.length > 0) {
console.log(` 💡 Recommandations: ${rapport.details.recommendations.join(', ')}`);
}
// ========================================
// EXEMPLES DE TRANSFORMATION
// ========================================
console.log('\n✨ EXEMPLES DE TRANSFORMATION:');
console.log('\n📝 INTRODUCTION:');
console.log('AVANT:', `"${exempleContenu['|Introduction_1|']}"`);
console.log('APRÈS:', `"${contenuFinal['|Introduction_1|']}"`);
console.log('\n📝 TEXTE PRINCIPAL:');
console.log('AVANT:', `"${exempleContenu['|Texte_1|']}"`);
console.log('APRÈS:', `"${contenuFinal['|Texte_1|']}"`);
console.log('\n✅ === DÉMONSTRATION SELECTIVE MODULAIRE TERMINÉE ===\n');
return {
success: true,
originalQuality: qualiteOriginale,
finalQuality: qualiteFinale,
improvementReport: rapport
};
} catch (error) {
console.error('\n❌ ERREUR DÉMONSTRATION:', error.message);
console.error(error.stack);
return { success: false, error: error.message };
}
}
/**
* EXEMPLE D'INTÉGRATION AVEC PIPELINE EXISTANTE
*/
async function demoIntegrationExistante() {
console.log('\n🔗 === DÉMONSTRATION INTÉGRATION PIPELINE ===\n');
// Simuler contenu venant de ContentGeneration.js (Level 1)
const contenuExistant = {
'|Titre_H1_1|': 'Solutions de plaques personnalisées professionnelles',
'|Meta_Description_1|': 'Découvrez notre gamme complète de plaques personnalisées pour tous vos besoins de signalétique professionnelle.',
'|Introduction_1|': 'Dans le domaine de la signalétique personnalisée, le choix des matériaux et des techniques de fabrication constitue un élément déterminant.',
'|Texte_Avantages_1|': 'Les avantages de nos solutions incluent la durabilité, la résistance aux intempéries et la possibilité de personnalisation complète.'
};
console.log('💼 SCÉNARIO: Application selective post-génération normale');
try {
console.log('\n🎯 Étape 1: Contenu généré par pipeline Level 1');
console.log(' ✅ Contenu de base: qualité préservée');
console.log('\n🎯 Étape 2: Application selective enhancement modulaire');
// Test avec couche technique puis style
let contenuEnhanced = contenuExistant;
// Amélioration technique
const resultTechnique = await applySelectiveLayer(contenuEnhanced, {
layerType: 'technical',
llmProvider: 'gpt4',
intensity: 1.0,
analysisMode: true,
csvData: {
personality: { nom: 'Marc', style: 'technique' },
mc0: 'plaque personnalisée'
}
});
contenuEnhanced = resultTechnique.content;
console.log(` ✅ Couche technique: ${resultTechnique.stats.enhanced} éléments améliorés`);
// Amélioration style
const resultStyle = await applySelectiveLayer(contenuEnhanced, {
layerType: 'style',
llmProvider: 'mistral',
intensity: 0.8,
analysisMode: true,
csvData: {
personality: {
nom: 'Sophie',
style: 'professionnel moderne',
vocabulairePref: 'innovation,expertise,personnalisation,qualité',
niveauTechnique: 'accessible'
}
}
});
contenuEnhanced = resultStyle.content;
console.log(` ✅ Couche style: ${resultStyle.stats.enhanced} éléments stylisés`);
console.log('\n📊 RÉSULTAT FINAL INTÉGRÉ:');
Object.entries(contenuEnhanced).forEach(([tag, content]) => {
console.log(`\n ${tag}:`);
console.log(` ORIGINAL: "${contenuExistant[tag]}"`);
console.log(` ENHANCED: "${content}"`);
});
return {
success: true,
techniqueResult: resultTechnique,
styleResult: resultStyle,
finalContent: contenuEnhanced
};
} catch (error) {
console.error('❌ ERREUR INTÉGRATION:', error.message);
return { success: false, error: error.message };
}
}
/**
* TEST PERFORMANCE ET BENCHMARKS
*/
async function benchmarkPerformance() {
console.log('\n⚡ === BENCHMARK PERFORMANCE ===\n');
// Contenu de test de taille variable
const contenuTest = {};
// Générer contenu test
for (let i = 1; i <= 10; i++) {
contenuTest[`|Element_${i}|`] = `Ceci est un contenu de test numéro ${i} pour valider les performances du système selective enhancement modulaire. ` +
`Il est important de noter que ce contenu contient du vocabulaire générique et des répétitions. Par ailleurs, les transitions sont basiques. ` +
`En effet, la qualité technique est faible et le style est générique. Par ailleurs, cela nécessite des améliorations.`.repeat(Math.floor(i/3) + 1);
}
console.log(`📊 Contenu test: ${Object.keys(contenuTest).length} éléments`);
try {
const benchmarks = [];
// Test 1: Couche technique seule
const start1 = Date.now();
const result1 = await applySelectiveLayer(contenuTest, {
layerType: 'technical',
intensity: 0.8
});
benchmarks.push({
test: 'Couche technique seule',
duration: Date.now() - start1,
enhanced: result1.stats.enhanced,
processed: result1.stats.processed
});
// Test 2: Stack complet
const start2 = Date.now();
const result2 = await applyPredefinedStack(contenuTest, 'fullEnhancement');
benchmarks.push({
test: 'Stack complet (3 couches)',
duration: Date.now() - start2,
totalModifications: result2.stats.totalModifications,
layers: result2.stats.layers.length
});
// Test 3: Adaptatif
const start3 = Date.now();
const result3 = await applyAdaptiveLayers(contenuTest, { maxIntensity: 1.0 });
benchmarks.push({
test: 'Couches adaptatives',
duration: Date.now() - start3,
layersApplied: result3.stats.layersApplied,
totalModifications: result3.stats.totalModifications
});
console.log('\n📈 RÉSULTATS BENCHMARK:');
benchmarks.forEach(bench => {
console.log(`\n ${bench.test}:`);
console.log(` ⏱️ Durée: ${bench.duration}ms`);
if (bench.enhanced) console.log(` ✅ Améliorés: ${bench.enhanced}/${bench.processed}`);
if (bench.totalModifications) console.log(` 🔄 Modifications: ${bench.totalModifications}`);
if (bench.layers) console.log(` 📦 Couches: ${bench.layers}`);
if (bench.layersApplied) console.log(` 🧠 Couches adaptées: ${bench.layersApplied}`);
});
return { success: true, benchmarks };
} catch (error) {
console.error('❌ ERREUR BENCHMARK:', error.message);
return { success: false, error: error.message };
}
}
// Exécuter démonstrations si fichier appelé directement
if (require.main === module) {
(async () => {
await demoModularSelective();
await demoIntegrationExistante();
await benchmarkPerformance();
})().catch(console.error);
}
module.exports = {
demoModularSelective,
demoIntegrationExistante,
benchmarkPerformance
};