UNPKG

ollama-code-mistral

Version:

Un assistant IA en ligne de commande utilisant Ollama et le modèle Mistral-Small-3.1 pour aider au développement, avec des capacités MCP avancées pour la manipulation de fichiers

135 lines (117 loc) 4.69 kB
#!/usr/bin/env node /** * Point d'entrée du CLI Ollama Code Mistral (version légère) * Cette version utilise une interface simplifiée pour les connexions à distance * avec le modèle Mistral-Small-3.1 et capacités d'agent. */ import { execSync } from 'child_process'; import { OllamaService } from '../src/services/ollama-service.js'; import { ContextManager } from '../src/services/context-manager.js'; import { Config } from '../src/utils/config.js'; import chalk from 'chalk'; import readline from 'readline'; import { marked } from 'marked'; import TerminalRenderer from 'marked-terminal'; // Configuration du renderer pour Markdown dans le terminal marked.setOptions({ renderer: new TerminalRenderer({ code: chalk.cyan, blockquote: chalk.gray.italic, table: chalk.white, listitem: chalk.yellow, strong: chalk.bold.green, em: chalk.italic.cyan, heading: chalk.bold.blueBright, }) }); // Initialisation des services const config = new Config(); const ollamaService = new OllamaService(config.get('defaultModel'), config.get('ollamaHost')); const contextManager = new ContextManager(process.cwd(), { config }); // Interface de ligne de commande const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); // Historique des conversations const conversation = [ { role: 'system', content: `Tu es un assistant IA de développement. Tu aides avec les questions de programmation et les tâches de codage.` } ]; // Fonction principale async function main() { console.log(chalk.magenta.bold('\nOllama Code Mistral (Mode léger)') + ' - Agent IA avec capacités de fichiers'); console.log(chalk.yellow(`Modèle: ${config.get('defaultModel')} | Serveur: ${config.get('ollamaHost')}`)); console.log(chalk.blue('Tapez "exit" ou "quit" pour quitter. "help" pour l\'aide.\n')); // Vérifier la connexion au serveur Ollama try { const serverRunning = await ollamaService.checkServer(); if (!serverRunning) { console.error(chalk.red(`Erreur: Impossible de se connecter au serveur Ollama à ${config.get('ollamaHost')}`)); process.exit(1); } console.log(chalk.green('✓ Connecté au serveur Ollama\n')); } catch (error) { console.error(chalk.red(`Erreur de connexion: ${error.message}`)); process.exit(1); } // Boucle de conversation askQuestion(); } function askQuestion() { rl.question(chalk.cyan('>>> '), async (input) => { // Commandes spéciales if (input.toLowerCase() === 'exit' || input.toLowerCase() === 'quit') { console.log(chalk.green('Au revoir!')); rl.close(); process.exit(0); } else if (input.toLowerCase() === 'help') { console.log(chalk.yellow('\nCommandes disponibles:')); console.log(' help - Affiche cette aide'); console.log(' exit/quit - Quitte l\'application'); console.log(' clear - Efface l\'écran'); console.log(' context - Charge le contexte du projet courant\n'); askQuestion(); return; } else if (input.toLowerCase() === 'clear') { console.clear(); askQuestion(); return; } else if (input.toLowerCase() === 'context') { console.log(chalk.yellow('Chargement du contexte du projet...')); try { const context = await contextManager.getContext(); conversation[0].content = `Tu es un assistant IA de développement. Tu aides avec les questions de programmation et les tâches de codage.\n\nContexte du projet:\n${context}`; console.log(chalk.green('Contexte chargé avec succès!\n')); } catch (error) { console.error(chalk.red(`Erreur lors du chargement du contexte: ${error.message}`)); } askQuestion(); return; } // Traitement normal des questions if (input.trim()) { try { // Ajouter la question à la conversation conversation.push({ role: 'user', content: input }); console.log(chalk.yellow('Réflexion en cours...')); // Obtenir la réponse sans streaming pour éviter les problèmes de performance const response = await ollamaService.chat(conversation); // Ajouter la réponse à la conversation conversation.push({ role: 'assistant', content: response }); // Afficher la réponse formatée console.log('\n' + marked(response) + '\n'); } catch (error) { console.error(chalk.red(`Erreur: ${error.message}`)); } } askQuestion(); }); } // Démarrer l'application main().catch(error => { console.error(chalk.red(`Erreur fatale: ${error.message}`)); process.exit(1); });