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
JavaScript
/**
* 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);
});