solver-sdk 1.8.0 → 1.8.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/README.md +176 -468
- package/dist/cjs/api/{chat-api.js → chat-api/index.js} +77 -125
- 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/api/projects-api.js +279 -5
- package/dist/cjs/api/projects-api.js.map +1 -1
- package/dist/cjs/code-solver-sdk.js +12 -17
- 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 +87 -56
- package/dist/cjs/utils/code-solver-websocket-client.js.map +1 -1
- package/dist/cjs/utils/http-client.js +7 -0
- package/dist/cjs/utils/http-client.js.map +1 -1
- package/dist/cjs/utils/reasoning-auth-helper.js +58 -0
- package/dist/cjs/utils/reasoning-auth-helper.js.map +1 -0
- package/dist/cjs/utils/websocket-client.js +37 -10
- package/dist/cjs/utils/websocket-client.js.map +1 -1
- package/dist/esm/api/{chat-api.js → chat-api/index.js} +74 -125
- 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/api/projects-api.js +279 -5
- package/dist/esm/api/projects-api.js.map +1 -1
- package/dist/esm/code-solver-sdk.js +10 -15
- 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 +87 -56
- package/dist/esm/utils/code-solver-websocket-client.js.map +1 -1
- package/dist/esm/utils/http-client.js +7 -0
- package/dist/esm/utils/http-client.js.map +1 -1
- package/dist/esm/utils/reasoning-auth-helper.js +54 -0
- package/dist/esm/utils/reasoning-auth-helper.js.map +1 -0
- package/dist/esm/utils/websocket-client.js +37 -10
- package/dist/esm/utils/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} +10 -73
- 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/api/projects-api.d.ts +114 -1
- package/dist/types/api/projects-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/constants/websocket-events.constants.d.ts +65 -36
- package/dist/types/constants/websocket-events.constants.d.ts.map +1 -1
- package/dist/types/interfaces/http-client.d.ts +1 -1
- package/dist/types/interfaces/http-client.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +8 -0
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/utils/code-solver-websocket-client.d.ts +44 -43
- package/dist/types/utils/code-solver-websocket-client.d.ts.map +1 -1
- package/dist/types/utils/http-client.d.ts +5 -0
- package/dist/types/utils/http-client.d.ts.map +1 -1
- package/dist/types/utils/reasoning-auth-helper.d.ts +24 -0
- package/dist/types/utils/reasoning-auth-helper.d.ts.map +1 -0
- package/dist/types/utils/websocket-client.d.ts +6 -0
- package/dist/types/utils/websocket-client.d.ts.map +1 -1
- package/docs/API_REFERENCE.md +432 -0
- package/docs/AUTHENTICATION.md +179 -0
- package/docs/ERROR_HANDLING.md +240 -0
- package/docs/INTEGRATION_EXAMPLES.md +342 -0
- package/docs/PING_PONG.md +212 -0
- package/docs/README.md +102 -0
- package/docs/WEBSOCKET.md +299 -0
- package/docs/advanced/PING_PONG.md +212 -0
- package/docs/features/THINKING.md +158 -0
- package/docs/indexing/INDEXING.md +231 -0
- package/package.json +4 -3
- 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
|
@@ -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,102 @@
|
|
|
1
|
+
23# Code Solver SDK
|
|
2
|
+
|
|
3
|
+
JavaScript/TypeScript SDK для взаимодействия с API Code Solver, предназначенного для умной работы с кодом, семантического поиска и AI-ассистентов.
|
|
4
|
+
|
|
5
|
+
## Установка
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @code-solver/sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Основные возможности
|
|
12
|
+
|
|
13
|
+
- **Работа с проектами**: создание, индексация и управление проектами
|
|
14
|
+
- **Семантический поиск**: поиск по смыслу в коде проекта
|
|
15
|
+
- **AI-чат с контекстом**: взаимодействие с AI-моделями в контексте проекта
|
|
16
|
+
- **Работа с WebSocket**: потоковая обработка событий и ответов
|
|
17
|
+
- **Мультиплатформенность**: поддержка как браузеров, так и Node.js
|
|
18
|
+
|
|
19
|
+
## Быстрый старт
|
|
20
|
+
|
|
21
|
+
```javascript
|
|
22
|
+
import { CodeSolverSDK } from '@code-solver/sdk';
|
|
23
|
+
|
|
24
|
+
// Инициализация SDK
|
|
25
|
+
const sdk = new CodeSolverSDK({
|
|
26
|
+
baseURL: 'https://api.code-solver.com',
|
|
27
|
+
apiKey: 'ваш-api-ключ',
|
|
28
|
+
websocket: {
|
|
29
|
+
reconnect: true,
|
|
30
|
+
reconnectAttempts: 5
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Проверка доступности API
|
|
35
|
+
const isAvailable = await sdk.checkHealth();
|
|
36
|
+
if (!isAvailable) {
|
|
37
|
+
console.error('API недоступен');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Создание проекта
|
|
42
|
+
const project = await sdk.projects.createProject(
|
|
43
|
+
'Мой проект',
|
|
44
|
+
'/путь/к/проекту',
|
|
45
|
+
{
|
|
46
|
+
excludePatterns: ['node_modules', '.git', 'dist']
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
// Индексация проекта
|
|
51
|
+
await sdk.projects.indexProject(project.id);
|
|
52
|
+
|
|
53
|
+
// Отслеживание прогресса индексации через WebSocket
|
|
54
|
+
sdk.projects.on('indexing_progress', (data) => {
|
|
55
|
+
console.log(`Прогресс индексации: ${data.progress}%`);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
sdk.projects.on('indexing_complete', (data) => {
|
|
59
|
+
console.log('Индексация завершена!');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Семантический поиск
|
|
63
|
+
const searchResults = await sdk.search.semanticSearch(project.id, {
|
|
64
|
+
query: 'функция для обработки HTTP запросов',
|
|
65
|
+
limit: 10
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Взаимодействие с AI-ассистентом
|
|
69
|
+
const chatResponse = await sdk.chat.chat([
|
|
70
|
+
{
|
|
71
|
+
role: 'system',
|
|
72
|
+
content: 'Ты опытный программист, помогающий разработчику.'
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
role: 'user',
|
|
76
|
+
content: 'Объясни, как работает функция getUserProfile в моем проекте.'
|
|
77
|
+
}
|
|
78
|
+
], {
|
|
79
|
+
projectId: project.id,
|
|
80
|
+
model: 'claude-3-7-sonnet-20240229'
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
console.log(chatResponse.answer);
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Документация
|
|
87
|
+
|
|
88
|
+
Подробная документация доступна в следующих файлах:
|
|
89
|
+
|
|
90
|
+
- [API Reference](./API_REFERENCE.md) - подробное описание всех методов SDK
|
|
91
|
+
- [Authentication](./AUTHENTICATION.md) - информация по аутентификации
|
|
92
|
+
- [Работа с WebSocket](./WEBSOCKET.md) - примеры работы с WebSocket соединениями
|
|
93
|
+
- [Примеры интеграции](./INTEGRATION_EXAMPLES.md) - примеры интеграции с VS Code/Cursor
|
|
94
|
+
|
|
95
|
+
## Поддерживаемые платформы
|
|
96
|
+
|
|
97
|
+
- **Браузеры**: Chrome, Firefox, Safari, Edge
|
|
98
|
+
- **Node.js**: 14.x и выше
|
|
99
|
+
|
|
100
|
+
## Лицензия
|
|
101
|
+
|
|
102
|
+
MIT
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
# Работа с WebSocket соединениями
|
|
2
|
+
|
|
3
|
+
В этом разделе описаны основные методы для работы с WebSocket соединениями.
|
|
4
|
+
|
|
5
|
+
## Получение WebSocket клиента
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
const { CodeSolverSDK } = require('solver-sdk');
|
|
9
|
+
|
|
10
|
+
const sdk = new CodeSolverSDK({
|
|
11
|
+
baseURL: 'https://api.example.com',
|
|
12
|
+
apiKey: 'your-api-key',
|
|
13
|
+
websocket: {
|
|
14
|
+
reconnect: true,
|
|
15
|
+
reconnectAttempts: 5,
|
|
16
|
+
reconnectDelay: 3000,
|
|
17
|
+
rejectUnauthorized: true // false для самоподписанных сертификатов
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// Получение WebSocket клиента
|
|
22
|
+
const wsClient = sdk.getWebSocketClient();
|
|
23
|
+
|
|
24
|
+
// Подключение к namespace рассуждений
|
|
25
|
+
await wsClient.connectToReasoning();
|
|
26
|
+
|
|
27
|
+
// Подключение к namespace индексации
|
|
28
|
+
await wsClient.connectToIndexing();
|
|
29
|
+
|
|
30
|
+
// Проверка статуса подключения
|
|
31
|
+
const isConnected = wsClient.isConnected(WebSocketNamespace.REASONING);
|
|
32
|
+
|
|
33
|
+
// Отключение от определенного namespace
|
|
34
|
+
await wsClient.disconnect(WebSocketNamespace.REASONING);
|
|
35
|
+
|
|
36
|
+
// Отключение от всех namespace
|
|
37
|
+
await wsClient.disconnectAll();
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Мониторинг индексации проектов
|
|
41
|
+
|
|
42
|
+
```javascript
|
|
43
|
+
// Подключение к WebSocket для проектов
|
|
44
|
+
await sdk.projects.connectWebSocket();
|
|
45
|
+
|
|
46
|
+
// Отслеживание прогресса индексации
|
|
47
|
+
sdk.projects.on('indexing_progress', (data) => {
|
|
48
|
+
console.log(`Прогресс индексации: ${data.progress}%`);
|
|
49
|
+
console.log(`Обработано файлов: ${data.processedFiles} из ${data.totalFiles}`);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Завершение индексации
|
|
53
|
+
sdk.projects.on('indexing_complete', (data) => {
|
|
54
|
+
console.log('Индексация завершена!', data.success ? 'Успешно' : 'С ошибками');
|
|
55
|
+
|
|
56
|
+
// Отключение после завершения
|
|
57
|
+
sdk.projects.disconnectWebSocket();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Остановка индексации
|
|
61
|
+
await sdk.projects.stopIndexing(projectId);
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Потоковый чат с мышлением AI
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
// Обработчик событий для потокового получения ответа и мышления
|
|
68
|
+
const handleEvent = (eventType, data) => {
|
|
69
|
+
if (eventType === 'thinking_delta' && data.thinking) {
|
|
70
|
+
console.log('Мышление:', data.thinking);
|
|
71
|
+
} else if (eventType === 'text_delta' && data.text) {
|
|
72
|
+
process.stdout.write(data.text); // Вывод текста без переноса строки
|
|
73
|
+
} else if (eventType === 'message_stop') {
|
|
74
|
+
console.log('\nОтвет завершен');
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// Отправка запроса
|
|
79
|
+
const messages = [
|
|
80
|
+
{ role: 'user', content: 'Расскажи о JavaScript' }
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
const options = {
|
|
84
|
+
model: 'claude-3-7-sonnet-20240229',
|
|
85
|
+
thinking: true,
|
|
86
|
+
temperature: 0.7
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const response = await sdk.chat.streamChatWithThinking(
|
|
90
|
+
messages,
|
|
91
|
+
options,
|
|
92
|
+
handleEvent
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
console.log(`Socket ID: ${response.socketId}`);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Работа с рассуждениями через WebSocket
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
// Создание рассуждения
|
|
102
|
+
const reasoning = await sdk.reasoning.createReasoning({
|
|
103
|
+
projectId: 'project-id',
|
|
104
|
+
query: 'Объясни этот проект'
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Подключение к WebSocket для рассуждений
|
|
108
|
+
await sdk.reasoning.connectWebSocket(reasoning.id);
|
|
109
|
+
|
|
110
|
+
// Подписка на события
|
|
111
|
+
sdk.reasoning.on('thinking', (data) => {
|
|
112
|
+
console.log('Мышление:', data.content);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
sdk.reasoning.on('complete', (data) => {
|
|
116
|
+
console.log('Результат:', data.content);
|
|
117
|
+
// Отключение после завершения
|
|
118
|
+
sdk.reasoning.disconnectWebSocket();
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// Запуск рассуждения
|
|
122
|
+
await sdk.reasoning.startReasoning(reasoning.id);
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Настройка параметров WebSocket
|
|
126
|
+
|
|
127
|
+
```javascript
|
|
128
|
+
// Настройка параметров WebSocket при создании SDK
|
|
129
|
+
const sdk = new CodeSolverSDK({
|
|
130
|
+
baseURL: 'https://api.example.com',
|
|
131
|
+
apiKey: 'your-api-key',
|
|
132
|
+
websocket: {
|
|
133
|
+
reconnect: true, // Автоматическое переподключение
|
|
134
|
+
reconnectAttempts: 5, // Максимальное количество попыток
|
|
135
|
+
reconnectDelay: 3000, // Задержка между попытками (мс)
|
|
136
|
+
rejectUnauthorized: true, // Проверка SSL-сертификатов
|
|
137
|
+
reconnectStrategy: 'exponential', // Стратегия задержки между попытками
|
|
138
|
+
enableAutoPing: true, // Автоматический ping/pong
|
|
139
|
+
pingInterval: 25000, // Интервал ping в мс
|
|
140
|
+
enableSessionPersistence: true // Сохранение сессии
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Обработка ошибок в WebSocket
|
|
146
|
+
|
|
147
|
+
```javascript
|
|
148
|
+
try {
|
|
149
|
+
await sdk.projects.connectWebSocket();
|
|
150
|
+
|
|
151
|
+
// Подписка на события ошибок
|
|
152
|
+
sdk.projects.on('error', (error) => {
|
|
153
|
+
console.error('Ошибка WebSocket:', error.message);
|
|
154
|
+
if (error.type === 'connection_error') {
|
|
155
|
+
console.error('Проблема с подключением');
|
|
156
|
+
} else if (error.type === 'authentication_error') {
|
|
157
|
+
console.error('Ошибка аутентификации');
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
} catch (error) {
|
|
161
|
+
console.error('Ошибка при подключении:', error.message);
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Модули с поддержкой WebSocket
|
|
166
|
+
|
|
167
|
+
### Чат и рассуждения
|
|
168
|
+
|
|
169
|
+
```javascript
|
|
170
|
+
// Подключение WebSocket для чата
|
|
171
|
+
await sdk.chat.connectWebSocket();
|
|
172
|
+
|
|
173
|
+
// Подписка на события
|
|
174
|
+
sdk.chat.on('message_start', (data) => {
|
|
175
|
+
console.log('Начало сообщения:', data);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
sdk.chat.on('content_block_delta', (data) => {
|
|
179
|
+
if (data.delta?.type === 'thinking_delta') {
|
|
180
|
+
console.log('Фрагмент мышления:', data.delta.thinking);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
// Отключение
|
|
185
|
+
await sdk.chat.disconnectWebSocket();
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Зависимости
|
|
189
|
+
|
|
190
|
+
```javascript
|
|
191
|
+
// Подключение к пространству имен зависимостей
|
|
192
|
+
await sdk.dependencies.connectWebSocket(projectId);
|
|
193
|
+
|
|
194
|
+
// Подписка на события зависимостей
|
|
195
|
+
sdk.dependencies.on('dependency_update', (data) => {
|
|
196
|
+
console.log('Обновление зависимостей:', data);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// Отключение
|
|
200
|
+
await sdk.dependencies.disconnectWebSocket();
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Проекты и индексация
|
|
204
|
+
|
|
205
|
+
```javascript
|
|
206
|
+
// Подключение к пространству имен проектов
|
|
207
|
+
await sdk.projects.connectWebSocket();
|
|
208
|
+
|
|
209
|
+
// Подписка на события индексации
|
|
210
|
+
sdk.projects.on('indexing_progress', (data) => {
|
|
211
|
+
console.log('Прогресс индексации:', data.progress);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
// Отключение
|
|
215
|
+
await sdk.projects.disconnectWebSocket();
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Поддерживаемые события
|
|
219
|
+
|
|
220
|
+
Основные события, на которые можно подписаться:
|
|
221
|
+
|
|
222
|
+
| Событие | Описание | Примечание |
|
|
223
|
+
|---------|----------|------------|
|
|
224
|
+
| `message_start` | Начало сообщения | { id, model, type } |
|
|
225
|
+
| `content_block_start` | Начало блока контента | { content_block: { type }, index } |
|
|
226
|
+
| `content_block_delta` | Дельта блока контента | См. документацию для типов дельт |
|
|
227
|
+
| `content_block_stop` | Конец блока контента | { content_block: { type }, index } |
|
|
228
|
+
| `message_stop` | Конец сообщения | { id, type, stop_reason } |
|
|
229
|
+
| `error` | Ошибка | { message, code, ... } |
|
|
230
|
+
|
|
231
|
+
## Потоковая передача мышления
|
|
232
|
+
|
|
233
|
+
Самый простой способ получать мышление — использовать метод `streamChatWithThinking`:
|
|
234
|
+
|
|
235
|
+
```javascript
|
|
236
|
+
// Обработчик событий
|
|
237
|
+
const handleEvent = (eventType, data) => {
|
|
238
|
+
if (eventType === 'content_block_delta' && data.delta?.type === 'thinking_delta') {
|
|
239
|
+
console.log('Мышление:', data.delta.thinking);
|
|
240
|
+
} else if (eventType === 'content_block_delta' && data.delta?.type === 'text_delta') {
|
|
241
|
+
console.log('Ответ:', data.delta.text);
|
|
242
|
+
} else if (eventType === 'message_stop') {
|
|
243
|
+
console.log('Завершение ответа');
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
// Отправка запроса с потоковым мышлением
|
|
248
|
+
const messages = [
|
|
249
|
+
{ role: 'user', content: 'Объясни квантовую механику' }
|
|
250
|
+
];
|
|
251
|
+
|
|
252
|
+
const options = {
|
|
253
|
+
model: 'claude-3-7-sonnet-20240229',
|
|
254
|
+
thinking: true,
|
|
255
|
+
temperature: 0.7
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
const response = await sdk.chat.streamChatWithThinking(
|
|
259
|
+
messages,
|
|
260
|
+
options,
|
|
261
|
+
handleEvent
|
|
262
|
+
);
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Обработка ошибок
|
|
266
|
+
|
|
267
|
+
```javascript
|
|
268
|
+
try {
|
|
269
|
+
await sdk.chat.streamChatWithThinking(
|
|
270
|
+
messages,
|
|
271
|
+
options,
|
|
272
|
+
handleEvent
|
|
273
|
+
);
|
|
274
|
+
} catch (error) {
|
|
275
|
+
if (error.code === 'CONNECTION_ERROR') {
|
|
276
|
+
console.error('Ошибка подключения:', error.message);
|
|
277
|
+
} else {
|
|
278
|
+
console.error('Произошла ошибка:', error.message);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Настройка WebSocket
|
|
284
|
+
|
|
285
|
+
```javascript
|
|
286
|
+
// Настройка параметров WebSocket при создании SDK
|
|
287
|
+
const sdk = new CodeSolverSDK({
|
|
288
|
+
baseURL: 'https://api.example.com',
|
|
289
|
+
apiKey: 'your-api-key',
|
|
290
|
+
websocket: {
|
|
291
|
+
reconnect: true, // Автоматическое переподключение
|
|
292
|
+
reconnectAttempts: 5, // Максимальное количество попыток
|
|
293
|
+
rejectUnauthorized: false // Для самоподписанных сертификатов
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
```
|
|
297
|
+
## Дополнительная информация
|
|
298
|
+
|
|
299
|
+
Для детального описания всех возможностей WebSocket, смотрите [руководство по мышлению](./features/THINKING.md) и примеры в директории [examples/websocket](../examples/websocket).
|