solver-sdk 2.0.2 → 2.1.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.
Files changed (51) hide show
  1. package/dist/cjs/api/chat-api/index.js +205 -171
  2. package/dist/cjs/api/chat-api/index.js.map +1 -1
  3. package/dist/cjs/api/chat-api/models.js +1 -1
  4. package/dist/cjs/api/chat-api/stream-utils.js +139 -151
  5. package/dist/cjs/api/chat-api/stream-utils.js.map +1 -1
  6. package/dist/cjs/constants/websocket-events.constants.js +1 -1
  7. package/dist/cjs/constants/websocket-events.constants.js.map +1 -1
  8. package/dist/cjs/index.js +2 -0
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/utils/message-helpers.js +212 -0
  11. package/dist/cjs/utils/message-helpers.js.map +1 -0
  12. package/dist/cjs/ws/filesystem-ws-client.js +0 -10
  13. package/dist/cjs/ws/filesystem-ws-client.js.map +1 -1
  14. package/dist/esm/api/chat-api/index.js +207 -151
  15. package/dist/esm/api/chat-api/index.js.map +1 -1
  16. package/dist/esm/api/chat-api/models.js +1 -1
  17. package/dist/esm/api/chat-api/stream-utils.js +139 -151
  18. package/dist/esm/api/chat-api/stream-utils.js.map +1 -1
  19. package/dist/esm/constants/websocket-events.constants.js +1 -1
  20. package/dist/esm/constants/websocket-events.constants.js.map +1 -1
  21. package/dist/esm/index.js +2 -0
  22. package/dist/esm/index.js.map +1 -1
  23. package/dist/esm/utils/message-helpers.js +199 -0
  24. package/dist/esm/utils/message-helpers.js.map +1 -0
  25. package/dist/esm/ws/filesystem-ws-client.js +0 -10
  26. package/dist/esm/ws/filesystem-ws-client.js.map +1 -1
  27. package/dist/types/api/chat-api/index.d.ts +23 -8
  28. package/dist/types/api/chat-api/index.d.ts.map +1 -1
  29. package/dist/types/api/chat-api/interfaces.d.ts +125 -8
  30. package/dist/types/api/chat-api/interfaces.d.ts.map +1 -1
  31. package/dist/types/api/chat-api/models.d.ts +163 -43
  32. package/dist/types/api/chat-api/models.d.ts.map +1 -1
  33. package/dist/types/api/chat-api/stream-utils.d.ts +19 -16
  34. package/dist/types/api/chat-api/stream-utils.d.ts.map +1 -1
  35. package/dist/types/constants/websocket-events.constants.d.ts +2 -2
  36. package/dist/types/constants/websocket-events.constants.d.ts.map +1 -1
  37. package/dist/types/index.d.ts +1 -0
  38. package/dist/types/index.d.ts.map +1 -1
  39. package/dist/types/utils/message-helpers.d.ts +84 -0
  40. package/dist/types/utils/message-helpers.d.ts.map +1 -0
  41. package/dist/types/ws/filesystem-ws-client.d.ts +0 -2
  42. package/dist/types/ws/filesystem-ws-client.d.ts.map +1 -1
  43. package/docs/API_REFERENCE.md +38 -166
  44. package/docs/AUTHENTICATION.md +37 -59
  45. package/docs/ERROR_HANDLING.md +124 -191
  46. package/docs/INTEGRATION_EXAMPLES.md +38 -52
  47. package/docs/PING_PONG.md +79 -178
  48. package/docs/README.md +7 -3
  49. package/docs/WEBSOCKET.md +66 -37
  50. package/package.json +7 -2
  51. package/docs/advanced/PING_PONG.md +0 -212
@@ -1,240 +1,173 @@
1
- # Обработка ошибок в Solver SDK
1
+ # Обработка ошибок в SDK
2
2
 
3
- Документация по системе обработки ошибок в Solver SDK, включая общие ошибки, ошибки WebSocket и географические ограничения.
3
+ SDK предоставляет различные механизмы обработки ошибок для HTTP запросов и WebSocket соединений.
4
4
 
5
- ## Содержание
5
+ ## Обработка HTTP ошибок
6
6
 
7
- - [Общие принципы](#общие-принципы)
8
- - [Типы ошибок](#типы-ошибок)
9
- - [HTTP ошибки](#http-ошибки)
10
- - [WebSocket ошибки](#websocket-ошибки)
11
- - [Ошибки географических ограничений](#ошибки-географических-ограничений)
12
- - [Примеры обработки ошибок](#примеры-обработки-ошибок)
7
+ ### Использование try/catch
13
8
 
14
- ## Общие принципы
15
-
16
- Solver SDK использует следующие принципы при работе с ошибками:
17
-
18
- 1. **Унифицированный формат** — все ошибки имеют единую структуру
19
- 2. **Информативные сообщения** — ошибки содержат детальное описание проблемы
20
- 3. **Коды ошибок** — каждая ошибка имеет уникальный код для идентификации
21
- 4. **Типизация** — ошибки классифицируются по типам для удобной обработки
22
-
23
- ## Типы ошибок
24
-
25
- Основные типы ошибок в SDK:
26
-
27
- | Тип ошибки | Описание |
28
- |------------|----------|
29
- | `http_error` | Ошибки HTTP запросов |
30
- | `websocket_error` | Ошибки WebSocket соединений |
31
- | `validation_error` | Ошибки валидации входных данных |
32
- | `authentication_error` | Ошибки аутентификации |
33
- | `rate_limit_error` | Ошибки превышения лимита запросов |
34
- | `provider_error` | Ошибки провайдеров API (Anthropic, OpenAI) |
35
- | `geo_restriction` | Ошибки географических ограничений |
36
-
37
- ## HTTP ошибки
38
-
39
- HTTP ошибки возникают при проблемах с HTTP запросами:
9
+ Рекомендуемый способ обработки ошибок - использование конструкции `try/catch`:
40
10
 
41
11
  ```javascript
42
12
  try {
43
- const result = await sdk.chat.chat([{ role: 'user', content: 'Hello' }]);
13
+ // Выполнение запроса
14
+ const projects = await sdk.projects.getAllProjects();
15
+ console.log('Получено проектов:', projects.length);
44
16
  } catch (error) {
45
- console.error(`Код ошибки: ${error.code}`);
46
- console.error(`Сообщение: ${error.message}`);
17
+ console.error('Ошибка при получении проектов:', error);
47
18
 
48
- // Проверка типа ошибки
49
- if (error.code === 401) {
50
- console.error('Ошибка аутентификации: проверьте API ключ');
51
- } else if (error.code === 429) {
52
- console.error('Превышен лимит запросов: повторите позже');
19
+ // Можно проверить тип ошибки
20
+ if (error.status === 401) {
21
+ console.error('Ошибка авторизации. Проверьте API ключ.');
22
+ } else if (error.status === 404) {
23
+ console.error('Ресурс не найден.');
24
+ } else if (error.code === 'NETWORK_ERROR') {
25
+ console.error('Проблема с сетевым соединением.');
53
26
  }
54
27
  }
55
28
  ```
56
29
 
57
- ## WebSocket ошибки
30
+ ### Глобальный обработчик ошибок
58
31
 
59
- WebSocket ошибки обрабатываются через обработчики событий:
32
+ Можно установить глобальный обработчик ошибок SDK:
60
33
 
61
34
  ```javascript
62
- const handleEvent = (eventType, data) => {
63
- if (eventType === 'error') {
64
- console.error(`WebSocket ошибка: ${data.message} (код: ${data.code})`);
65
-
66
- // Обработка конкретных типов ошибок
67
- switch (data.type) {
68
- case 'connection_error':
69
- console.error('Проблема с подключением, пробуем переподключиться...');
70
- break;
71
- case 'authentication_error':
72
- console.error('Проблема аутентификации, запрашиваем новый токен...');
73
- break;
74
- case 'timeout_error':
75
- console.error('Превышен таймаут ожидания ответа');
76
- break;
77
- }
78
- }
79
- };
80
-
81
- // Передаем обработчик событий
82
- await sdk.chat.streamChatWithThinking(messages, options, handleEvent);
35
+ // Установка глобального обработчика
36
+ CodeSolverSDK.setErrorHandler((error) => {
37
+ console.error('Глобальная ошибка SDK:', error);
38
+ // Отправка информации об ошибке в мониторинг
39
+ sendToMonitoring(error);
40
+ });
41
+
42
+ // После этого необработанные ошибки SDK будут передаваться в этот обработчик
83
43
  ```
84
44
 
85
- ## Ошибки географических ограничений
45
+ ## Обработка ошибок WebSocket
46
+
47
+ ### Обработка событий ошибок
48
+
49
+ SDK позволяет подписаться на события ошибок для различных API:
50
+
51
+ ```javascript
52
+ // Для индексации проектов
53
+ sdk.projects.on('error', (error) => {
54
+ console.error('Ошибка индексации:', error);
55
+ });
56
+
57
+ // Для рассуждений
58
+ sdk.reasoning.on('error', (error) => {
59
+ console.error('Ошибка рассуждения:', error);
60
+ });
61
+ ```
86
62
 
87
- > **Добавлено в версии 1.7.4**
63
+ ### Обработка ошибок соединения
88
64
 
89
- Начиная с версии 1.7.4 SDK поддерживает специальную обработку ошибок географических ограничений API Anthropic. Эти ошибки возникают, когда запросы отправляются из регионов, не поддерживаемых API Anthropic:
65
+ При использовании высокоуровневых методов подключения можно обрабатывать ошибки соединения:
90
66
 
91
67
  ```javascript
92
68
  try {
93
- const response = await sdk.chat.streamChatWithThinking(messages, options, handleEvent);
69
+ // Попытка подключения к WebSocket
70
+ await sdk.connect();
71
+ console.log('Подключение установлено');
94
72
  } catch (error) {
95
- // Проверка наличия ошибки географических ограничений
96
- if (error.type === 'geo_restriction') {
97
- console.error('==============================================');
98
- console.error('⚠️ ОШИБКА ГЕОГРАФИЧЕСКОГО ОГРАНИЧЕНИЯ API ANTHROPIC');
99
- console.error('⚠️ Для работы с API Anthropic требуется VPN или прокси');
100
- console.error('⚠️ Anthropic API доступен только из определенных регионов');
101
- console.error('==============================================');
102
-
103
- // Возможные действия:
104
- // 1. Предложить пользователю включить VPN
105
- // 2. Переключиться на другой провайдер API
106
- // 3. Использовать прокси-сервер
107
- }
73
+ console.error('Ошибка подключения:', error);
108
74
  }
109
75
  ```
110
76
 
111
- Через обработчик WebSocket событий:
77
+ ### Автоматическое переподключение
78
+
79
+ SDK поддерживает автоматическое переподключение в случае разрыва соединения:
112
80
 
113
81
  ```javascript
114
- const handleEvent = (eventType, data) => {
115
- if (eventType === 'error' && data.type === 'geo_restriction') {
116
- console.error('Необходимо включить VPN для доступа к API Anthropic из вашего региона');
117
-
118
- // Выполнить действия по настройке VPN или показать инструкции пользователю
82
+ const sdk = new CodeSolverSDK({
83
+ baseURL: 'https://api.example.com',
84
+ apiKey: 'your-api-key',
85
+ websocket: {
86
+ reconnect: true, // Включить автоматическое переподключение
87
+ reconnectAttempts: 5, // Максимальное число попыток
88
+ reconnectDelay: 3000 // Задержка между попытками (мс)
119
89
  }
120
- };
90
+ });
121
91
  ```
122
92
 
123
- ### Причины ошибок географических ограничений
93
+ ## Типичные ошибки и их решения
124
94
 
125
- Основные причины возникновения ошибок географических ограничений:
95
+ ### Ошибки подключения
126
96
 
127
- 1. **Региональные ограничения API Anthropic** API доступен только из определенных регионов (США, Европа и некоторые другие)
128
- 2. **Регуляторные требования** — законодательство некоторых стран ограничивает доступ к определенным API
129
- 3. **IP-блокировка** некоторые IP-адреса могут быть заблокированы провайдером API
97
+ | Код ошибки | Описание | Решение |
98
+ |------------|----------|---------|
99
+ | `NETWORK_ERROR` | Ошибка сети | Проверьте подключение к Интернету |
100
+ | `ETIMEDOUT` | Таймаут соединения | Увеличьте значение `timeout` в настройках SDK |
101
+ | `CONNECTION_REFUSED` | Соединение отклонено | Проверьте правильность URL и доступность сервера |
102
+ | `CERT_ERROR` | Ошибка сертификата | Используйте параметр `rejectUnauthorized: false` для локальной разработки |
130
103
 
131
- ### Решение проблемы
104
+ ### Ошибки аутентификации
132
105
 
133
- Для решения проблемы географических ограничений:
106
+ | Код ошибки | Описание | Решение |
107
+ |------------|----------|---------|
108
+ | `401 Unauthorized` | Неверный API ключ | Проверьте правильность API ключа |
109
+ | `403 Forbidden` | Недостаточно прав | Проверьте права доступа для API ключа |
110
+ | `AUTH_EXPIRED` | Срок действия токена истек | Обновите API ключ |
134
111
 
135
- 1. **Использование VPN** — подключитесь через VPN к поддерживаемому региону (США, Европа)
136
- 2. **Прокси-сервер** — настройте прокси для запросов к API
137
- 3. **Альтернативные провайдеры** — используйте альтернативных провайдеров, доступных в вашем регионе
112
+ ### Ошибки индексации
138
113
 
139
- ## Примеры обработки ошибок
114
+ | Код ошибки | Описание | Решение |
115
+ |------------|----------|---------|
116
+ | `PROJECT_NOT_FOUND` | Проект не найден | Проверьте ID проекта |
117
+ | `INDEXING_IN_PROGRESS` | Индексация уже выполняется | Дождитесь завершения текущей индексации |
118
+ | `INDEXING_ERROR` | Ошибка во время индексации | Проверьте лог ошибок на сервере |
140
119
 
141
- ### Комплексная обработка ошибок
120
+ ## Пример комплексной обработки ошибок
142
121
 
143
122
  ```javascript
144
- async function exampleWithErrorHandling() {
145
- const sdk = new CodeSolverSDK({
146
- baseURL: 'https://api.example.com',
147
- apiKey: 'your-api-key'
148
- });
149
-
150
- const messages = [
151
- { role: 'user', content: 'Explain quantum computing' }
152
- ];
153
-
154
- const options = {
155
- model: 'claude-3-7-sonnet-20240229',
156
- thinking: true,
157
- authToken: 'your-auth-token'
158
- };
159
-
160
- // Обработчик WebSocket событий
161
- const handleEvent = (eventType, data) => {
162
- // Обработка ошибок
163
- if (eventType === 'error') {
164
- console.error(`Ошибка: ${data.message}`);
165
-
166
- // Проверка типа ошибки
167
- switch (data.type) {
168
- case 'geo_restriction':
169
- console.error('Географическое ограничение: требуется VPN');
170
- break;
171
- case 'authentication_error':
172
- console.error('Ошибка аутентификации: неверный токен');
173
- break;
174
- case 'rate_limit_error':
175
- console.error('Превышен лимит запросов');
176
- break;
177
- default:
178
- console.error(`Неизвестная ошибка типа: ${data.type}`);
179
- break;
180
- }
181
- }
182
- };
183
-
123
+ async function initializeSDK() {
184
124
  try {
185
- const response = await sdk.chat.streamChatWithThinking(messages, options, handleEvent);
186
- console.log(`Успешно отправлен запрос, Socket ID: ${response.socketId}`);
125
+ // Проверка доступности API
126
+ const isHealthy = await sdk.checkHealth();
127
+
128
+ if (!isHealthy) {
129
+ console.error('API недоступен, пробуем резервный сервер');
130
+ // Создаем новый экземпляр SDK с резервным URL
131
+ return new CodeSolverSDK({
132
+ baseURL: 'https://backup-api.example.com',
133
+ apiKey: 'your-api-key'
134
+ });
135
+ }
136
+
137
+ // Подключение к WebSocket
138
+ await sdk.connect();
139
+ console.log('SDK успешно инициализирован');
140
+
141
+ return sdk;
187
142
  } catch (error) {
188
- console.error(`Критическая ошибка: ${error.message}`);
143
+ console.error('Ошибка при инициализации SDK:', error);
144
+
145
+ // Логирование ошибки для отладки
146
+ logError('SDK_INIT_ERROR', error);
189
147
 
190
- // Обработка специфических типов ошибок
191
- if (error.type === 'geo_restriction') {
192
- showVpnInstructions(); // Показать инструкции по настройке VPN
193
- } else if (error.status === 429) {
194
- scheduleRetry(5000); // Запланировать повторную попытку через 5 секунд
195
- } else {
196
- reportError(error); // Отправить отчет об ошибке
148
+ // В зависимости от ошибки предпринимаем разные действия
149
+ if (error.code === 'CONNECTION_ERROR') {
150
+ console.warn('Продолжаем работу без WebSocket подключения');
151
+ return sdk; // Возвращаем SDK, но без WebSocket функциональности
197
152
  }
153
+
154
+ // Для критических ошибок выбрасываем исключение
155
+ throw new Error(`Не удалось инициализировать SDK: ${error.message}`);
198
156
  }
199
157
  }
200
- ```
201
158
 
202
- ### Обработка ошибок при работе с рассуждениями
203
-
204
- ```javascript
205
- try {
206
- // Создание рассуждения
207
- const reasoning = await sdk.reasoning.createReasoning({
208
- projectId: 'project-123',
209
- query: 'Analyze this codebase'
210
- });
211
-
212
- // Подключение WebSocket
213
- await sdk.reasoning.connectWebSocket({
214
- reasoningId: reasoning.id,
215
- authToken: 'your-auth-token',
216
- onError: (error) => {
217
- console.error(`WebSocket ошибка: ${error.message}`);
218
-
219
- if (error.type === 'geo_restriction') {
220
- // Показать сообщение о необходимости VPN
221
- showVpnAlert();
222
- }
223
- }
224
- });
159
+ // Использование
160
+ const sdk = await initializeSDK().catch(error => {
161
+ console.error('Критическая ошибка:', error);
162
+ // Показываем пользователю сообщение об ошибке
163
+ showErrorMessage('Не удалось подключиться к серверу');
225
164
 
226
- // Запуск рассуждения
227
- await sdk.reasoning.startReasoning(reasoning.id);
228
- } catch (error) {
229
- console.error(`HTTP ошибка: ${error.message}`);
230
-
231
- // Обработка HTTP ошибок
232
- if (error.status === 401) {
233
- // Перенаправить на страницу входа
234
- redirectToLogin();
235
- } else if (error.status === 403) {
236
- // Показать сообщение об отсутствии доступа
237
- showAccessDeniedMessage();
238
- }
239
- }
240
- ```
165
+ // Возвращаем отключенную версию SDK или null
166
+ return null;
167
+ });
168
+
169
+ if (sdk) {
170
+ // Продолжаем работу с SDK
171
+ } else {
172
+ // Работаем в режиме ограниченной функциональности
173
+ }
@@ -1,6 +1,6 @@
1
- # Примеры интеграции с VS Code/Cursor
1
+ # Примеры интеграции SDK
2
2
 
3
- В этом документе приведены примеры использования SDK с VS Code или Cursor расширениями.
3
+ В этом документе приведены примеры использования SDK с расширениями VS Code/Cursor или другими приложениями.
4
4
 
5
5
  ## Содержание
6
6
  - [Инициализация SDK](#инициализация-sdk)
@@ -179,6 +179,18 @@ context.subscriptions.push(
179
179
  <div class="thinking" id="thinking"></div>
180
180
  <h4>Ответ:</h4>
181
181
  <div class="answer" id="answer"></div>
182
+
183
+ <script>
184
+ const vscode = acquireVsCodeApi();
185
+ window.addEventListener('message', event => {
186
+ const message = event.data;
187
+ if (message.command === 'appendThinking') {
188
+ document.getElementById('thinking').textContent += message.content;
189
+ } else if (message.command === 'appendAnswer') {
190
+ document.getElementById('answer').textContent += message.content;
191
+ }
192
+ });
193
+ </script>
182
194
  </body>
183
195
  </html>
184
196
  `;
@@ -219,18 +231,6 @@ context.subscriptions.push(
219
231
  handleEvent
220
232
  );
221
233
 
222
- // Настраиваем обработку сообщений в WebView
223
- panel.webview.onDidReceiveMessage(message => {
224
- const thinkingElement = document.getElementById('thinking');
225
- const answerElement = document.getElementById('answer');
226
-
227
- if (message.command === 'appendThinking') {
228
- thinkingElement.textContent += message.content;
229
- } else if (message.command === 'appendAnswer') {
230
- answerElement.textContent += message.content;
231
- }
232
- });
233
-
234
234
  } catch (error) {
235
235
  vscode.window.showErrorMessage(`Ошибка чата: ${error.message}`);
236
236
  }
@@ -273,6 +273,16 @@ async function searchInProject(projectId, query) {
273
273
  );
274
274
 
275
275
  // Формируем HTML для отображения результатов
276
+ let resultsHtml = '';
277
+ results.results.forEach((result, index) => {
278
+ resultsHtml += `
279
+ <div class="result">
280
+ <div class="path" data-path="${result.path}">${result.path}</div>
281
+ <div class="snippet">${result.content || 'Содержимое недоступно'}</div>
282
+ </div>
283
+ `;
284
+ });
285
+
276
286
  panel.webview.html = `
277
287
  <!DOCTYPE html>
278
288
  <html>
@@ -286,25 +296,15 @@ async function searchInProject(projectId, query) {
286
296
  </head>
287
297
  <body>
288
298
  <h3>Результаты для: ${query}</h3>
289
- ${results.results.map((result, index) => `
290
- <div class="result">
291
- <div class="path" data-path="${result.filePath}" data-start="${result.startLine}" data-end="${result.endLine}">
292
- ${result.filePath}:${result.startLine}-${result.endLine}
293
- </div>
294
- <div class="snippet">${result.snippet || result.content || ''}</div>
295
- </div>
296
- `).join('')}
299
+ ${resultsHtml}
297
300
 
298
301
  <script>
299
- // Добавляем обработчик для открытия файлов
300
- document.querySelectorAll('.path').forEach(elem => {
301
- elem.addEventListener('click', () => {
302
- const vscode = acquireVsCodeApi();
302
+ const vscode = acquireVsCodeApi();
303
+ document.querySelectorAll('.path').forEach(element => {
304
+ element.addEventListener('click', () => {
303
305
  vscode.postMessage({
304
306
  command: 'openFile',
305
- filePath: elem.dataset.path,
306
- startLine: parseInt(elem.dataset.start),
307
- endLine: parseInt(elem.dataset.end)
307
+ path: element.getAttribute('data-path')
308
308
  });
309
309
  });
310
310
  });
@@ -313,30 +313,16 @@ async function searchInProject(projectId, query) {
313
313
  </html>
314
314
  `;
315
315
 
316
- // Обработка сообщений от WebView
317
- panel.webview.onDidReceiveMessage(
318
- message => {
319
- if (message.command === 'openFile') {
320
- const uri = vscode.Uri.file(message.filePath);
321
- vscode.workspace.openTextDocument(uri).then(doc => {
322
- vscode.window.showTextDocument(doc).then(editor => {
323
- const range = new vscode.Range(
324
- new vscode.Position(message.startLine - 1, 0),
325
- new vscode.Position(message.endLine - 1, 0)
326
- );
327
- editor.revealRange(range);
328
- });
329
- });
330
- }
331
- },
332
- undefined,
333
- context.subscriptions
334
- );
335
-
336
- return results;
316
+ // Обработчик сообщений от WebView
317
+ panel.webview.onDidReceiveMessage(message => {
318
+ if (message.command === 'openFile') {
319
+ const filePath = message.path;
320
+ vscode.workspace.openTextDocument(filePath)
321
+ .then(doc => vscode.window.showTextDocument(doc));
322
+ }
323
+ });
337
324
  });
338
325
  } catch (error) {
339
326
  vscode.window.showErrorMessage(`Ошибка поиска: ${error.message}`);
340
327
  }
341
- }
342
- ```
328
+ }