route-claudecode
Version:
Advanced routing and transformation system for Claude Code outputs to multiple AI providers
198 lines • 7.85 kB
JavaScript
;
/**
* 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