UNPKG

route-claudecode

Version:

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

159 lines 6.59 kB
"use strict"; /** * OpenAI通用流式解析器实现 * 基于通用框架的OpenAI Provider优化 * Owner: Jason Zhang */ Object.defineProperty(exports, "__esModule", { value: true }); exports.EnhancedOpenAIAnalyzer = void 0; exports.createOptimizedOpenAIParser = createOptimizedOpenAIParser; exports.processOpenAIResponse = processOpenAIResponse; const logger_1 = require("@/utils/logger"); const universal_streaming_parser_1 = require("../common/universal-streaming-parser"); /** * OpenAI缓冲处理策略实现 */ class OpenAIBufferedStrategy extends universal_streaming_parser_1.BufferedProcessingStrategy { async process(data, requestId, metadata) { const content = Buffer.isBuffer(data) ? data.toString() : data; logger_1.logger.info('🔧 OpenAI buffered processing (tool calls detected)', { dataLength: content.length, reason: 'tool_calls_detected' }, requestId, 'openai-buffered-parser'); return this.parseOpenAIStreamResponse(content, requestId); } parseOpenAIStreamResponse(content, requestId) { const events = []; const lines = content.split('\n'); for (const line of lines) { if (line.startsWith('data: ')) { const data = line.slice(6).trim(); if (data === '[DONE]') { break; } try { const parsedData = JSON.parse(data); events.push(parsedData); } catch (error) { logger_1.logger.debug('Failed to parse OpenAI stream line', { line: data, error: error instanceof Error ? error.message : String(error) }, requestId, 'openai-buffered-parser'); } } } logger_1.logger.debug('OpenAI buffered parsing completed', { totalEvents: events.length, eventTypes: events.map(e => e.object || 'unknown').slice(0, 5) }, requestId, 'openai-buffered-parser'); return events; } } /** * OpenAI直接流式策略实现 */ class OpenAIDirectStrategy extends universal_streaming_parser_1.DirectStreamingStrategy { async process(data, requestId, metadata) { const content = Buffer.isBuffer(data) ? data.toString() : data; logger_1.logger.info('⚡ OpenAI direct streaming (no tools, small response)', { dataLength: content.length, reason: 'small_response_no_tools' }, requestId, 'openai-direct-parser'); // 对于小响应,直接解析即可 return this.parseOpenAIStreamResponse(content, requestId); } parseOpenAIStreamResponse(content, requestId) { const events = []; const lines = content.split('\n'); for (const line of lines) { if (line.startsWith('data: ')) { const data = line.slice(6).trim(); if (data === '[DONE]') { break; } try { const parsedData = JSON.parse(data); events.push(parsedData); } catch (error) { logger_1.logger.debug('Failed to parse OpenAI stream line', { line: data.slice(0, 100), error: error instanceof Error ? error.message : String(error) }, requestId, 'openai-direct-parser'); } } } logger_1.logger.debug('OpenAI direct parsing completed', { totalEvents: events.length, processingTime: 'minimal' }, requestId, 'openai-direct-parser'); return events; } } /** * OpenAI批量处理策略 (如果需要的话) */ class OpenAIBatchStrategy extends universal_streaming_parser_1.DirectStreamingStrategy { name = 'openai-batch'; shouldUse(analysis) { // OpenAI通常不需要批量处理,因为事件已经比较大 // 但如果发现有大量小事件,可以启用 return analysis.estimatedEventCount > 1000 && analysis.eventSize === 'small'; } async process(data, requestId, metadata) { logger_1.logger.info('🚀 OpenAI batch processing (large event count)', { dataLength: Buffer.isBuffer(data) ? data.length : data.length, reason: 'large_event_count' }, requestId, 'openai-batch-parser'); // 对于OpenAI,通常直接处理即可,因为事件本身不会太小 return new OpenAIDirectStrategy().process(data, requestId, metadata); } } /** * 创建OpenAI优化解析器 */ function createOptimizedOpenAIParser(requestId) { const analyzer = new universal_streaming_parser_1.OpenAIAnalyzer(); const strategies = [ new OpenAIBufferedStrategy(), new OpenAIBatchStrategy(), new OpenAIDirectStrategy() ]; return new universal_streaming_parser_1.UniversalStreamingParser(analyzer, strategies); } /** * 便捷的OpenAI响应处理方法 */ async function processOpenAIResponse(data, requestId, metadata) { const parser = createOptimizedOpenAIParser(requestId); return parser.processResponse(data, requestId, metadata); } /** * OpenAI增强分析器 - 针对特定提供商优化 */ class EnhancedOpenAIAnalyzer extends universal_streaming_parser_1.OpenAIAnalyzer { analyzeResponseStructure(buffer) { const baseAnalysis = super.analyzeResponseStructure(buffer); // 针对特定OpenAI兼容提供商的优化 const content = Buffer.isBuffer(buffer) ? buffer.toString() : buffer; // 检查是否为Shuaihong等第三方提供商的特殊响应格式 const isThirdPartyProvider = this.detectThirdPartyProvider(content); const hasLargeContent = content.length > 50000; // 50KB return { ...baseAnalysis, recommendedStrategy: isThirdPartyProvider && hasLargeContent ? 'buffered' : baseAnalysis.hasToolCalls ? 'buffered' : 'direct-streaming', confidence: isThirdPartyProvider ? 0.95 : baseAnalysis.confidence }; } detectThirdPartyProvider(content) { // 检测第三方提供商的特殊标识 const thirdPartySignatures = [ 'shuaihong', 'modelscope', 'deepseek', 'zhipu' ]; return thirdPartySignatures.some(sig => content.toLowerCase().includes(sig)); } } exports.EnhancedOpenAIAnalyzer = EnhancedOpenAIAnalyzer; //# sourceMappingURL=universal-openai-parser.js.map