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
|
@@ -2,374 +2,161 @@
|
|
|
2
2
|
* Утилиты для обработки потоковых данных от API чата
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
* @param line Строка данных из потока
|
|
7
|
-
* @param isInThinkingBlock Флаг нахождения в блоке мышления
|
|
8
|
-
* @param thinkingContent Накопленное содержимое мышления
|
|
9
|
-
* @param textContent Накопленное текстовое содержимое
|
|
10
|
-
* @param thinkingSignature Подпись блока мышления
|
|
11
|
-
* @param onToken Обработчик получения токена
|
|
12
|
-
* @returns Результат обработки
|
|
5
|
+
* Парсит строку SSE потока согласно официальному Anthropic API
|
|
13
6
|
*/
|
|
14
|
-
export function
|
|
7
|
+
export function parseStreamLine(line) {
|
|
8
|
+
// Пропускаем пустые строки и комментарии
|
|
9
|
+
if (!line.trim() || line.startsWith(':')) {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
// Обрабатываем только data: события
|
|
13
|
+
if (!line.startsWith('data: ')) {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
const data = line.slice(6).trim();
|
|
17
|
+
// Пропускаем пустые данные
|
|
18
|
+
if (!data) {
|
|
19
|
+
return {};
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const jsonData = JSON.parse(data);
|
|
23
|
+
// ✅ Все события Anthropic API имеют поле type
|
|
24
|
+
if (!jsonData.type) {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
// Создаем chunk согласно официальному формату Anthropic
|
|
28
|
+
const chunk = {
|
|
29
|
+
type: jsonData.type,
|
|
30
|
+
...jsonData
|
|
31
|
+
};
|
|
32
|
+
return { chunk };
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
console.warn('Failed to parse SSE line:', line, error);
|
|
36
|
+
return {};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Проверяет завершен ли поток согласно Anthropic API
|
|
41
|
+
*/
|
|
42
|
+
export function isStreamComplete(chunk) {
|
|
43
|
+
return chunk.type === 'message_stop';
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Обрабатывает чанк потоковой передачи данных в формате Server-Sent Events
|
|
47
|
+
* Работает только с официальными событиями Anthropic API
|
|
48
|
+
*
|
|
49
|
+
* @param line Строка из SSE потока
|
|
50
|
+
* @param logger Логгер для отладки
|
|
51
|
+
* @param options Опции обработки
|
|
52
|
+
* @returns Результат обработки чанка
|
|
53
|
+
*/
|
|
54
|
+
export function processStreamChunk(line, logger, options) {
|
|
15
55
|
try {
|
|
56
|
+
// Игнорируем пустые строки и комментарии
|
|
57
|
+
if (!line.trim() || line.startsWith(':')) {
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
// Проверяем формат SSE
|
|
16
61
|
if (!line.startsWith('data: ')) {
|
|
17
|
-
return {
|
|
62
|
+
return {};
|
|
18
63
|
}
|
|
19
64
|
const data = line.slice(6).trim();
|
|
20
|
-
//
|
|
21
|
-
if (data
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
// 🔧 КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Обрабатываем события начала блока tool_use
|
|
58
|
-
if (jsonData.type === 'content_block_start' && jsonData.content_block?.type === 'tool_use') {
|
|
59
|
-
const chunk = {
|
|
60
|
-
type: 'content_block_start',
|
|
61
|
-
text: '',
|
|
62
|
-
isComplete: false,
|
|
63
|
-
isThinking: false,
|
|
64
|
-
// Передаем данные tool_use в chunk для доступа в onEvent callback
|
|
65
|
-
data: {
|
|
66
|
-
content_block: jsonData.content_block,
|
|
67
|
-
index: jsonData.index
|
|
65
|
+
// Пропускаем пустые данные
|
|
66
|
+
if (!data) {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
// Парсим JSON данные
|
|
70
|
+
let jsonData;
|
|
71
|
+
try {
|
|
72
|
+
jsonData = JSON.parse(data);
|
|
73
|
+
}
|
|
74
|
+
catch (parseError) {
|
|
75
|
+
if (logger) {
|
|
76
|
+
logger.error('Ошибка парсинга JSON', { error: parseError, data: data.substring(0, 100) });
|
|
77
|
+
}
|
|
78
|
+
return {};
|
|
79
|
+
}
|
|
80
|
+
// Валидируем что это официальное событие Anthropic API
|
|
81
|
+
const validEvents = [
|
|
82
|
+
'message_start', 'content_block_start', 'content_block_delta',
|
|
83
|
+
'content_block_stop', 'message_delta', 'message_stop', 'ping', 'error'
|
|
84
|
+
];
|
|
85
|
+
if (!validEvents.includes(jsonData.type)) {
|
|
86
|
+
if (logger) {
|
|
87
|
+
logger.warn('Неизвестное событие', { type: jsonData.type });
|
|
88
|
+
}
|
|
89
|
+
return {};
|
|
90
|
+
}
|
|
91
|
+
// Создаем ChatStreamChunk в соответствии с официальным API
|
|
92
|
+
const chunk = {
|
|
93
|
+
type: jsonData.type
|
|
94
|
+
};
|
|
95
|
+
// Добавляем поля в зависимости от типа события
|
|
96
|
+
switch (jsonData.type) {
|
|
97
|
+
case 'message_start':
|
|
98
|
+
if (jsonData.message) {
|
|
99
|
+
chunk.message = jsonData.message;
|
|
68
100
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
textContent,
|
|
74
|
-
thinkingSignature,
|
|
75
|
-
chunk,
|
|
76
|
-
isDone: false
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
// ✅ ИСПРАВЛЕНИЕ: Обрабатываем события начала текстового блока
|
|
80
|
-
if (jsonData.type === 'content_block_start' && jsonData.content_block?.type === 'text') {
|
|
81
|
-
const chunk = {
|
|
82
|
-
type: 'content_block_start',
|
|
83
|
-
text: '',
|
|
84
|
-
isComplete: false,
|
|
85
|
-
isThinking: false,
|
|
86
|
-
data: {
|
|
87
|
-
content_block: jsonData.content_block,
|
|
88
|
-
index: jsonData.index
|
|
101
|
+
break;
|
|
102
|
+
case 'content_block_start':
|
|
103
|
+
if (jsonData.index !== undefined) {
|
|
104
|
+
chunk.index = jsonData.index;
|
|
89
105
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
isInThinkingBlock,
|
|
93
|
-
thinkingContent,
|
|
94
|
-
textContent,
|
|
95
|
-
thinkingSignature,
|
|
96
|
-
chunk,
|
|
97
|
-
isDone: false
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
// ✅ Удалено: дублирование thinking_delta обработки (основная версия ниже)
|
|
101
|
-
// ✅ ИСПРАВЛЕНИЕ: Обрабатываем signature_delta согласно документации Anthropic
|
|
102
|
-
if (jsonData.type === 'content_block_delta' && jsonData.delta?.type === 'signature_delta' && jsonData.delta.signature) {
|
|
103
|
-
const newSignature = jsonData.delta.signature;
|
|
104
|
-
const chunk = {
|
|
105
|
-
type: 'content_block_delta',
|
|
106
|
-
text: '', // signature не отображается как текст
|
|
107
|
-
isComplete: false,
|
|
108
|
-
isThinking: true, // signature относится к thinking блоку
|
|
109
|
-
signature: newSignature
|
|
110
|
-
};
|
|
111
|
-
return {
|
|
112
|
-
isInThinkingBlock,
|
|
113
|
-
thinkingContent,
|
|
114
|
-
textContent,
|
|
115
|
-
thinkingSignature: newSignature,
|
|
116
|
-
chunk,
|
|
117
|
-
isDone: false
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
// ✅ КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Обрабатываем дельты мышления в правильном формате
|
|
121
|
-
if (jsonData.type === 'content_block_delta' && jsonData.delta?.type === 'thinking_delta' && jsonData.delta.thinking) {
|
|
122
|
-
const newThinkingContent = thinkingContent + jsonData.delta.thinking;
|
|
123
|
-
const chunk = {
|
|
124
|
-
type: 'content_block_delta',
|
|
125
|
-
text: jsonData.delta.thinking, // ✅ Извлекаем текст из delta.thinking
|
|
126
|
-
isComplete: false,
|
|
127
|
-
isThinking: true
|
|
128
|
-
};
|
|
129
|
-
// Вызываем onToken если передан
|
|
130
|
-
if (onToken) {
|
|
131
|
-
onToken(jsonData.delta.thinking);
|
|
132
|
-
}
|
|
133
|
-
return {
|
|
134
|
-
isInThinkingBlock: true,
|
|
135
|
-
thinkingContent: newThinkingContent,
|
|
136
|
-
textContent,
|
|
137
|
-
thinkingSignature,
|
|
138
|
-
chunk,
|
|
139
|
-
isDone: false
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
// ✅ ИСПРАВЛЕНИЕ: Обрабатываем завершение любых блоков контента
|
|
143
|
-
if (jsonData.type === 'content_block_stop') {
|
|
144
|
-
const chunk = {
|
|
145
|
-
type: 'content_block_stop',
|
|
146
|
-
text: '',
|
|
147
|
-
isComplete: false,
|
|
148
|
-
isThinking: isInThinkingBlock, // Сохраняем текущее состояние thinking
|
|
149
|
-
data: {
|
|
150
|
-
index: jsonData.index
|
|
106
|
+
if (jsonData.content_block) {
|
|
107
|
+
chunk.content_block = jsonData.content_block;
|
|
151
108
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
textContent,
|
|
157
|
-
thinkingSignature,
|
|
158
|
-
chunk,
|
|
159
|
-
isDone: false
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
// 🔧 КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: Обрабатываем input_json_delta для инструментов
|
|
163
|
-
if (jsonData.type === 'content_block_delta' && jsonData.delta?.type === 'input_json_delta') {
|
|
164
|
-
const chunk = {
|
|
165
|
-
type: 'content_block_delta',
|
|
166
|
-
text: jsonData.delta.partial_json || '',
|
|
167
|
-
isComplete: false,
|
|
168
|
-
isThinking: false,
|
|
169
|
-
data: {
|
|
170
|
-
delta: jsonData.delta,
|
|
171
|
-
index: jsonData.index
|
|
109
|
+
break;
|
|
110
|
+
case 'content_block_delta':
|
|
111
|
+
if (jsonData.index !== undefined) {
|
|
112
|
+
chunk.index = jsonData.index;
|
|
172
113
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
isComplete: false,
|
|
194
|
-
isThinking: false
|
|
195
|
-
};
|
|
196
|
-
// Вызываем onToken если передан
|
|
197
|
-
if (onToken) {
|
|
198
|
-
onToken(jsonData.delta.text);
|
|
199
|
-
}
|
|
200
|
-
return {
|
|
201
|
-
isInThinkingBlock,
|
|
202
|
-
thinkingContent,
|
|
203
|
-
textContent: newTextContent,
|
|
204
|
-
thinkingSignature,
|
|
205
|
-
chunk,
|
|
206
|
-
isDone: false
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
// ✅ СОХРАНЯЕМ: Обрабатываем legacy форматы для совместимости
|
|
210
|
-
if (jsonData.event === 'thinking_delta' && jsonData.thinking && isInThinkingBlock) {
|
|
211
|
-
const newThinkingContent = thinkingContent + jsonData.thinking;
|
|
212
|
-
const chunk = {
|
|
213
|
-
type: 'content_block_delta',
|
|
214
|
-
text: jsonData.thinking,
|
|
215
|
-
isComplete: false,
|
|
216
|
-
isThinking: true
|
|
217
|
-
};
|
|
218
|
-
if (onToken) {
|
|
219
|
-
onToken(jsonData.thinking);
|
|
220
|
-
}
|
|
221
|
-
return {
|
|
222
|
-
isInThinkingBlock: true,
|
|
223
|
-
thinkingContent: newThinkingContent,
|
|
224
|
-
textContent,
|
|
225
|
-
thinkingSignature,
|
|
226
|
-
chunk,
|
|
227
|
-
isDone: false
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
// Обрабатываем завершение мышления (legacy)
|
|
231
|
-
if (jsonData.type === 'thinking_end' ||
|
|
232
|
-
(jsonData.event === 'thinking_signature' && isInThinkingBlock)) {
|
|
233
|
-
let signature = thinkingSignature;
|
|
234
|
-
if (jsonData.signature) {
|
|
235
|
-
signature = jsonData.signature;
|
|
236
|
-
}
|
|
237
|
-
const chunk = {
|
|
238
|
-
type: 'content_block_delta',
|
|
239
|
-
text: jsonData.text || '',
|
|
240
|
-
isComplete: false,
|
|
241
|
-
isThinking: false
|
|
242
|
-
};
|
|
243
|
-
if (jsonData.text && onToken) {
|
|
244
|
-
onToken(jsonData.text);
|
|
245
|
-
}
|
|
246
|
-
return {
|
|
247
|
-
isInThinkingBlock: false,
|
|
248
|
-
thinkingContent,
|
|
249
|
-
textContent: textContent + (jsonData.text || ''),
|
|
250
|
-
thinkingSignature: signature,
|
|
251
|
-
chunk,
|
|
252
|
-
isDone: false
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
// Обрабатываем текстовые дельты (legacy)
|
|
256
|
-
if (jsonData.event === 'text_delta' && jsonData.text) {
|
|
257
|
-
const newTextContent = textContent + jsonData.text;
|
|
258
|
-
const chunk = {
|
|
259
|
-
type: 'content_block_delta',
|
|
260
|
-
text: jsonData.text,
|
|
261
|
-
isComplete: false,
|
|
262
|
-
isThinking: false
|
|
263
|
-
};
|
|
264
|
-
if (onToken) {
|
|
265
|
-
onToken(jsonData.text);
|
|
266
|
-
}
|
|
267
|
-
return {
|
|
268
|
-
isInThinkingBlock,
|
|
269
|
-
thinkingContent,
|
|
270
|
-
textContent: newTextContent,
|
|
271
|
-
thinkingSignature,
|
|
272
|
-
chunk,
|
|
273
|
-
isDone: false
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
// ✅ ИСПРАВЛЕНИЕ: Обрабатываем message_start согласно документации Anthropic
|
|
277
|
-
if (jsonData.type === 'message_start') {
|
|
278
|
-
const chunk = {
|
|
279
|
-
type: 'message_start',
|
|
280
|
-
message: jsonData.message,
|
|
281
|
-
text: '',
|
|
282
|
-
isComplete: false
|
|
283
|
-
};
|
|
284
|
-
return {
|
|
285
|
-
isInThinkingBlock,
|
|
286
|
-
thinkingContent,
|
|
287
|
-
textContent,
|
|
288
|
-
thinkingSignature,
|
|
289
|
-
chunk,
|
|
290
|
-
isDone: false
|
|
291
|
-
};
|
|
292
|
-
}
|
|
293
|
-
// ✅ ИСПРАВЛЕНИЕ: Обрабатываем message_delta согласно документации Anthropic
|
|
294
|
-
if (jsonData.type === 'message_delta') {
|
|
295
|
-
const chunk = {
|
|
296
|
-
type: 'message_delta',
|
|
297
|
-
delta: jsonData.delta,
|
|
298
|
-
text: '',
|
|
299
|
-
isComplete: false
|
|
300
|
-
};
|
|
301
|
-
return {
|
|
302
|
-
isInThinkingBlock,
|
|
303
|
-
thinkingContent,
|
|
304
|
-
textContent,
|
|
305
|
-
thinkingSignature,
|
|
306
|
-
chunk,
|
|
307
|
-
isDone: false
|
|
308
|
-
};
|
|
309
|
-
}
|
|
310
|
-
// ✅ ИСПРАВЛЕНИЕ: Обрабатываем message_stop согласно документации Anthropic
|
|
311
|
-
if (jsonData.type === 'message_stop') {
|
|
312
|
-
const chunk = {
|
|
313
|
-
type: 'message_stop',
|
|
314
|
-
message: jsonData.message,
|
|
315
|
-
text: '',
|
|
316
|
-
isComplete: true
|
|
317
|
-
};
|
|
318
|
-
return {
|
|
319
|
-
isInThinkingBlock: false, // Завершаем thinking при остановке сообщения
|
|
320
|
-
thinkingContent,
|
|
321
|
-
textContent,
|
|
322
|
-
thinkingSignature,
|
|
323
|
-
chunk,
|
|
324
|
-
isDone: true
|
|
325
|
-
};
|
|
326
|
-
}
|
|
327
|
-
// Обрабатываем обычные текстовые данные (fallback)
|
|
328
|
-
if (jsonData.content || jsonData.text || jsonData.delta) {
|
|
329
|
-
const text = jsonData.content || jsonData.text || jsonData.delta;
|
|
330
|
-
const newTextContent = textContent + text;
|
|
331
|
-
const chunk = {
|
|
332
|
-
type: 'content_block_delta',
|
|
333
|
-
text: text,
|
|
334
|
-
isComplete: false,
|
|
335
|
-
isThinking: false
|
|
336
|
-
};
|
|
337
|
-
if (onToken) {
|
|
338
|
-
onToken(text);
|
|
339
|
-
}
|
|
340
|
-
return {
|
|
341
|
-
isInThinkingBlock,
|
|
342
|
-
thinkingContent,
|
|
343
|
-
textContent: newTextContent,
|
|
344
|
-
thinkingSignature,
|
|
345
|
-
chunk,
|
|
346
|
-
isDone: false
|
|
347
|
-
};
|
|
114
|
+
if (jsonData.delta) {
|
|
115
|
+
chunk.delta = jsonData.delta;
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
case 'content_block_stop':
|
|
119
|
+
if (jsonData.index !== undefined) {
|
|
120
|
+
chunk.index = jsonData.index;
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
123
|
+
case 'message_delta':
|
|
124
|
+
if (jsonData.delta) {
|
|
125
|
+
chunk.message_delta = jsonData.delta;
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
case 'error':
|
|
129
|
+
if (jsonData.error) {
|
|
130
|
+
chunk.error = jsonData.error;
|
|
131
|
+
}
|
|
132
|
+
break;
|
|
133
|
+
// message_stop и ping не требуют дополнительных полей
|
|
348
134
|
}
|
|
349
|
-
|
|
350
|
-
// Если ничего не обработали, возвращаем исходное состояние
|
|
351
|
-
return { isInThinkingBlock, thinkingContent, textContent, thinkingSignature, isDone: false };
|
|
135
|
+
return { chunk };
|
|
352
136
|
}
|
|
353
137
|
catch (error) {
|
|
354
|
-
|
|
355
|
-
|
|
138
|
+
if (logger) {
|
|
139
|
+
logger.error('Ошибка обработки чанка', { error, line: line.substring(0, 100) });
|
|
140
|
+
}
|
|
141
|
+
return {};
|
|
356
142
|
}
|
|
357
143
|
}
|
|
358
144
|
/**
|
|
359
145
|
* Обрабатывает ошибки потоковой передачи
|
|
360
|
-
* @param error Ошибка
|
|
146
|
+
* @param error Ошибка для обработки
|
|
361
147
|
* @returns Обработанная ошибка
|
|
362
148
|
*/
|
|
363
149
|
export function handleStreamError(error) {
|
|
364
150
|
if (error instanceof Error) {
|
|
365
151
|
return error;
|
|
366
152
|
}
|
|
367
|
-
if (error && error.message) {
|
|
368
|
-
return new Error(error.message);
|
|
369
|
-
}
|
|
370
153
|
if (typeof error === 'string') {
|
|
371
154
|
return new Error(error);
|
|
372
155
|
}
|
|
373
|
-
|
|
156
|
+
if (error && typeof error === 'object') {
|
|
157
|
+
const message = error.message || error.error || JSON.stringify(error);
|
|
158
|
+
return new Error(message);
|
|
159
|
+
}
|
|
160
|
+
return new Error('Неизвестная ошибка потока');
|
|
374
161
|
}
|
|
375
162
|
//# 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":"AAAA;;GAEG;AAYH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,yCAAyC;IACzC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,oCAAoC;IACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAElC,2BAA2B;IAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,8CAA8C;QAC9C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,wDAAwD;QACxD,MAAM,KAAK,GAAoB;YAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,GAAG,QAAQ;SACZ,CAAC;QAEF,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAsB;IACrD,OAAO,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC;AACvC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,MAAY,EACZ,OAGC;IAED,IAAI,CAAC;QACH,yCAAyC;QACzC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAElC,2BAA2B;QAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,qBAAqB;QACrB,IAAI,QAAa,CAAC;QAClB,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,uDAAuD;QACvD,MAAM,WAAW,GAAG;YAClB,eAAe,EAAE,qBAAqB,EAAE,qBAAqB;YAC7D,oBAAoB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO;SACvE,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,2DAA2D;QAC3D,MAAM,KAAK,GAAoB;YAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI;SACpB,CAAC;QAEF,+CAA+C;QAC/C,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,eAAe;gBAClB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACrB,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;gBACnC,CAAC;gBACD,MAAM;YAER,KAAK,qBAAqB;gBACxB,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBACjC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC/B,CAAC;gBACD,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;oBAC3B,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;gBAC/C,CAAC;gBACD,MAAM;YAER,KAAK,qBAAqB;gBACxB,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBACjC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC/B,CAAC;gBACD,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACnB,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC/B,CAAC;gBACD,MAAM;YAER,KAAK,oBAAoB;gBACvB,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBACjC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC/B,CAAC;gBACD,MAAM;YAER,KAAK,eAAe;gBAClB,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACnB,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;gBACvC,CAAC;gBACD,MAAM;YAER,KAAK,OAAO;gBACV,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACnB,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAC/B,CAAC;gBACD,MAAM;YAER,sDAAsD;QACxD,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,CAAC;IAEnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAU;IAC1C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -7,7 +7,7 @@ import { CodeModificationApi } from './api/code-modification-api.js';
|
|
|
7
7
|
import { ChatApi } from './api/chat-api/index.js';
|
|
8
8
|
import { ModelsApi } from './api/models-api.js';
|
|
9
9
|
// Версия SDK
|
|
10
|
-
const SDK_VERSION = '3.1.
|
|
10
|
+
const SDK_VERSION = '3.1.11';
|
|
11
11
|
/**
|
|
12
12
|
* Определение типа среды выполнения
|
|
13
13
|
* @returns 'browser' | 'node' | 'unknown'
|
|
@@ -50,25 +50,25 @@ export class CodeSolverSDK {
|
|
|
50
50
|
log: (message) => {
|
|
51
51
|
const debugLevel = this._options.debug;
|
|
52
52
|
if (debugLevel && debugLevel !== 'silent' && debugLevel !== 'error' && debugLevel !== 'warn') {
|
|
53
|
-
console.log(
|
|
53
|
+
console.log(`${message}`);
|
|
54
54
|
}
|
|
55
55
|
},
|
|
56
56
|
warn: (message) => {
|
|
57
57
|
const debugLevel = this._options.debug;
|
|
58
58
|
if (debugLevel && debugLevel !== 'silent' && debugLevel !== 'error') {
|
|
59
|
-
console.warn(
|
|
59
|
+
console.warn(`⚠️ ${message}`);
|
|
60
60
|
}
|
|
61
61
|
},
|
|
62
62
|
error: (message) => {
|
|
63
63
|
const debugLevel = this._options.debug;
|
|
64
64
|
if (debugLevel !== 'silent') {
|
|
65
|
-
console.error(
|
|
65
|
+
console.error(`🔴 ${message}`);
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
68
|
debug: (message) => {
|
|
69
69
|
const debugLevel = this._options.debug;
|
|
70
70
|
if (debugLevel === 'verbose' || debugLevel === 'debug') {
|
|
71
|
-
console.debug(
|
|
71
|
+
console.debug(`🔍 ${message}`);
|
|
72
72
|
}
|
|
73
73
|
},
|
|
74
74
|
// ✅ НОВЫЕ методы для контроля стрим логирования
|
|
@@ -78,7 +78,7 @@ export class CodeSolverSDK {
|
|
|
78
78
|
if (debugLevel === 'silent')
|
|
79
79
|
return;
|
|
80
80
|
if (streamLogging?.sseEvents || (debugLevel === 'verbose' || debugLevel === 'debug')) {
|
|
81
|
-
console.log(`
|
|
81
|
+
console.log(`STREAM: ${message}`, data);
|
|
82
82
|
}
|
|
83
83
|
},
|
|
84
84
|
streamChunk: (message, data) => {
|
|
@@ -87,7 +87,7 @@ export class CodeSolverSDK {
|
|
|
87
87
|
if (debugLevel === 'silent')
|
|
88
88
|
return;
|
|
89
89
|
if (streamLogging?.streamChunks || (debugLevel === 'verbose' || debugLevel === 'debug')) {
|
|
90
|
-
console.log(`
|
|
90
|
+
console.log(`CHUNK: ${message}`, data);
|
|
91
91
|
}
|
|
92
92
|
},
|
|
93
93
|
eventCallback: (message, data) => {
|
|
@@ -96,7 +96,7 @@ export class CodeSolverSDK {
|
|
|
96
96
|
if (debugLevel === 'silent')
|
|
97
97
|
return;
|
|
98
98
|
if (streamLogging?.eventCallbacks || (debugLevel === 'verbose' || debugLevel === 'debug')) {
|
|
99
|
-
console.log(`
|
|
99
|
+
console.log(`EVENT: ${message}`, data);
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
};
|
|
@@ -253,7 +253,7 @@ export class CodeSolverSDK {
|
|
|
253
253
|
CodeSolverSDK.errorHandler(error);
|
|
254
254
|
}
|
|
255
255
|
else {
|
|
256
|
-
console.error('
|
|
256
|
+
console.error('Необработанная ошибка:', error);
|
|
257
257
|
}
|
|
258
258
|
}
|
|
259
259
|
/**
|
|
@@ -267,7 +267,7 @@ export class CodeSolverSDK {
|
|
|
267
267
|
* Освобождает ресурсы SDK
|
|
268
268
|
*/
|
|
269
269
|
dispose() {
|
|
270
|
-
this.logger.debug('Освобождение ресурсов
|
|
270
|
+
this.logger.debug('Освобождение ресурсов');
|
|
271
271
|
// В HTTP-only версии нет ресурсов для освобождения
|
|
272
272
|
}
|
|
273
273
|
/**
|