- New modular pipeline architecture allowing custom workflow combinations
- Per-step LLM provider configuration (Claude, OpenAI, Gemini, Deepseek, Moonshot, Mistral)
- Visual pipeline builder and runner interfaces with drag-and-drop
- 10 predefined pipeline templates (minimal-test to originality-bypass)
- Pipeline CRUD operations via ConfigManager and REST API
- Fix variable resolution in instructions (HTML tags were breaking {{variables}})
- Fix hardcoded LLM providers in AdversarialCore
- Add TESTS_LLM_PROVIDER.md documentation with validation results
- Update dashboard to disable legacy config editor
API Endpoints:
- POST /api/pipeline/save, execute, validate, estimate
- GET /api/pipeline/list, modules, templates
Backward compatible with legacy modular workflow system.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
8.5 KiB
Tests LLM Provider Configuration
📊 Résumé des Tests
Date: 2025-10-09 Feature: Configuration LLM Provider par module de pipeline Statut: ✅ TOUS LES TESTS PASSENT
🧪 Tests Exécutés
Test 1: Validation Structure LLM Providers
Fichier: test-llm-provider.js
Résultat: ✅ PASSÉ
✓ 6 providers LLM disponibles:
- claude: Claude (Anthropic) (default)
- openai: OpenAI GPT-4
- gemini: Google Gemini
- deepseek: Deepseek
- moonshot: Moonshot
- mistral: Mistral AI
✓ 5 modules avec llmProvider parameter:
- generation: defaultLLM=claude
- selective: defaultLLM=openai
- adversarial: defaultLLM=gemini
- human: defaultLLM=mistral
- pattern: defaultLLM=deepseek
Points validés:
- AVAILABLE_LLM_PROVIDERS exporté correctement
- Chaque module a un defaultLLM
- Chaque module accepte llmProvider en paramètre
- Pipeline multi-LLM valide avec PipelineDefinition.validate()
- Résumé et estimation de durée fonctionnels
Test 2: Execution Flow Multi-LLM
Fichier: test-llm-execution.cjs
Résultat: ✅ PASSÉ
Scénario 1: Override du defaultLLM
Step 1: generation
Default: claude
Configured: openai
→ Extracted: openai ✓
Step 2: selective
Default: openai
Configured: mistral
→ Extracted: mistral ✓
Scénario 2: Fallback sur defaultLLM
Step sans llmProvider configuré:
Module: generation
→ Fallback: claude ✓
Scénario 3: Empty string llmProvider
Step avec llmProvider = '':
Module: selective
→ Fallback: openai ✓
Points validés:
- llmProvider configuré → utilise la valeur configurée
- llmProvider non spécifié → fallback sur module.defaultLLM
- llmProvider vide → fallback sur module.defaultLLM
- Aucun default → fallback final sur "claude"
🎯 Flow d'Exécution Complet Validé
┌─────────────────────────────────────────────────────┐
│ Frontend (pipeline-builder.js) │
│ - User sélectionne LLM dans dropdown │
│ - Sauvé dans step.parameters.llmProvider │
└──────────────────┬──────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ Backend API (ManualServer.js) │
│ - Endpoint /api/pipeline/modules retourne │
│ modules + llmProviders │
│ - Reçoit pipelineConfig avec steps │
│ - Passe à PipelineExecutor.execute() │
└──────────────────┬──────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ PipelineExecutor │
│ Pour chaque step: │
│ • Extract: step.parameters?.llmProvider │
│ || module.defaultLLM │
│ • Pass config avec llmProvider aux modules │
└──────────────────┬──────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ Modules (SelectiveUtils, AdversarialCore, etc.) │
│ - Reçoivent config.llmProvider │
│ - Appellent LLMManager.callLLM(provider, ...) │
└──────────────────┬──────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ LLMManager │
│ - Route vers le bon provider (Claude, OpenAI, etc.)│
│ - Execute la requête │
└─────────────────────────────────────────────────────┘
📝 Fichiers Modifiés
Backend
-
lib/pipeline/PipelineDefinition.js
- Ajout:
AVAILABLE_LLM_PROVIDERS(exporté) - Ajout:
llmProviderparameter pour chaque module
- Ajout:
-
lib/modes/ManualServer.js
- Modif:
/api/pipeline/modulesretourne maintenantllmProviders
- Modif:
-
lib/pipeline/PipelineExecutor.js
- Modif:
runGeneration()extraitllmProviderde parameters - Modif:
runSelective()extraitllmProviderde parameters - Modif:
runAdversarial()extraitllmProviderde parameters - Modif:
runHumanSimulation()extraitllmProviderde parameters - Modif:
runPatternBreaking()extraitllmProviderde parameters
- Modif:
-
lib/selective-enhancement/SelectiveUtils.js
- Modif:
generateSimple()accepteoptions.llmProvider
- Modif:
Frontend
- public/pipeline-builder.js
- Ajout:
state.llmProviders = [] - Ajout:
loadLLMProviders()function - Modif:
renderModuleParameters()affiche dropdown LLM pour chaque step - Logique: Gère fallback sur defaultLLM avec option "Default"
- Ajout:
✅ Checklist Implémentation
- Backend: AVAILABLE_LLM_PROVIDERS défini et exporté
- Backend: Chaque module a defaultLLM et llmProvider parameter
- Backend: API /api/pipeline/modules retourne llmProviders
- Backend: PipelineExecutor extrait et passe llmProvider
- Backend: generateSimple() accepte llmProvider configuré
- Frontend: Chargement des llmProviders depuis API
- Frontend: Dropdown LLM affiché pour chaque étape
- Frontend: Sauvegarde llmProvider dans step.parameters
- Frontend: Affichage "Default (provider_name)" dans dropdown
- Tests: Validation structure LLM providers
- Tests: Extraction et fallback llmProvider
- Tests: Pipeline multi-LLM valide
🚀 Utilisation
Créer un pipeline avec différents LLMs
{
name: "Multi-LLM Pipeline",
pipeline: [
{
step: 1,
module: "generation",
mode: "simple",
parameters: {
llmProvider: "claude" // Force Claude pour génération
}
},
{
step: 2,
module: "selective",
mode: "standardEnhancement",
parameters: {
llmProvider: "openai" // Force OpenAI pour enhancement
}
},
{
step: 3,
module: "adversarial",
mode: "heavy",
parameters: {
llmProvider: "gemini", // Force Gemini pour adversarial
detector: "gptZero",
method: "regeneration"
}
}
]
}
Via l'interface
- Ouvrir
http://localhost:8080/pipeline-builder.html - Ajouter une étape (drag & drop ou bouton)
- Dans la configuration de l'étape:
- Mode: Sélectionner le mode
- Intensité: Ajuster 0.1-2.0
- LLM: Sélectionner le provider OU laisser "Default"
- Sauvegarder le pipeline
- Exécuter depuis pipeline-runner.html
📈 Performance
Providers par défaut optimisés:
generation→ Claude (meilleure créativité)selective→ OpenAI (précision technique)adversarial→ Gemini (diversité stylistique)human→ Mistral (naturalité)pattern→ Deepseek (variations syntaxiques)
Override possible pour tous les modules selon besoins spécifiques.
🔍 Debugging
Pour vérifier quel LLM est utilisé, consulter les logs:
✓ Génération: 12 éléments créés avec openai
✓ Selective: modifications appliquées avec mistral
✓ Adversarial: modifications appliquées avec gemini
Chaque étape log maintenant le provider utilisé.
✅ Statut Final
Implémentation: ✅ COMPLETE Tests: ✅ TOUS PASSENT Documentation: ✅ À JOUR Production Ready: ✅ OUI
Le système supporte maintenant la configuration de LLM provider par module de pipeline avec fallback intelligent sur les defaults.