UNPKG

ollama-code-qwen

Version:

Un assistant IA en ligne de commande utilisant Ollama et le modèle qwen2.5-coder pour aider au développement, avec des capacités MCP améliorées et détection d'intentions en français et anglais

216 lines (188 loc) 8.2 kB
/** * Service spécialisé pour la gestion des prompts adaptés par tâche et contexte */ export class PromptService { constructor(config) { this.config = config; this.defaultTemperature = config.get('temperature') || 0.5; // Température réduite par défaut // Prompts système par type de tâche this.taskPrompts = { // Pour les tâches de génération de code code_generation: ` Tu es un assistant de programmation expert, spécialisé dans la génération de code. - Produis du code clair, bien commenté et respectant les bonnes pratiques - Gère les cas d'erreur et ajoute des tests unitaires quand c'est approprié - Suis les conventions de nommage et de style cohérentes avec le projet - Explique brièvement ton raisonnement et les choix d'implémentation `, // Pour les tâches de débogage debugging: ` Tu es un assistant de débogage expert, spécialisé dans la résolution de problèmes de code. - Analyse rigoureusement les erreurs et les bugs décrits - Identifie la cause racine du problème - Propose des corrections précises en expliquant pourquoi elles fonctionnent - Suggère des tests ou vérifications supplémentaires pour valider la correction `, // Pour les tâches de refactorisation refactoring: ` Tu es un assistant de refactorisation expert, spécialisé dans l'amélioration de code existant. - Maintiens la fonctionnalité existante tout en améliorant la structure - Améliore la lisibilité, la maintenabilité et les performances - Explique les bénéfices de chaque modification proposée - Respecte les patterns de conception cohérents avec le reste du projet `, // Pour les tâches d'explication de code explanation: ` Tu es un assistant expert en explication de code. - Décompose le code en sections logiques et explique leur fonctionnement - Identifie les patterns et les algorithmes utilisés - Explique les choix d'implémentation et leurs implications - Utilise un langage clair et adapté au niveau technique de l'utilisateur `, // Pour les tâches Git git_operations: ` Tu es un assistant Git expert. - Aide à formuler des commandes Git précises et sûres - Propose des stratégies efficaces pour la gestion des branches et des conflits - Rédige des messages de commit clairs et informatifs suivant les conventions - Explique les implications des opérations Git proposées `, // Prompt par défaut default: ` Tu es un assistant de programmation intelligent qui aide au développement de logiciels. - Réponds de manière concise et précise aux questions techniques - Fournis du code bien structuré et documenté quand c'est demandé - Explique ton raisonnement et tes recommandations - Adapte tes réponses au contexte du projet actuel ` }; // Prompts spécifiques par langage this.languagePrompts = { javascript: ` Pour le code JavaScript: - Utilise des fonctions fléchées et les features modernes (async/await, destructuring, etc.) - Préfère const sur let et évite var - Utilise ESM pour les imports/exports sauf indication contraire - Ajoute des JSDoc pour documenter les fonctions `, python: ` Pour le code Python: - Suit PEP 8 pour le style de code - Utilise les type hints (Python 3.6+) - Préfère les list/dict comprehensions quand c'est approprié - Utilise des docstrings au format Google ou NumPy `, java: ` Pour le code Java: - Utilise les conventions de nommage Java standard - Préfère les classes immuables quand c'est possible - Utilise les streams et les lambdas pour les opérations sur collections - Ajoute des commentaires Javadoc pour les classes et méthodes publiques `, go: ` Pour le code Go: - Suit le style Go standard (gofmt) - Gère les erreurs explicitement - Utilise les interfaces de façon appropriée - Préfère les slices aux arrays quand la taille est variable `, // Autres langages... }; } /** * Détecte le type de tâche basé sur l'entrée utilisateur * @param {string} userInput - Entrée utilisateur * @returns {string} - Type de tâche détecté */ detectTaskType(userInput) { const input = userInput.toLowerCase(); // Détection simple basée sur des mots-clés if (/crée|génère|écris|implément|développe/.test(input)) { return 'code_generation'; } if (/bug|erreur|corrige|résous|fixe|débogue/.test(input)) { return 'debugging'; } if (/refactori|améliore|optimise|nettoie|restructure/.test(input)) { return 'refactoring'; } if (/explique|analyse|comprendre|comment fonctionne|que fait/.test(input)) { return 'explanation'; } if (/git|commit|branch|merge|pull|push|conflit/.test(input)) { return 'git_operations'; } return 'default'; } /** * Détecte le langage de programmation principal basé sur le contexte * @param {string} projectContext - Contexte du projet * @returns {string|null} - Langage détecté ou null */ detectPrimaryLanguage(projectContext) { const languageSignatures = { javascript: ['.js', '.jsx', '.ts', '.tsx', 'package.json', 'node_modules'], python: ['.py', 'requirements.txt', 'setup.py', '__pycache__'], java: ['.java', '.class', 'pom.xml', 'build.gradle'], go: ['.go', 'go.mod', 'go.sum'], rust: ['.rs', 'Cargo.toml', 'Cargo.lock'], ruby: ['.rb', 'Gemfile', 'Rakefile'], php: ['.php', 'composer.json'], csharp: ['.cs', '.csproj', '.sln'], cpp: ['.cpp', '.hpp', '.cc', 'CMakeLists.txt'] }; // Compter les occurrences de chaque signature const counts = {}; for (const [lang, signatures] of Object.entries(languageSignatures)) { counts[lang] = 0; for (const signature of signatures) { const regex = new RegExp(signature.replace('.', '\\.'), 'gi'); const matches = projectContext.match(regex); if (matches) { counts[lang] += matches.length; } } } // Trouver le langage avec le plus d'occurrences let maxLang = null; let maxCount = 0; for (const [lang, count] of Object.entries(counts)) { if (count > maxCount) { maxLang = lang; maxCount = count; } } return maxCount > 0 ? maxLang : null; } /** * Génère un prompt système complet basé sur le type de tâche et le contexte * @param {string} userInput - Entrée utilisateur * @param {string} projectContext - Contexte du projet * @returns {object} - Prompt et paramètres recommandés */ generateSystemPrompt(userInput, projectContext) { // Détecter le type de tâche const taskType = this.detectTaskType(userInput); // Détecter le langage principal du projet const primaryLanguage = this.detectPrimaryLanguage(projectContext); // Construire le prompt système complet let systemPrompt = this.taskPrompts[taskType]; // Ajouter des conseils spécifiques au langage si détecté if (primaryLanguage && this.languagePrompts[primaryLanguage]) { systemPrompt += '\n\n' + this.languagePrompts[primaryLanguage]; } // Ajuster la température en fonction du type de tâche let temperature = this.defaultTemperature; if (taskType === 'code_generation' || taskType === 'debugging') { temperature = 0.3; // Plus basse pour plus de précision } else if (taskType === 'explanation') { temperature = 0.7; // Plus haute pour plus de créativité dans les explications } return { systemPrompt, temperature, taskType, primaryLanguage }; } }