UNPKG

route-claudecode

Version:

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

198 lines 7.85 kB
"use strict"; /** * CodeWhisperer Preprocessor - 兼容性处理 * 处理CodeWhisperer特定的兼容性问题和修复 * 项目所有者: Jason Zhang */ Object.defineProperty(exports, "__esModule", { value: true }); exports.CodeWhispererPreprocessor = void 0; exports.createCodeWhispererPreprocessor = createCodeWhispererPreprocessor; const logger_1 = require("@/utils/logger"); class CodeWhispererPreprocessor { name = 'codewhisperer'; /** * 应用兼容性修复 */ applyCompatibilityFixes(request) { let processedRequest = { ...request }; // 应用ProfileArn修复 processedRequest = this.applyProfileArnFix(processedRequest); // 应用模型名标准化 processedRequest = this.standardizeModelName(processedRequest); // 应用消息格式修复 processedRequest = this.fixMessageFormat(processedRequest); logger_1.logger.debug('CodeWhisperer compatibility fixes applied', { requestId: request.metadata?.requestId, model: processedRequest.model, hasProfileArn: !!processedRequest.metadata?.profileArn }); return processedRequest; } /** * 修复ProfileArn问题 * 🎯 关键修复:防止profileArn为undefined时调用substring导致错误 */ applyProfileArnFix(request) { const metadata = request.metadata; if (metadata && typeof metadata.profileArn !== 'undefined') { // 🚨 零Fallback原则:不使用默认值,而是明确处理 if (metadata.profileArn === null || metadata.profileArn === undefined || metadata.profileArn === '') { // 明确标记为非社交认证模式 metadata.profileArnStatus = 'N/A (authMethod!=social)'; logger_1.logger.debug('ProfileArn processed for non-social auth', { originalValue: metadata.profileArn, processedStatus: metadata.profileArnStatus }); } else if (typeof metadata.profileArn === 'string') { // 安全截取profileArn metadata.profileArnStatus = metadata.profileArn.length > 50 ? metadata.profileArn.substring(0, 50) + '...' : metadata.profileArn; logger_1.logger.debug('ProfileArn safely truncated', { originalLength: metadata.profileArn.length, truncated: metadata.profileArn.length > 50 }); } } return request; } /** * 标准化模型名 */ standardizeModelName(request) { const modelMapping = { 'claude-sonnet-4': 'CLAUDE_SONNET_4_20250514_V1_0', 'claude-3-7-sonnet': 'CLAUDE_3_7_SONNET', 'claude-3-5-sonnet': 'CLAUDE_3_5_SONNET' }; if (modelMapping[request.model]) { const originalModel = request.model; request.model = modelMapping[request.model]; // 保存原始模型名用于响应映射 if (!request.metadata) { request.metadata = { requestId: `cw_${Date.now()}` }; } request.metadata.originalModel = originalModel; logger_1.logger.debug('Model name standardized for CodeWhisperer', { original: originalModel, standardized: request.model }); } return request; } /** * 修复消息格式 */ fixMessageFormat(request) { if (!request.messages || !Array.isArray(request.messages)) { return request; } // 确保消息格式符合CodeWhisperer要求 request.messages = request.messages.map(message => { const fixedMessage = { ...message }; // 处理内容格式 if (typeof fixedMessage.content === 'string') { // 字符串内容保持不变 return fixedMessage; } if (Array.isArray(fixedMessage.content)) { // 数组内容进行格式检查 fixedMessage.content = fixedMessage.content.map(block => { if (block.type === 'text' && typeof block.text === 'string') { return block; } if (block.type === 'tool_use' && block.id && block.name) { return { type: 'tool_use', id: block.id, name: block.name, input: block.input || {} }; } return block; }); } return fixedMessage; }); return request; } /** * 验证请求完整性 * 🚨 零静默失败:确保所有必要字段存在 */ validateRequest(request) { // 验证基本字段 if (!request.model) { throw new Error('CodeWhisperer request missing required field: model'); } if (!request.messages || !Array.isArray(request.messages)) { throw new Error('CodeWhisperer request missing required field: messages'); } if (request.messages.length === 0) { throw new Error('CodeWhisperer request messages array is empty'); } // 验证消息格式 for (const [index, message] of request.messages.entries()) { if (!message.role) { throw new Error(`CodeWhisperer request message[${index}] missing role`); } if (!message.content) { throw new Error(`CodeWhisperer request message[${index}] missing content`); } // 验证角色值 const validRoles = ['user', 'assistant', 'system']; if (!validRoles.includes(message.role)) { throw new Error(`CodeWhisperer request message[${index}] has invalid role: ${message.role}`); } } // 验证工具格式(如果存在) if (request.tools && Array.isArray(request.tools)) { for (const [index, tool] of request.tools.entries()) { if (!tool.name) { throw new Error(`CodeWhisperer request tool[${index}] missing name`); } if (!tool.description) { throw new Error(`CodeWhisperer request tool[${index}] missing description`); } if (!tool.input_schema) { throw new Error(`CodeWhisperer request tool[${index}] missing input_schema`); } } } logger_1.logger.debug('CodeWhisperer request validation passed', { model: request.model, messageCount: request.messages.length, hasTools: !!(request.tools && request.tools.length > 0) }); } /** * 处理认证相关的预处理 */ processAuthentication(request, authConfig) { if (!request.metadata) { request.metadata = { requestId: `cw_auth_${Date.now()}` }; } // 处理profileArn相关逻辑 if (authConfig.profileArn) { request.metadata.profileArn = authConfig.profileArn; } // 处理认证方法 if (authConfig.authMethod) { request.metadata.authMethod = authConfig.authMethod; } return request; } } exports.CodeWhispererPreprocessor = CodeWhispererPreprocessor; /** * 创建CodeWhisperer预处理器实例 */ function createCodeWhispererPreprocessor() { return new CodeWhispererPreprocessor(); } //# sourceMappingURL=codewhisperer-preprocessor.js.map