solver-sdk 1.7.3 → 1.7.5

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.
Files changed (63) hide show
  1. package/README.md +40 -49
  2. package/dist/cjs/api/{chat-api.js → chat-api/index.js} +37 -151
  3. package/dist/cjs/api/chat-api/index.js.map +1 -0
  4. package/dist/cjs/api/chat-api/interfaces.js +3 -0
  5. package/dist/cjs/api/chat-api/interfaces.js.map +1 -0
  6. package/dist/cjs/api/chat-api/models.js +6 -0
  7. package/dist/cjs/api/chat-api/models.js.map +1 -0
  8. package/dist/cjs/api/chat-api/stream-utils.js +192 -0
  9. package/dist/cjs/api/chat-api/stream-utils.js.map +1 -0
  10. package/dist/cjs/api/chat-api/websocket-helpers.js +211 -0
  11. package/dist/cjs/api/chat-api/websocket-helpers.js.map +1 -0
  12. package/dist/cjs/code-solver-sdk.js +10 -15
  13. package/dist/cjs/code-solver-sdk.js.map +1 -1
  14. package/dist/cjs/constants/websocket-events.constants.js +77 -52
  15. package/dist/cjs/constants/websocket-events.constants.js.map +1 -1
  16. package/dist/cjs/utils/code-solver-websocket-client.js.map +1 -1
  17. package/dist/esm/api/{chat-api.js → chat-api/index.js} +34 -151
  18. package/dist/esm/api/chat-api/index.js.map +1 -0
  19. package/dist/esm/api/chat-api/interfaces.js +2 -0
  20. package/dist/esm/api/chat-api/interfaces.js.map +1 -0
  21. package/dist/esm/api/chat-api/models.js +5 -0
  22. package/dist/esm/api/chat-api/models.js.map +1 -0
  23. package/dist/esm/api/chat-api/stream-utils.js +188 -0
  24. package/dist/esm/api/chat-api/stream-utils.js.map +1 -0
  25. package/dist/esm/api/chat-api/websocket-helpers.js +205 -0
  26. package/dist/esm/api/chat-api/websocket-helpers.js.map +1 -0
  27. package/dist/esm/code-solver-sdk.js +8 -13
  28. package/dist/esm/code-solver-sdk.js.map +1 -1
  29. package/dist/esm/constants/websocket-events.constants.js +76 -51
  30. package/dist/esm/constants/websocket-events.constants.js.map +1 -1
  31. package/dist/esm/utils/code-solver-websocket-client.js.map +1 -1
  32. package/dist/types/api/chat-api/index.d.ts +81 -0
  33. package/dist/types/api/chat-api/index.d.ts.map +1 -0
  34. package/dist/types/api/chat-api/interfaces.d.ts +47 -0
  35. package/dist/types/api/chat-api/interfaces.d.ts.map +1 -0
  36. package/dist/types/api/{chat-api.d.ts → chat-api/models.d.ts} +10 -79
  37. package/dist/types/api/chat-api/models.d.ts.map +1 -0
  38. package/dist/types/api/chat-api/stream-utils.d.ts +31 -0
  39. package/dist/types/api/chat-api/stream-utils.d.ts.map +1 -0
  40. package/dist/types/api/chat-api/websocket-helpers.d.ts +40 -0
  41. package/dist/types/api/chat-api/websocket-helpers.d.ts.map +1 -0
  42. package/dist/types/code-solver-sdk.d.ts +1 -1
  43. package/dist/types/code-solver-sdk.d.ts.map +1 -1
  44. package/dist/types/constants/websocket-events.constants.d.ts +65 -36
  45. package/dist/types/constants/websocket-events.constants.d.ts.map +1 -1
  46. package/dist/types/utils/code-solver-websocket-client.d.ts +28 -34
  47. package/dist/types/utils/code-solver-websocket-client.d.ts.map +1 -1
  48. package/docs/API_REFERENCE.md +168 -0
  49. package/docs/AUTHENTICATION.md +179 -0
  50. package/docs/ERROR_HANDLING.md +240 -0
  51. package/docs/README.md +32 -56
  52. package/docs/WEBSOCKET.md +55 -394
  53. package/docs/advanced/PING_PONG.md +212 -0
  54. package/docs/features/THINKING.md +158 -0
  55. package/package.json +1 -1
  56. package/dist/cjs/api/chat-api.js.map +0 -1
  57. package/dist/esm/api/chat-api.js.map +0 -1
  58. package/dist/types/api/chat-api.d.ts.map +0 -1
  59. package/docs/REGIONS.md +0 -140
  60. package/docs/WEBSOCKET_EVENTS.md +0 -183
  61. package/docs/thinking/THINKING_ARCHITECTURE.md +0 -221
  62. package/docs/thinking/streaming-thinking-guide.md +0 -164
  63. package/docs/thinking/thinking-mode.md +0 -366
package/README.md CHANGED
@@ -43,8 +43,8 @@ SDK для интеграции с Code Solver Backend API. Поддержива
43
43
  - Настраиваемый мониторинг здоровья соединения
44
44
  - **Потоковая передача мышления**:
45
45
  - Метод `streamChatWithThinking()` для потоковой передачи процесса мышления модели
46
- - Полная поддержка событий Anthropic API (`thinking_delta`, `text_delta` и др.)
47
- - Стандартизированный формат для всех типов событий
46
+ - Полная поддержка официального Anthropic API со всеми типами блоков контента
47
+ - Единый стандартизированный формат событий
48
48
  - **Работа с регионами**:
49
49
  - Поддержка региональных эндпоинтов Anthropic API
50
50
  - Автоматическое переключение между регионами при ошибках
@@ -150,7 +150,6 @@ example().catch(console.error);
150
150
  | `headers` | object | Пользовательские HTTP заголовки | Нет |
151
151
  | `httpsAgent` | object | Опции для HTTPS агента (Node.js) | Нет |
152
152
  | `mode` | string | Режим работы SDK ('browser', 'node', 'auto') | Нет |
153
- | `providers` | object | Настройки провайдеров API (Anthropic и др.) | Нет |
154
153
  | `websocket` | object | Настройки WebSocket (reconnect, timeout и др.) | Нет |
155
154
 
156
155
  ## Продвинутые функции
@@ -205,8 +204,12 @@ await wsClient.connectToReasoning(reasoning.id);
205
204
  wsClient.enablePingPong(30000, 3);
206
205
 
207
206
  // Обработка событий мышления
208
- wsClient.on('thinking_delta', (data) => {
209
- console.log('Фрагмент размышления:', data.text);
207
+ wsClient.on('content_block_delta', (data) => {
208
+ if (data.delta?.type === 'thinking_delta') {
209
+ console.log('Фрагмент размышления:', data.delta.thinking);
210
+ } else if (data.delta?.type === 'text_delta') {
211
+ console.log('Фрагмент ответа:', data.delta.text);
212
+ }
210
213
  });
211
214
 
212
215
  wsClient.on('message_stop', (data) => {
@@ -249,7 +252,7 @@ sdk.dependencies.on('dependency_update', (data) => {
249
252
 
250
253
  ### Потоковая передача мышления
251
254
 
252
- Версия 1.7.2 включает полную поддержку потоковой передачи мышления через Anthropic API:
255
+ Версия 1.7.4 включает полную поддержку потоковой передачи мышления через Anthropic API, а также улучшенную обработку ошибок:
253
256
 
254
257
  ```javascript
255
258
  const { CodeSolverSDK } = require('solver-sdk');
@@ -269,22 +272,34 @@ async function streamThinking() {
269
272
  const options = {
270
273
  model: 'claude-3-7-sonnet-20240229',
271
274
  temperature: 0.7,
272
- thinking: true
275
+ thinking: true,
276
+ authToken: 'your-auth-token' // Унифицированный параметр для аутентификации WebSocket
273
277
  };
274
278
 
275
279
  // Обработчик событий WebSocket
276
280
  const handleEvent = (eventType, data) => {
277
281
  switch(eventType) {
278
- case 'thinking_start':
279
- console.log('Начало размышлений:');
282
+ case 'content_block_start':
283
+ if (data.content_block && data.content_block.type === 'thinking') {
284
+ console.log('Начало размышлений:');
285
+ }
280
286
  break;
281
287
 
282
- case 'thinking_delta':
283
- process.stdout.write(data.text); // Потоковый вывод размышлений
288
+ case 'content_block_delta':
289
+ if (data.delta && data.delta.type === 'thinking_delta') {
290
+ process.stdout.write(data.delta.thinking); // Потоковый вывод размышлений
291
+ } else if (data.delta && data.delta.type === 'text_delta') {
292
+ process.stdout.write(data.delta.text); // Потоковый вывод итогового текста
293
+ }
284
294
  break;
285
295
 
286
- case 'text_delta':
287
- process.stdout.write(data.text); // Потоковый вывод итогового текста
296
+ case 'error':
297
+ console.error('Ошибка:', data.message);
298
+
299
+ // Обработка ошибки географических ограничений
300
+ if (data.type === 'geo_restriction') {
301
+ console.error('Необходимо включить VPN для доступа к API Anthropic из вашего региона');
302
+ }
288
303
  break;
289
304
  }
290
305
  };
@@ -300,6 +315,11 @@ async function streamThinking() {
300
315
  console.log(`Запрос успешно отправлен. Socket ID: ${response.socketId}`);
301
316
  } catch (error) {
302
317
  console.error('Ошибка:', error);
318
+
319
+ // Проверка наличия ошибки географических ограничений
320
+ if (error.type === 'geo_restriction') {
321
+ console.error('Необходимо включить VPN для доступа к API Anthropic из вашего региона');
322
+ }
303
323
  }
304
324
  }
305
325
 
@@ -310,41 +330,15 @@ streamThinking();
310
330
 
311
331
  - `message_start` - начало сообщения от модели
312
332
  - `content_block_start` - начало блока контента (текст или thinking)
313
- - `thinking_delta` - фрагмент размышления модели
314
- - `text_delta` - фрагмент итогового текста
333
+ - `content_block_delta` - дельта блока контента со следующими типами:
334
+ - `delta.type === 'thinking_delta'` - фрагмент размышления модели
335
+ - `delta.type === 'text_delta'` - фрагмент текстового ответа
336
+ - `delta.type === 'input_json_delta'` - фрагмент JSON для инструментов
337
+ - `delta.type === 'signature_delta'` - подпись блока мышления
315
338
  - `content_block_stop` - завершение блока контента
339
+ - `message_delta` - дельта сообщения
316
340
  - `message_stop` - завершение сообщения
317
341
 
318
- ### Работа с региональными эндпоинтами
319
-
320
- ```javascript
321
- // Настройка SDK с указанием предпочтительного региона
322
- const sdk = new CodeSolverSDK({
323
- baseURL: 'https://api.example.com',
324
- apiKey: 'your-api-key',
325
- providers: {
326
- anthropic: {
327
- region: 'eu-west-1' // Использовать европейский регион
328
- }
329
- }
330
- });
331
-
332
- // Запрос с автоматическим переключением между регионами при ошибках
333
- const response = await sdk.chat.chatWithRegionFailover([
334
- { role: 'user', content: 'Расскажи о квантовых компьютерах' }
335
- ], {
336
- model: 'claude-3-7-sonnet-20240229'
337
- });
338
-
339
- // Запрос с явным указанием региона
340
- const responseFromAsia = await sdk.chat.chat([
341
- { role: 'user', content: 'Расскажи о квантовых компьютерах' }
342
- ], {
343
- model: 'claude-3-7-sonnet-20240229',
344
- region: 'ap-southeast-2' // Явно указываем регион
345
- });
346
- ```
347
-
348
342
  ## Примеры
349
343
 
350
344
  В директории [`examples`](./examples) доступны примеры использования SDK:
@@ -358,9 +352,6 @@ npm run example:indexing
358
352
 
359
353
  # Работа с зависимостями
360
354
  npm run example:dependencies
361
-
362
- # Проверка доступности регионов
363
- npm run example:regions
364
355
  ```
365
356
 
366
357
  ## Совместимость
@@ -419,4 +410,4 @@ const sdk = new CodeSolverSDK({
419
410
 
420
411
  ## Лицензия
421
412
 
422
- [MIT](./LICENSE)
413
+ [MIT](./LICENSE)
@@ -15,6 +15,9 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
18
21
  var __importStar = (this && this.__importStar) || (function () {
19
22
  var ownKeys = function(o) {
20
23
  ownKeys = Object.getOwnPropertyNames || function (o) {
@@ -34,13 +37,18 @@ var __importStar = (this && this.__importStar) || (function () {
34
37
  })();
35
38
  Object.defineProperty(exports, "__esModule", { value: true });
36
39
  exports.ChatApi = void 0;
40
+ const websocket_helpers_1 = require("./websocket-helpers");
41
+ const stream_utils_1 = require("./stream-utils");
42
+ // Экспортируем все типы и интерфейсы для внешнего использования
43
+ __exportStar(require("./models"), exports);
44
+ __exportStar(require("./interfaces"), exports);
37
45
  /**
38
46
  * API для работы с чатом
39
47
  */
40
48
  class ChatApi {
41
49
  /**
42
50
  * Создает новый экземпляр API для работы с чатом
43
- * @param {HttpClient} httpClient HTTP клиент
51
+ * @param {IHttpClient} httpClient HTTP клиент
44
52
  */
45
53
  constructor(httpClient) {
46
54
  this.httpClient = httpClient;
@@ -234,78 +242,21 @@ class ChatApi {
234
242
  for (const line of lines) {
235
243
  if (!line.startsWith('data:'))
236
244
  continue;
237
- const data = line.slice(5).trim();
238
- if (data === '[DONE]') {
245
+ const result = (0, stream_utils_1.processStreamChunk)(line, isInThinkingBlock, thinkingContent, textContent, thinkingSignature, options?.onToken);
246
+ isInThinkingBlock = result.isInThinkingBlock;
247
+ thinkingContent = result.thinkingContent;
248
+ textContent = result.textContent;
249
+ thinkingSignature = result.thinkingSignature;
250
+ if (result.chunk) {
251
+ yield result.chunk;
252
+ }
253
+ if (result.isDone) {
239
254
  // Поток завершен
240
255
  if (options?.onComplete) {
241
256
  options.onComplete(textContent);
242
257
  }
243
- yield {
244
- text: '',
245
- isComplete: true,
246
- thinkingContent: thinkingContent.length > 0 ? thinkingContent : undefined,
247
- thinkingSignature: thinkingSignature.length > 0 ? thinkingSignature : undefined
248
- };
249
258
  return;
250
259
  }
251
- try {
252
- const parsedData = JSON.parse(data);
253
- // Обрабатываем различные типы событий
254
- if (parsedData.type === 'thinking_start' || parsedData.type === 'content_block_start' && parsedData.content_block?.type === 'thinking') {
255
- isInThinkingBlock = true;
256
- // Отправляем начало блока thinking
257
- if (options?.onToken) {
258
- options.onToken('[THINKING_START]');
259
- }
260
- yield {
261
- text: '[THINKING_START]',
262
- isComplete: false,
263
- isThinking: true
264
- };
265
- }
266
- else if (parsedData.type === 'thinking_end' || parsedData.type === 'content_block_stop' && isInThinkingBlock) {
267
- isInThinkingBlock = false;
268
- // Отправляем конец блока thinking
269
- if (options?.onToken) {
270
- options.onToken('[THINKING_END]');
271
- }
272
- yield {
273
- text: '[THINKING_END]',
274
- isComplete: false,
275
- isThinking: true
276
- };
277
- }
278
- else if (parsedData.type === 'content_block_delta' || parsedData.type === 'thinking_delta') {
279
- const text = parsedData.delta?.text || '';
280
- if (isInThinkingBlock || parsedData.type === 'thinking_delta') {
281
- // Добавляем текст к блоку размышлений
282
- thinkingContent += text;
283
- if (options?.onToken) {
284
- options.onToken(text);
285
- }
286
- yield {
287
- text,
288
- isComplete: false,
289
- isThinking: true
290
- };
291
- }
292
- else {
293
- // Добавляем текст к основному содержимому
294
- textContent += text;
295
- if (options?.onToken) {
296
- options.onToken(text);
297
- }
298
- yield {
299
- text,
300
- isComplete: false,
301
- isThinking: false
302
- };
303
- }
304
- }
305
- }
306
- catch (e) {
307
- console.error('Ошибка при парсинге данных:', e);
308
- }
309
260
  }
310
261
  }
311
262
  // Финальный чанк, если поток завершился без [DONE]
@@ -320,10 +271,11 @@ class ChatApi {
320
271
  };
321
272
  }
322
273
  catch (error) {
274
+ const errorObj = (0, stream_utils_1.handleStreamError)(error);
323
275
  if (options?.onError) {
324
- options.onError(error);
276
+ options.onError(errorObj);
325
277
  }
326
- throw error;
278
+ throw errorObj;
327
279
  }
328
280
  }
329
281
  /**
@@ -349,7 +301,7 @@ class ChatApi {
349
301
  * Отправляет сообщение в чат в потоковом режиме с поддержкой thinking через WebSocket
350
302
  * @param {ChatMessage[]} messages Массив сообщений для отправки
351
303
  * @param {ChatStreamOptions} [options] Дополнительные параметры
352
- * @param {(eventType: string, data: any) => void} [onEvent] Обработчик событий WebSocket
304
+ * @param {EventHandler} [onEvent] Обработчик событий WebSocket
353
305
  * @returns {Promise<ThinkingStreamResponse>} Информация о потоковом запросе
354
306
  */
355
307
  async streamChatWithThinking(messages, options = {}, onEvent) {
@@ -358,7 +310,9 @@ class ChatApi {
358
310
  }
359
311
  try {
360
312
  // 1. Создаем параметры для запроса
361
- const socketId = `socket_${Date.now()}_${this.generateId(10)}`;
313
+ const socketId = `socket_${Date.now()}_${(0, websocket_helpers_1.generateId)(10)}`;
314
+ // Создаем sessionId для отслеживания контекста между запросами
315
+ const sessionId = options.sessionId || `thinking-${Date.now()}`;
362
316
  let socket = null;
363
317
  // 2. Подключаемся к WebSocket и ждем успешного подключения
364
318
  if (onEvent) {
@@ -372,8 +326,7 @@ class ChatApi {
372
326
  timeout: 10000,
373
327
  query: {
374
328
  socketId: socketId,
375
- isTest: 'true',
376
- testToken: options.testToken || 'test-token'
329
+ token: options.authToken || 'test-token'
377
330
  }
378
331
  };
379
332
  // Динамически импортируем socket.io-client
@@ -384,69 +337,12 @@ class ChatApi {
384
337
  return;
385
338
  }
386
339
  // Создаем соединение с сервером WebSocket
387
- const serverUrl = this.httpClient.getBaseURL() || 'http://localhost:3000';
340
+ const serverUrl = this.httpClient.getBaseURL?.() || 'http://localhost:3000';
388
341
  socket = io(`${serverUrl}/reasoning`, socketOptions);
389
342
  // Устанавливаем обработчики событий
390
- socket.on('connect', () => {
391
- console.log(`[SDK] WebSocket подключен: ${socket.id}, задано socketId: ${socketId}`);
392
- // При подключении отправляем событие аутентификации
393
- socket.emit('authenticate', {
394
- isTest: true,
395
- socketId: socketId,
396
- testToken: options.testToken || 'test-token'
397
- });
398
- // Отправляем событие присоединения к комнате с ID
399
- socket.emit('join_room', { roomId: socketId });
400
- // Вызываем обработчик события connect
401
- if (onEvent) {
402
- onEvent('connect', { socketId });
403
- }
404
- // Разрешаем промис, продолжаем выполнение
405
- resolve();
406
- });
407
- // Обработчик сообщений от сервера
408
- socket.on('message', (data) => {
409
- if (onEvent && data && data.type) {
410
- onEvent(data.type, data.data || data);
411
- }
412
- });
413
- // Обработчик ошибок
414
- socket.on('error', (error) => {
415
- console.error('[SDK] WebSocket error:', error);
416
- if (onEvent) {
417
- onEvent('error', { message: error.message || 'Unknown WebSocket error', code: error.code });
418
- }
419
- });
420
- // Обработчик отключения
421
- socket.on('disconnect', (reason) => {
422
- console.log(`[SDK] WebSocket отключен: ${reason}`);
423
- if (onEvent) {
424
- onEvent('disconnect', { reason });
425
- }
426
- });
427
- // Обработчики для событий аутентификации
428
- socket.on('authenticated', (data) => {
429
- console.log('[SDK] Аутентификация успешна', data);
430
- if (onEvent) {
431
- onEvent('authenticated', data);
432
- }
433
- });
434
- socket.on('authentication_error', (data) => {
435
- console.error('[SDK] Ошибка аутентификации:', data);
436
- if (onEvent) {
437
- onEvent('error', { message: 'Ошибка аутентификации: ' + (data.message || 'Unknown error'), code: 'AUTH_ERROR' });
438
- }
439
- reject(new Error('Ошибка аутентификации: ' + (data.message || 'Unknown error')));
440
- });
441
- // Регистрируем обработчики для всех событий потока мышления
442
- ['message_start', 'content_block_start', 'thinking_start', 'thinking_delta',
443
- 'text_delta', 'content_block_stop', 'message_stop', 'done'].forEach(eventType => {
444
- socket.on(eventType, (data) => {
445
- if (onEvent) {
446
- onEvent(eventType, data);
447
- }
448
- });
449
- });
343
+ (0, websocket_helpers_1.setupSocketEventHandlers)(socket, socketId, sessionId, onEvent);
344
+ // Разрешаем промис, продолжаем выполнение
345
+ resolve();
450
346
  // Обработчик таймаута соединения
451
347
  setTimeout(() => {
452
348
  if (socket && !socket.connected) {
@@ -471,32 +367,22 @@ class ChatApi {
471
367
  temperature: options.temperature,
472
368
  maxTokens: options.maxTokens,
473
369
  socketId: socketId,
370
+ sessionId: sessionId, // Добавляем sessionId для кэширования блоков мышления
474
371
  thinking: true,
475
372
  region: options.region
476
373
  }, {
477
- 'X-Socket-ID': socketId
374
+ 'X-Socket-ID': socketId,
375
+ 'X-Session-ID': sessionId // Добавляем ID сессии в заголовки
478
376
  });
479
377
  }
480
378
  catch (error) {
379
+ const errorObj = (0, stream_utils_1.handleStreamError)(error);
481
380
  if (options.onError) {
482
- options.onError(error);
381
+ options.onError(errorObj);
483
382
  }
484
- throw error;
485
- }
486
- }
487
- /**
488
- * Генерирует случайный ID указанной длины
489
- * @param {number} length Длина ID
490
- * @returns {string} Сгенерированный ID
491
- */
492
- generateId(length) {
493
- const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
494
- let result = '';
495
- for (let i = 0; i < length; i++) {
496
- result += chars.charAt(Math.floor(Math.random() * chars.length));
383
+ throw errorObj;
497
384
  }
498
- return result;
499
385
  }
500
386
  }
501
387
  exports.ChatApi = ChatApi;
502
- //# sourceMappingURL=chat-api.js.map
388
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/api/chat-api/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../src/api/chat-api/interfaces.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Модели данных для чат-API
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/api/chat-api/models.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processStreamChunk = processStreamChunk;
4
+ exports.handleStreamError = handleStreamError;
5
+ /**
6
+ * Обрабатывает чанк данных из потока SSE
7
+ */
8
+ function processStreamChunk(line, isInThinkingBlock, thinkingContent, textContent, thinkingSignature, onToken) {
9
+ // Проверяем формат строки
10
+ if (!line.startsWith('data:')) {
11
+ return {
12
+ isInThinkingBlock,
13
+ thinkingContent,
14
+ textContent,
15
+ thinkingSignature,
16
+ isDone: false
17
+ };
18
+ }
19
+ const data = line.slice(5).trim();
20
+ // Проверяем завершение потока
21
+ if (data === '[DONE]') {
22
+ if (onToken) {
23
+ onToken('');
24
+ }
25
+ return {
26
+ isInThinkingBlock,
27
+ thinkingContent,
28
+ textContent,
29
+ thinkingSignature,
30
+ chunk: {
31
+ text: '',
32
+ isComplete: true,
33
+ thinkingContent: thinkingContent.length > 0 ? thinkingContent : undefined,
34
+ thinkingSignature: thinkingSignature.length > 0 ? thinkingSignature : undefined
35
+ },
36
+ isDone: true
37
+ };
38
+ }
39
+ try {
40
+ const parsedData = JSON.parse(data);
41
+ // Обрабатываем типы событий по актуальному API Anthropic
42
+ if (parsedData.type === 'content_block_start' && parsedData.content_block?.type === 'thinking') {
43
+ const newIsInThinkingBlock = true;
44
+ if (onToken) {
45
+ onToken('[THINKING_START]');
46
+ }
47
+ return {
48
+ isInThinkingBlock: newIsInThinkingBlock,
49
+ thinkingContent,
50
+ textContent,
51
+ thinkingSignature,
52
+ chunk: {
53
+ text: '[THINKING_START]',
54
+ isComplete: false,
55
+ isThinking: true
56
+ },
57
+ isDone: false
58
+ };
59
+ }
60
+ else if (parsedData.type === 'content_block_stop' && isInThinkingBlock) {
61
+ const newIsInThinkingBlock = false;
62
+ if (onToken) {
63
+ onToken('[THINKING_END]');
64
+ }
65
+ return {
66
+ isInThinkingBlock: newIsInThinkingBlock,
67
+ thinkingContent,
68
+ textContent,
69
+ thinkingSignature,
70
+ chunk: {
71
+ text: '[THINKING_END]',
72
+ isComplete: false,
73
+ isThinking: true
74
+ },
75
+ isDone: false
76
+ };
77
+ }
78
+ else if (parsedData.type === 'content_block_delta') {
79
+ // Получаем тип дельты из данных события
80
+ const deltaType = parsedData.delta?.type;
81
+ // Обрабатываем дельту в зависимости от типа
82
+ if (deltaType === 'text_delta') {
83
+ const text = parsedData.delta?.text || '';
84
+ const newTextContent = textContent + text;
85
+ if (onToken) {
86
+ onToken(text);
87
+ }
88
+ return {
89
+ isInThinkingBlock,
90
+ thinkingContent,
91
+ textContent: newTextContent,
92
+ thinkingSignature,
93
+ chunk: {
94
+ text,
95
+ isComplete: false,
96
+ isThinking: false
97
+ },
98
+ isDone: false
99
+ };
100
+ }
101
+ else if (deltaType === 'thinking_delta') {
102
+ const thinking = parsedData.delta?.thinking || '';
103
+ const newThinkingContent = thinkingContent + thinking;
104
+ if (onToken) {
105
+ onToken(thinking);
106
+ }
107
+ return {
108
+ isInThinkingBlock: true,
109
+ thinkingContent: newThinkingContent,
110
+ textContent,
111
+ thinkingSignature,
112
+ chunk: {
113
+ text: thinking,
114
+ isComplete: false,
115
+ isThinking: true
116
+ },
117
+ isDone: false
118
+ };
119
+ }
120
+ else if (deltaType === 'signature_delta') {
121
+ const signature = parsedData.delta?.signature || '';
122
+ return {
123
+ isInThinkingBlock,
124
+ thinkingContent,
125
+ textContent,
126
+ thinkingSignature: signature,
127
+ isDone: false
128
+ };
129
+ }
130
+ else if (deltaType === 'input_json_delta') {
131
+ const jsonData = parsedData.delta?.input_json || '';
132
+ if (onToken) {
133
+ onToken(jsonData);
134
+ }
135
+ // Убираем свойство isToolUse, добавляем метаданные
136
+ return {
137
+ isInThinkingBlock,
138
+ thinkingContent,
139
+ textContent,
140
+ thinkingSignature,
141
+ chunk: {
142
+ text: jsonData,
143
+ isComplete: false,
144
+ isThinking: false
145
+ },
146
+ isDone: false
147
+ };
148
+ }
149
+ }
150
+ // Возвращаем без изменений, если тип события не обрабатывается
151
+ return {
152
+ isInThinkingBlock,
153
+ thinkingContent,
154
+ textContent,
155
+ thinkingSignature,
156
+ isDone: false
157
+ };
158
+ }
159
+ catch (e) {
160
+ console.error('Ошибка при парсинге данных:', e);
161
+ return {
162
+ isInThinkingBlock,
163
+ thinkingContent,
164
+ textContent,
165
+ thinkingSignature,
166
+ isDone: false
167
+ };
168
+ }
169
+ }
170
+ /**
171
+ * Обрабатывает ошибку из потока
172
+ */
173
+ function handleStreamError(error) {
174
+ // Проверяем наличие ошибки географических ограничений
175
+ const errorObj = error;
176
+ const isGeoRestriction = (errorObj.status === 403 || errorObj.code === 403) &&
177
+ errorObj.message &&
178
+ (errorObj.message.includes('ограничен в вашем регионе') ||
179
+ errorObj.message.includes('Request not allowed') ||
180
+ errorObj.message.includes('forbidden'));
181
+ if (isGeoRestriction) {
182
+ console.error('\n==============================================');
183
+ console.error('⚠️ ОШИБКА ГЕОГРАФИЧЕСКОГО ОГРАНИЧЕНИЯ API ANTHROPIC');
184
+ console.error('⚠️ Для работы с API Anthropic требуется VPN или прокси');
185
+ console.error('⚠️ Anthropic API доступен только из определенных регионов');
186
+ console.error('==============================================');
187
+ // Обогащаем объект ошибки информацией о географических ограничениях
188
+ errorObj.type = 'geo_restriction';
189
+ }
190
+ return errorObj;
191
+ }
192
+ //# sourceMappingURL=stream-utils.js.map