injection_rag
Analyzes entire code projects and automatically prepares and injects data for RAG systems by processing source files and integrating with knowledge graphs.
Instructions
Analyse du projet complet + prépare et injecte les données automatiquement (Phase 0 → RAG)
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project_path | Yes | Chemin absolu vers le projet à analyser et injecter | |
| file_patterns | No | Patterns de fichiers à inclure (ex: ['**/*.py', '**/*.js']) | |
| recursive | No | Parcourir les sous-dossiers récursivement | |
| log_level | No | Niveau de logs (INFO, DEBUG, ERROR) | INFO |
| enable_graph_integration | No | Activer l'intégration automatique avec le graphe de connaissances |
Implementation Reference
- build/tools/rag/injection-rag.js:98-238 (handler)Main execution handler for 'injection_rag' tool. Performs permission checks (Phase 0), graph integration (Phase 1), loads RAG config, sets embedding provider, and indexes the project (Phase 2) using indexProject.export const injectionRagHandler = async (args) => { const logger = InjectionLogger.getInstance(); if (!args.project_path || typeof args.project_path !== 'string') { const error = "Le paramètre 'project_path' est requis et doit être une chaîne de caractères"; logger.error(error); throw new Error(error); } // Configurer le niveau de logs const logLevel = args.log_level || LogLevel.INFO; logger.setLogLevel(logLevel); logger.info("🚀 Démarrage de l'injection RAG", { version: "v1.0.0", project_path: args.project_path, log_level: logLevel }); // Phase 0 : Vérification des permissions logger.info("🔍 Phase 0 - Vérification des permissions et sécurité"); try { const fs = await import('fs'); const path = await import('path'); // Vérifier que le chemin existe if (!fs.existsSync(args.project_path)) { const error = `Le chemin du projet n'existe pas: ${args.project_path}`; logger.error(error); throw new Error(error); } // Vérifier les permissions d'écriture (pour les logs et métadonnées) const testWritePath = path.join(args.project_path, ".rag-test-permission"); try { fs.writeFileSync(testWritePath, "test"); fs.unlinkSync(testWritePath); logger.debug("✅ Permissions d'écriture vérifiées"); } catch (error) { logger.warn("⚠️ Permissions d'écriture limitées, continuation en mode lecture seule"); } } catch (error) { logger.error("Erreur lors de la vérification des permissions", error); throw error; } // Charger la configuration logger.info("⚙️ Chargement de la configuration RAG"); const configManager = getRagConfigManager(); const defaults = configManager.getDefaults(); // Utiliser les valeurs par défaut de la configuration const file_patterns = args.file_patterns || defaults.file_patterns; const recursive = args.recursive !== undefined ? args.recursive : defaults.recursive; const embedding_provider = defaults.embedding_provider; const embedding_model = defaults.embedding_model; const enable_graph_integration = args.enable_graph_integration !== undefined ? args.enable_graph_integration : true; // Appliquer les limites aux valeurs numériques de la configuration const chunk_size = configManager.applyLimits('chunk_size', defaults.chunk_size); const chunk_overlap = configManager.applyLimits('chunk_overlap', defaults.chunk_overlap); logger.info("📊 Configuration appliquée", { file_patterns_count: file_patterns.length, recursive, embedding_provider, embedding_model, chunk_size, chunk_overlap, enable_graph_integration }); // Phase 1 : Intégration avec le graphe de connaissances (si activé) if (enable_graph_integration) { logger.info("🧠 Phase 1 - Intégration avec le graphe de connaissances"); try { // Note: L'intégration complète avec les outils Graph se fait automatiquement // via le système d'enrichissement Phase 0 dans le pipeline RAG logger.debug("Enrichissement automatique des entités via Phase 0"); // Ici, on pourrait appeler des fonctions spécifiques d'enrichissement // Par exemple: await enrichWithGraphKnowledge(args.project_path); logger.info("✅ Enrichissement Graph intégré automatiquement"); } catch (error) { logger.error("Erreur lors de l'intégration Graph, continuation sans enrichissement", error); // Ne pas bloquer le processus principal en cas d'erreur Graph } } // Configurer le fournisseur d'embeddings logger.info(`🔧 Configuration du fournisseur d'embeddings: ${embedding_provider}`); setEmbeddingProvider(embedding_provider, embedding_model); const options = { filePatterns: file_patterns, recursive: recursive, chunkSize: chunk_size, chunkOverlap: chunk_overlap }; // Phase 2 : Injection RAG principale logger.info("🚀 Phase 2 - Injection RAG principale"); const startTime = Date.now(); try { const result = await indexProject(args.project_path, options); const endTime = Date.now(); const duration = ((endTime - startTime) / 1000).toFixed(2); logger.info("✅ Injection RAG terminée avec succès", { duration: `${duration}s`, total_files: result.totalFiles, indexed_files: result.indexedFiles, chunks_created: result.chunksCreated, errors: result.errors }); return { content: [{ type: "text", text: JSON.stringify({ success: true, version: "v1.0.0", duration_seconds: duration, ...result, config_used: { embedding_provider, embedding_model, chunk_size, chunk_overlap, recursive, file_patterns_count: file_patterns.length, enable_graph_integration, log_level: logLevel }, pipeline: { phase_0: "Vérification permissions ✓", phase_1: enable_graph_integration ? "Enrichissement Graph intégré ✓" : "Enrichissement Graph désactivé", phase_2: "Injection RAG principale ✓" } }, null, 2) }] }; } catch (error) { const endTime = Date.now(); const duration = ((endTime - startTime) / 1000).toFixed(2); logger.error("❌ Erreur lors de l'injection RAG", { duration: `${duration}s`, error: error instanceof Error ? error.message : String(error) }); throw error; } };
- Tool definition object containing name, description, and detailed inputSchema for validation.export const injectionRagTool = { name: "injection_rag", description: "Analyse du projet complet + prépare et injecte les données automatiquement (Phase 0 → RAG)", inputSchema: { type: "object", properties: { project_path: { type: "string", description: "Chemin absolu vers le projet à analyser et injecter" }, file_patterns: { type: "array", items: { type: "string" }, description: "Patterns de fichiers à inclure (ex: ['**/*.py', '**/*.js'])", default: ["**/*.{js,ts,py,md,txt,json,yaml,yml,html,css,scss}"] }, recursive: { type: "boolean", description: "Parcourir les sous-dossiers récursivement", default: true }, log_level: { type: "string", description: "Niveau de logs (INFO, DEBUG, ERROR)", enum: ["INFO", "DEBUG", "ERROR"], default: "INFO" }, enable_graph_integration: { type: "boolean", description: "Activer l'intégration automatique avec le graphe de connaissances", default: true } }, required: ["project_path"] }, };
- Custom logging utility class used throughout the handler for structured logging with levels (INFO, DEBUG, ERROR).class InjectionLogger { static instance; logLevel = LogLevel.INFO; constructor() { } static getInstance() { if (!InjectionLogger.instance) { InjectionLogger.instance = new InjectionLogger(); } return InjectionLogger.instance; } setLogLevel(level) { this.logLevel = level; } shouldLog(level) { const levels = [LogLevel.ERROR, LogLevel.INFO, LogLevel.DEBUG]; return levels.indexOf(level) <= levels.indexOf(this.logLevel); } log(level, message, data) { if (this.shouldLog(level)) { const timestamp = new Date().toISOString(); const logMessage = `[${timestamp}] [${level}] ${message}`; if (data) { console.error(logMessage, JSON.stringify(data, null, 2)); } else { console.error(logMessage); } } } info(message, data) { this.log(LogLevel.INFO, message, data); } debug(message, data) { this.log(LogLevel.DEBUG, message, data); } error(message, error) { this.log(LogLevel.ERROR, message, error); } warn(message, data) { this.log(LogLevel.INFO, `⚠️ ${message}`, data); } }
- TypeScript source definition of the tool schema with typed ToolDefinition.export const injectionRagTool: ToolDefinition = { name: "injection_rag", description: "Analyse du projet complet + prépare et injecte les données automatiquement (Phase 0 → RAG)", inputSchema: { type: "object", properties: { project_path: { type: "string", description: "Chemin absolu vers le projet à analyser et injecter" }, file_patterns: { type: "array", items: { type: "string" }, description: "Patterns de fichiers à inclure (ex: ['**/*.py', '**/*.js'])", default: ["**/*.{js,ts,py,md,txt,json,yaml,yml,html,css,scss}"] }, recursive: { type: "boolean", description: "Parcourir les sous-dossiers récursivement", default: true }, log_level: { type: "string", description: "Niveau de logs (INFO, DEBUG, ERROR)", enum: ["INFO", "DEBUG", "ERROR"], default: "INFO" }, enable_graph_integration: { type: "boolean", description: "Activer l'intégration automatique avec le graphe de connaissances", default: true } }, required: ["project_path"] }, };