solver-sdk 3.1.10 → 3.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/api/chat-api/index.js +89 -118
- package/dist/cjs/api/chat-api/index.js.map +1 -1
- package/dist/cjs/api/chat-api/stream-utils.js +133 -344
- package/dist/cjs/api/chat-api/stream-utils.js.map +1 -1
- package/dist/cjs/code-solver-sdk.js +10 -10
- package/dist/cjs/code-solver-sdk.js.map +1 -1
- package/dist/cjs/utils/message-helpers.js +1 -1
- package/dist/cjs/utils/message-helpers.js.map +1 -1
- package/dist/esm/api/chat-api/index.js +89 -118
- package/dist/esm/api/chat-api/index.js.map +1 -1
- package/dist/esm/api/chat-api/stream-utils.js +131 -344
- package/dist/esm/api/chat-api/stream-utils.js.map +1 -1
- package/dist/esm/code-solver-sdk.js +10 -10
- package/dist/esm/code-solver-sdk.js.map +1 -1
- package/dist/esm/utils/message-helpers.js +1 -1
- package/dist/esm/utils/message-helpers.js.map +1 -1
- package/dist/types/api/chat-api/index.d.ts +1 -1
- package/dist/types/api/chat-api/index.d.ts.map +1 -1
- package/dist/types/api/chat-api/models.d.ts +28 -21
- package/dist/types/api/chat-api/models.d.ts.map +1 -1
- package/dist/types/api/chat-api/stream-utils.d.ts +22 -18
- package/dist/types/api/chat-api/stream-utils.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -3,377 +3,166 @@
|
|
|
3
3
|
* Утилиты для обработки потоковых данных от API чата
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseStreamLine = parseStreamLine;
|
|
7
|
+
exports.isStreamComplete = isStreamComplete;
|
|
6
8
|
exports.processStreamChunk = processStreamChunk;
|
|
7
9
|
exports.handleStreamError = handleStreamError;
|
|
8
10
|
/**
|
|
9
|
-
*
|
|
10
|
-
* @param line Строка данных из потока
|
|
11
|
-
* @param isInThinkingBlock Флаг нахождения в блоке мышления
|
|
12
|
-
* @param thinkingContent Накопленное содержимое мышления
|
|
13
|
-
* @param textContent Накопленное текстовое содержимое
|
|
14
|
-
* @param thinkingSignature Подпись блока мышления
|
|
15
|
-
* @param onToken Обработчик получения токена
|
|
16
|
-
* @returns Результат обработки
|
|
11
|
+
* Парсит строку SSE потока согласно официальному Anthropic API
|
|
17
12
|
*/
|
|
18
|
-
function
|
|
13
|
+
function parseStreamLine(line) {
|
|
14
|
+
// Пропускаем пустые строки и комментарии
|
|
15
|
+
if (!line.trim() || line.startsWith(':')) {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
// Обрабатываем только data: события
|
|
19
|
+
if (!line.startsWith('data: ')) {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
const data = line.slice(6).trim();
|
|
23
|
+
// Пропускаем пустые данные
|
|
24
|
+
if (!data) {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const jsonData = JSON.parse(data);
|
|
29
|
+
// ✅ Все события Anthropic API имеют поле type
|
|
30
|
+
if (!jsonData.type) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
// Создаем chunk согласно официальному формату Anthropic
|
|
34
|
+
const chunk = {
|
|
35
|
+
type: jsonData.type,
|
|
36
|
+
...jsonData
|
|
37
|
+
};
|
|
38
|
+
return { chunk };
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.warn('Failed to parse SSE line:', line, error);
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Проверяет завершен ли поток согласно Anthropic API
|
|
47
|
+
*/
|
|
48
|
+
function isStreamComplete(chunk) {
|
|
49
|
+
return chunk.type === 'message_stop';
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Обрабатывает чанк потоковой передачи данных в формате Server-Sent Events
|
|
53
|
+
* Работает только с официальными событиями Anthropic API
|
|
54
|
+
*
|
|
55
|
+
* @param line Строка из SSE потока
|
|
56
|
+
* @param logger Логгер для отладки
|
|
57
|
+
* @param options Опции обработки
|
|
58
|
+
* @returns Результат обработки чанка
|
|
59
|
+
*/
|
|
60
|
+
function processStreamChunk(line, logger, options) {
|
|
19
61
|
try {
|
|
62
|
+
// Игнорируем пустые строки и комментарии
|
|
63
|
+
if (!line.trim() || line.startsWith(':')) {
|
|
64
|
+
return {};
|
|
65
|
+
}
|
|
66
|
+
// Проверяем формат SSE
|
|
20
67
|
if (!line.startsWith('data: ')) {
|
|
21
|
-
return {
|
|
68
|
+
return {};
|
|
22
69
|
}
|
|
23
70
|
const data = line.slice(6).trim();
|
|
24
|
-
//
|
|
25
|
-
if (data
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
// 🔧 КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Обрабатываем события начала блока tool_use
|
|
62
|
-
if (jsonData.type === 'content_block_start' && jsonData.content_block?.type === 'tool_use') {
|
|
63
|
-
const chunk = {
|
|
64
|
-
type: 'content_block_start',
|
|
65
|
-
text: '',
|
|
66
|
-
isComplete: false,
|
|
67
|
-
isThinking: false,
|
|
68
|
-
// Передаем данные tool_use в chunk для доступа в onEvent callback
|
|
69
|
-
data: {
|
|
70
|
-
content_block: jsonData.content_block,
|
|
71
|
-
index: jsonData.index
|
|
71
|
+
// Пропускаем пустые данные
|
|
72
|
+
if (!data) {
|
|
73
|
+
return {};
|
|
74
|
+
}
|
|
75
|
+
// Парсим JSON данные
|
|
76
|
+
let jsonData;
|
|
77
|
+
try {
|
|
78
|
+
jsonData = JSON.parse(data);
|
|
79
|
+
}
|
|
80
|
+
catch (parseError) {
|
|
81
|
+
if (logger) {
|
|
82
|
+
logger.error('Ошибка парсинга JSON', { error: parseError, data: data.substring(0, 100) });
|
|
83
|
+
}
|
|
84
|
+
return {};
|
|
85
|
+
}
|
|
86
|
+
// Валидируем что это официальное событие Anthropic API
|
|
87
|
+
const validEvents = [
|
|
88
|
+
'message_start', 'content_block_start', 'content_block_delta',
|
|
89
|
+
'content_block_stop', 'message_delta', 'message_stop', 'ping', 'error'
|
|
90
|
+
];
|
|
91
|
+
if (!validEvents.includes(jsonData.type)) {
|
|
92
|
+
if (logger) {
|
|
93
|
+
logger.warn('Неизвестное событие', { type: jsonData.type });
|
|
94
|
+
}
|
|
95
|
+
return {};
|
|
96
|
+
}
|
|
97
|
+
// Создаем ChatStreamChunk в соответствии с официальным API
|
|
98
|
+
const chunk = {
|
|
99
|
+
type: jsonData.type
|
|
100
|
+
};
|
|
101
|
+
// Добавляем поля в зависимости от типа события
|
|
102
|
+
switch (jsonData.type) {
|
|
103
|
+
case 'message_start':
|
|
104
|
+
if (jsonData.message) {
|
|
105
|
+
chunk.message = jsonData.message;
|
|
72
106
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
textContent,
|
|
78
|
-
thinkingSignature,
|
|
79
|
-
chunk,
|
|
80
|
-
isDone: false
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
// ✅ ИСПРАВЛЕНИЕ: Обрабатываем события начала текстового блока
|
|
84
|
-
if (jsonData.type === 'content_block_start' && jsonData.content_block?.type === 'text') {
|
|
85
|
-
const chunk = {
|
|
86
|
-
type: 'content_block_start',
|
|
87
|
-
text: '',
|
|
88
|
-
isComplete: false,
|
|
89
|
-
isThinking: false,
|
|
90
|
-
data: {
|
|
91
|
-
content_block: jsonData.content_block,
|
|
92
|
-
index: jsonData.index
|
|
107
|
+
break;
|
|
108
|
+
case 'content_block_start':
|
|
109
|
+
if (jsonData.index !== undefined) {
|
|
110
|
+
chunk.index = jsonData.index;
|
|
93
111
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
isInThinkingBlock,
|
|
97
|
-
thinkingContent,
|
|
98
|
-
textContent,
|
|
99
|
-
thinkingSignature,
|
|
100
|
-
chunk,
|
|
101
|
-
isDone: false
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
// ✅ Удалено: дублирование thinking_delta обработки (основная версия ниже)
|
|
105
|
-
// ✅ ИСПРАВЛЕНИЕ: Обрабатываем signature_delta согласно документации Anthropic
|
|
106
|
-
if (jsonData.type === 'content_block_delta' && jsonData.delta?.type === 'signature_delta' && jsonData.delta.signature) {
|
|
107
|
-
const newSignature = jsonData.delta.signature;
|
|
108
|
-
const chunk = {
|
|
109
|
-
type: 'content_block_delta',
|
|
110
|
-
text: '', // signature не отображается как текст
|
|
111
|
-
isComplete: false,
|
|
112
|
-
isThinking: true, // signature относится к thinking блоку
|
|
113
|
-
signature: newSignature
|
|
114
|
-
};
|
|
115
|
-
return {
|
|
116
|
-
isInThinkingBlock,
|
|
117
|
-
thinkingContent,
|
|
118
|
-
textContent,
|
|
119
|
-
thinkingSignature: newSignature,
|
|
120
|
-
chunk,
|
|
121
|
-
isDone: false
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
// ✅ КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Обрабатываем дельты мышления в правильном формате
|
|
125
|
-
if (jsonData.type === 'content_block_delta' && jsonData.delta?.type === 'thinking_delta' && jsonData.delta.thinking) {
|
|
126
|
-
const newThinkingContent = thinkingContent + jsonData.delta.thinking;
|
|
127
|
-
const chunk = {
|
|
128
|
-
type: 'content_block_delta',
|
|
129
|
-
text: jsonData.delta.thinking, // ✅ Извлекаем текст из delta.thinking
|
|
130
|
-
isComplete: false,
|
|
131
|
-
isThinking: true
|
|
132
|
-
};
|
|
133
|
-
// Вызываем onToken если передан
|
|
134
|
-
if (onToken) {
|
|
135
|
-
onToken(jsonData.delta.thinking);
|
|
136
|
-
}
|
|
137
|
-
return {
|
|
138
|
-
isInThinkingBlock: true,
|
|
139
|
-
thinkingContent: newThinkingContent,
|
|
140
|
-
textContent,
|
|
141
|
-
thinkingSignature,
|
|
142
|
-
chunk,
|
|
143
|
-
isDone: false
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
// ✅ ИСПРАВЛЕНИЕ: Обрабатываем завершение любых блоков контента
|
|
147
|
-
if (jsonData.type === 'content_block_stop') {
|
|
148
|
-
const chunk = {
|
|
149
|
-
type: 'content_block_stop',
|
|
150
|
-
text: '',
|
|
151
|
-
isComplete: false,
|
|
152
|
-
isThinking: isInThinkingBlock, // Сохраняем текущее состояние thinking
|
|
153
|
-
data: {
|
|
154
|
-
index: jsonData.index
|
|
112
|
+
if (jsonData.content_block) {
|
|
113
|
+
chunk.content_block = jsonData.content_block;
|
|
155
114
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
textContent,
|
|
161
|
-
thinkingSignature,
|
|
162
|
-
chunk,
|
|
163
|
-
isDone: false
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
// 🔧 КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Обрабатываем input_json_delta для инструментов
|
|
167
|
-
if (jsonData.type === 'content_block_delta' && jsonData.delta?.type === 'input_json_delta') {
|
|
168
|
-
const chunk = {
|
|
169
|
-
type: 'content_block_delta',
|
|
170
|
-
text: jsonData.delta.partial_json || '',
|
|
171
|
-
isComplete: false,
|
|
172
|
-
isThinking: false,
|
|
173
|
-
data: {
|
|
174
|
-
delta: jsonData.delta,
|
|
175
|
-
index: jsonData.index
|
|
115
|
+
break;
|
|
116
|
+
case 'content_block_delta':
|
|
117
|
+
if (jsonData.index !== undefined) {
|
|
118
|
+
chunk.index = jsonData.index;
|
|
176
119
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
isComplete: false,
|
|
198
|
-
isThinking: false
|
|
199
|
-
};
|
|
200
|
-
// Вызываем onToken если передан
|
|
201
|
-
if (onToken) {
|
|
202
|
-
onToken(jsonData.delta.text);
|
|
203
|
-
}
|
|
204
|
-
return {
|
|
205
|
-
isInThinkingBlock,
|
|
206
|
-
thinkingContent,
|
|
207
|
-
textContent: newTextContent,
|
|
208
|
-
thinkingSignature,
|
|
209
|
-
chunk,
|
|
210
|
-
isDone: false
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
// ✅ СОХРАНЯЕМ: Обрабатываем legacy форматы для совместимости
|
|
214
|
-
if (jsonData.event === 'thinking_delta' && jsonData.thinking && isInThinkingBlock) {
|
|
215
|
-
const newThinkingContent = thinkingContent + jsonData.thinking;
|
|
216
|
-
const chunk = {
|
|
217
|
-
type: 'content_block_delta',
|
|
218
|
-
text: jsonData.thinking,
|
|
219
|
-
isComplete: false,
|
|
220
|
-
isThinking: true
|
|
221
|
-
};
|
|
222
|
-
if (onToken) {
|
|
223
|
-
onToken(jsonData.thinking);
|
|
224
|
-
}
|
|
225
|
-
return {
|
|
226
|
-
isInThinkingBlock: true,
|
|
227
|
-
thinkingContent: newThinkingContent,
|
|
228
|
-
textContent,
|
|
229
|
-
thinkingSignature,
|
|
230
|
-
chunk,
|
|
231
|
-
isDone: false
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
// Обрабатываем завершение мышления (legacy)
|
|
235
|
-
if (jsonData.type === 'thinking_end' ||
|
|
236
|
-
(jsonData.event === 'thinking_signature' && isInThinkingBlock)) {
|
|
237
|
-
let signature = thinkingSignature;
|
|
238
|
-
if (jsonData.signature) {
|
|
239
|
-
signature = jsonData.signature;
|
|
240
|
-
}
|
|
241
|
-
const chunk = {
|
|
242
|
-
type: 'content_block_delta',
|
|
243
|
-
text: jsonData.text || '',
|
|
244
|
-
isComplete: false,
|
|
245
|
-
isThinking: false
|
|
246
|
-
};
|
|
247
|
-
if (jsonData.text && onToken) {
|
|
248
|
-
onToken(jsonData.text);
|
|
249
|
-
}
|
|
250
|
-
return {
|
|
251
|
-
isInThinkingBlock: false,
|
|
252
|
-
thinkingContent,
|
|
253
|
-
textContent: textContent + (jsonData.text || ''),
|
|
254
|
-
thinkingSignature: signature,
|
|
255
|
-
chunk,
|
|
256
|
-
isDone: false
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
// Обрабатываем текстовые дельты (legacy)
|
|
260
|
-
if (jsonData.event === 'text_delta' && jsonData.text) {
|
|
261
|
-
const newTextContent = textContent + jsonData.text;
|
|
262
|
-
const chunk = {
|
|
263
|
-
type: 'content_block_delta',
|
|
264
|
-
text: jsonData.text,
|
|
265
|
-
isComplete: false,
|
|
266
|
-
isThinking: false
|
|
267
|
-
};
|
|
268
|
-
if (onToken) {
|
|
269
|
-
onToken(jsonData.text);
|
|
270
|
-
}
|
|
271
|
-
return {
|
|
272
|
-
isInThinkingBlock,
|
|
273
|
-
thinkingContent,
|
|
274
|
-
textContent: newTextContent,
|
|
275
|
-
thinkingSignature,
|
|
276
|
-
chunk,
|
|
277
|
-
isDone: false
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
// ✅ ИСПРАВЛЕНИЕ: Обрабатываем message_start согласно документации Anthropic
|
|
281
|
-
if (jsonData.type === 'message_start') {
|
|
282
|
-
const chunk = {
|
|
283
|
-
type: 'message_start',
|
|
284
|
-
message: jsonData.message,
|
|
285
|
-
text: '',
|
|
286
|
-
isComplete: false
|
|
287
|
-
};
|
|
288
|
-
return {
|
|
289
|
-
isInThinkingBlock,
|
|
290
|
-
thinkingContent,
|
|
291
|
-
textContent,
|
|
292
|
-
thinkingSignature,
|
|
293
|
-
chunk,
|
|
294
|
-
isDone: false
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
// ✅ ИСПРАВЛЕНИЕ: Обрабатываем message_delta согласно документации Anthropic
|
|
298
|
-
if (jsonData.type === 'message_delta') {
|
|
299
|
-
const chunk = {
|
|
300
|
-
type: 'message_delta',
|
|
301
|
-
delta: jsonData.delta,
|
|
302
|
-
text: '',
|
|
303
|
-
isComplete: false
|
|
304
|
-
};
|
|
305
|
-
return {
|
|
306
|
-
isInThinkingBlock,
|
|
307
|
-
thinkingContent,
|
|
308
|
-
textContent,
|
|
309
|
-
thinkingSignature,
|
|
310
|
-
chunk,
|
|
311
|
-
isDone: false
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
// ✅ ИСПРАВЛЕНИЕ: Обрабатываем message_stop согласно документации Anthropic
|
|
315
|
-
if (jsonData.type === 'message_stop') {
|
|
316
|
-
const chunk = {
|
|
317
|
-
type: 'message_stop',
|
|
318
|
-
message: jsonData.message,
|
|
319
|
-
text: '',
|
|
320
|
-
isComplete: true
|
|
321
|
-
};
|
|
322
|
-
return {
|
|
323
|
-
isInThinkingBlock: false, // Завершаем thinking при остановке сообщения
|
|
324
|
-
thinkingContent,
|
|
325
|
-
textContent,
|
|
326
|
-
thinkingSignature,
|
|
327
|
-
chunk,
|
|
328
|
-
isDone: true
|
|
329
|
-
};
|
|
330
|
-
}
|
|
331
|
-
// Обрабатываем обычные текстовые данные (fallback)
|
|
332
|
-
if (jsonData.content || jsonData.text || jsonData.delta) {
|
|
333
|
-
const text = jsonData.content || jsonData.text || jsonData.delta;
|
|
334
|
-
const newTextContent = textContent + text;
|
|
335
|
-
const chunk = {
|
|
336
|
-
type: 'content_block_delta',
|
|
337
|
-
text: text,
|
|
338
|
-
isComplete: false,
|
|
339
|
-
isThinking: false
|
|
340
|
-
};
|
|
341
|
-
if (onToken) {
|
|
342
|
-
onToken(text);
|
|
343
|
-
}
|
|
344
|
-
return {
|
|
345
|
-
isInThinkingBlock,
|
|
346
|
-
thinkingContent,
|
|
347
|
-
textContent: newTextContent,
|
|
348
|
-
thinkingSignature,
|
|
349
|
-
chunk,
|
|
350
|
-
isDone: false
|
|
351
|
-
};
|
|
120
|
+
if (jsonData.delta) {
|
|
121
|
+
chunk.delta = jsonData.delta;
|
|
122
|
+
}
|
|
123
|
+
break;
|
|
124
|
+
case 'content_block_stop':
|
|
125
|
+
if (jsonData.index !== undefined) {
|
|
126
|
+
chunk.index = jsonData.index;
|
|
127
|
+
}
|
|
128
|
+
break;
|
|
129
|
+
case 'message_delta':
|
|
130
|
+
if (jsonData.delta) {
|
|
131
|
+
chunk.message_delta = jsonData.delta;
|
|
132
|
+
}
|
|
133
|
+
break;
|
|
134
|
+
case 'error':
|
|
135
|
+
if (jsonData.error) {
|
|
136
|
+
chunk.error = jsonData.error;
|
|
137
|
+
}
|
|
138
|
+
break;
|
|
139
|
+
// message_stop и ping не требуют дополнительных полей
|
|
352
140
|
}
|
|
353
|
-
|
|
354
|
-
// Если ничего не обработали, возвращаем исходное состояние
|
|
355
|
-
return { isInThinkingBlock, thinkingContent, textContent, thinkingSignature, isDone: false };
|
|
141
|
+
return { chunk };
|
|
356
142
|
}
|
|
357
143
|
catch (error) {
|
|
358
|
-
|
|
359
|
-
|
|
144
|
+
if (logger) {
|
|
145
|
+
logger.error('Ошибка обработки чанка', { error, line: line.substring(0, 100) });
|
|
146
|
+
}
|
|
147
|
+
return {};
|
|
360
148
|
}
|
|
361
149
|
}
|
|
362
150
|
/**
|
|
363
151
|
* Обрабатывает ошибки потоковой передачи
|
|
364
|
-
* @param error Ошибка
|
|
152
|
+
* @param error Ошибка для обработки
|
|
365
153
|
* @returns Обработанная ошибка
|
|
366
154
|
*/
|
|
367
155
|
function handleStreamError(error) {
|
|
368
156
|
if (error instanceof Error) {
|
|
369
157
|
return error;
|
|
370
158
|
}
|
|
371
|
-
if (error && error.message) {
|
|
372
|
-
return new Error(error.message);
|
|
373
|
-
}
|
|
374
159
|
if (typeof error === 'string') {
|
|
375
160
|
return new Error(error);
|
|
376
161
|
}
|
|
377
|
-
|
|
162
|
+
if (error && typeof error === 'object') {
|
|
163
|
+
const message = error.message || error.error || JSON.stringify(error);
|
|
164
|
+
return new Error(message);
|
|
165
|
+
}
|
|
166
|
+
return new Error('Неизвестная ошибка потока');
|
|
378
167
|
}
|
|
379
168
|
//# sourceMappingURL=stream-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-utils.js","sourceRoot":"","sources":["../../../../src/api/chat-api/stream-utils.ts"],"names":[],"mappings":";AAAA;;GAEG;;
|
|
1
|
+
{"version":3,"file":"stream-utils.js","sourceRoot":"","sources":["../../../../src/api/chat-api/stream-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ const code_modification_api_js_1 = require("./api/code-modification-api.js");
|
|
|
10
10
|
const index_js_1 = require("./api/chat-api/index.js");
|
|
11
11
|
const models_api_js_1 = require("./api/models-api.js");
|
|
12
12
|
// Версия SDK
|
|
13
|
-
const SDK_VERSION = '3.1.
|
|
13
|
+
const SDK_VERSION = '3.1.11';
|
|
14
14
|
/**
|
|
15
15
|
* Определение типа среды выполнения
|
|
16
16
|
* @returns 'browser' | 'node' | 'unknown'
|
|
@@ -53,25 +53,25 @@ class CodeSolverSDK {
|
|
|
53
53
|
log: (message) => {
|
|
54
54
|
const debugLevel = this._options.debug;
|
|
55
55
|
if (debugLevel && debugLevel !== 'silent' && debugLevel !== 'error' && debugLevel !== 'warn') {
|
|
56
|
-
console.log(
|
|
56
|
+
console.log(`${message}`);
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
59
|
warn: (message) => {
|
|
60
60
|
const debugLevel = this._options.debug;
|
|
61
61
|
if (debugLevel && debugLevel !== 'silent' && debugLevel !== 'error') {
|
|
62
|
-
console.warn(
|
|
62
|
+
console.warn(`⚠️ ${message}`);
|
|
63
63
|
}
|
|
64
64
|
},
|
|
65
65
|
error: (message) => {
|
|
66
66
|
const debugLevel = this._options.debug;
|
|
67
67
|
if (debugLevel !== 'silent') {
|
|
68
|
-
console.error(
|
|
68
|
+
console.error(`🔴 ${message}`);
|
|
69
69
|
}
|
|
70
70
|
},
|
|
71
71
|
debug: (message) => {
|
|
72
72
|
const debugLevel = this._options.debug;
|
|
73
73
|
if (debugLevel === 'verbose' || debugLevel === 'debug') {
|
|
74
|
-
console.debug(
|
|
74
|
+
console.debug(`🔍 ${message}`);
|
|
75
75
|
}
|
|
76
76
|
},
|
|
77
77
|
// ✅ НОВЫЕ методы для контроля стрим логирования
|
|
@@ -81,7 +81,7 @@ class CodeSolverSDK {
|
|
|
81
81
|
if (debugLevel === 'silent')
|
|
82
82
|
return;
|
|
83
83
|
if (streamLogging?.sseEvents || (debugLevel === 'verbose' || debugLevel === 'debug')) {
|
|
84
|
-
console.log(`
|
|
84
|
+
console.log(`STREAM: ${message}`, data);
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
87
|
streamChunk: (message, data) => {
|
|
@@ -90,7 +90,7 @@ class CodeSolverSDK {
|
|
|
90
90
|
if (debugLevel === 'silent')
|
|
91
91
|
return;
|
|
92
92
|
if (streamLogging?.streamChunks || (debugLevel === 'verbose' || debugLevel === 'debug')) {
|
|
93
|
-
console.log(`
|
|
93
|
+
console.log(`CHUNK: ${message}`, data);
|
|
94
94
|
}
|
|
95
95
|
},
|
|
96
96
|
eventCallback: (message, data) => {
|
|
@@ -99,7 +99,7 @@ class CodeSolverSDK {
|
|
|
99
99
|
if (debugLevel === 'silent')
|
|
100
100
|
return;
|
|
101
101
|
if (streamLogging?.eventCallbacks || (debugLevel === 'verbose' || debugLevel === 'debug')) {
|
|
102
|
-
console.log(`
|
|
102
|
+
console.log(`EVENT: ${message}`, data);
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
};
|
|
@@ -256,7 +256,7 @@ class CodeSolverSDK {
|
|
|
256
256
|
CodeSolverSDK.errorHandler(error);
|
|
257
257
|
}
|
|
258
258
|
else {
|
|
259
|
-
console.error('
|
|
259
|
+
console.error('Необработанная ошибка:', error);
|
|
260
260
|
}
|
|
261
261
|
}
|
|
262
262
|
/**
|
|
@@ -270,7 +270,7 @@ class CodeSolverSDK {
|
|
|
270
270
|
* Освобождает ресурсы SDK
|
|
271
271
|
*/
|
|
272
272
|
dispose() {
|
|
273
|
-
this.logger.debug('Освобождение ресурсов
|
|
273
|
+
this.logger.debug('Освобождение ресурсов');
|
|
274
274
|
// В HTTP-only версии нет ресурсов для освобождения
|
|
275
275
|
}
|
|
276
276
|
/**
|