solver-sdk
Version:
SDK для интеграции с Code Solver Backend API
192 lines • 7.39 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.processStreamChunk = processStreamChunk;
exports.handleStreamError = handleStreamError;
/**
* Обрабатывает чанк данных из потока SSE
*/
function processStreamChunk(line, isInThinkingBlock, thinkingContent, textContent, thinkingSignature, onToken) {
// Проверяем формат строки
if (!line.startsWith('data:')) {
return {
isInThinkingBlock,
thinkingContent,
textContent,
thinkingSignature,
isDone: false
};
}
const data = line.slice(5).trim();
// Проверяем завершение потока
if (data === '[DONE]') {
if (onToken) {
onToken('');
}
return {
isInThinkingBlock,
thinkingContent,
textContent,
thinkingSignature,
chunk: {
text: '',
isComplete: true,
thinkingContent: thinkingContent.length > 0 ? thinkingContent : undefined,
thinkingSignature: thinkingSignature.length > 0 ? thinkingSignature : undefined
},
isDone: true
};
}
try {
const parsedData = JSON.parse(data);
// Обрабатываем типы событий по актуальному API Anthropic
if (parsedData.type === 'content_block_start' && parsedData.content_block?.type === 'thinking') {
const newIsInThinkingBlock = true;
if (onToken) {
onToken('[THINKING_START]');
}
return {
isInThinkingBlock: newIsInThinkingBlock,
thinkingContent,
textContent,
thinkingSignature,
chunk: {
text: '[THINKING_START]',
isComplete: false,
isThinking: true
},
isDone: false
};
}
else if (parsedData.type === 'content_block_stop' && isInThinkingBlock) {
const newIsInThinkingBlock = false;
if (onToken) {
onToken('[THINKING_END]');
}
return {
isInThinkingBlock: newIsInThinkingBlock,
thinkingContent,
textContent,
thinkingSignature,
chunk: {
text: '[THINKING_END]',
isComplete: false,
isThinking: true
},
isDone: false
};
}
else if (parsedData.type === 'content_block_delta') {
// Получаем тип дельты из данных события
const deltaType = parsedData.delta?.type;
// Обрабатываем дельту в зависимости от типа
if (deltaType === 'text_delta') {
const text = parsedData.delta?.text || '';
const newTextContent = textContent + text;
if (onToken) {
onToken(text);
}
return {
isInThinkingBlock,
thinkingContent,
textContent: newTextContent,
thinkingSignature,
chunk: {
text,
isComplete: false,
isThinking: false
},
isDone: false
};
}
else if (deltaType === 'thinking_delta') {
const thinking = parsedData.delta?.thinking || '';
const newThinkingContent = thinkingContent + thinking;
if (onToken) {
onToken(thinking);
}
return {
isInThinkingBlock: true,
thinkingContent: newThinkingContent,
textContent,
thinkingSignature,
chunk: {
text: thinking,
isComplete: false,
isThinking: true
},
isDone: false
};
}
else if (deltaType === 'signature_delta') {
const signature = parsedData.delta?.signature || '';
return {
isInThinkingBlock,
thinkingContent,
textContent,
thinkingSignature: signature,
isDone: false
};
}
else if (deltaType === 'input_json_delta') {
const jsonData = parsedData.delta?.input_json || '';
if (onToken) {
onToken(jsonData);
}
// Убираем свойство isToolUse, добавляем метаданные
return {
isInThinkingBlock,
thinkingContent,
textContent,
thinkingSignature,
chunk: {
text: jsonData,
isComplete: false,
isThinking: false
},
isDone: false
};
}
}
// Возвращаем без изменений, если тип события не обрабатывается
return {
isInThinkingBlock,
thinkingContent,
textContent,
thinkingSignature,
isDone: false
};
}
catch (e) {
console.error('Ошибка при парсинге данных:', e);
return {
isInThinkingBlock,
thinkingContent,
textContent,
thinkingSignature,
isDone: false
};
}
}
/**
* Обрабатывает ошибку из потока
*/
function handleStreamError(error) {
// Проверяем наличие ошибки географических ограничений
const errorObj = error;
const isGeoRestriction = (errorObj.status === 403 || errorObj.code === 403) &&
errorObj.message &&
(errorObj.message.includes('ограничен в вашем регионе') ||
errorObj.message.includes('Request not allowed') ||
errorObj.message.includes('forbidden'));
if (isGeoRestriction) {
console.error('\n==============================================');
console.error('⚠️ ОШИБКА ГЕОГРАФИЧЕСКОГО ОГРАНИЧЕНИЯ API ANTHROPIC');
console.error('⚠️ Для работы с API Anthropic требуется VPN или прокси');
console.error('⚠️ Anthropic API доступен только из определенных регионов');
console.error('==============================================');
// Обогащаем объект ошибки информацией о географических ограничениях
errorObj.type = 'geo_restriction';
}
return errorObj;
}
//# sourceMappingURL=stream-utils.js.map
;