UNPKG

route-claudecode

Version:

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

321 lines 15.6 kB
#!/usr/bin/env node "use strict"; /** * 动态模型配置发现和验证工具 * CLI工具用于测试和管理动态模型配置系统 */ Object.defineProperty(exports, "__esModule", { value: true }); const commander_1 = require("commander"); const dynamic_model_config_manager_1 = require("@/utils/dynamic-model-config-manager"); const config_paths_1 = require("@/utils/config-paths"); const fs_1 = require("fs"); const program = new commander_1.Command(); program .name('dynamic-model-cli') .description('Claude Code Router - Dynamic Model Configuration CLI') .version('1.0.0'); /** * 加载路由器配置 */ async function loadRouterConfig(configPath) { try { if (configPath) { const configData = (0, fs_1.readFileSync)(configPath, 'utf8'); return JSON.parse(configData); } // 使用默认配置路径 const configPaths = (0, config_paths_1.getConfigPaths)(); const configData = (0, fs_1.readFileSync)(configPaths.configDir + '/config.json', 'utf8'); return JSON.parse(configData); } catch (error) { console.error('Failed to load router configuration:', error.message); process.exit(1); } } /** * 发现和验证所有提供商的模型 */ program .command('discover-all') .description('Discover and validate models for all providers') .option('-c, --config <path>', 'Router configuration file path') .option('-o, --output <path>', 'Output file path for results') .option('--max-models <number>', 'Maximum models per provider', '10') .option('--timeout <number>', 'Test timeout in milliseconds', '30000') .action(async (options) => { console.log('🔍 Starting comprehensive model discovery...'); const config = await loadRouterConfig(options.config); const manager = (0, dynamic_model_config_manager_1.createDynamicModelConfigManager)({ ...dynamic_model_config_manager_1.DEFAULT_MODEL_CONFIG_MANAGER_CONFIG, maxModelsPerProvider: parseInt(options.maxModels), testTimeout: parseInt(options.timeout) }); const results = { timestamp: new Date().toISOString(), providers: {}, summary: { totalProviders: 0, totalModels: 0, availableModels: 0, averageResponseTime: 0 } }; try { // 注册所有提供商 for (const [providerId, providerConfig] of Object.entries(config.providers)) { console.log(`\n📋 Registering provider: ${providerId}`); await manager.registerProvider(providerId, providerConfig); results.summary.totalProviders++; } // 为每个提供商发现模型 for (const providerId of Object.keys(config.providers)) { console.log(`\n🔍 Discovering models for provider: ${providerId}`); try { const discoveryResult = await manager.discoverProviderModels(providerId); results.providers[providerId] = discoveryResult; results.summary.totalModels += discoveryResult.totalModels; results.summary.availableModels += discoveryResult.availableModels.length; console.log(` ✅ Total models: ${discoveryResult.totalModels}`); console.log(` ✅ Available models: ${discoveryResult.availableModels.length}`); console.log(` ✅ Unavailable models: ${discoveryResult.unavailableModels.length}`); console.log(` ⏱️ Average response time: ${discoveryResult.averageResponseTime}ms`); if (discoveryResult.availableModels.length > 0) { console.log(` 📝 Available models: ${discoveryResult.availableModels.slice(0, 5).join(', ')}`); if (discoveryResult.availableModels.length > 5) { console.log(` ... and ${discoveryResult.availableModels.length - 5} more`); } } if (discoveryResult.errors.length > 0) { console.log(` ⚠️ Errors: ${discoveryResult.errors.join('; ')}`); } } catch (error) { console.error(` ❌ Failed to discover models for ${providerId}: ${error.message}`); results.providers[providerId] = { error: error.message, totalModels: 0, availableModels: [], unavailableModels: [] }; } } // 计算总体平均响应时间 const totalResponseTime = Object.values(results.providers) .filter((p) => p.averageResponseTime) .reduce((sum, p) => sum + p.averageResponseTime, 0); const validProviders = Object.values(results.providers) .filter((p) => p.averageResponseTime) .length; results.summary.averageResponseTime = validProviders > 0 ? totalResponseTime / validProviders : 0; // 输出结果摘要 console.log('\n🎯 Discovery Summary:'); console.log(` 📊 Total providers: ${results.summary.totalProviders}`); console.log(` 📊 Total models discovered: ${results.summary.totalModels}`); console.log(` ✅ Available models: ${results.summary.availableModels}`); console.log(` ❌ Unavailable models: ${results.summary.totalModels - results.summary.availableModels}`); console.log(` ⏱️ Average response time: ${Math.round(results.summary.averageResponseTime)}ms`); // 保存结果到文件 if (options.output) { (0, fs_1.writeFileSync)(options.output, JSON.stringify(results, null, 2)); console.log(`\n💾 Results saved to: ${options.output}`); } console.log('\n✅ Model discovery completed successfully!'); } catch (error) { console.error('\n❌ Model discovery failed:', error.message); process.exit(1); } }); /** * 测试特定提供商的模型可用性 */ program .command('test-provider') .description('Test model availability for a specific provider') .argument('<provider-id>', 'Provider ID to test') .option('-c, --config <path>', 'Router configuration file path') .option('--model <model>', 'Specific model to test (optional)') .option('--retries <number>', 'Number of test retries', '3') .action(async (providerId, options) => { console.log(`🔍 Testing provider: ${providerId}`); const config = await loadRouterConfig(options.config); const providerConfig = config.providers[providerId]; if (!providerConfig) { console.error(`❌ Provider ${providerId} not found in configuration`); process.exit(1); } const manager = (0, dynamic_model_config_manager_1.createDynamicModelConfigManager)({ ...dynamic_model_config_manager_1.DEFAULT_MODEL_CONFIG_MANAGER_CONFIG, testRetries: parseInt(options.retries) }); try { await manager.registerProvider(providerId, providerConfig); if (options.model) { // 测试特定模型 console.log(`\n🧪 Testing model: ${options.model}`); const isAvailable = await manager.testModelAvailability(providerId, options.model); console.log(` ${isAvailable ? '✅' : '❌'} Model ${options.model} is ${isAvailable ? 'available' : 'unavailable'}`); // 获取模型详细信息 const modelConfig = manager.getModelConfig(providerId, options.model); if (modelConfig) { console.log(` 📊 Response time: ${modelConfig.responseTime}ms`); console.log(` 🏷️ Category: ${modelConfig.category}`); console.log(` 🎯 Priority: ${modelConfig.priority}`); console.log(` 🔧 Capabilities: ${JSON.stringify(modelConfig.capabilities)}`); } } else { // 测试所有模型 console.log('\n🔍 Discovering models...'); const result = await manager.discoverProviderModels(providerId); console.log(`\n📊 Test Results for ${providerId}:`); console.log(` 📝 Total models: ${result.totalModels}`); console.log(` ✅ Available models: ${result.availableModels.length}`); console.log(` ❌ Unavailable models: ${result.unavailableModels.length}`); console.log(` ⏱️ Average response time: ${result.averageResponseTime}ms`); if (result.availableModels.length > 0) { console.log(`\n✅ Available models:`); result.availableModels.forEach((modelId, index) => { const modelConfig = manager.getModelConfig(providerId, modelId); if (modelConfig) { console.log(` ${index + 1}. ${modelId} (${modelConfig.responseTime}ms, ${modelConfig.category})`); } }); } if (result.unavailableModels.length > 0) { console.log(`\n❌ Unavailable models:`); result.unavailableModels.forEach((modelId, index) => { console.log(` ${index + 1}. ${modelId}`); }); } } console.log('\n✅ Provider test completed successfully!'); } catch (error) { console.error('\n❌ Provider test failed:', error.message); process.exit(1); } }); /** * 启动自动发现监控 */ program .command('monitor') .description('Start auto-discovery monitoring with real-time updates') .argument('<duration>', 'Monitoring duration in minutes') .option('-c, --config <path>', 'Router configuration file path') .option('--interval <number>', 'Discovery interval in minutes', '5') .action(async (duration, options) => { console.log(`🔍 Starting auto-discovery monitoring for ${duration} minutes...`); const config = await loadRouterConfig(options.config); const manager = (0, dynamic_model_config_manager_1.createDynamicModelConfigManager)({ ...dynamic_model_config_manager_1.DEFAULT_MODEL_CONFIG_MANAGER_CONFIG, discoveryInterval: parseInt(options.interval) }); // 添加模型更新监听器 manager.addModelUpdateListener((event) => { const timestamp = new Date(event.timestamp).toLocaleTimeString(); console.log(`[${timestamp}] 🔄 ${event.type}: ${event.providerId}/${event.modelId}`); if (event.details?.result) { const result = event.details.result; console.log(` 📊 Available: ${result.availableModels.length}, Response time: ${Math.round(result.averageResponseTime)}ms`); } }); try { // 注册所有提供商 for (const [providerId, providerConfig] of Object.entries(config.providers)) { console.log(`📋 Registering provider: ${providerId}`); await manager.registerProvider(providerId, providerConfig); } console.log('\n🚀 Starting monitoring...'); console.log(` ⏱️ Interval: ${options.interval} minutes`); console.log(` ⏱️ Duration: ${duration} minutes`); console.log(' 🔄 Press Ctrl+C to stop monitoring'); console.log(''); // 启动自动发现 manager.startAutoDiscovery(); // 监控指定时长 const endTime = Date.now() + (parseInt(duration) * 60 * 1000); const statusInterval = setInterval(() => { const status = manager.getStatus(); console.log(`[STATUS] 📊 Providers: ${status.registeredProviders.length}, Models: ${status.totalModels}, Available: ${status.availableModels}`); }, 60000); // 每分钟输出状态 // 等待指定时长 await new Promise(resolve => { const checkInterval = setInterval(() => { if (Date.now() >= endTime) { clearInterval(checkInterval); clearInterval(statusInterval); resolve(undefined); } }, 1000); }); // 停止监控 manager.stopAutoDiscovery(); // 输出最终状态 const finalStatus = manager.getStatus(); console.log('\n🎯 Final Status:'); console.log(` 📊 Registered providers: ${finalStatus.registeredProviders.length}`); console.log(` 📊 Total models: ${finalStatus.totalModels}`); console.log(` ✅ Available models: ${finalStatus.availableModels}`); console.log(` 🔄 Auto discovery: ${finalStatus.isAutoDiscoveryRunning ? 'running' : 'stopped'}`); console.log('\n✅ Monitoring completed successfully!'); } catch (error) { console.error('\n❌ Monitoring failed:', error.message); process.exit(1); } }); /** * 显示系统状态 */ program .command('status') .description('Show dynamic model configuration system status') .option('-c, --config <path>', 'Router configuration file path') .action(async (options) => { console.log('📊 Dynamic Model Configuration System Status'); try { const config = await loadRouterConfig(options.config); const manager = (0, dynamic_model_config_manager_1.createDynamicModelConfigManager)(dynamic_model_config_manager_1.DEFAULT_MODEL_CONFIG_MANAGER_CONFIG); console.log('\n📋 Configuration Providers:'); Object.keys(config.providers).forEach(providerId => { console.log(` 📝 ${providerId}`); }); console.log('\n🔧 System Configuration:'); console.log(` 🔄 Auto discovery: ${dynamic_model_config_manager_1.DEFAULT_MODEL_CONFIG_MANAGER_CONFIG.autoDiscovery ? 'enabled' : 'disabled'}`); console.log(` ⏱️ Discovery interval: ${dynamic_model_config_manager_1.DEFAULT_MODEL_CONFIG_MANAGER_CONFIG.discoveryInterval} minutes`); console.log(` 📊 Max models per provider: ${dynamic_model_config_manager_1.DEFAULT_MODEL_CONFIG_MANAGER_CONFIG.maxModelsPerProvider}`); console.log(` 🧪 Test retries: ${dynamic_model_config_manager_1.DEFAULT_MODEL_CONFIG_MANAGER_CONFIG.testRetries}`); console.log(` ⏱️ Test timeout: ${dynamic_model_config_manager_1.DEFAULT_MODEL_CONFIG_MANAGER_CONFIG.testTimeout}ms`); console.log(` 💾 Cache enabled: ${dynamic_model_config_manager_1.DEFAULT_MODEL_CONFIG_MANAGER_CONFIG.enableCaching}`); console.log(` ⏰ Cache expiry: ${dynamic_model_config_manager_1.DEFAULT_MODEL_CONFIG_MANAGER_CONFIG.cacheExpiry} minutes`); console.log('\n✅ System is ready for model discovery!'); } catch (error) { console.error('\n❌ Failed to get system status:', error.message); process.exit(1); } }); /** * 清除所有缓存 */ program .command('clear-cache') .description('Clear all model discovery caches') .action(async () => { console.log('🧹 Clearing all model discovery caches...'); try { const manager = (0, dynamic_model_config_manager_1.createDynamicModelConfigManager)(dynamic_model_config_manager_1.DEFAULT_MODEL_CONFIG_MANAGER_CONFIG); manager.clearAllCaches(); console.log('✅ All caches cleared successfully!'); } catch (error) { console.error('\n❌ Failed to clear caches:', error.message); process.exit(1); } }); // 解析命令行参数 program.parse(); //# sourceMappingURL=dynamic-model-cli.js.map