UNPKG

@moikas/code-audit-mcp

Version:

AI-powered code auditing via MCP using local Ollama models for security, performance, and quality analysis

416 lines 13.7 kB
/** * Model configuration and specialization for different audit types */ /** * Default model configurations with specializations */ export const DEFAULT_MODELS = { 'codellama:7b': { name: 'codellama:7b', displayName: 'CodeLlama 7B', specialization: ['security', 'completeness', 'quality'], maxTokens: 4096, temperature: 0.1, topP: 0.9, fallbackModels: ['codellama:13b', 'deepseek-coder:6.7b'], performance: { speed: 'fast', accuracy: 'medium', resourceUsage: 'medium', }, }, 'codellama:13b': { name: 'codellama:13b', displayName: 'CodeLlama 13B', specialization: ['security', 'completeness', 'quality', 'architecture'], maxTokens: 4096, temperature: 0.1, topP: 0.9, fallbackModels: ['codellama:7b', 'deepseek-coder:6.7b'], performance: { speed: 'medium', accuracy: 'high', resourceUsage: 'medium', }, }, 'deepseek-coder:6.7b': { name: 'deepseek-coder:6.7b', displayName: 'DeepSeek Coder 6.7B', specialization: ['performance', 'quality', 'architecture'], maxTokens: 4096, temperature: 0.1, topP: 0.95, fallbackModels: ['codellama:7b', 'starcoder2:7b'], performance: { speed: 'medium', accuracy: 'high', resourceUsage: 'medium', }, }, 'deepseek-coder:33b': { name: 'deepseek-coder:33b', displayName: 'DeepSeek Coder 33B', specialization: ['performance', 'architecture', 'quality', 'documentation'], maxTokens: 4096, temperature: 0.1, topP: 0.95, fallbackModels: ['deepseek-coder:6.7b', 'codellama:13b'], performance: { speed: 'slow', accuracy: 'high', resourceUsage: 'high', }, }, 'starcoder2:7b': { name: 'starcoder2:7b', displayName: 'StarCoder2 7B', specialization: ['testing', 'quality', 'completeness'], maxTokens: 4096, temperature: 0.1, topP: 0.9, fallbackModels: ['codellama:7b', 'deepseek-coder:6.7b'], performance: { speed: 'fast', accuracy: 'medium', resourceUsage: 'medium', }, }, 'starcoder2:15b': { name: 'starcoder2:15b', displayName: 'StarCoder2 15B', specialization: ['testing', 'architecture', 'documentation'], maxTokens: 4096, temperature: 0.1, topP: 0.9, fallbackModels: ['starcoder2:7b', 'codellama:13b'], performance: { speed: 'medium', accuracy: 'high', resourceUsage: 'high', }, }, 'qwen2.5-coder:7b': { name: 'qwen2.5-coder:7b', displayName: 'Qwen2.5 Coder 7B', specialization: ['completeness', 'quality', 'documentation'], maxTokens: 4096, temperature: 0.1, topP: 0.9, fallbackModels: ['codellama:7b', 'starcoder2:7b'], performance: { speed: 'fast', accuracy: 'medium', resourceUsage: 'medium', }, }, 'llama3.1:8b': { name: 'llama3.1:8b', displayName: 'Llama 3.1 8B', specialization: ['documentation', 'architecture'], maxTokens: 4096, temperature: 0.1, topP: 0.9, fallbackModels: ['codellama:7b'], performance: { speed: 'fast', accuracy: 'medium', resourceUsage: 'medium', }, }, 'granite-code:8b': { name: 'granite-code:8b', displayName: 'Granite Code 8B', specialization: ['security', 'quality', 'completeness'], maxTokens: 4096, temperature: 0.1, topP: 0.9, fallbackModels: ['codellama:7b', 'deepseek-coder:6.7b'], performance: { speed: 'fast', accuracy: 'medium', resourceUsage: 'medium', }, }, }; /** * Priority order for models by audit type (best to worst) */ export const MODEL_PRIORITY = { security: [ 'granite-code:8b', 'codellama:13b', 'codellama:7b', 'deepseek-coder:6.7b', 'qwen2.5-coder:7b', ], completeness: [ 'codellama:13b', 'qwen2.5-coder:7b', 'starcoder2:7b', 'codellama:7b', 'granite-code:8b', ], performance: [ 'deepseek-coder:33b', 'deepseek-coder:6.7b', 'codellama:13b', 'granite-code:8b', 'codellama:7b', ], quality: [ 'deepseek-coder:33b', 'deepseek-coder:6.7b', 'codellama:13b', 'qwen2.5-coder:7b', 'starcoder2:15b', 'granite-code:8b', ], architecture: [ 'deepseek-coder:33b', 'starcoder2:15b', 'codellama:13b', 'deepseek-coder:6.7b', 'llama3.1:8b', ], testing: [ 'starcoder2:15b', 'starcoder2:7b', 'deepseek-coder:6.7b', 'codellama:13b', 'qwen2.5-coder:7b', ], documentation: [ 'deepseek-coder:33b', 'llama3.1:8b', 'qwen2.5-coder:7b', 'starcoder2:15b', 'codellama:13b', ], all: [ 'deepseek-coder:33b', 'codellama:13b', 'deepseek-coder:6.7b', 'starcoder2:15b', 'granite-code:8b', 'codellama:7b', ], }; /** * Fast mode models (prioritize speed for rapid feedback) */ export const FAST_MODE_MODELS = [ 'codellama:7b', 'granite-code:8b', 'starcoder2:7b', 'qwen2.5-coder:7b', 'deepseek-coder:6.7b', ]; /** * Thorough mode models (prioritize accuracy over speed) */ export const THOROUGH_MODE_MODELS = [ 'deepseek-coder:33b', 'codellama:13b', 'starcoder2:15b', 'deepseek-coder:6.7b', ]; /** * Language-specific model preferences */ export const LANGUAGE_MODEL_PREFERENCES = { javascript: ['deepseek-coder:6.7b', 'codellama:13b', 'qwen2.5-coder:7b'], typescript: ['deepseek-coder:6.7b', 'codellama:13b', 'qwen2.5-coder:7b'], python: ['deepseek-coder:33b', 'codellama:13b', 'granite-code:8b'], java: ['deepseek-coder:6.7b', 'granite-code:8b', 'codellama:13b'], csharp: ['deepseek-coder:6.7b', 'codellama:13b', 'granite-code:8b'], cpp: ['deepseek-coder:6.7b', 'codellama:13b', 'granite-code:8b'], c: ['codellama:13b', 'granite-code:8b', 'deepseek-coder:6.7b'], go: ['deepseek-coder:6.7b', 'codellama:13b', 'granite-code:8b'], rust: ['deepseek-coder:6.7b', 'codellama:13b', 'granite-code:8b'], php: ['codellama:13b', 'deepseek-coder:6.7b', 'qwen2.5-coder:7b'], ruby: ['codellama:13b', 'deepseek-coder:6.7b', 'granite-code:8b'], swift: ['codellama:13b', 'deepseek-coder:6.7b', 'granite-code:8b'], kotlin: ['deepseek-coder:6.7b', 'codellama:13b', 'granite-code:8b'], scala: ['deepseek-coder:6.7b', 'codellama:13b', 'granite-code:8b'], html: ['qwen2.5-coder:7b', 'codellama:7b', 'deepseek-coder:6.7b'], css: ['qwen2.5-coder:7b', 'codellama:7b', 'deepseek-coder:6.7b'], sql: ['granite-code:8b', 'codellama:13b', 'deepseek-coder:6.7b'], shell: ['codellama:13b', 'granite-code:8b', 'deepseek-coder:6.7b'], yaml: ['qwen2.5-coder:7b', 'codellama:7b', 'granite-code:8b'], json: ['qwen2.5-coder:7b', 'codellama:7b', 'deepseek-coder:6.7b'], dockerfile: ['granite-code:8b', 'codellama:13b', 'deepseek-coder:6.7b'], }; /** * Default model selection strategy */ export class DefaultModelSelectionStrategy { selectModel(auditType, language, priority, availableModels) { // Get preference lists const auditTypeModels = MODEL_PRIORITY[auditType] || MODEL_PRIORITY.all; const languageModels = LANGUAGE_MODEL_PREFERENCES[language.toLowerCase()] || []; const priorityModels = priority === 'fast' ? FAST_MODE_MODELS : THOROUGH_MODE_MODELS; // Create weighted scoring const scores = new Map(); // Score by audit type preference (highest weight) auditTypeModels.forEach((model, index) => { if (availableModels.includes(model)) { scores.set(model, (scores.get(model) || 0) + (auditTypeModels.length - index) * 3); } }); // Score by language preference (medium weight) languageModels.forEach((model, index) => { if (availableModels.includes(model)) { scores.set(model, (scores.get(model) || 0) + (languageModels.length - index) * 2); } }); // Score by priority preference (lower weight) priorityModels.forEach((model, index) => { if (availableModels.includes(model)) { scores.set(model, (scores.get(model) || 0) + (priorityModels.length - index) * 1); } }); // Find the highest scoring model let bestModel = null; let bestScore = -1; for (const [model, score] of scores.entries()) { if (score > bestScore) { bestModel = model; bestScore = score; } } // Fallback to first available model if no scored models if (!bestModel && availableModels.length > 0) { bestModel = availableModels[0]; } return bestModel; } } /** * Performance-optimized model selection strategy */ export class PerformanceModelSelectionStrategy { selectModel(auditType, language, priority, availableModels) { // Always prefer fastest models for performance optimization const fastModels = FAST_MODE_MODELS.filter((model) => availableModels.includes(model)); if (fastModels.length > 0) { // Still consider audit type for fast models const auditTypeModels = MODEL_PRIORITY[auditType] || []; for (const model of auditTypeModels) { if (fastModels.includes(model)) { return model; } } return fastModels[0]; } // Fallback to default strategy return (new DefaultModelSelectionStrategy().selectModel(auditType, language, priority, availableModels) || null); } } /** * Quality-focused model selection strategy */ export class QualityModelSelectionStrategy { selectModel(auditType, language, priority, availableModels) { // Always prefer highest quality models regardless of speed const qualityModels = THOROUGH_MODE_MODELS.filter((model) => availableModels.includes(model)); if (qualityModels.length > 0) { const auditTypeModels = MODEL_PRIORITY[auditType] || []; for (const model of auditTypeModels) { if (qualityModels.includes(model)) { return model; } } return qualityModels[0]; } // Fallback to default strategy return (new DefaultModelSelectionStrategy().selectModel(auditType, language, priority, availableModels) || null); } } /** * Model manager for handling model selection and configuration */ export class ModelManager { strategy; modelConfigs; constructor(strategy = new DefaultModelSelectionStrategy()) { this.strategy = strategy; this.modelConfigs = new Map(); // Load default configurations for (const [name, config] of Object.entries(DEFAULT_MODELS)) { this.modelConfigs.set(name, config); } } /** * Select the best model for given criteria */ selectModel(auditType, language, priority, availableModels) { return (this.strategy.selectModel(auditType, language, priority, availableModels) || null); } /** * Get configuration for a specific model */ getModelConfig(modelName) { return this.modelConfigs.get(modelName); } /** * Update model configuration */ updateModelConfig(modelName, config) { const existing = this.modelConfigs.get(modelName); if (existing) { this.modelConfigs.set(modelName, { ...existing, ...config }); } else { this.modelConfigs.set(modelName, { name: modelName, displayName: modelName, specialization: [], maxTokens: 4096, temperature: 0.1, performance: { speed: 'medium', accuracy: 'medium', resourceUsage: 'medium', }, ...config, }); } } /** * Get all configured models */ getAllModels() { return Array.from(this.modelConfigs.values()); } /** * Get models specialized for specific audit type */ getModelsForAuditType(auditType) { return this.getAllModels().filter((config) => config.specialization.includes(auditType)); } /** * Get recommended models to download */ getRecommendedModels() { return [ 'codellama:7b', // Fast, good general purpose 'deepseek-coder:6.7b', // Good performance analysis 'granite-code:8b', // Good security analysis 'starcoder2:7b', // Good testing analysis ]; } /** * Change model selection strategy */ setStrategy(strategy) { this.strategy = strategy; } /** * Get fallback models for a given model */ getFallbackModels(modelName) { const config = this.getModelConfig(modelName); return config?.fallbackModels || []; } } //# sourceMappingURL=models.js.map