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.
- package/README.md +175 -458
- 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,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
|
+
В этом справочнике содержится подробная информация обо всех константах событий, их строковых значениях, форматах данных и рекомендациях по использованию в различных сценариях.
|