solver-sdk 1.7.2 → 1.7.3

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.
@@ -0,0 +1,508 @@
1
+ # Работа с WebSocket соединениями
2
+
3
+ В этом разделе описаны возможности SDK для работы с WebSocket соединениями, методы управления сессиями рассуждений, диагностика соединений и дополнительные возможности для обеспечения стабильной работы.
4
+
5
+ ## Содержание
6
+
7
+ - [Основы работы с WebSocket](#основы-работы-с-websocket)
8
+ - [Высокоуровневый API (версия 1.7.2)](#высокоуровневый-api-версия-172)
9
+ - [Потоковая передача мышления](#потоковая-передача-мышления)
10
+ - [Управление сессиями рассуждений](#управление-сессиями-рассуждений)
11
+ - [Диагностика соединений](#диагностика-соединений)
12
+ - [Механизм переподключения](#механизм-переподключения)
13
+ - [Сохранение и восстановление сессий](#сохранение-и-восстановление-сессий)
14
+ - [Проверка здоровья соединений](#проверка-здоровья-соединений)
15
+ - [Работа с ping/pong](#работа-с-pingpong)
16
+ - [Примеры использования](#примеры-использования)
17
+ - [Справочник всех событий WebSocket](#справочник-всех-событий-websocket)
18
+
19
+ ## Основы работы с WebSocket
20
+
21
+ SDK предоставляет низкоуровневый WebSocket клиент (`CodeSolverWebSocketClient`), который используется для связи с различными пространствами имен сервера:
22
+
23
+ ```javascript
24
+ const { CodeSolverSDK } = require('solver-sdk');
25
+
26
+ const sdk = new CodeSolverSDK({
27
+ baseURL: 'https://api.example.com',
28
+ apiKey: 'your-api-key'
29
+ });
30
+
31
+ // Получение WebSocket клиента
32
+ const wsClient = sdk.getWebSocketClient();
33
+
34
+ // Подключение к пространству имен рассуждений
35
+ await wsClient.connectToReasoning('reasoning-id');
36
+
37
+ // Проверка состояния подключения
38
+ const isConnected = wsClient.isConnectedToReasoning();
39
+ console.log('Подключено к рассуждениям:', isConnected);
40
+
41
+ // Подписка на события
42
+ wsClient.on('thinking_delta', (data) => {
43
+ console.log('Получен фрагмент мышления:', data.text);
44
+ });
45
+
46
+ // Отключение
47
+ wsClient.disconnect(WebSocketNamespace.REASONING);
48
+ ```
49
+
50
+ ## Высокоуровневый API (версия 1.7.2)
51
+
52
+ Начиная с версии 1.7.2, SDK предоставляет высокоуровневый API для работы с WebSocket, интегрированный непосредственно в основные классы API:
53
+
54
+ ### Работа с чатом и рассуждениями
55
+
56
+ ```javascript
57
+ // Подключение WebSocket для чата
58
+ await sdk.chat.connectWebSocket();
59
+
60
+ // Подписка на события
61
+ sdk.chat.on('message_start', (data) => {
62
+ console.log('Начало сообщения:', data);
63
+ });
64
+
65
+ sdk.chat.on('thinking_delta', (data) => {
66
+ console.log('Фрагмент мышления:', data.text);
67
+ });
68
+
69
+ // Отключение
70
+ await sdk.chat.disconnectWebSocket();
71
+ ```
72
+
73
+ ### Работа с зависимостями
74
+
75
+ ```javascript
76
+ // Подключение к пространству имен зависимостей
77
+ await sdk.dependencies.connectWebSocket(projectId);
78
+
79
+ // Подписка на события зависимостей
80
+ sdk.dependencies.on('dependency_update', (data) => {
81
+ console.log('Обновление зависимостей:', data);
82
+ });
83
+
84
+ // Отключение
85
+ await sdk.dependencies.disconnectWebSocket();
86
+ ```
87
+
88
+ ### Работа с проектами и индексацией
89
+
90
+ ```javascript
91
+ // Подключение к пространству имен проектов
92
+ await sdk.projects.connectWebSocket();
93
+
94
+ // Подписка на события индексации
95
+ sdk.projects.on('indexing_progress', (data) => {
96
+ console.log('Прогресс индексации:', data.progress);
97
+ });
98
+
99
+ // Отключение
100
+ await sdk.projects.disconnectWebSocket();
101
+ ```
102
+
103
+ ## Потоковая передача мышления
104
+
105
+ В версии 1.7.2 добавлена полная поддержка потоковой передачи мышления через метод `streamChatWithThinking`:
106
+
107
+ ```javascript
108
+ // Обработчик событий
109
+ const handleEvent = (eventType, data) => {
110
+ switch(eventType) {
111
+ case 'thinking_delta':
112
+ console.log('Мышление:', data.text);
113
+ break;
114
+ case 'text_delta':
115
+ console.log('Ответ:', data.text);
116
+ break;
117
+ case 'message_start':
118
+ console.log('Начало сообщения');
119
+ break;
120
+ case 'message_stop':
121
+ console.log('Завершение ответа');
122
+ break;
123
+ }
124
+ };
125
+
126
+ // Отправка запроса с потоковым мышлением
127
+ const messages = [
128
+ { role: 'user', content: 'Как работает квантовый компьютер?' }
129
+ ];
130
+
131
+ const options = {
132
+ model: 'claude-3-7-sonnet-20240229',
133
+ thinking: true,
134
+ temperature: 0.7
135
+ };
136
+
137
+ const response = await sdk.chat.streamChatWithThinking(
138
+ messages,
139
+ options,
140
+ handleEvent
141
+ );
142
+ ```
143
+
144
+ ### Поддерживаемые события мышления
145
+
146
+ SDK поддерживает следующие ключевые события:
147
+
148
+ | Событие | Описание | Данные |
149
+ |---------|----------|--------|
150
+ | `message_start` | Начало сообщения | `{ model: string, type: string }` |
151
+ | `content_block_start` | Начало блока контента | `{ index: number, type: string }` |
152
+ | `thinking_delta` | Фрагмент мышления | `{ text: string, index: number }` |
153
+ | `text_delta` | Фрагмент ответа | `{ text: string, index: number }` |
154
+ | `content_block_stop` | Завершение блока контента | `{ index: number, type: string }` |
155
+ | `message_stop` | Завершение сообщения | `{ type: string }` |
156
+
157
+ ## Управление сессиями рассуждений
158
+
159
+ SDK версии 1.7.0+ предоставляет расширенные возможности для управления сессиями рассуждений:
160
+
161
+ ### Установка активной сессии рассуждения
162
+
163
+ ```javascript
164
+ // Простая установка активного ID рассуждения
165
+ wsClient.setActiveReasoningId('reasoning-id');
166
+
167
+ // Расширенный вариант с дополнительными возможностями
168
+ await wsClient.setActiveReasoningIdAsync(
169
+ 'reasoning-id', // ID рассуждения (можно передать null для создания нового)
170
+ true, // waitForJoin: ждать результата присоединения
171
+ true // createIfNotExists: создать новое, если не существует
172
+ );
173
+ ```
174
+
175
+ ### Создание нового рассуждения
176
+
177
+ ```javascript
178
+ // Создание нового рассуждения и получение его ID
179
+ const newReasoningId = await wsClient.createNewReasoning();
180
+ console.log('Создано новое рассуждение:', newReasoningId);
181
+ ```
182
+
183
+ ### Проверка существования рассуждения
184
+
185
+ ```javascript
186
+ // Проверка существования рассуждения на сервере
187
+ const exists = await wsClient.checkReasoningExists('reasoning-id');
188
+ if (exists) {
189
+ console.log('Рассуждение существует');
190
+ } else {
191
+ console.log('Рассуждение не найдено');
192
+ }
193
+ ```
194
+
195
+ ### Получение статуса рассуждения
196
+
197
+ ```javascript
198
+ // Получение детальной информации о сессии рассуждения
199
+ const status = await wsClient.getReasoningStatus('reasoning-id');
200
+ console.log('Статус:', status.exists, status.isActive);
201
+ console.log('Метаданные:', status.metadata);
202
+ ```
203
+
204
+ ### Присоединение к сессии рассуждения
205
+
206
+ ```javascript
207
+ // Явное присоединение к существующей сессии
208
+ const joined = await wsClient.joinReasoning(
209
+ 'reasoning-id',
210
+ true // setActive: установить как активное рассуждение
211
+ );
212
+
213
+ if (joined) {
214
+ console.log('Успешно присоединились к рассуждению');
215
+ } else {
216
+ console.log('Не удалось присоединиться к рассуждению');
217
+ }
218
+ ```
219
+
220
+ ## Диагностика соединений
221
+
222
+ SDK предоставляет методы для диагностики состояния соединений и получения подробной информации о них:
223
+
224
+ ```javascript
225
+ // Диагностика конкретного соединения
226
+ const diagnostics = wsClient.diagnoseConnection(WebSocketNamespace.REASONING);
227
+ console.log('Диагностика соединения:', diagnostics);
228
+
229
+ // Диагностика всех активных соединений
230
+ const allDiagnostics = wsClient.diagnoseAllConnections();
231
+ console.log('Все соединения:', allDiagnostics);
232
+ ```
233
+
234
+ Результат диагностики содержит следующую информацию:
235
+
236
+ ```typescript
237
+ interface ConnectionDiagnostics {
238
+ namespace: WebSocketNamespace; // Пространство имен
239
+ isConnected: boolean; // Активно ли соединение
240
+ socketId: string | null; // ID сокета
241
+ lastActivity: number; // Время последней активности
242
+ rtt: { // Round Trip Time (задержка)
243
+ current: number; // Текущая задержка
244
+ min: number; // Минимальная задержка
245
+ max: number; // Максимальная задержка
246
+ avg: number; // Средняя задержка
247
+ };
248
+ pingSent: number; // Отправлено ping-сообщений
249
+ pongReceived: number; // Получено pong-ответов
250
+ missedPongs: number; // Пропущено pong-ответов
251
+ timeoutCount: number; // Количество таймаутов
252
+ reconnectAttempts: number; // Количество попыток переподключения
253
+ lastConnectTime: number; // Время последнего подключения
254
+ sessionRecovery: { // Информация о восстановлении сессии
255
+ hasSessionToken: boolean; // Наличие токена сессии
256
+ tokenLength: number; // Длина токена сессии
257
+ wasRecovered: boolean; // Было ли восстановлено из сессии
258
+ };
259
+ }
260
+ ```
261
+
262
+ ## Механизм переподключения
263
+
264
+ SDK реализует интеллектуальный механизм переподключения с экспоненциальной задержкой и случайным фактором (jitter) для предотвращения штормов переподключений:
265
+
266
+ ```javascript
267
+ // Настройка параметров переподключения при создании SDK
268
+ const sdk = new CodeSolverSDK({
269
+ baseURL: 'https://api.example.com',
270
+ apiKey: 'your-api-key',
271
+ websocket: {
272
+ reconnect: true, // Включить автоматическое переподключение
273
+ reconnectStrategy: 'exponential', // 'linear' или 'exponential'
274
+ retryDelay: 1000, // Базовая задержка в миллисекундах
275
+ maxRetryDelay: 30000, // Максимальная задержка
276
+ reconnectAttempts: 5 // Максимальное количество попыток
277
+ }
278
+ });
279
+
280
+ // Принудительное переподключение к пространству имен
281
+ await wsClient.reconnectNamespace(
282
+ WebSocketNamespace.REASONING,
283
+ true // immediate: переподключиться немедленно, без задержки
284
+ );
285
+ ```
286
+
287
+ ## Сохранение и восстановление сессий
288
+
289
+ SDK поддерживает механизм сохранения и восстановления токенов сессий для непрерывной работы при переподключениях:
290
+
291
+ ```javascript
292
+ // Явное сохранение токена сессии
293
+ wsClient.saveSessionToken(WebSocketNamespace.REASONING, 'session-token');
294
+
295
+ // Получение сохраненного токена
296
+ const token = wsClient.getSessionToken(WebSocketNamespace.REASONING);
297
+
298
+ // Очистка токена сессии
299
+ wsClient.clearSessionToken(WebSocketNamespace.REASONING);
300
+
301
+ // Включение/отключение сохранения сессий при создании SDK
302
+ const sdk = new CodeSolverSDK({
303
+ baseURL: 'https://api.example.com',
304
+ apiKey: 'your-api-key',
305
+ websocket: {
306
+ enableSessionPersistence: true // Включить сохранение токенов сессий
307
+ }
308
+ });
309
+ ```
310
+
311
+ ## Проверка здоровья соединений
312
+
313
+ SDK предоставляет механизм регулярной проверки здоровья соединений и автоматического переподключения при обнаружении проблем:
314
+
315
+ ```javascript
316
+ // Настройка проверки здоровья соединений
317
+ wsClient.setupConnectionHealthCheck(
318
+ 30000 // Интервал проверки в миллисекундах
319
+ );
320
+
321
+ // Отключение проверки здоровья
322
+ if (wsClient.healthCheckTimer) {
323
+ clearInterval(wsClient.healthCheckTimer);
324
+ wsClient.healthCheckTimer = null;
325
+ }
326
+ ```
327
+
328
+ ## Работа с ping/pong
329
+
330
+ Для поддержания активных соединений и измерения времени отклика SDK использует механизм ping/pong:
331
+
332
+ ```javascript
333
+ // Включение автоматического ping/pong
334
+ wsClient.enablePingPong(
335
+ 15000, // Интервал между ping-сообщениями (мс)
336
+ 3 // Порог таймаута (количество пропущенных pong)
337
+ );
338
+
339
+ // Отключение механизма ping/pong
340
+ wsClient.disablePingPong();
341
+
342
+ // Получение статистики ping/pong
343
+ const stats = wsClient.getPingStats(WebSocketNamespace.REASONING);
344
+ console.log('Статистика ping/pong:', stats);
345
+
346
+ // Подписка на события таймаута соединения
347
+ wsClient.onPingPongEvent('connection_timeout', (data) => {
348
+ console.log('Таймаут соединения:', data);
349
+ });
350
+ ```
351
+
352
+ ## Примеры использования
353
+
354
+ ### Работа с потоковой передачей мышления
355
+
356
+ ```javascript
357
+ const { CodeSolverSDK } = require('solver-sdk');
358
+
359
+ async function streamingThinking() {
360
+ const sdk = new CodeSolverSDK({
361
+ baseURL: 'https://api.example.com',
362
+ apiKey: 'ваш-ключ-api',
363
+ websocket: {
364
+ reconnect: true,
365
+ pingInterval: 30000
366
+ }
367
+ });
368
+
369
+ // Подключаем WebSocket
370
+ await sdk.chat.connectWebSocket();
371
+
372
+ // Создаем буферы для накопления контента
373
+ let thinkingBuffer = '';
374
+ let responseBuffer = '';
375
+
376
+ // Настраиваем обработчик событий
377
+ const handleEvent = (eventType, data) => {
378
+ switch(eventType) {
379
+ case 'thinking_delta':
380
+ thinkingBuffer += data.text || '';
381
+ // Обновляем UI с мышлением
382
+ updateThinkingUI(thinkingBuffer);
383
+ break;
384
+
385
+ case 'text_delta':
386
+ responseBuffer += data.text || '';
387
+ // Обновляем UI с ответом
388
+ updateResponseUI(responseBuffer);
389
+ break;
390
+
391
+ case 'message_stop':
392
+ console.log('Обработка завершена');
393
+ break;
394
+ }
395
+ };
396
+
397
+ // Отправляем запрос
398
+ const messages = [
399
+ { role: 'user', content: 'Объясни принцип работы квантового компьютера' }
400
+ ];
401
+
402
+ try {
403
+ const response = await sdk.chat.streamChatWithThinking(
404
+ messages,
405
+ {
406
+ model: 'claude-3-7-sonnet-20240229',
407
+ thinking: true,
408
+ temperature: 0.7
409
+ },
410
+ handleEvent
411
+ );
412
+
413
+ console.log('Запрос отправлен, ID сокета:', response.socketId);
414
+
415
+ // После завершения можно отключиться
416
+ setTimeout(() => {
417
+ sdk.chat.disconnectWebSocket();
418
+ console.log('Соединение закрыто');
419
+ }, 1000);
420
+
421
+ return {
422
+ thinking: thinkingBuffer,
423
+ response: responseBuffer
424
+ };
425
+ } catch (error) {
426
+ console.error('Ошибка при отправке запроса:', error);
427
+ sdk.chat.disconnectWebSocket();
428
+ throw error;
429
+ }
430
+ }
431
+
432
+ // Функции для обновления UI
433
+ function updateThinkingUI(text) {
434
+ console.log('Обновление блока мышления');
435
+ // document.getElementById('thinking-container').textContent = text;
436
+ }
437
+
438
+ function updateResponseUI(text) {
439
+ console.log('Обновление блока ответа');
440
+ // document.getElementById('response-container').textContent = text;
441
+ }
442
+
443
+ // Запуск функции
444
+ streamingThinking().catch(console.error);
445
+ ```
446
+
447
+ ### Работа с региональным переключением
448
+
449
+ ```javascript
450
+ const { CodeSolverSDK } = require('solver-sdk');
451
+
452
+ async function chatWithRegionalFailover() {
453
+ const sdk = new CodeSolverSDK({
454
+ baseURL: 'https://api.example.com',
455
+ apiKey: 'ваш-ключ-api',
456
+ providers: {
457
+ anthropic: {
458
+ region: 'us-east-1' // Базовый регион
459
+ }
460
+ }
461
+ });
462
+
463
+ // Подключаем WebSocket
464
+ await sdk.chat.connectWebSocket();
465
+
466
+ // Настраиваем обработчик для отображения региона и ошибок
467
+ sdk.chat.on('region_switch', (data) => {
468
+ console.log(`Переключение на регион: ${data.region}`);
469
+ });
470
+
471
+ sdk.chat.on('error', (data) => {
472
+ console.error('Ошибка:', data);
473
+ });
474
+
475
+ // Отправляем запрос с автоматическим переключением регионов при ошибках
476
+ try {
477
+ const response = await sdk.chat.chatWithRegionFailover(
478
+ [{ role: 'user', content: 'Расскажи о квантовой физике' }],
479
+ {
480
+ model: 'claude-3-7-sonnet-20240229',
481
+ thinking: true,
482
+ // Порядок перебора регионов при ошибках
483
+ regionPreference: ['us-east-1', 'eu-west-1', 'ap-southeast-2']
484
+ }
485
+ );
486
+
487
+ console.log('Ответ получен из региона:', response.region);
488
+ console.log('Ответ:', response.choices[0].message.content);
489
+
490
+ return response;
491
+ } catch (error) {
492
+ console.error('Не удалось получить ответ ни из одного региона:', error);
493
+ throw error;
494
+ } finally {
495
+ await sdk.chat.disconnectWebSocket();
496
+ }
497
+ }
498
+
499
+ chatWithRegionalFailover().catch(console.error);
500
+ ```
501
+
502
+ ## Справочник всех событий WebSocket
503
+
504
+ Полный список всех поддерживаемых WebSocket событий, их описание, формат данных и примеры использования доступны в отдельном документе:
505
+
506
+ [Справочник WebSocket событий SDK](./WEBSOCKET_EVENTS.md)
507
+
508
+ В этом справочнике содержится подробная информация обо всех константах событий, их строковых значениях, форматах данных и рекомендациях по использованию в различных сценариях.