solver-sdk 1.7.4 → 1.7.5
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 +25 -49
- package/dist/cjs/api/{chat-api.js → chat-api/index.js} +32 -192
- package/dist/cjs/api/chat-api/index.js.map +1 -0
- package/dist/cjs/api/chat-api/interfaces.js +3 -0
- package/dist/cjs/api/chat-api/interfaces.js.map +1 -0
- package/dist/cjs/api/chat-api/models.js +6 -0
- package/dist/cjs/api/chat-api/models.js.map +1 -0
- package/dist/cjs/api/chat-api/stream-utils.js +192 -0
- package/dist/cjs/api/chat-api/stream-utils.js.map +1 -0
- package/dist/cjs/api/chat-api/websocket-helpers.js +211 -0
- package/dist/cjs/api/chat-api/websocket-helpers.js.map +1 -0
- package/dist/cjs/code-solver-sdk.js +10 -15
- package/dist/cjs/code-solver-sdk.js.map +1 -1
- package/dist/cjs/constants/websocket-events.constants.js +77 -52
- package/dist/cjs/constants/websocket-events.constants.js.map +1 -1
- package/dist/cjs/utils/code-solver-websocket-client.js.map +1 -1
- package/dist/esm/api/{chat-api.js → chat-api/index.js} +29 -192
- package/dist/esm/api/chat-api/index.js.map +1 -0
- package/dist/esm/api/chat-api/interfaces.js +2 -0
- package/dist/esm/api/chat-api/interfaces.js.map +1 -0
- package/dist/esm/api/chat-api/models.js +5 -0
- package/dist/esm/api/chat-api/models.js.map +1 -0
- package/dist/esm/api/chat-api/stream-utils.js +188 -0
- package/dist/esm/api/chat-api/stream-utils.js.map +1 -0
- package/dist/esm/api/chat-api/websocket-helpers.js +205 -0
- package/dist/esm/api/chat-api/websocket-helpers.js.map +1 -0
- package/dist/esm/code-solver-sdk.js +8 -13
- package/dist/esm/code-solver-sdk.js.map +1 -1
- package/dist/esm/constants/websocket-events.constants.js +76 -51
- package/dist/esm/constants/websocket-events.constants.js.map +1 -1
- package/dist/esm/utils/code-solver-websocket-client.js.map +1 -1
- package/dist/types/api/chat-api/index.d.ts +81 -0
- package/dist/types/api/chat-api/index.d.ts.map +1 -0
- package/dist/types/api/chat-api/interfaces.d.ts +47 -0
- package/dist/types/api/chat-api/interfaces.d.ts.map +1 -0
- package/dist/types/api/{chat-api.d.ts → chat-api/models.d.ts} +8 -79
- package/dist/types/api/chat-api/models.d.ts.map +1 -0
- package/dist/types/api/chat-api/stream-utils.d.ts +31 -0
- package/dist/types/api/chat-api/stream-utils.d.ts.map +1 -0
- package/dist/types/api/chat-api/websocket-helpers.d.ts +40 -0
- package/dist/types/api/chat-api/websocket-helpers.d.ts.map +1 -0
- package/dist/types/code-solver-sdk.d.ts +1 -1
- package/dist/types/code-solver-sdk.d.ts.map +1 -1
- package/dist/types/constants/websocket-events.constants.d.ts +65 -36
- package/dist/types/constants/websocket-events.constants.d.ts.map +1 -1
- package/dist/types/utils/code-solver-websocket-client.d.ts +28 -34
- package/dist/types/utils/code-solver-websocket-client.d.ts.map +1 -1
- package/docs/API_REFERENCE.md +168 -0
- package/docs/README.md +32 -56
- package/docs/WEBSOCKET.md +55 -394
- package/docs/advanced/PING_PONG.md +212 -0
- package/docs/features/THINKING.md +158 -0
- package/package.json +1 -1
- package/dist/cjs/api/chat-api.js.map +0 -1
- package/dist/esm/api/chat-api.js.map +0 -1
- package/dist/types/api/chat-api.d.ts.map +0 -1
- package/docs/REGIONS.md +0 -140
- package/docs/WEBSOCKET_EVENTS.md +0 -183
- package/docs/thinking/THINKING_ARCHITECTURE.md +0 -221
- package/docs/thinking/streaming-thinking-guide.md +0 -164
- package/docs/thinking/thinking-mode.md +0 -366
package/docs/WEBSOCKET.md
CHANGED
|
@@ -1,24 +1,10 @@
|
|
|
1
1
|
# Работа с WebSocket соединениями
|
|
2
2
|
|
|
3
|
-
В этом разделе описаны
|
|
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)
|
|
3
|
+
В этом разделе описаны методы SDK для работы с WebSocket соединениями и потоковой передачей данных.
|
|
18
4
|
|
|
19
5
|
## Основы работы с WebSocket
|
|
20
6
|
|
|
21
|
-
SDK предоставляет
|
|
7
|
+
SDK предоставляет высокоуровневое API для работы с WebSocket, интегрированное в основные классы:
|
|
22
8
|
|
|
23
9
|
```javascript
|
|
24
10
|
const { CodeSolverSDK } = require('solver-sdk');
|
|
@@ -34,24 +20,20 @@ const wsClient = sdk.getWebSocketClient();
|
|
|
34
20
|
// Подключение к пространству имен рассуждений
|
|
35
21
|
await wsClient.connectToReasoning('reasoning-id');
|
|
36
22
|
|
|
37
|
-
// Проверка состояния подключения
|
|
38
|
-
const isConnected = wsClient.isConnectedToReasoning();
|
|
39
|
-
console.log('Подключено к рассуждениям:', isConnected);
|
|
40
|
-
|
|
41
23
|
// Подписка на события
|
|
42
|
-
wsClient.on('
|
|
43
|
-
|
|
24
|
+
wsClient.on('content_block_delta', (data) => {
|
|
25
|
+
if (data.delta?.type === 'thinking_delta') {
|
|
26
|
+
console.log('Фрагмент мышления:', data.delta.thinking);
|
|
27
|
+
}
|
|
44
28
|
});
|
|
45
29
|
|
|
46
30
|
// Отключение
|
|
47
31
|
wsClient.disconnect(WebSocketNamespace.REASONING);
|
|
48
32
|
```
|
|
49
33
|
|
|
50
|
-
##
|
|
34
|
+
## Модули с поддержкой WebSocket
|
|
51
35
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
### Работа с чатом и рассуждениями
|
|
36
|
+
### Чат и рассуждения
|
|
55
37
|
|
|
56
38
|
```javascript
|
|
57
39
|
// Подключение WebSocket для чата
|
|
@@ -62,15 +44,17 @@ sdk.chat.on('message_start', (data) => {
|
|
|
62
44
|
console.log('Начало сообщения:', data);
|
|
63
45
|
});
|
|
64
46
|
|
|
65
|
-
sdk.chat.on('
|
|
66
|
-
|
|
47
|
+
sdk.chat.on('content_block_delta', (data) => {
|
|
48
|
+
if (data.delta?.type === 'thinking_delta') {
|
|
49
|
+
console.log('Фрагмент мышления:', data.delta.thinking);
|
|
50
|
+
}
|
|
67
51
|
});
|
|
68
52
|
|
|
69
53
|
// Отключение
|
|
70
54
|
await sdk.chat.disconnectWebSocket();
|
|
71
55
|
```
|
|
72
56
|
|
|
73
|
-
###
|
|
57
|
+
### Зависимости
|
|
74
58
|
|
|
75
59
|
```javascript
|
|
76
60
|
// Подключение к пространству имен зависимостей
|
|
@@ -85,7 +69,7 @@ sdk.dependencies.on('dependency_update', (data) => {
|
|
|
85
69
|
await sdk.dependencies.disconnectWebSocket();
|
|
86
70
|
```
|
|
87
71
|
|
|
88
|
-
###
|
|
72
|
+
### Проекты и индексация
|
|
89
73
|
|
|
90
74
|
```javascript
|
|
91
75
|
// Подключение к пространству имен проектов
|
|
@@ -100,32 +84,38 @@ sdk.projects.on('indexing_progress', (data) => {
|
|
|
100
84
|
await sdk.projects.disconnectWebSocket();
|
|
101
85
|
```
|
|
102
86
|
|
|
87
|
+
## Поддерживаемые события
|
|
88
|
+
|
|
89
|
+
Основные события, на которые можно подписаться:
|
|
90
|
+
|
|
91
|
+
| Событие | Описание | Примечание |
|
|
92
|
+
|---------|----------|------------|
|
|
93
|
+
| `message_start` | Начало сообщения | { id, model, type } |
|
|
94
|
+
| `content_block_start` | Начало блока контента | { content_block: { type }, index } |
|
|
95
|
+
| `content_block_delta` | Дельта блока контента | См. документацию для типов дельт |
|
|
96
|
+
| `content_block_stop` | Конец блока контента | { content_block: { type }, index } |
|
|
97
|
+
| `message_stop` | Конец сообщения | { id, type, stop_reason } |
|
|
98
|
+
| `error` | Ошибка | { message, code, ... } |
|
|
99
|
+
|
|
103
100
|
## Потоковая передача мышления
|
|
104
101
|
|
|
105
|
-
|
|
102
|
+
Самый простой способ получать мышление — использовать метод `streamChatWithThinking`:
|
|
106
103
|
|
|
107
104
|
```javascript
|
|
108
105
|
// Обработчик событий
|
|
109
106
|
const handleEvent = (eventType, data) => {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
break;
|
|
117
|
-
case 'message_start':
|
|
118
|
-
console.log('Начало сообщения');
|
|
119
|
-
break;
|
|
120
|
-
case 'message_stop':
|
|
121
|
-
console.log('Завершение ответа');
|
|
122
|
-
break;
|
|
107
|
+
if (eventType === 'content_block_delta' && data.delta?.type === 'thinking_delta') {
|
|
108
|
+
console.log('Мышление:', data.delta.thinking);
|
|
109
|
+
} else if (eventType === 'content_block_delta' && data.delta?.type === 'text_delta') {
|
|
110
|
+
console.log('Ответ:', data.delta.text);
|
|
111
|
+
} else if (eventType === 'message_stop') {
|
|
112
|
+
console.log('Завершение ответа');
|
|
123
113
|
}
|
|
124
114
|
};
|
|
125
115
|
|
|
126
116
|
// Отправка запроса с потоковым мышлением
|
|
127
117
|
const messages = [
|
|
128
|
-
{ role: 'user', content: '
|
|
118
|
+
{ role: 'user', content: 'Объясни квантовую механику' }
|
|
129
119
|
];
|
|
130
120
|
|
|
131
121
|
const options = {
|
|
@@ -141,368 +131,39 @@ const response = await sdk.chat.streamChatWithThinking(
|
|
|
141
131
|
);
|
|
142
132
|
```
|
|
143
133
|
|
|
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
|
-
### Получение статуса рассуждения
|
|
134
|
+
## Обработка ошибок
|
|
196
135
|
|
|
197
136
|
```javascript
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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 // Максимальное количество попыток
|
|
137
|
+
try {
|
|
138
|
+
await sdk.chat.streamChatWithThinking(
|
|
139
|
+
messages,
|
|
140
|
+
options,
|
|
141
|
+
handleEvent
|
|
142
|
+
);
|
|
143
|
+
} catch (error) {
|
|
144
|
+
if (error.code === 'CONNECTION_ERROR') {
|
|
145
|
+
console.error('Ошибка подключения:', error.message);
|
|
146
|
+
} else {
|
|
147
|
+
console.error('Произошла ошибка:', error.message);
|
|
277
148
|
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// Принудительное переподключение к пространству имен
|
|
281
|
-
await wsClient.reconnectNamespace(
|
|
282
|
-
WebSocketNamespace.REASONING,
|
|
283
|
-
true // immediate: переподключиться немедленно, без задержки
|
|
284
|
-
);
|
|
149
|
+
}
|
|
285
150
|
```
|
|
286
151
|
|
|
287
|
-
##
|
|
288
|
-
|
|
289
|
-
SDK поддерживает механизм сохранения и восстановления токенов сессий для непрерывной работы при переподключениях:
|
|
152
|
+
## Настройка WebSocket
|
|
290
153
|
|
|
291
154
|
```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
|
|
155
|
+
// Настройка параметров WebSocket при создании SDK
|
|
302
156
|
const sdk = new CodeSolverSDK({
|
|
303
157
|
baseURL: 'https://api.example.com',
|
|
304
158
|
apiKey: 'your-api-key',
|
|
305
159
|
websocket: {
|
|
306
|
-
|
|
160
|
+
reconnect: true, // Автоматическое переподключение
|
|
161
|
+
reconnectAttempts: 5, // Максимальное количество попыток
|
|
162
|
+
rejectUnauthorized: false // Для самоподписанных сертификатов
|
|
307
163
|
}
|
|
308
164
|
});
|
|
309
165
|
```
|
|
310
166
|
|
|
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)
|
|
167
|
+
## Дополнительная информация
|
|
507
168
|
|
|
508
|
-
|
|
169
|
+
Для детального описания всех возможностей WebSocket, смотрите [руководство по мышлению](./features/THINKING.md) и примеры в директории [examples/websocket](../examples/websocket).
|