UNPKG

route-claudecode

Version:

Advanced routing and transformation system for Claude Code outputs to multiple AI providers

397 lines 16.9 kB
"use strict"; /** * Provider Comparison System - Main Entry Point * 整合对比分析、修正机制和自动化工具 * Project owner: Jason Zhang */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultComparisonConfig = exports.ProviderComparisonSystem = void 0; exports.createComparisonSystem = createComparisonSystem; const logger_1 = require("@/utils/logger"); const analysis_engine_1 = require("./analysis-engine"); const correction_engine_1 = require("./correction-engine"); const auto_correction_1 = require("./auto-correction"); const promises_1 = __importDefault(require("fs/promises")); const path_1 = __importDefault(require("path")); class ProviderComparisonSystem { config; analysisEngine; correctionEngine; autoCorrection; activeComparisons = new Map(); constructor(config) { this.config = config; // 初始化分析引擎 this.analysisEngine = new analysis_engine_1.ComparisonAnalysisEngine({ enableContentAnalysis: config.analysis.enableContentAnalysis, enablePerformanceAnalysis: config.analysis.enablePerformanceAnalysis, enableStructuralAnalysis: config.analysis.enableStructuralAnalysis, qualityThresholds: config.analysis.qualityThresholds }); // 初始化修正引擎 this.correctionEngine = new correction_engine_1.CorrectionEngine(config.correction); // 初始化自动修正工具 this.autoCorrection = new auto_correction_1.AutoCorrectionTool(this.analysisEngine, this.correctionEngine, config.autoCorrection); // 确保存储目录存在 this.ensureStorageDirectories(); logger_1.logger.info('Provider Comparison System initialized', { analysisEnabled: config.analysis.enableContentAnalysis, correctionEnabled: config.correction.enableContentCorrection, autoLearningEnabled: config.autoCorrection.learningEnabled }); } /** * 执行完整的提供商对比分析 */ async compareProviders(request, codewhispererResponse, openaiResponse, options = {}) { const requestId = request.metadata?.requestId || `comparison_${Date.now()}`; const startTime = Date.now(); // 检查并发限制 if (this.activeComparisons.size >= this.config.system.maxConcurrentComparisons) { throw new Error(`Maximum concurrent comparisons limit reached: ${this.config.system.maxConcurrentComparisons}`); } logger_1.logger.info('Starting comprehensive provider comparison', { requestId, enableCorrection: options.enableCorrection !== false, enableAutoCorrection: options.enableAutoCorrection !== false, codewhispererTokens: codewhispererResponse.usage?.output_tokens || 0, openaiTokens: openaiResponse.usage?.output_tokens || 0 }); const comparisonPromise = this.executeComparison(request, codewhispererResponse, openaiResponse, options, startTime); this.activeComparisons.set(requestId, comparisonPromise); try { const result = await comparisonPromise; return result; } finally { this.activeComparisons.delete(requestId); } } /** * 批量对比多个响应对 */ async batchCompareProviders(comparisons, options = {}) { const maxConcurrency = options.maxConcurrency || 3; const results = []; logger_1.logger.info('Starting batch provider comparison', { batchSize: comparisons.length, maxConcurrency }); // 分批处理以控制并发 for (let i = 0; i < comparisons.length; i += maxConcurrency) { const batch = comparisons.slice(i, i + maxConcurrency); const batchPromises = batch.map(({ request, codewhispererResponse, openaiResponse }) => this.compareProviders(request, codewhispererResponse, openaiResponse, options)); const batchResults = await Promise.allSettled(batchPromises); for (const result of batchResults) { if (result.status === 'fulfilled') { results.push(result.value); } else { logger_1.logger.error('Batch comparison item failed', result.reason); } } logger_1.logger.debug(`Batch comparison progress: ${results.length}/${comparisons.length}`); } logger_1.logger.info('Batch provider comparison completed', { total: comparisons.length, successful: results.length, failed: comparisons.length - results.length }); return results; } /** * 获取实时修正建议 */ async getRealtimeRecommendations(request, codewhispererResponse, openaiReference) { try { return await this.autoCorrection.getRecommendations(request, codewhispererResponse, openaiReference); } catch (error) { logger_1.logger.error('Failed to get realtime recommendations', error); return { urgentRecommendations: [], improvementSuggestions: [], preventiveMeasures: [], confidence: 0 }; } } /** * 应用快速自动修正 */ async applyQuickCorrection(request, codewhispererResponse, openaiReference) { try { return await this.autoCorrection.applyAutomaticCorrection(request, codewhispererResponse, openaiReference); } catch (error) { logger_1.logger.error('Quick correction failed', error); return { correctedResponse: codewhispererResponse, appliedRules: [], confidence: 0, improvements: [] }; } } /** * 学习和更新修正规则 */ async learnAndUpdate() { if (!this.config.autoCorrection.learningEnabled) { logger_1.logger.debug('Auto-learning is disabled'); return; } try { logger_1.logger.info('Starting system learning update'); // 学习分析引擎的历史数据 await this.autoCorrection.learnFromHistory(); // 学习修正引擎的历史数据 await this.correctionEngine.learnFromHistory(); logger_1.logger.info('System learning update completed'); } catch (error) { logger_1.logger.error('System learning update failed', error); throw error; } } /** * 获取系统统计信息 */ getSystemStatistics() { const analysisStats = this.analysisEngine.getQualityStatistics(); const correctionStats = this.correctionEngine.getCorrectionStatistics(); const learningStats = this.autoCorrection.getLearningStatistics(); return { analysis: analysisStats, correction: correctionStats, learning: learningStats, system: { activeComparisons: this.activeComparisons.size, totalProcessed: analysisStats.totalComparisons, averageProcessingTime: correctionStats.performanceMetrics.averageProcessingTime } }; } /** * 导出学习数据 */ async exportLearningData() { return { patterns: this.autoCorrection.getLearnedPatterns(), rules: this.autoCorrection.getLearnedRules(), statistics: this.autoCorrection.getLearningStatistics(), exportTime: new Date() }; } /** * 清理资源 */ destroy() { this.autoCorrection.destroy(); this.activeComparisons.clear(); logger_1.logger.info('Provider Comparison System destroyed'); } // 私有方法 async executeComparison(request, codewhispererResponse, openaiResponse, options, startTime) { const requestId = request.metadata?.requestId || 'unknown'; try { // Step 1: 执行对比分析 const analysisStartTime = Date.now(); const cwProviderResponse = { response: codewhispererResponse, metadata: { responseTime: 0, // 实际项目中应该从请求指标中获取 tokenCount: { input: codewhispererResponse.usage?.input_tokens || 0, output: codewhispererResponse.usage?.output_tokens || 0 }, errors: [], warnings: [] } }; const oaiProviderResponse = { response: openaiResponse, metadata: { responseTime: 0, tokenCount: { input: openaiResponse.usage?.input_tokens || 0, output: openaiResponse.usage?.output_tokens || 0 }, errors: [], warnings: [] } }; const comparisonAnalysis = await this.analysisEngine.analyzeProviderResponses(request, cwProviderResponse, oaiProviderResponse); const analysisTime = Date.now() - analysisStartTime; // Step 2: 应用修正(如果启用) let correctionResult; let correctionTime = 0; if (options.enableCorrection !== false && comparisonAnalysis.differences.length > 0) { const correctionStartTime = Date.now(); correctionResult = await this.correctionEngine.correctResponse(request, codewhispererResponse, openaiResponse, comparisonAnalysis); correctionTime = Date.now() - correctionStartTime; } // Step 3: 应用自动修正(如果启用) let autoCorrection; let autoLearningTime = 0; if (options.enableAutoCorrection !== false) { const autoStartTime = Date.now(); autoCorrection = await this.autoCorrection.applyAutomaticCorrection(request, codewhispererResponse, openaiResponse); autoLearningTime = Date.now() - autoStartTime; } // Step 4: 生成建议 const recommendations = this.generateSystemRecommendations(comparisonAnalysis, correctionResult, autoCorrection); const totalProcessingTime = Date.now() - startTime; const result = { comparisonAnalysis, correctionResult, autoCorrection, systemMetrics: { totalProcessingTime, analysisTime, correctionTime, autoLearningTime }, recommendations }; // Step 5: 保存结果(如果启用) if (options.saveResults !== false && this.config.system.autoSaveResults) { await this.saveComparisonResult(requestId, result); } logger_1.logger.info('Provider comparison completed successfully', { requestId, totalTime: totalProcessingTime, qualityScore: comparisonAnalysis.qualityScore.overall, differencesFound: comparisonAnalysis.differences.length, correctionsApplied: correctionResult?.appliedCorrections.length || 0, autoRulesApplied: autoCorrection?.appliedRules.length || 0 }); return result; } catch (error) { logger_1.logger.error('Provider comparison failed', error, requestId); throw error; } } generateSystemRecommendations(analysis, correction, autoCorrection) { const recommendations = { immediate: [], longTerm: [], technical: [] }; // 基于分析结果的建议 if (analysis.qualityScore.overall < 50) { recommendations.immediate.push('Critical quality issues detected - immediate correction required'); } const criticalDifferences = analysis.differences.filter(d => d.severity === 'critical').length; if (criticalDifferences > 0) { recommendations.immediate.push(`${criticalDifferences} critical differences found - requires manual review`); } // 基于修正结果的建议 if (correction && correction.correctionMetrics.confidenceScore < 0.7) { recommendations.technical.push('Low correction confidence - consider improving correction strategies'); } if (correction && correction.correctionMetrics.successfulCorrections === 0) { recommendations.longTerm.push('No corrections were successfully applied - review correction engine configuration'); } // 基于自动修正的建议 if (autoCorrection && autoCorrection.appliedRules.length > 0) { recommendations.immediate.push(`${autoCorrection.appliedRules.length} automatic rules applied successfully`); } if (autoCorrection && autoCorrection.confidence < 0.6) { recommendations.longTerm.push('Auto-correction confidence is low - more training data needed'); } // 通用建议 if (analysis.qualityScore.recommendation === 'needs_correction') { recommendations.immediate.push('Response quality below threshold - correction strongly recommended'); } if (analysis.analysis.performanceComparison.responseTime.difference > 5000) { recommendations.technical.push('Significant response time difference detected - investigate performance issues'); } return recommendations; } async saveComparisonResult(requestId, result) { try { const filename = `comparison-${requestId}-${Date.now()}.json`; const filepath = path_1.default.join(this.config.system.resultStoragePath, filename); await promises_1.default.writeFile(filepath, JSON.stringify(result, null, 2), 'utf8'); logger_1.logger.debug('Comparison result saved', { filepath }); } catch (error) { logger_1.logger.error('Failed to save comparison result', error); // Don't throw - saving is not critical } } async ensureStorageDirectories() { try { await promises_1.default.mkdir(this.config.system.resultStoragePath, { recursive: true }); await promises_1.default.mkdir(this.config.autoCorrection.dataStoragePath, { recursive: true }); } catch (error) { logger_1.logger.error('Failed to create storage directories', error); } } } exports.ProviderComparisonSystem = ProviderComparisonSystem; // 导出工厂函数 function createComparisonSystem(config) { return new ProviderComparisonSystem(config); } // 导出默认配置 exports.defaultComparisonConfig = { analysis: { enableContentAnalysis: true, enablePerformanceAnalysis: true, enableStructuralAnalysis: true, qualityThresholds: { critical: 0.3, major: 0.6, minor: 0.8 } }, correction: { enableContentCorrection: true, enableStructuralCorrection: true, enableToolCorrection: true, enableMetadataCorrection: false, confidenceThreshold: 0.7, maxCorrections: 10, strategies: { content: { useReferenceLength: true, preserveOriginalStyle: false, similarityThreshold: 0.5 }, structure: { normalizeFields: true, preserveOriginalData: true }, tools: { fixFormat: true, validateParameters: true } } }, autoCorrection: { learningEnabled: true, minimumDataPoints: 10, confidenceThreshold: 0.6, patternDetectionThreshold: 3, ruleGenerationThreshold: 5, maxPatternsPerType: 10, maxRules: 50, dataStoragePath: path_1.default.join(process.env.HOME || '/tmp', '.claude-code-router', 'learning'), autoSaveInterval: 300000 }, system: { enableRealTimeCorrection: true, enableLearning: true, autoSaveResults: true, resultStoragePath: path_1.default.join(process.env.HOME || '/tmp', '.claude-code-router', 'comparisons'), maxConcurrentComparisons: 5 } }; //# sourceMappingURL=index.js.map