solver-sdk 2.5.0 → 2.6.1
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/projects-api.js +18 -5
- package/dist/cjs/api/projects-api.js.map +1 -1
- package/dist/cjs/api/reasoning-api.js +0 -8
- package/dist/cjs/api/reasoning-api.js.map +1 -1
- package/dist/cjs/code-solver-sdk.js +15 -18
- package/dist/cjs/code-solver-sdk.js.map +1 -1
- package/dist/cjs/utils/message-helpers.js +15 -37
- package/dist/cjs/utils/message-helpers.js.map +1 -1
- package/dist/esm/api/projects-api.js +18 -5
- package/dist/esm/api/projects-api.js.map +1 -1
- package/dist/esm/api/reasoning-api.js +0 -8
- package/dist/esm/api/reasoning-api.js.map +1 -1
- package/dist/esm/code-solver-sdk.js +15 -18
- package/dist/esm/code-solver-sdk.js.map +1 -1
- package/dist/esm/utils/message-helpers.js +16 -38
- package/dist/esm/utils/message-helpers.js.map +1 -1
- package/dist/types/api/projects-api.d.ts +2 -2
- package/dist/types/api/projects-api.d.ts.map +1 -1
- package/dist/types/api/reasoning-api.d.ts +0 -7
- package/dist/types/api/reasoning-api.d.ts.map +1 -1
- package/dist/types/code-solver-sdk.d.ts +1 -1
- package/dist/types/code-solver-sdk.d.ts.map +1 -1
- package/dist/types/utils/message-helpers.d.ts +4 -3
- package/dist/types/utils/message-helpers.d.ts.map +1 -1
- package/docs/API_REFERENCE.md +495 -96
- package/docs/AUTHENTICATION.md +291 -36
- package/docs/ERROR_HANDLING.md +544 -104
- package/docs/README.md +260 -75
- package/docs/README_V2.5.md +266 -0
- package/docs/WEBSOCKET.md +374 -111
- package/docs/indexing/INDEXING.md +372 -167
- package/package.json +1 -1
- package/docs/PING_PONG.md +0 -113
- package/docs/RESPONSE_TO_DEVELOPERS.md +0 -1
package/docs/ERROR_HANDLING.md
CHANGED
|
@@ -1,173 +1,613 @@
|
|
|
1
|
-
# Обработка ошибок
|
|
1
|
+
# Обработка ошибок v2.5.0
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Полная документация по обработке ошибок в AI Solver SDK v2.5.0.
|
|
4
|
+
|
|
5
|
+
## Философия "Fail Fast"
|
|
6
|
+
|
|
7
|
+
SDK v2.5.0 следует принципу "fail fast" - ошибки возникают сразу при обнаружении проблем, без тихих fallback'ов.
|
|
4
8
|
|
|
5
9
|
## Обработка HTTP ошибок
|
|
6
10
|
|
|
7
11
|
### Использование try/catch
|
|
8
12
|
|
|
9
|
-
Рекомендуемый способ обработки
|
|
13
|
+
Рекомендуемый способ обработки ошибок:
|
|
10
14
|
|
|
11
15
|
```javascript
|
|
16
|
+
import { CodeSolverSDK } from '@ai-solver/sdk';
|
|
17
|
+
|
|
12
18
|
try {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
console.log('Получено проектов:', projects.length);
|
|
19
|
+
const projects = await sdk.projects.getAll();
|
|
20
|
+
console.log('✅ Получено проектов:', projects.total);
|
|
16
21
|
} catch (error) {
|
|
17
|
-
console.error('
|
|
22
|
+
console.error('❌ Ошибка:', error.message);
|
|
18
23
|
|
|
19
|
-
//
|
|
24
|
+
// Проверка типа ошибки
|
|
20
25
|
if (error.status === 401) {
|
|
21
|
-
console.error('Ошибка
|
|
26
|
+
console.error('🔑 Ошибка аутентификации');
|
|
22
27
|
} else if (error.status === 404) {
|
|
23
|
-
console.error('Ресурс не
|
|
28
|
+
console.error('🔍 Ресурс не найден');
|
|
24
29
|
} else if (error.code === 'NETWORK_ERROR') {
|
|
25
|
-
console.error('Проблема
|
|
30
|
+
console.error('🌐 Проблема сети');
|
|
26
31
|
}
|
|
27
32
|
}
|
|
28
33
|
```
|
|
29
34
|
|
|
30
|
-
###
|
|
35
|
+
### Структура ошибок
|
|
31
36
|
|
|
32
|
-
|
|
37
|
+
SDK v2.5.0 возвращает стандартизированные ошибки:
|
|
33
38
|
|
|
34
39
|
```javascript
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
// Пример объекта ошибки
|
|
41
|
+
{
|
|
42
|
+
name: 'APIError',
|
|
43
|
+
message: 'Project not found',
|
|
44
|
+
status: 404,
|
|
45
|
+
code: 'PROJECT_NOT_FOUND',
|
|
46
|
+
endpoint: '/api/v1/projects/123',
|
|
47
|
+
method: 'GET',
|
|
48
|
+
timestamp: '2025-06-28T12:00:00Z',
|
|
49
|
+
requestId: 'req_abc123'
|
|
50
|
+
}
|
|
43
51
|
```
|
|
44
52
|
|
|
45
|
-
## Обработка ошибок
|
|
53
|
+
## Обработка WebSocket ошибок
|
|
46
54
|
|
|
47
55
|
### Обработка событий ошибок
|
|
48
56
|
|
|
49
|
-
SDK позволяет подписаться на события ошибок для различных API:
|
|
50
|
-
|
|
51
57
|
```javascript
|
|
52
|
-
//
|
|
53
|
-
sdk.projects.
|
|
54
|
-
|
|
58
|
+
// Projects WebSocket ошибки
|
|
59
|
+
await sdk.projects.connectWebSocket();
|
|
60
|
+
|
|
61
|
+
sdk.projects.onIndexingError((error) => {
|
|
62
|
+
console.error('❌ Indexing error:', error.message);
|
|
63
|
+
console.error('📁 Project:', error.projectId);
|
|
64
|
+
console.error('📄 File:', error.fileName);
|
|
55
65
|
});
|
|
56
66
|
|
|
57
|
-
//
|
|
58
|
-
sdk.reasoning.
|
|
59
|
-
|
|
67
|
+
// Reasoning WebSocket ошибки
|
|
68
|
+
await sdk.reasoning.connectWebSocket();
|
|
69
|
+
|
|
70
|
+
sdk.reasoning.onReasoningError((error) => {
|
|
71
|
+
console.error('❌ Reasoning error:', error.message);
|
|
72
|
+
console.error('🆔 Reasoning ID:', error.reasoningId);
|
|
60
73
|
});
|
|
61
|
-
```
|
|
62
74
|
|
|
63
|
-
|
|
75
|
+
// Chat WebSocket ошибки
|
|
76
|
+
await sdk.chat.connectWebSocket();
|
|
64
77
|
|
|
65
|
-
|
|
78
|
+
sdk.chat.on('error', (error) => {
|
|
79
|
+
console.error('❌ Chat error:', error.message);
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Обработка ошибок подключения
|
|
66
84
|
|
|
67
85
|
```javascript
|
|
68
86
|
try {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
console.log('Подключение установлено');
|
|
87
|
+
await sdk.projects.connectWebSocket();
|
|
88
|
+
console.log('✅ Projects WebSocket connected');
|
|
72
89
|
} catch (error) {
|
|
73
|
-
console.error('
|
|
90
|
+
console.error('❌ WebSocket connection failed:', error.message);
|
|
91
|
+
|
|
92
|
+
if (error.code === 'WS_CONNECTION_REFUSED') {
|
|
93
|
+
console.error('🔌 Server unavailable');
|
|
94
|
+
} else if (error.code === 'WS_AUTH_FAILED') {
|
|
95
|
+
console.error('🔑 Authentication failed');
|
|
96
|
+
}
|
|
74
97
|
}
|
|
75
98
|
```
|
|
76
99
|
|
|
77
|
-
|
|
100
|
+
## Диагностика ошибок
|
|
78
101
|
|
|
79
|
-
|
|
102
|
+
### API диагностика
|
|
80
103
|
|
|
81
104
|
```javascript
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
105
|
+
// Полная диагностика всех endpoints
|
|
106
|
+
const diagnostics = await sdk.diagnoseAPI();
|
|
107
|
+
console.log('📊 API Diagnostics:', diagnostics);
|
|
108
|
+
|
|
109
|
+
/* Пример результата:
|
|
110
|
+
{
|
|
111
|
+
'/api/v1/projects': {
|
|
112
|
+
status: 200,
|
|
113
|
+
success: true,
|
|
114
|
+
responseTime: 120
|
|
115
|
+
},
|
|
116
|
+
'/api/v1/reasoning': {
|
|
117
|
+
status: 401,
|
|
118
|
+
success: false,
|
|
119
|
+
error: 'Invalid API key'
|
|
120
|
+
},
|
|
121
|
+
'/api/v1/chat': {
|
|
122
|
+
status: 500,
|
|
123
|
+
success: false,
|
|
124
|
+
error: 'Internal server error'
|
|
89
125
|
}
|
|
90
|
-
}
|
|
126
|
+
}
|
|
127
|
+
*/
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### WebSocket диагностика
|
|
131
|
+
|
|
132
|
+
```javascript
|
|
133
|
+
// Диагностика WebSocket соединений
|
|
134
|
+
const wsStatus = await sdk.diagnoseWebSocket();
|
|
135
|
+
console.log('🔌 WebSocket status:', wsStatus);
|
|
136
|
+
|
|
137
|
+
/* Пример результата:
|
|
138
|
+
{
|
|
139
|
+
projects: {
|
|
140
|
+
connected: true,
|
|
141
|
+
url: 'ws://localhost:3000/projects'
|
|
142
|
+
},
|
|
143
|
+
reasoning: {
|
|
144
|
+
connected: false,
|
|
145
|
+
error: 'Connection timeout'
|
|
146
|
+
},
|
|
147
|
+
chat: {
|
|
148
|
+
connected: true,
|
|
149
|
+
latency: 45
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
*/
|
|
91
153
|
```
|
|
92
154
|
|
|
93
|
-
##
|
|
155
|
+
## Типы ошибок
|
|
156
|
+
|
|
157
|
+
### HTTP ошибки
|
|
94
158
|
|
|
95
|
-
|
|
159
|
+
#### 400 Bad Request
|
|
96
160
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
161
|
+
```javascript
|
|
162
|
+
{
|
|
163
|
+
status: 400,
|
|
164
|
+
code: 'VALIDATION_ERROR',
|
|
165
|
+
message: 'Invalid project data',
|
|
166
|
+
details: {
|
|
167
|
+
field: 'name',
|
|
168
|
+
issue: 'Name is required'
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
```
|
|
103
172
|
|
|
104
|
-
|
|
173
|
+
**Решение:** Проверьте корректность входных данных.
|
|
105
174
|
|
|
106
|
-
|
|
107
|
-
|------------|----------|---------|
|
|
108
|
-
| `401 Unauthorized` | Неверный API ключ | Проверьте правильность API ключа |
|
|
109
|
-
| `403 Forbidden` | Недостаточно прав | Проверьте права доступа для API ключа |
|
|
110
|
-
| `AUTH_EXPIRED` | Срок действия токена истек | Обновите API ключ |
|
|
175
|
+
#### 401 Unauthorized
|
|
111
176
|
|
|
112
|
-
|
|
177
|
+
```javascript
|
|
178
|
+
{
|
|
179
|
+
status: 401,
|
|
180
|
+
code: 'AUTH_INVALID_KEY',
|
|
181
|
+
message: 'Invalid or missing API key'
|
|
182
|
+
}
|
|
183
|
+
```
|
|
113
184
|
|
|
114
|
-
|
|
115
|
-
|------------|----------|---------|
|
|
116
|
-
| `PROJECT_NOT_FOUND` | Проект не найден | Проверьте ID проекта |
|
|
117
|
-
| `INDEXING_IN_PROGRESS` | Индексация уже выполняется | Дождитесь завершения текущей индексации |
|
|
118
|
-
| `INDEXING_ERROR` | Ошибка во время индексации | Проверьте лог ошибок на сервере |
|
|
185
|
+
**Решение:** Проверьте API ключ в настройках SDK.
|
|
119
186
|
|
|
120
|
-
|
|
187
|
+
#### 403 Forbidden
|
|
121
188
|
|
|
122
189
|
```javascript
|
|
123
|
-
|
|
190
|
+
{
|
|
191
|
+
status: 403,
|
|
192
|
+
code: 'AUTH_INSUFFICIENT_SCOPE',
|
|
193
|
+
message: 'Insufficient permissions',
|
|
194
|
+
required_scope: 'projects:write'
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Решение:** Используйте API ключ с необходимыми правами.
|
|
199
|
+
|
|
200
|
+
#### 404 Not Found
|
|
201
|
+
|
|
202
|
+
```javascript
|
|
203
|
+
{
|
|
204
|
+
status: 404,
|
|
205
|
+
code: 'PROJECT_NOT_FOUND',
|
|
206
|
+
message: 'Project with ID "123" not found'
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**Решение:** Проверьте правильность ID ресурса.
|
|
211
|
+
|
|
212
|
+
#### 429 Too Many Requests
|
|
213
|
+
|
|
214
|
+
```javascript
|
|
215
|
+
{
|
|
216
|
+
status: 429,
|
|
217
|
+
code: 'RATE_LIMIT_EXCEEDED',
|
|
218
|
+
message: 'Rate limit exceeded',
|
|
219
|
+
retry_after: 60
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Решение:** Подождите указанное время или используйте Production ключ.
|
|
224
|
+
|
|
225
|
+
#### 500 Internal Server Error
|
|
226
|
+
|
|
227
|
+
```javascript
|
|
228
|
+
{
|
|
229
|
+
status: 500,
|
|
230
|
+
code: 'INTERNAL_ERROR',
|
|
231
|
+
message: 'Internal server error',
|
|
232
|
+
incident_id: 'inc_abc123'
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Решение:** Сообщите о проблеме с указанием incident_id.
|
|
237
|
+
|
|
238
|
+
### WebSocket ошибки
|
|
239
|
+
|
|
240
|
+
#### WS_CONNECTION_REFUSED
|
|
241
|
+
|
|
242
|
+
```javascript
|
|
243
|
+
{
|
|
244
|
+
code: 'WS_CONNECTION_REFUSED',
|
|
245
|
+
message: 'WebSocket connection refused',
|
|
246
|
+
namespace: 'projects'
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**Решение:** Проверьте доступность сервера.
|
|
251
|
+
|
|
252
|
+
#### WS_AUTH_FAILED
|
|
253
|
+
|
|
254
|
+
```javascript
|
|
255
|
+
{
|
|
256
|
+
code: 'WS_AUTH_FAILED',
|
|
257
|
+
message: 'WebSocket authentication failed',
|
|
258
|
+
namespace: 'reasoning'
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**Решение:** Проверьте API ключ.
|
|
263
|
+
|
|
264
|
+
#### WS_TIMEOUT
|
|
265
|
+
|
|
266
|
+
```javascript
|
|
267
|
+
{
|
|
268
|
+
code: 'WS_TIMEOUT',
|
|
269
|
+
message: 'WebSocket connection timeout',
|
|
270
|
+
timeout: 30000
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Решение:** Увеличьте timeout или проверьте сеть.
|
|
275
|
+
|
|
276
|
+
### Network ошибки
|
|
277
|
+
|
|
278
|
+
#### NETWORK_ERROR
|
|
279
|
+
|
|
280
|
+
```javascript
|
|
281
|
+
{
|
|
282
|
+
code: 'NETWORK_ERROR',
|
|
283
|
+
message: 'Network request failed',
|
|
284
|
+
cause: 'ECONNREFUSED'
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**Решение:** Проверьте подключение к интернету и доступность сервера.
|
|
289
|
+
|
|
290
|
+
#### TIMEOUT_ERROR
|
|
291
|
+
|
|
292
|
+
```javascript
|
|
293
|
+
{
|
|
294
|
+
code: 'TIMEOUT_ERROR',
|
|
295
|
+
message: 'Request timeout after 30000ms',
|
|
296
|
+
timeout: 30000
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
**Решение:** Увеличьте timeout в настройках SDK.
|
|
301
|
+
|
|
302
|
+
## Стратегии обработки ошибок
|
|
303
|
+
|
|
304
|
+
### Retry стратегия
|
|
305
|
+
|
|
306
|
+
```javascript
|
|
307
|
+
async function retryableRequest(operation, maxRetries = 3) {
|
|
308
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
309
|
+
try {
|
|
310
|
+
return await operation();
|
|
311
|
+
} catch (error) {
|
|
312
|
+
console.warn(`⚠️ Attempt ${attempt} failed:`, error.message);
|
|
313
|
+
|
|
314
|
+
// Не повторяем для клиентских ошибок
|
|
315
|
+
if (error.status >= 400 && error.status < 500) {
|
|
316
|
+
throw error;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Последняя попытка
|
|
320
|
+
if (attempt === maxRetries) {
|
|
321
|
+
throw error;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Экспоненциальная задержка
|
|
325
|
+
const delay = Math.pow(2, attempt) * 1000;
|
|
326
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Использование
|
|
332
|
+
try {
|
|
333
|
+
const projects = await retryableRequest(() => sdk.projects.getAll());
|
|
334
|
+
} catch (error) {
|
|
335
|
+
console.error('❌ All retries failed:', error.message);
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### Circuit Breaker
|
|
340
|
+
|
|
341
|
+
```javascript
|
|
342
|
+
class CircuitBreaker {
|
|
343
|
+
constructor(threshold = 5, timeout = 60000) {
|
|
344
|
+
this.threshold = threshold;
|
|
345
|
+
this.timeout = timeout;
|
|
346
|
+
this.failures = 0;
|
|
347
|
+
this.state = 'CLOSED'; // CLOSED, OPEN, HALF_OPEN
|
|
348
|
+
this.nextAttempt = Date.now();
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
async execute(operation) {
|
|
352
|
+
if (this.state === 'OPEN') {
|
|
353
|
+
if (Date.now() < this.nextAttempt) {
|
|
354
|
+
throw new Error('Circuit breaker is OPEN');
|
|
355
|
+
}
|
|
356
|
+
this.state = 'HALF_OPEN';
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
try {
|
|
360
|
+
const result = await operation();
|
|
361
|
+
this.onSuccess();
|
|
362
|
+
return result;
|
|
363
|
+
} catch (error) {
|
|
364
|
+
this.onFailure();
|
|
365
|
+
throw error;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
onSuccess() {
|
|
370
|
+
this.failures = 0;
|
|
371
|
+
this.state = 'CLOSED';
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
onFailure() {
|
|
375
|
+
this.failures++;
|
|
376
|
+
if (this.failures >= this.threshold) {
|
|
377
|
+
this.state = 'OPEN';
|
|
378
|
+
this.nextAttempt = Date.now() + this.timeout;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Использование
|
|
384
|
+
const breaker = new CircuitBreaker();
|
|
385
|
+
|
|
386
|
+
try {
|
|
387
|
+
const result = await breaker.execute(() => sdk.chat.send(messages));
|
|
388
|
+
} catch (error) {
|
|
389
|
+
console.error('❌ Circuit breaker error:', error.message);
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### Graceful degradation
|
|
394
|
+
|
|
395
|
+
```javascript
|
|
396
|
+
async function robustProjectCreation(projectData) {
|
|
124
397
|
try {
|
|
125
|
-
//
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
398
|
+
// Основной путь
|
|
399
|
+
const project = await sdk.projects.create(projectData);
|
|
400
|
+
console.log('✅ Project created:', project.id);
|
|
401
|
+
|
|
402
|
+
// Запуск индексации
|
|
403
|
+
try {
|
|
404
|
+
await sdk.projects.startIndexing(project.id);
|
|
405
|
+
console.log('✅ Indexing started');
|
|
406
|
+
} catch (indexError) {
|
|
407
|
+
console.warn('⚠️ Indexing failed, but project created:', indexError.message);
|
|
135
408
|
}
|
|
136
409
|
|
|
137
|
-
|
|
138
|
-
await sdk.connect();
|
|
139
|
-
console.log('SDK успешно инициализирован');
|
|
410
|
+
return project;
|
|
140
411
|
|
|
141
|
-
return sdk;
|
|
142
412
|
} catch (error) {
|
|
143
|
-
console.error('
|
|
413
|
+
console.error('❌ Project creation failed:', error.message);
|
|
144
414
|
|
|
145
|
-
//
|
|
146
|
-
|
|
415
|
+
// Fallback: сохраняем локально
|
|
416
|
+
const localProject = {
|
|
417
|
+
id: `local_${Date.now()}`,
|
|
418
|
+
name: projectData.name,
|
|
419
|
+
path: projectData.path,
|
|
420
|
+
local: true
|
|
421
|
+
};
|
|
147
422
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
console.warn('Продолжаем работу без WebSocket подключения');
|
|
151
|
-
return sdk; // Возвращаем SDK, но без WebSocket функциональности
|
|
152
|
-
}
|
|
423
|
+
localStorage.setItem(`project_${localProject.id}`, JSON.stringify(localProject));
|
|
424
|
+
console.log('💾 Project saved locally:', localProject.id);
|
|
153
425
|
|
|
154
|
-
|
|
155
|
-
throw new Error(`Не удалось инициализировать SDK: ${error.message}`);
|
|
426
|
+
return localProject;
|
|
156
427
|
}
|
|
157
428
|
}
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
## Мониторинг ошибок
|
|
432
|
+
|
|
433
|
+
### Логирование ошибок
|
|
434
|
+
|
|
435
|
+
```javascript
|
|
436
|
+
function logError(error, context = {}) {
|
|
437
|
+
const errorLog = {
|
|
438
|
+
timestamp: new Date().toISOString(),
|
|
439
|
+
error: {
|
|
440
|
+
name: error.name,
|
|
441
|
+
message: error.message,
|
|
442
|
+
status: error.status,
|
|
443
|
+
code: error.code,
|
|
444
|
+
stack: error.stack
|
|
445
|
+
},
|
|
446
|
+
context: {
|
|
447
|
+
...context,
|
|
448
|
+
userAgent: navigator.userAgent,
|
|
449
|
+
url: window.location.href,
|
|
450
|
+
userId: getCurrentUserId()
|
|
451
|
+
}
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
// Отправка в систему мониторинга
|
|
455
|
+
sendToMonitoring(errorLog);
|
|
456
|
+
|
|
457
|
+
// Локальное логирование
|
|
458
|
+
console.error('🚨 Error logged:', errorLog);
|
|
459
|
+
}
|
|
158
460
|
|
|
159
461
|
// Использование
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
462
|
+
try {
|
|
463
|
+
await sdk.reasoning.start(reasoningId);
|
|
464
|
+
} catch (error) {
|
|
465
|
+
logError(error, {
|
|
466
|
+
operation: 'reasoning_start',
|
|
467
|
+
reasoningId: reasoningId,
|
|
468
|
+
projectId: projectId
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Метрики ошибок
|
|
474
|
+
|
|
475
|
+
```javascript
|
|
476
|
+
class ErrorMetrics {
|
|
477
|
+
constructor() {
|
|
478
|
+
this.errors = new Map();
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
record(error) {
|
|
482
|
+
const key = `${error.code || 'UNKNOWN'}_${error.status || 0}`;
|
|
483
|
+
const count = this.errors.get(key) || 0;
|
|
484
|
+
this.errors.set(key, count + 1);
|
|
485
|
+
}
|
|
164
486
|
|
|
165
|
-
|
|
166
|
-
|
|
487
|
+
getReport() {
|
|
488
|
+
const report = Array.from(this.errors.entries())
|
|
489
|
+
.map(([error, count]) => ({ error, count }))
|
|
490
|
+
.sort((a, b) => b.count - a.count);
|
|
491
|
+
|
|
492
|
+
return {
|
|
493
|
+
totalErrors: Array.from(this.errors.values()).reduce((a, b) => a + b, 0),
|
|
494
|
+
topErrors: report.slice(0, 5),
|
|
495
|
+
allErrors: report
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// Глобальные метрики
|
|
501
|
+
const errorMetrics = new ErrorMetrics();
|
|
502
|
+
|
|
503
|
+
// Автоматическая регистрация ошибок
|
|
504
|
+
window.addEventListener('unhandledrejection', (event) => {
|
|
505
|
+
errorMetrics.record(event.reason);
|
|
167
506
|
});
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
## Пример комплексной обработки
|
|
510
|
+
|
|
511
|
+
```javascript
|
|
512
|
+
async function initializeAIWorkflow(projectPath, query) {
|
|
513
|
+
const sdk = CodeSolverSDK.create({
|
|
514
|
+
baseURL: 'http://localhost:3000',
|
|
515
|
+
apiKey: process.env.AI_SOLVER_API_KEY,
|
|
516
|
+
autoConnect: false
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
try {
|
|
520
|
+
// 1. Диагностика API
|
|
521
|
+
console.log('🔍 Diagnosing API...');
|
|
522
|
+
const apiStatus = await sdk.diagnoseAPI();
|
|
523
|
+
|
|
524
|
+
const healthyEndpoints = Object.entries(apiStatus)
|
|
525
|
+
.filter(([_, status]) => status.success)
|
|
526
|
+
.map(([endpoint]) => endpoint);
|
|
527
|
+
|
|
528
|
+
if (healthyEndpoints.length === 0) {
|
|
529
|
+
throw new Error('No healthy endpoints available');
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
console.log('✅ Healthy endpoints:', healthyEndpoints);
|
|
533
|
+
|
|
534
|
+
// 2. Создание проекта
|
|
535
|
+
console.log('📁 Creating project...');
|
|
536
|
+
const project = await retryableRequest(() =>
|
|
537
|
+
sdk.projects.create({
|
|
538
|
+
name: 'AI Analysis Project',
|
|
539
|
+
path: projectPath
|
|
540
|
+
})
|
|
541
|
+
);
|
|
542
|
+
|
|
543
|
+
// 3. Индексация с WebSocket
|
|
544
|
+
console.log('📊 Starting indexing...');
|
|
545
|
+
await sdk.projects.connectWebSocket();
|
|
546
|
+
|
|
547
|
+
let indexingComplete = false;
|
|
548
|
+
sdk.projects.onIndexingComplete(() => {
|
|
549
|
+
indexingComplete = true;
|
|
550
|
+
console.log('✅ Indexing completed');
|
|
551
|
+
sdk.projects.disconnectWebSocket();
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
sdk.projects.onIndexingError((error) => {
|
|
555
|
+
console.error('❌ Indexing failed:', error.message);
|
|
556
|
+
sdk.projects.disconnectWebSocket();
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
await sdk.projects.startIndexing(project.id);
|
|
560
|
+
|
|
561
|
+
// Ожидание завершения индексации
|
|
562
|
+
while (!indexingComplete) {
|
|
563
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// 4. AI Reasoning
|
|
567
|
+
console.log('🧠 Starting reasoning...');
|
|
568
|
+
await sdk.reasoning.connectWebSocket();
|
|
569
|
+
|
|
570
|
+
const reasoning = await sdk.reasoning.create({
|
|
571
|
+
projectId: project.id,
|
|
572
|
+
query: query
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
await sdk.reasoning.start(reasoning.id);
|
|
576
|
+
|
|
577
|
+
return {
|
|
578
|
+
project,
|
|
579
|
+
reasoning,
|
|
580
|
+
success: true
|
|
581
|
+
};
|
|
582
|
+
|
|
583
|
+
} catch (error) {
|
|
584
|
+
console.error('❌ Workflow failed:', error.message);
|
|
585
|
+
|
|
586
|
+
// Очистка ресурсов
|
|
587
|
+
try {
|
|
588
|
+
await sdk.projects.disconnectWebSocket();
|
|
589
|
+
await sdk.reasoning.disconnectWebSocket();
|
|
590
|
+
} catch (cleanupError) {
|
|
591
|
+
console.warn('⚠️ Cleanup warning:', cleanupError.message);
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
// Регистрация ошибки
|
|
595
|
+
logError(error, {
|
|
596
|
+
workflow: 'ai_analysis',
|
|
597
|
+
projectPath,
|
|
598
|
+
query
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
return {
|
|
602
|
+
error: error.message,
|
|
603
|
+
success: false
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
---
|
|
168
610
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
// Работаем в режиме ограниченной функциональности
|
|
173
|
-
}
|
|
611
|
+
**Документация обработки ошибок для SDK v2.5.0**
|
|
612
|
+
**Принцип:** Fail Fast, явные ошибки, надежная диагностика
|
|
613
|
+
**Обновлено:** 28 июня 2025
|