solver-sdk 1.7.2 → 1.7.4
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/README.md +191 -459
- package/dist/cjs/api/chat-api.js +55 -9
- package/dist/cjs/api/chat-api.js.map +1 -1
- package/dist/esm/api/chat-api.js +55 -9
- package/dist/esm/api/chat-api.js.map +1 -1
- package/dist/types/api/chat-api.d.ts +2 -0
- package/dist/types/api/chat-api.d.ts.map +1 -1
- package/docs/AUTHENTICATION.md +179 -0
- package/docs/ERROR_HANDLING.md +240 -0
- package/docs/PING_PONG.md +212 -0
- package/docs/README.md +77 -0
- package/docs/REGIONS.md +140 -0
- package/docs/WEBSOCKET.md +508 -0
- package/docs/WEBSOCKET_EVENTS.md +183 -0
- package/docs/indexing/INDEXING.md +401 -0
- package/docs/thinking/THINKING_ARCHITECTURE.md +221 -0
- package/docs/thinking/streaming-thinking-guide.md +164 -0
- package/docs/thinking/thinking-mode.md +366 -0
- package/package.json +3 -2
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# Обработка ошибок в Solver SDK
|
|
2
|
+
|
|
3
|
+
Документация по системе обработки ошибок в Solver SDK, включая общие ошибки, ошибки WebSocket и географические ограничения.
|
|
4
|
+
|
|
5
|
+
## Содержание
|
|
6
|
+
|
|
7
|
+
- [Общие принципы](#общие-принципы)
|
|
8
|
+
- [Типы ошибок](#типы-ошибок)
|
|
9
|
+
- [HTTP ошибки](#http-ошибки)
|
|
10
|
+
- [WebSocket ошибки](#websocket-ошибки)
|
|
11
|
+
- [Ошибки географических ограничений](#ошибки-географических-ограничений)
|
|
12
|
+
- [Примеры обработки ошибок](#примеры-обработки-ошибок)
|
|
13
|
+
|
|
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 запросами:
|
|
40
|
+
|
|
41
|
+
```javascript
|
|
42
|
+
try {
|
|
43
|
+
const result = await sdk.chat.chat([{ role: 'user', content: 'Hello' }]);
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error(`Код ошибки: ${error.code}`);
|
|
46
|
+
console.error(`Сообщение: ${error.message}`);
|
|
47
|
+
|
|
48
|
+
// Проверка типа ошибки
|
|
49
|
+
if (error.code === 401) {
|
|
50
|
+
console.error('Ошибка аутентификации: проверьте API ключ');
|
|
51
|
+
} else if (error.code === 429) {
|
|
52
|
+
console.error('Превышен лимит запросов: повторите позже');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## WebSocket ошибки
|
|
58
|
+
|
|
59
|
+
WebSocket ошибки обрабатываются через обработчики событий:
|
|
60
|
+
|
|
61
|
+
```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);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Ошибки географических ограничений
|
|
86
|
+
|
|
87
|
+
> **Добавлено в версии 1.7.4**
|
|
88
|
+
|
|
89
|
+
Начиная с версии 1.7.4 SDK поддерживает специальную обработку ошибок географических ограничений API Anthropic. Эти ошибки возникают, когда запросы отправляются из регионов, не поддерживаемых API Anthropic:
|
|
90
|
+
|
|
91
|
+
```javascript
|
|
92
|
+
try {
|
|
93
|
+
const response = await sdk.chat.streamChatWithThinking(messages, options, handleEvent);
|
|
94
|
+
} 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
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Через обработчик WebSocket событий:
|
|
112
|
+
|
|
113
|
+
```javascript
|
|
114
|
+
const handleEvent = (eventType, data) => {
|
|
115
|
+
if (eventType === 'error' && data.type === 'geo_restriction') {
|
|
116
|
+
console.error('Необходимо включить VPN для доступа к API Anthropic из вашего региона');
|
|
117
|
+
|
|
118
|
+
// Выполнить действия по настройке VPN или показать инструкции пользователю
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Причины ошибок географических ограничений
|
|
124
|
+
|
|
125
|
+
Основные причины возникновения ошибок географических ограничений:
|
|
126
|
+
|
|
127
|
+
1. **Региональные ограничения API Anthropic** — API доступен только из определенных регионов (США, Европа и некоторые другие)
|
|
128
|
+
2. **Регуляторные требования** — законодательство некоторых стран ограничивает доступ к определенным API
|
|
129
|
+
3. **IP-блокировка** — некоторые IP-адреса могут быть заблокированы провайдером API
|
|
130
|
+
|
|
131
|
+
### Решение проблемы
|
|
132
|
+
|
|
133
|
+
Для решения проблемы географических ограничений:
|
|
134
|
+
|
|
135
|
+
1. **Использование VPN** — подключитесь через VPN к поддерживаемому региону (США, Европа)
|
|
136
|
+
2. **Прокси-сервер** — настройте прокси для запросов к API
|
|
137
|
+
3. **Альтернативные провайдеры** — используйте альтернативных провайдеров, доступных в вашем регионе
|
|
138
|
+
|
|
139
|
+
## Примеры обработки ошибок
|
|
140
|
+
|
|
141
|
+
### Комплексная обработка ошибок
|
|
142
|
+
|
|
143
|
+
```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
|
+
|
|
184
|
+
try {
|
|
185
|
+
const response = await sdk.chat.streamChatWithThinking(messages, options, handleEvent);
|
|
186
|
+
console.log(`Успешно отправлен запрос, Socket ID: ${response.socketId}`);
|
|
187
|
+
} catch (error) {
|
|
188
|
+
console.error(`Критическая ошибка: ${error.message}`);
|
|
189
|
+
|
|
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); // Отправить отчет об ошибке
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
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
|
+
});
|
|
225
|
+
|
|
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
|
+
```
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# WebSocket Ping/Pong механизм
|
|
2
|
+
|
|
3
|
+
Данный документ описывает механизм поддержания WebSocket соединений и мониторинга их состояния через ping/pong обмен.
|
|
4
|
+
|
|
5
|
+
## Обзор функциональности
|
|
6
|
+
|
|
7
|
+
SDK поддерживает автоматический механизм отправки ping-сообщений и обработки pong-ответов для:
|
|
8
|
+
|
|
9
|
+
1. **Проверки активности соединения** - обнаружение разрывов соединения даже в отсутствие активности
|
|
10
|
+
2. **Измерения времени отклика (Round Trip Time, RTT)** - мониторинг качества соединения
|
|
11
|
+
3. **Сбора статистики соединения** - для диагностики и отладки
|
|
12
|
+
4. **Автоматического обнаружения проблем** - уведомление о потере соединения
|
|
13
|
+
|
|
14
|
+
## Включение механизма ping/pong
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { CodeSolverSDK, WebSocketNamespace } from 'solver-sdk';
|
|
18
|
+
|
|
19
|
+
// Создаем экземпляр SDK
|
|
20
|
+
const sdk = new CodeSolverSDK({
|
|
21
|
+
baseURL: 'https://api.example.com',
|
|
22
|
+
apiKey: 'your-api-key'
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Получаем WebSocket клиент
|
|
26
|
+
const wsClient = sdk.getWebSocketClient();
|
|
27
|
+
|
|
28
|
+
// Подключаемся к пространствам имен
|
|
29
|
+
await wsClient.connectToReasoning();
|
|
30
|
+
await wsClient.connectToDependencies();
|
|
31
|
+
await wsClient.connectToIndexing();
|
|
32
|
+
|
|
33
|
+
// Включаем автоматический механизм ping/pong
|
|
34
|
+
// параметры: интервал отправки в мс (по умолчанию 30000) и порог таймаута (по умолчанию 3)
|
|
35
|
+
wsClient.enablePingPong(10000, 3);
|
|
36
|
+
|
|
37
|
+
// Регистрируем обработчик для события таймаута соединения
|
|
38
|
+
wsClient.onPingPongEvent('connection_timeout', (data) => {
|
|
39
|
+
console.log(`Соединение потеряно для namespace ${data.namespace}`);
|
|
40
|
+
console.log(`Socket ID: ${data.socketId}`);
|
|
41
|
+
console.log(`Количество пропущенных pong: ${data.timeouts}`);
|
|
42
|
+
|
|
43
|
+
// Здесь можно добавить логику переподключения или уведомления пользователя
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Отключение механизма ping/pong
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
// Отключение для всех пространств имен
|
|
51
|
+
wsClient.disablePingPong();
|
|
52
|
+
|
|
53
|
+
// Отключение для конкретного пространства имен
|
|
54
|
+
wsClient.disablePingPong(WebSocketNamespace.REASONING);
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Получение статистики ping/pong
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// Получение статистики для всех пространств имен
|
|
61
|
+
const allStats = wsClient.getPingStats();
|
|
62
|
+
console.log('Статистика для всех соединений:', allStats);
|
|
63
|
+
|
|
64
|
+
// Получение статистики для конкретного пространства имен
|
|
65
|
+
const reasoningStats = wsClient.getPingStats(WebSocketNamespace.REASONING);
|
|
66
|
+
console.log('Статистика для reasoning:', reasoningStats);
|
|
67
|
+
|
|
68
|
+
// Пример содержимого статистики:
|
|
69
|
+
// {
|
|
70
|
+
// namespace: '/reasoning',
|
|
71
|
+
// socketId: 'socket-id-123',
|
|
72
|
+
// pingSent: 10, // Количество отправленных ping
|
|
73
|
+
// pongReceived: 10, // Количество полученных pong
|
|
74
|
+
// averageRtt: 15.5, // Среднее время отклика (мс)
|
|
75
|
+
// minRtt: 5, // Минимальное время отклика (мс)
|
|
76
|
+
// maxRtt: 45, // Максимальное время отклика (мс)
|
|
77
|
+
// lastRtt: 12, // Последнее измеренное время отклика (мс)
|
|
78
|
+
// lastPongTimestamp: 1712345678901, // Timestamp последнего полученного pong
|
|
79
|
+
// isConnected: true // Текущий статус соединения
|
|
80
|
+
// }
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Ручная отправка ping/pong
|
|
84
|
+
|
|
85
|
+
Хотя SDK обеспечивает автоматический механизм ping/pong, вы также можете вручную отправлять ping-сообщения:
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// Отправка ping и получение pong
|
|
89
|
+
wsClient.send(WebSocketNamespace.REASONING, 'connection_ping', {
|
|
90
|
+
timestamp: Date.now()
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Добавление обработчика для pong-ответов
|
|
94
|
+
wsClient.on('connection_pong', (data) => {
|
|
95
|
+
const rtt = Date.now() - data.echo;
|
|
96
|
+
console.log(`Получен pong, RTT: ${rtt}ms`);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Альтернативно, можно использовать готовый обработчик
|
|
100
|
+
wsClient.on('connection_pong', wsClient.getPongHandler());
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Обработка отключений и переподключение
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
// Обработка события таймаута соединения
|
|
107
|
+
wsClient.onPingPongEvent('connection_timeout', async (data) => {
|
|
108
|
+
console.log(`Соединение потеряно для ${data.namespace}`);
|
|
109
|
+
|
|
110
|
+
// Попытка переподключения
|
|
111
|
+
try {
|
|
112
|
+
// Отключаемся от проблемного пространства имен
|
|
113
|
+
wsClient.disconnect(data.namespace);
|
|
114
|
+
|
|
115
|
+
// Пауза перед повторным подключением
|
|
116
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
117
|
+
|
|
118
|
+
// Переподключаемся
|
|
119
|
+
switch (data.namespace) {
|
|
120
|
+
case WebSocketNamespace.REASONING:
|
|
121
|
+
await wsClient.connectToReasoning();
|
|
122
|
+
break;
|
|
123
|
+
case WebSocketNamespace.DEPENDENCIES:
|
|
124
|
+
await wsClient.connectToDependencies();
|
|
125
|
+
break;
|
|
126
|
+
case WebSocketNamespace.INDEXING:
|
|
127
|
+
await wsClient.connectToIndexing();
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
console.log(`Успешно переподключились к ${data.namespace}`);
|
|
132
|
+
} catch (error) {
|
|
133
|
+
console.error(`Ошибка при переподключении к ${data.namespace}:`, error);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Рекомендации по использованию
|
|
139
|
+
|
|
140
|
+
1. **Интервал ping/pong**: Рекомендуемый интервал - 30 секунд для продакшн и 5-10 секунд для отладки.
|
|
141
|
+
|
|
142
|
+
2. **Порог таймаута**: Значение 2-3 пропущенных ping/pong позволяет избежать ложных срабатываний при временных задержках сети.
|
|
143
|
+
|
|
144
|
+
3. **Экономия трафика**: При частой передаче данных через WebSocket можно увеличить интервал ping/pong, так как регулярный обмен данными уже поддерживает соединение активным.
|
|
145
|
+
|
|
146
|
+
4. **Мониторинг RTT**: Используйте statsPingStats для мониторинга задержек сети и раннего обнаружения проблем с соединением.
|
|
147
|
+
|
|
148
|
+
5. **Отключение перед закрытием приложения**: Вызывайте disablePingPong() и затем disconnectAll() при закрытии приложения для корректного освобождения ресурсов.
|
|
149
|
+
|
|
150
|
+
## Пример комплексного использования
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
async function setupWebSocketWithHealthMonitoring() {
|
|
154
|
+
const sdk = new CodeSolverSDK({
|
|
155
|
+
baseURL: 'https://api.example.com',
|
|
156
|
+
apiKey: 'your-api-key',
|
|
157
|
+
websocket: {
|
|
158
|
+
reconnect: true,
|
|
159
|
+
reconnectAttempts: 5,
|
|
160
|
+
reconnectDelay: 2000
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
const wsClient = sdk.getWebSocketClient();
|
|
165
|
+
|
|
166
|
+
// Подключаемся ко всем пространствам имен
|
|
167
|
+
await wsClient.connectToReasoning();
|
|
168
|
+
await wsClient.connectToDependencies();
|
|
169
|
+
await wsClient.connectToIndexing();
|
|
170
|
+
|
|
171
|
+
// Включаем механизм ping/pong для всех соединений
|
|
172
|
+
wsClient.enablePingPong(20000, 3);
|
|
173
|
+
|
|
174
|
+
// Регистрируем обработчик для события таймаута
|
|
175
|
+
wsClient.onPingPongEvent('connection_timeout', handleConnectionTimeout);
|
|
176
|
+
|
|
177
|
+
// Периодически проверяем статистику соединений
|
|
178
|
+
const statsInterval = setInterval(() => {
|
|
179
|
+
const stats = wsClient.getPingStats();
|
|
180
|
+
|
|
181
|
+
// Анализируем статистику
|
|
182
|
+
for (const stat of stats) {
|
|
183
|
+
if (stat.averageRtt > 500) {
|
|
184
|
+
console.warn(`Высокая задержка для ${stat.namespace}: ${stat.averageRtt}ms`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}, 60000); // Проверка каждую минуту
|
|
188
|
+
|
|
189
|
+
// Функция для обработки таймаута соединения
|
|
190
|
+
async function handleConnectionTimeout(data) {
|
|
191
|
+
console.error(`Соединение потеряно для ${data.namespace}`);
|
|
192
|
+
|
|
193
|
+
// Логика переподключения...
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Функция для корректного закрытия соединений
|
|
197
|
+
function cleanup() {
|
|
198
|
+
clearInterval(statsInterval);
|
|
199
|
+
wsClient.disablePingPong();
|
|
200
|
+
wsClient.disconnectAll();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Возвращаем функцию очистки
|
|
204
|
+
return cleanup;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Использование
|
|
208
|
+
const cleanup = await setupWebSocketWithHealthMonitoring();
|
|
209
|
+
|
|
210
|
+
// При закрытии приложения
|
|
211
|
+
window.addEventListener('beforeunload', cleanup);
|
|
212
|
+
```
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Документация Solver SDK
|
|
2
|
+
|
|
3
|
+
Эта директория содержит подробную документацию по Solver SDK версии 1.7.2.
|
|
4
|
+
|
|
5
|
+
## Содержание
|
|
6
|
+
|
|
7
|
+
### Основная документация
|
|
8
|
+
|
|
9
|
+
- [Потоковая передача мышления (Thinking Architecture)](./THINKING_ARCHITECTURE.md) - Архитектура системы потоковой передачи мышления
|
|
10
|
+
- [Руководство по потоковой передаче мышления](./streaming-thinking-guide.md) - Практическое руководство по использованию потоковой передачи мышления
|
|
11
|
+
- [Работа с региональными эндпоинтами](./REGIONS.md) - Информация о работе с региональными эндпоинтами Anthropic API
|
|
12
|
+
- [Расширенные возможности SDK](./ADVANCED.md) - Продвинутые функции и конфигурация SDK
|
|
13
|
+
- [WebSocket API](./WEBSOCKET.md) - Подробное руководство по работе с WebSocket
|
|
14
|
+
- [Справочник WebSocket событий](./WEBSOCKET_EVENTS.md) - Полный список всех WebSocket событий SDK
|
|
15
|
+
- [Механизм Ping/Pong](./PING_PONG.md) - Документация по мониторингу состояния WebSocket соединений
|
|
16
|
+
- [Индексация проектов](./INDEXING.md) - Руководство по индексации и обновлению индекса проектов
|
|
17
|
+
|
|
18
|
+
### Дополнительные материалы
|
|
19
|
+
|
|
20
|
+
- [Режим мышления](./thinking/thinking-mode.md) - Основная информация о режиме мышления
|
|
21
|
+
|
|
22
|
+
## Основные возможности SDK 1.7.2
|
|
23
|
+
|
|
24
|
+
### Потоковая передача мышления (Streaming Thinking)
|
|
25
|
+
|
|
26
|
+
В версии 1.7.2 добавлена полная поддержка потоковой передачи мышления с помощью метода `streamChatWithThinking()`. Это позволяет получать события мышления модели в реальном времени через WebSocket.
|
|
27
|
+
|
|
28
|
+
```javascript
|
|
29
|
+
const response = await sdk.chat.streamChatWithThinking(
|
|
30
|
+
messages,
|
|
31
|
+
{ model: 'claude-3-7-sonnet-20240229', thinking: true },
|
|
32
|
+
handleEvent
|
|
33
|
+
);
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Региональные эндпоинты
|
|
37
|
+
|
|
38
|
+
SDK поддерживает работу с различными региональными эндпоинтами Anthropic API:
|
|
39
|
+
|
|
40
|
+
```javascript
|
|
41
|
+
const sdk = new CodeSolverSDK({
|
|
42
|
+
providers: {
|
|
43
|
+
anthropic: {
|
|
44
|
+
region: 'eu-west-1' // Использовать европейский регион
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Автоматическое переключение между регионами при ошибках
|
|
50
|
+
const response = await sdk.chat.chatWithRegionFailover([...], options);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### WebSocket улучшения
|
|
54
|
+
|
|
55
|
+
Улучшена надежность и диагностика WebSocket соединений:
|
|
56
|
+
|
|
57
|
+
```javascript
|
|
58
|
+
// Диагностика соединения
|
|
59
|
+
const diagnostics = sdk.getWebSocketClient().diagnoseConnection(namespace);
|
|
60
|
+
console.log(diagnostics);
|
|
61
|
+
|
|
62
|
+
// Мониторинг здоровья
|
|
63
|
+
sdk.getWebSocketClient().setupConnectionHealthCheck(interval);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Примеры кода
|
|
67
|
+
|
|
68
|
+
Примеры использования SDK доступны в директории `examples` корневого каталога проекта:
|
|
69
|
+
|
|
70
|
+
- `example:check-api` - Проверка соединения с API
|
|
71
|
+
- `example:indexing` - Индексация проектов
|
|
72
|
+
- `example:dependencies` - Работа с зависимостями
|
|
73
|
+
- `example:regions` - Проверка доступности регионов
|
|
74
|
+
|
|
75
|
+
## Обратная связь
|
|
76
|
+
|
|
77
|
+
Если вы обнаружили ошибки в документации или у вас есть предложения по улучшению, пожалуйста, создайте issue в репозитории проекта.
|
package/docs/REGIONS.md
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Работа с региональными эндпоинтами Anthropic API
|
|
2
|
+
|
|
3
|
+
SDK поддерживает работу с различными региональными эндпоинтами Anthropic API, что позволяет:
|
|
4
|
+
- Улучшить производительность для пользователей в разных регионах
|
|
5
|
+
- Обеспечить отказоустойчивость при перегрузке одного из регионов
|
|
6
|
+
- Соблюдать законодательные требования по обработке данных в конкретных регионах
|
|
7
|
+
|
|
8
|
+
## Содержание
|
|
9
|
+
|
|
10
|
+
- [Поддерживаемые регионы](#поддерживаемые-регионы)
|
|
11
|
+
- [Настройка региона](#настройка-региона)
|
|
12
|
+
- [Автоматическое переключение между регионами](#автоматическое-переключение-между-регионами)
|
|
13
|
+
- [Примеры использования](#примеры-использования)
|
|
14
|
+
- [Ограничения](#ограничения)
|
|
15
|
+
|
|
16
|
+
## Поддерживаемые регионы
|
|
17
|
+
|
|
18
|
+
SDK поддерживает следующие регионы Anthropic API:
|
|
19
|
+
|
|
20
|
+
| Регион | Код | Расположение | Доступность |
|
|
21
|
+
|--------|-----|--------------|-------------|
|
|
22
|
+
| US East (N. Virginia) | `us-east-1` | США | Основной регион |
|
|
23
|
+
| EU West (Ireland) | `eu-west-1` | Евросоюз | Соответствует GDPR |
|
|
24
|
+
| Asia Pacific (Sydney) | `ap-southeast-2` | Австралия | Для пользователей в APAC |
|
|
25
|
+
|
|
26
|
+
Каждый регион имеет собственный эндпоинт и характеристики производительности.
|
|
27
|
+
|
|
28
|
+
## Настройка региона
|
|
29
|
+
|
|
30
|
+
Регион для запросов можно настроить несколькими способами:
|
|
31
|
+
|
|
32
|
+
### 1. В глобальных настройках SDK
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
const sdk = new CodeSolverSDK({
|
|
36
|
+
baseURL: 'https://api.example.com',
|
|
37
|
+
apiKey: 'your-api-key',
|
|
38
|
+
providers: {
|
|
39
|
+
anthropic: {
|
|
40
|
+
region: 'eu-west-1' // Использовать европейский регион для всех запросов
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 2. В параметрах конкретного запроса
|
|
47
|
+
|
|
48
|
+
```javascript
|
|
49
|
+
// Для чата
|
|
50
|
+
const response = await sdk.chat.chat([
|
|
51
|
+
{ role: 'user', content: 'Привет! Как дела?' }
|
|
52
|
+
], {
|
|
53
|
+
model: 'claude-3-sonnet-20240229',
|
|
54
|
+
region: 'ap-southeast-2' // Использовать азиатско-тихоокеанский регион для этого запроса
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Для рассуждений
|
|
58
|
+
const reasoning = await sdk.reasoning.createReasoning({
|
|
59
|
+
projectId: 'my-project',
|
|
60
|
+
query: 'Как оптимизировать этот код?',
|
|
61
|
+
options: {
|
|
62
|
+
region: 'us-east-1' // Использовать американский регион для этого рассуждения
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Автоматическое переключение между регионами
|
|
68
|
+
|
|
69
|
+
SDK (версия 1.7.1+) поддерживает автоматическое переключение между регионами при получении ошибки перегрузки (код 529) от Anthropic API.
|
|
70
|
+
|
|
71
|
+
### Для чата
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
// Использует автоматическое переключение между регионами
|
|
75
|
+
const response = await sdk.chat.chatWithRegionFailover([
|
|
76
|
+
{ role: 'user', content: 'Привет! Как дела?' }
|
|
77
|
+
], {
|
|
78
|
+
model: 'claude-3-sonnet-20240229',
|
|
79
|
+
region: 'us-east-1' // Начинаем с этого региона, но можем переключиться на другие
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Для рассуждений
|
|
84
|
+
|
|
85
|
+
```javascript
|
|
86
|
+
// Использует автоматическое переключение между регионами
|
|
87
|
+
const reasoning = await sdk.reasoning.createReasoningWithRegionFailover({
|
|
88
|
+
projectId: 'my-project',
|
|
89
|
+
query: 'Как оптимизировать этот код?',
|
|
90
|
+
options: {
|
|
91
|
+
region: 'eu-west-1' // Начинаем с этого региона, но можем переключиться на другие
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Как работает переключение между регионами
|
|
97
|
+
|
|
98
|
+
1. Запрос отправляется в указанный регион
|
|
99
|
+
2. Если регион возвращает ошибку перегрузки (код 529), SDK автоматически пробует следующий доступный регион
|
|
100
|
+
3. Если все регионы перегружены, возвращается ошибка
|
|
101
|
+
|
|
102
|
+
Порядок переключения: регионы проверяются в порядке, начиная с указанного в параметрах, затем по кругу.
|
|
103
|
+
|
|
104
|
+
## Примеры использования
|
|
105
|
+
|
|
106
|
+
### Базовый пример переключения регионов
|
|
107
|
+
|
|
108
|
+
```javascript
|
|
109
|
+
try {
|
|
110
|
+
const response = await sdk.chat.chatWithRegionFailover([
|
|
111
|
+
{ role: 'user', content: 'Привет! Расскажи о переключении регионов Anthropic API.' }
|
|
112
|
+
], {
|
|
113
|
+
model: 'claude-3-sonnet-20240229'
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
console.log('Ответ:', response.choices[0].message.content);
|
|
117
|
+
} catch (error) {
|
|
118
|
+
console.error('Все регионы недоступны:', error);
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Пример с настройкой порядка регионов
|
|
123
|
+
|
|
124
|
+
```javascript
|
|
125
|
+
// Запрос с указанием предпочтительного региона
|
|
126
|
+
// (остальные будут проверены в порядке следования после него)
|
|
127
|
+
const response = await sdk.chat.chatWithRegionFailover([
|
|
128
|
+
{ role: 'user', content: 'Привет!' }
|
|
129
|
+
], {
|
|
130
|
+
model: 'claude-3-sonnet-20240229',
|
|
131
|
+
region: 'ap-southeast-2' // Сначала пробуем AP регион, затем US и EU
|
|
132
|
+
});
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Ограничения
|
|
136
|
+
|
|
137
|
+
- Переключение работает только для ошибки перегрузки (код 529)
|
|
138
|
+
- Другие ошибки (аутентификация, формат запроса и т.д.) не вызывают переключение
|
|
139
|
+
- При переключении между регионами может быть заметная задержка
|
|
140
|
+
- Цены и квоты могут отличаться в разных регионах
|