UNPKG

vscode-ai-model-detector

Version:

Real-time AI model detection with 100% accuracy using Chat Participant API

287 lines (242 loc) 11.3 kB
import * as vscode from 'vscode'; import { ModelDetectorService } from './modelDetector'; import { ChatParticipantResult, ModelInfo } from './types'; import { IPCBridgeServer } from './ipcBridge'; /** * Chat participant for real-time AI model detection with 100% accuracy * Enhanced with MCP integration via IPC bridge */ export class ChatParticipantHandler { private detectorService: ModelDetectorService; private ipcBridge?: IPCBridgeServer; constructor(detectorService: ModelDetectorService, ipcBridge?: IPCBridgeServer) { this.detectorService = detectorService; this.ipcBridge = ipcBridge; console.log('🎯 Chat Participant initialized with', ipcBridge ? 'MCP bridge' : 'direct API only'); } /** * Handle chat requests for @modeldetector participant */ public async handleChatRequest( request: vscode.ChatRequest, context: vscode.ChatContext, stream: vscode.ChatResponseStream, token: vscode.CancellationToken ): Promise<ChatParticipantResult> { // Handle different commands if (request.command === 'detect') { return this.handleDetectCommand(request, stream, token); } else if (request.command === 'monitor') { return this.handleMonitorCommand(request, stream, token); } else { // Default: comprehensive model detection return this.handleDefaultDetection(request, stream, token); } } /** * Handle /detect command for comprehensive model information */ private async handleDetectCommand( request: vscode.ChatRequest, stream: vscode.ChatResponseStream, token: vscode.CancellationToken ): Promise<ChatParticipantResult> { stream.progress('🔍 Detecting current AI model with 100% accuracy...'); try { // 🎯 PRIMARY METHOD: 100% accurate detection via chat context const result = await this.detectorService.detectFromChatContext(request); if (result.success && result.model) { await this.streamModelInformation(stream, result.model, result); // Also show available models as context const lmResult = await this.detectorService.detectFromLMAPI(); if (lmResult.availableModels && lmResult.availableModels.length > 1) { await this.streamAvailableModels(stream, lmResult.availableModels); } return { metadata: { command: 'detect', modelDetected: true, accuracy: '100%' } }; } else { stream.markdown(`## ❌ Detection Failed\n\n`); stream.markdown(`**Error:** ${result.error}\n\n`); stream.markdown(`Please ensure you're using a supported AI model in VS Code chat.\n`); return { metadata: { command: 'detect', modelDetected: false, accuracy: 'failed' } }; } } catch (error) { stream.markdown(`## ❌ Unexpected Error\n\n`); stream.markdown(`**Error:** ${error instanceof Error ? error.message : 'Unknown error'}\n`); return { metadata: { command: 'detect', modelDetected: false, accuracy: 'error' } }; } } /** * Handle /monitor command for continuous monitoring setup */ private async handleMonitorCommand( request: vscode.ChatRequest, stream: vscode.ChatResponseStream, token: vscode.CancellationToken ): Promise<ChatParticipantResult> { stream.progress('⚙️ Setting up continuous model monitoring...'); // Enable status bar monitoring const config = vscode.workspace.getConfiguration('aiModelDetector'); await config.update('enableStatusBar', true, vscode.ConfigurationTarget.Global); stream.markdown(`## ⚙️ Monitoring Enabled\n\n`); stream.markdown(`✅ **Status bar monitoring** is now active\n`); stream.markdown(`✅ **Real-time model detection** enabled\n\n`); stream.markdown(`### 📊 Monitoring Features:\n\n`); stream.markdown(`- Status bar shows current model continuously\n`); stream.markdown(`- Click status bar item for detailed information\n`); stream.markdown(`- Automatic updates when model changes\n`); stream.markdown(`- Detection history tracking\n\n`); // Show current model const result = await this.detectorService.detectFromChatContext(request); if (result.success && result.model) { stream.markdown(`### 🎯 Currently Detected Model:\n\n`); stream.markdown(`**${result.model.name}** (${result.model.vendor})\n`); } // Add command buttons stream.button({ command: 'aiModelDetector.detect', title: '🔍 Manual Detection' }); stream.button({ command: 'aiModelDetector.showHistory', title: '📋 Show History' }); return { metadata: { command: 'monitor', modelDetected: true, accuracy: 'monitoring-enabled' } }; } /** * Handle default detection (no specific command) */ private async handleDefaultDetection( request: vscode.ChatRequest, stream: vscode.ChatResponseStream, token: vscode.CancellationToken ): Promise<ChatParticipantResult> { stream.progress('🎯 Analyzing current AI model selection...'); try { // Perform real-time detection const result = await this.detectorService.detectFromChatContext(request); if (result.success && result.model) { // Stream comprehensive model information await this.streamModelInformation(stream, result.model, result); // Add helpful buttons stream.button({ command: 'aiModelDetector.toggleStatusBar', title: '📊 Toggle Status Bar' }); stream.button({ command: 'aiModelDetector.showHistory', title: '📋 Detection History' }); return { metadata: { command: 'default', modelDetected: true, accuracy: '100%' } }; } else { // Show fallback information stream.markdown(`## ⚠️ Limited Detection\n\n`); stream.markdown(`Chat context detection failed, trying alternative methods...\n\n`); const fallbackResult = await this.detectorService.detectCurrentModel(); if (fallbackResult.success && fallbackResult.model) { await this.streamModelInformation(stream, fallbackResult.model, fallbackResult); } else { stream.markdown(`❌ **All detection methods failed**\n\n`); stream.markdown(`${fallbackResult.error}\n`); } return { metadata: { command: 'default', modelDetected: fallbackResult.success, accuracy: 'fallback' } }; } } catch (error) { stream.markdown(`## ❌ Detection Error\n\n`); stream.markdown(`**Error:** ${error instanceof Error ? error.message : 'Unknown error'}\n`); return { metadata: { command: 'default', modelDetected: false, accuracy: 'error' } }; } } /** * Stream comprehensive model information to chat */ private async streamModelInformation( stream: vscode.ChatResponseStream, model: ModelInfo, result: any ): Promise<void> { stream.markdown(`## 🎯 AI Model Detection Results\n\n`); // Accuracy indicator const accuracyEmoji = model.accuracy === 'Perfect' ? '✅' : model.accuracy === 'Available' ? '🔍' : model.accuracy === 'Cached' ? '💾' : '❓'; stream.markdown(`${accuracyEmoji} **Accuracy:** ${model.accuracy} (${model.source})\n\n`); // Model details table stream.markdown(`### 📋 Model Details\n\n`); stream.markdown(`| Property | Value |\n`); stream.markdown(`|----------|-------|\n`); stream.markdown(`| **Model ID** | \`${model.id}\` |\n`); stream.markdown(`| **Display Name** | \`${model.name}\` |\n`); stream.markdown(`| **Vendor** | \`${model.vendor}\` |\n`); stream.markdown(`| **Family** | \`${model.family}\` |\n`); stream.markdown(`| **Version** | \`${model.version}\` |\n`); stream.markdown(`| **Max Tokens** | \`${model.maxTokens.toLocaleString()}\` |\n\n`); // Performance metrics if (result.performance) { stream.markdown(`### ⚡ Performance\n\n`); stream.markdown(`- **Detection Time:** ${result.performance.duration}ms\n`); stream.markdown(`- **Method:** ${result.method}\n`); stream.markdown(`- **Timestamp:** ${model.timestamp.toISOString()}\n\n`); } // Technical details if (model.metadata) { stream.markdown(`### 🔧 Technical Details\n\n`); stream.markdown(`\`\`\`json\n${JSON.stringify(model.metadata, null, 2)}\n\`\`\`\n\n`); } } /** * Stream available models information */ private async streamAvailableModels( stream: vscode.ChatResponseStream, models: ModelInfo[] ): Promise<void> { stream.markdown(`### 🔍 Available Models\n\n`); for (const model of models) { const isCurrentEmoji = '🎯'; // Could be enhanced to detect current stream.markdown(`- ${isCurrentEmoji} **${model.name}** (\`${model.id}\`) - ${model.vendor}\n`); } stream.markdown(`\n*Total available models: ${models.length}*\n\n`); } }