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