solver-sdk 2.5.0 → 2.6.0

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/docs/WEBSOCKET.md CHANGED
@@ -1,168 +1,431 @@
1
- # Работа с WebSocket в Solver SDK
1
+ # WebSocket API v2.5.0
2
2
 
3
- Эта документация описывает, как использовать WebSocket соединения через высокоуровневые методы Solver SDK для работы в реальном времени.
3
+ Полная документация по работе с WebSocket соединениями в AI Solver SDK v2.5.0.
4
4
 
5
- ## Инициализация SDK
5
+ ## Инициализация с контролируемыми подключениями
6
6
 
7
7
  ```javascript
8
- const { CodeSolverSDK } = require('solver-sdk');
8
+ import { CodeSolverSDK } from '@ai-solver/sdk';
9
9
 
10
- // Создаем экземпляр SDK с настройками
11
- const sdk = new CodeSolverSDK({
12
- baseURL: 'https://api.example.com',
13
- apiKey: 'your-api-key',
14
- websocket: {
15
- reconnect: true, // Автоматическое переподключение при разрыве соединения
16
- reconnectAttempts: 5, // Максимальное количество попыток переподключения
17
- reconnectDelay: 3000 // Задержка между попытками (мс)
18
- }
10
+ // Рекомендуемый способ с autoConnect: false
11
+ const sdk = CodeSolverSDK.create({
12
+ baseURL: 'http://localhost:3000',
13
+ apiKey: 'dev_sk_test_12345678',
14
+ autoConnect: false // Контролируемые WebSocket подключения
19
15
  });
20
16
 
21
- // Единое подключение ко всем сервисам
22
- await sdk.connect();
17
+ // Диагностика перед подключением
18
+ const wsStatus = await sdk.diagnoseWebSocket();
19
+ console.log('WebSocket readiness:', wsStatus);
23
20
  ```
24
21
 
25
- ## Работа с индексацией проектов
22
+ ## WebSocket Namespaces
23
+
24
+ SDK поддерживает 3 основных WebSocket namespace:
25
+
26
+ 1. **Projects** (`/projects`) - события проектов и индексации
27
+ 2. **Reasoning** (`/reasoning`) - события AI reasoning процессов
28
+ 3. **Chat** (`/chat`) - события потокового чата и thinking
29
+
30
+ ## Projects WebSocket
31
+
32
+ ### Подключение
26
33
 
27
34
  ```javascript
28
- // Подключение к WebSocket для проектов
35
+ // Подключение к projects namespace
29
36
  await sdk.projects.connectWebSocket();
30
37
 
31
- // Отслеживание прогресса индексации
32
- sdk.projects.on('indexing_progress', (data) => {
33
- console.log(`Прогресс индексации: ${data.progress}%`);
34
- console.log(`Обработано файлов: ${data.processedFiles} из ${data.totalFiles}`);
38
+ // Проверка статуса подключения
39
+ const isConnected = sdk.projects.isWebSocketConnected();
40
+ console.log('Projects WebSocket connected:', isConnected);
41
+ ```
42
+
43
+ ### События индексации
44
+
45
+ #### `indexing_progress`
46
+
47
+ Прогресс индексации в реальном времени.
48
+
49
+ ```javascript
50
+ sdk.projects.onIndexingProgress((data) => {
51
+ console.log(`Progress: ${data.percentage}%`);
52
+ console.log(`Files: ${data.processedFiles}/${data.totalFiles}`);
53
+ console.log(`Current: ${data.currentFile}`);
54
+ console.log(`Status: ${data.status}`);
55
+ console.log(`Speed: ${data.filesPerSecond} files/sec`);
35
56
  });
57
+ ```
36
58
 
37
- // Завершение индексации
38
- sdk.projects.on('indexing_complete', (data) => {
39
- console.log('Индексация завершена!', data.success ? 'Успешно' : 'С ошибками');
40
-
41
- // Отключение после завершения
42
- sdk.projects.disconnectWebSocket();
59
+ #### `indexing_complete`
60
+
61
+ Завершение индексации.
62
+
63
+ ```javascript
64
+ sdk.projects.onIndexingComplete((data) => {
65
+ console.log('Indexing completed:', data.projectId);
66
+ console.log('Total files:', data.totalFiles);
67
+ console.log('Duration:', data.duration);
68
+ console.log('Success:', data.success);
69
+ console.log('Errors:', data.errors);
43
70
  });
71
+ ```
72
+
73
+ #### `indexing_error`
74
+
75
+ Ошибки индексации.
44
76
 
45
- // Запуск индексации проекта
46
- await sdk.projects.indexProject('project-id');
77
+ ```javascript
78
+ sdk.projects.onIndexingError((error) => {
79
+ console.error('Indexing error:', error.message);
80
+ console.error('Project:', error.projectId);
81
+ console.error('File:', error.fileName);
82
+ console.error('Code:', error.errorCode);
83
+ });
47
84
  ```
48
85
 
49
- ## Работа с рассуждениями (Reasoning)
86
+ ### Пример полного цикла индексации
50
87
 
51
88
  ```javascript
52
- // Создание рассуждения
53
- const reasoning = await sdk.reasoning.createReasoning({
54
- projectId: 'project-id',
55
- query: 'Объясни этот проект'
89
+ async function indexProjectWithProgress(projectId) {
90
+ // Подключение к WebSocket
91
+ await sdk.projects.connectWebSocket();
92
+
93
+ // Настройка обработчиков
94
+ sdk.projects.onIndexingProgress((data) => {
95
+ const progress = Math.round(data.percentage);
96
+ console.log(`[${progress}%] ${data.currentFile}`);
97
+ });
98
+
99
+ sdk.projects.onIndexingComplete((data) => {
100
+ console.log('✅ Indexing completed!');
101
+ console.log(`📊 ${data.totalFiles} files indexed in ${data.duration}ms`);
102
+ sdk.projects.disconnectWebSocket();
103
+ });
104
+
105
+ sdk.projects.onIndexingError((error) => {
106
+ console.error('❌ Indexing failed:', error.message);
107
+ sdk.projects.disconnectWebSocket();
108
+ });
109
+
110
+ // Запуск индексации
111
+ await sdk.projects.startIndexing(projectId);
112
+ }
113
+ ```
114
+
115
+ ## Reasoning WebSocket
116
+
117
+ ### Подключение
118
+
119
+ ```javascript
120
+ // Подключение к reasoning namespace
121
+ await sdk.reasoning.connectWebSocket();
122
+ ```
123
+
124
+ ### События reasoning
125
+
126
+ #### `reasoning_started`
127
+
128
+ Начало reasoning процесса.
129
+
130
+ ```javascript
131
+ sdk.reasoning.onReasoningStarted((data) => {
132
+ console.log('🚀 Reasoning started:', data.id);
133
+ console.log('📝 Query:', data.query);
134
+ console.log('🎯 Project:', data.projectId);
56
135
  });
136
+ ```
57
137
 
58
- // Подключение к WebSocket для рассуждений
59
- await sdk.reasoning.connectWebSocket(reasoning.id);
138
+ #### `reasoning_progress`
60
139
 
61
- // Подписка на события
62
- sdk.reasoning.on('thinking', (data) => {
63
- console.log('Мышление:', data.content);
140
+ Прогресс reasoning.
141
+
142
+ ```javascript
143
+ sdk.reasoning.onReasoningProgress((data) => {
144
+ console.log('⚡ Progress:', data.progress);
145
+ console.log('📍 Step:', data.currentStep);
146
+ console.log('🔍 Action:', data.action);
64
147
  });
148
+ ```
149
+
150
+ #### `reasoning_completed`
65
151
 
66
- sdk.reasoning.on('complete', (data) => {
67
- console.log('Результат:', data.content);
68
- // Отключение после завершения
69
- sdk.reasoning.disconnectWebSocket();
152
+ Завершение reasoning.
153
+
154
+ ```javascript
155
+ sdk.reasoning.onReasoningCompleted((data) => {
156
+ console.log('✅ Reasoning completed:', data.id);
157
+ console.log('📊 Results:', data.results);
158
+ console.log('⏱️ Duration:', data.duration);
70
159
  });
160
+ ```
71
161
 
72
- // Запуск рассуждения
73
- await sdk.reasoning.startReasoning(reasoning.id);
162
+ #### `reasoning_error`
163
+
164
+ Ошибки reasoning.
165
+
166
+ ```javascript
167
+ sdk.reasoning.onReasoningError((error) => {
168
+ console.error('❌ Reasoning error:', error.message);
169
+ console.error('🆔 Reasoning ID:', error.reasoningId);
170
+ });
74
171
  ```
75
172
 
76
- ## Потоковый чат с мышлением AI
173
+ ### Пример reasoning с WebSocket
77
174
 
78
175
  ```javascript
79
- // Обработчик событий для потокового получения ответа и мышления
80
- const handleEvent = (eventType, data) => {
81
- if (eventType === 'thinking_delta' && data.thinking) {
82
- console.log('Мышление:', data.thinking);
83
- } else if (eventType === 'text_delta' && data.text) {
84
- process.stdout.write(data.text);
85
- } else if (eventType === 'message_stop') {
86
- console.log('\nОтвет завершен');
87
- }
88
- };
176
+ async function runReasoningWithEvents(projectId, query) {
177
+ // Подключение
178
+ await sdk.reasoning.connectWebSocket();
179
+
180
+ // Обработчики
181
+ sdk.reasoning.onReasoningStarted((data) => {
182
+ console.log('🚀 Started reasoning:', data.id);
183
+ });
184
+
185
+ sdk.reasoning.onReasoningProgress((data) => {
186
+ console.log(`⚡ ${data.progress}% - ${data.currentStep}`);
187
+ });
188
+
189
+ sdk.reasoning.onReasoningCompleted((data) => {
190
+ console.log('✅ Results:', data.results);
191
+ sdk.reasoning.disconnectWebSocket();
192
+ });
193
+
194
+ // Создание и запуск
195
+ const reasoning = await sdk.reasoning.create({
196
+ projectId: projectId,
197
+ query: query
198
+ });
199
+
200
+ await sdk.reasoning.start(reasoning.id);
201
+ }
202
+ ```
89
203
 
90
- // Отправка запроса
91
- const messages = [
92
- { role: 'user', content: 'Расскажи о JavaScript' }
93
- ];
204
+ ## Chat WebSocket
94
205
 
95
- const options = {
96
- model: 'claude-3-7-sonnet-20240229',
97
- thinking: true,
98
- temperature: 0.7
99
- };
206
+ ### Подключение
100
207
 
101
- // Отправка с потоковым получением ответа
102
- const response = await sdk.chat.streamChatWithThinking(
103
- messages,
104
- options,
105
- handleEvent
106
- );
208
+ ```javascript
209
+ // Подключение к chat namespace
210
+ await sdk.chat.connectWebSocket();
107
211
  ```
108
212
 
109
- ## Работа с зависимостями
213
+ ### События потокового чата
214
+
215
+ #### `text_delta`
216
+
217
+ Фрагменты текстового ответа.
110
218
 
111
219
  ```javascript
112
- // Подключение к пространству имен зависимостей
113
- await sdk.dependencies.connectWebSocket(projectId);
220
+ sdk.chat.onTextDelta((text) => {
221
+ process.stdout.write(text); // Вывод в реальном времени
222
+ });
223
+ ```
224
+
225
+ #### `thinking_delta`
114
226
 
115
- // Подписка на события зависимостей
116
- sdk.dependencies.on('dependency_update', (data) => {
117
- console.log('Обновление зависимостей:', data);
227
+ Фрагменты thinking блоков (Claude 4).
228
+
229
+ ```javascript
230
+ sdk.chat.onThinkingDelta((thinking) => {
231
+ console.log('🧠 Thinking:', thinking);
118
232
  });
233
+ ```
234
+
235
+ #### `tool_use`
236
+
237
+ Использование инструментов AI.
238
+
239
+ ```javascript
240
+ sdk.chat.onToolUse((tool) => {
241
+ console.log('🔧 Tool used:', tool.name);
242
+ console.log('📥 Input:', tool.input);
243
+ });
244
+ ```
245
+
246
+ #### `message_complete`
247
+
248
+ Завершение сообщения.
249
+
250
+ ```javascript
251
+ sdk.chat.onMessageComplete((message) => {
252
+ console.log('✅ Message completed');
253
+ console.log('📄 Full content:', message.content);
254
+ });
255
+ ```
256
+
257
+ ### Потоковый чат с thinking
258
+
259
+ ```javascript
260
+ async function streamChatWithThinking(messages) {
261
+ // Подключение
262
+ await sdk.chat.connectWebSocket();
263
+
264
+ let fullResponse = '';
265
+ let thinkingContent = '';
266
+
267
+ // Обработчики
268
+ sdk.chat.onThinkingDelta((thinking) => {
269
+ thinkingContent += thinking;
270
+ console.log('🧠 Thinking fragment:', thinking);
271
+ });
272
+
273
+ sdk.chat.onTextDelta((text) => {
274
+ fullResponse += text;
275
+ process.stdout.write(text);
276
+ });
277
+
278
+ sdk.chat.onToolUse((tool) => {
279
+ console.log(`\n🔧 Using tool: ${tool.name}`);
280
+ });
281
+
282
+ sdk.chat.onMessageComplete((message) => {
283
+ console.log('\n✅ Response completed');
284
+ console.log('💭 Full thinking:', thinkingContent);
285
+ sdk.chat.disconnectWebSocket();
286
+ });
287
+
288
+ // Отправка с thinking
289
+ await sdk.chat.stream(messages, {
290
+ thinking: true,
291
+ model: 'claude-3-5-sonnet-20241022',
292
+ tool_choice: { type: 'auto' }
293
+ });
294
+ }
295
+ ```
296
+
297
+ ## Управление подключениями
298
+
299
+ ### Подключение/отключение
300
+
301
+ ```javascript
302
+ // Подключение к конкретным namespace
303
+ await sdk.projects.connectWebSocket();
304
+ await sdk.reasoning.connectWebSocket();
305
+ await sdk.chat.connectWebSocket();
119
306
 
120
307
  // Отключение
121
- await sdk.dependencies.disconnectWebSocket();
308
+ await sdk.projects.disconnectWebSocket();
309
+ await sdk.reasoning.disconnectWebSocket();
310
+ await sdk.chat.disconnectWebSocket();
311
+
312
+ // Проверка статуса
313
+ console.log('Projects WS:', sdk.projects.isWebSocketConnected());
314
+ console.log('Reasoning WS:', sdk.reasoning.isWebSocketConnected());
315
+ console.log('Chat WS:', sdk.chat.isWebSocketConnected());
122
316
  ```
123
317
 
124
- ## Автоматическая авторизация
318
+ ### Диагностика WebSocket
125
319
 
126
- **Важно:** Авторизация происходит автоматически, если указан `apiKey` при инициализации SDK. Отдельных действий для авторизации не требуется.
320
+ ```javascript
321
+ // Полная диагностика WebSocket
322
+ const wsStatus = await sdk.diagnoseWebSocket();
323
+ console.log('WebSocket Diagnostics:', wsStatus);
324
+
325
+ /* Пример ответа:
326
+ {
327
+ projects: { connected: true, url: 'ws://localhost:3000/projects' },
328
+ reasoning: { connected: false, url: 'ws://localhost:3000/reasoning' },
329
+ chat: { connected: true, url: 'ws://localhost:3000/chat' }
330
+ }
331
+ */
332
+ ```
127
333
 
128
- ## Обработка ошибок и переподключение
334
+ ## Обработка ошибок WebSocket
129
335
 
130
- Используйте параметры `reconnect` и `reconnectAttempts` для автоматического переподключения при разрыве соединения:
336
+ ```javascript
337
+ // Обработка ошибок подключения
338
+ try {
339
+ await sdk.projects.connectWebSocket();
340
+ } catch (error) {
341
+ console.error('WebSocket connection failed:', error.message);
342
+ // Fallback к HTTP API
343
+ }
344
+
345
+ // Обработка разрывов соединения
346
+ sdk.projects.on('disconnect', () => {
347
+ console.log('Projects WebSocket disconnected');
348
+ // Логика переподключения
349
+ });
350
+
351
+ sdk.reasoning.on('error', (error) => {
352
+ console.error('Reasoning WebSocket error:', error);
353
+ });
354
+ ```
355
+
356
+ ## WebSocket URLs
357
+
358
+ | Namespace | URL | Описание |
359
+ |-----------|-----|----------|
360
+ | Projects | `ws://localhost:3000/projects` | События проектов и индексации |
361
+ | Reasoning | `ws://localhost:3000/reasoning` | События AI reasoning |
362
+ | Chat | `ws://localhost:3000/chat` | Потоковый чат и thinking |
363
+
364
+ ## Аутентификация
365
+
366
+ WebSocket соединения автоматически используют API ключ из настроек SDK:
131
367
 
132
368
  ```javascript
133
- // Инициализация SDK с настройками переподключения
134
- const sdk = new CodeSolverSDK({
135
- baseURL: 'https://api.example.com',
136
- apiKey: 'your-api-key',
137
- websocket: {
138
- reconnect: true,
139
- reconnectAttempts: 5,
140
- reconnectDelay: 3000
141
- }
369
+ const sdk = CodeSolverSDK.create({
370
+ baseURL: 'http://localhost:3000',
371
+ apiKey: 'dev_sk_test_12345678', // Автоматически используется для WS
372
+ autoConnect: false
142
373
  });
374
+ ```
143
375
 
144
- // Проверка доступности сервера перед началом работы
145
- const isHealthy = await sdk.checkHealth();
146
- if (!isHealthy) {
147
- console.error('API недоступен');
148
- return;
149
- }
376
+ ## Производительность
377
+
378
+ ### Рекомендации
379
+
380
+ 1. **Используйте autoConnect: false** для контроля подключений
381
+ 2. **Подключайтесь только к нужным namespace** для экономии ресурсов
382
+ 3. **Отключайтесь после завершения** операций
383
+ 4. **Используйте диагностику** для мониторинга состояния
384
+
385
+ ### Пример оптимизированного использования
150
386
 
151
- // Попытка подключения
152
- const connected = await sdk.connect();
153
- if (!connected) {
154
- console.warn('WebSocket соединение не установлено, работа будет ограничена');
387
+ ```javascript
388
+ async function optimizedWorkflow(projectId, query) {
389
+ const sdk = CodeSolverSDK.create({
390
+ baseURL: 'http://localhost:3000',
391
+ apiKey: 'dev_sk_test_12345678',
392
+ autoConnect: false
393
+ });
394
+
395
+ try {
396
+ // 1. Индексация проекта
397
+ await sdk.projects.connectWebSocket();
398
+ await sdk.projects.startIndexing(projectId);
399
+
400
+ await new Promise(resolve => {
401
+ sdk.projects.onIndexingComplete(() => {
402
+ sdk.projects.disconnectWebSocket();
403
+ resolve();
404
+ });
405
+ });
406
+
407
+ // 2. Reasoning
408
+ await sdk.reasoning.connectWebSocket();
409
+ const reasoning = await sdk.reasoning.create({ projectId, query });
410
+ await sdk.reasoning.start(reasoning.id);
411
+
412
+ await new Promise(resolve => {
413
+ sdk.reasoning.onReasoningCompleted(() => {
414
+ sdk.reasoning.disconnectWebSocket();
415
+ resolve();
416
+ });
417
+ });
418
+
419
+ console.log('✅ Workflow completed');
420
+
421
+ } catch (error) {
422
+ console.error('❌ Workflow failed:', error);
423
+ }
155
424
  }
156
425
  ```
157
426
 
158
- ## Основные события WebSocket
427
+ ---
159
428
 
160
- | Событие | Описание |
161
- |---------|----------|
162
- | `message_start` | Начало сообщения |
163
- | `thinking_delta` | Обновление мышления AI |
164
- | `text_delta` | Часть текстового ответа |
165
- | `message_stop` | Конец сообщения |
166
- | `indexing_progress` | Прогресс индексации |
167
- | `indexing_complete` | Завершение индексации |
168
- | `error` | Уведомление об ошибке |
429
+ **Документация WebSocket API для SDK v2.5.0**
430
+ **Совместимость:** AI Solver Backend v1.0.0
431
+ **Обновлено:** 28 июня 2025