solver-sdk
Version:
SDK для интеграции с Code Solver Backend API
300 lines (238 loc) • 10 kB
Markdown
# Работа с WebSocket соединениями
В этом разделе описаны основные методы для работы с WebSocket соединениями.
## Получение WebSocket клиента
```javascript
const { CodeSolverSDK } = require('solver-sdk');
const sdk = new CodeSolverSDK({
baseURL: 'https://api.example.com',
apiKey: 'your-api-key',
websocket: {
reconnect: true,
reconnectAttempts: 5,
reconnectDelay: 3000,
rejectUnauthorized: true // false для самоподписанных сертификатов
}
});
// Получение WebSocket клиента
const wsClient = sdk.getWebSocketClient();
// Подключение к namespace рассуждений
await wsClient.connectToReasoning();
// Подключение к namespace индексации
await wsClient.connectToIndexing();
// Проверка статуса подключения
const isConnected = wsClient.isConnected(WebSocketNamespace.REASONING);
// Отключение от определенного namespace
await wsClient.disconnect(WebSocketNamespace.REASONING);
// Отключение от всех namespace
await wsClient.disconnectAll();
```
## Мониторинг индексации проектов
```javascript
// Подключение к WebSocket для проектов
await sdk.projects.connectWebSocket();
// Отслеживание прогресса индексации
sdk.projects.on('indexing_progress', (data) => {
console.log(`Прогресс индексации: ${data.progress}%`);
console.log(`Обработано файлов: ${data.processedFiles} из ${data.totalFiles}`);
});
// Завершение индексации
sdk.projects.on('indexing_complete', (data) => {
console.log('Индексация завершена!', data.success ? 'Успешно' : 'С ошибками');
// Отключение после завершения
sdk.projects.disconnectWebSocket();
});
// Остановка индексации
await sdk.projects.stopIndexing(projectId);
```
## Потоковый чат с мышлением AI
```javascript
// Обработчик событий для потокового получения ответа и мышления
const handleEvent = (eventType, data) => {
if (eventType === 'thinking_delta' && data.thinking) {
console.log('Мышление:', data.thinking);
} else if (eventType === 'text_delta' && data.text) {
process.stdout.write(data.text); // Вывод текста без переноса строки
} else if (eventType === 'message_stop') {
console.log('\nОтвет завершен');
}
};
// Отправка запроса
const messages = [
{ role: 'user', content: 'Расскажи о JavaScript' }
];
const options = {
model: 'claude-3-7-sonnet-20240229',
thinking: true,
temperature: 0.7
};
const response = await sdk.chat.streamChatWithThinking(
messages,
options,
handleEvent
);
console.log(`Socket ID: ${response.socketId}`);
```
## Работа с рассуждениями через WebSocket
```javascript
// Создание рассуждения
const reasoning = await sdk.reasoning.createReasoning({
projectId: 'project-id',
query: 'Объясни этот проект'
});
// Подключение к WebSocket для рассуждений
await sdk.reasoning.connectWebSocket(reasoning.id);
// Подписка на события
sdk.reasoning.on('thinking', (data) => {
console.log('Мышление:', data.content);
});
sdk.reasoning.on('complete', (data) => {
console.log('Результат:', data.content);
// Отключение после завершения
sdk.reasoning.disconnectWebSocket();
});
// Запуск рассуждения
await sdk.reasoning.startReasoning(reasoning.id);
```
## Настройка параметров WebSocket
```javascript
// Настройка параметров WebSocket при создании SDK
const sdk = new CodeSolverSDK({
baseURL: 'https://api.example.com',
apiKey: 'your-api-key',
websocket: {
reconnect: true, // Автоматическое переподключение
reconnectAttempts: 5, // Максимальное количество попыток
reconnectDelay: 3000, // Задержка между попытками (мс)
rejectUnauthorized: true, // Проверка SSL-сертификатов
reconnectStrategy: 'exponential', // Стратегия задержки между попытками
enableAutoPing: true, // Автоматический ping/pong
pingInterval: 25000, // Интервал ping в мс
enableSessionPersistence: true // Сохранение сессии
}
});
```
## Обработка ошибок в WebSocket
```javascript
try {
await sdk.projects.connectWebSocket();
// Подписка на события ошибок
sdk.projects.on('error', (error) => {
console.error('Ошибка WebSocket:', error.message);
if (error.type === 'connection_error') {
console.error('Проблема с подключением');
} else if (error.type === 'authentication_error') {
console.error('Ошибка аутентификации');
}
});
} catch (error) {
console.error('Ошибка при подключении:', error.message);
}
```
## Модули с поддержкой WebSocket
### Чат и рассуждения
```javascript
// Подключение WebSocket для чата
await sdk.chat.connectWebSocket();
// Подписка на события
sdk.chat.on('message_start', (data) => {
console.log('Начало сообщения:', data);
});
sdk.chat.on('content_block_delta', (data) => {
if (data.delta?.type === 'thinking_delta') {
console.log('Фрагмент мышления:', data.delta.thinking);
}
});
// Отключение
await sdk.chat.disconnectWebSocket();
```
### Зависимости
```javascript
// Подключение к пространству имен зависимостей
await sdk.dependencies.connectWebSocket(projectId);
// Подписка на события зависимостей
sdk.dependencies.on('dependency_update', (data) => {
console.log('Обновление зависимостей:', data);
});
// Отключение
await sdk.dependencies.disconnectWebSocket();
```
### Проекты и индексация
```javascript
// Подключение к пространству имен проектов
await sdk.projects.connectWebSocket();
// Подписка на события индексации
sdk.projects.on('indexing_progress', (data) => {
console.log('Прогресс индексации:', data.progress);
});
// Отключение
await sdk.projects.disconnectWebSocket();
```
## Поддерживаемые события
Основные события, на которые можно подписаться:
| Событие | Описание | Примечание |
|---------|----------|------------|
| `message_start` | Начало сообщения | { id, model, type } |
| `content_block_start` | Начало блока контента | { content_block: { type }, index } |
| `content_block_delta` | Дельта блока контента | См. документацию для типов дельт |
| `content_block_stop` | Конец блока контента | { content_block: { type }, index } |
| `message_stop` | Конец сообщения | { id, type, stop_reason } |
| `error` | Ошибка | { message, code, ... } |
## Потоковая передача мышления
Самый простой способ получать мышление — использовать метод `streamChatWithThinking`:
```javascript
// Обработчик событий
const handleEvent = (eventType, data) => {
if (eventType === 'content_block_delta' && data.delta?.type === 'thinking_delta') {
console.log('Мышление:', data.delta.thinking);
} else if (eventType === 'content_block_delta' && data.delta?.type === 'text_delta') {
console.log('Ответ:', data.delta.text);
} else if (eventType === 'message_stop') {
console.log('Завершение ответа');
}
};
// Отправка запроса с потоковым мышлением
const messages = [
{ role: 'user', content: 'Объясни квантовую механику' }
];
const options = {
model: 'claude-3-7-sonnet-20240229',
thinking: true,
temperature: 0.7
};
const response = await sdk.chat.streamChatWithThinking(
messages,
options,
handleEvent
);
```
## Обработка ошибок
```javascript
try {
await sdk.chat.streamChatWithThinking(
messages,
options,
handleEvent
);
} catch (error) {
if (error.code === 'CONNECTION_ERROR') {
console.error('Ошибка подключения:', error.message);
} else {
console.error('Произошла ошибка:', error.message);
}
}
```
## Настройка WebSocket
```javascript
// Настройка параметров WebSocket при создании SDK
const sdk = new CodeSolverSDK({
baseURL: 'https://api.example.com',
apiKey: 'your-api-key',
websocket: {
reconnect: true, // Автоматическое переподключение
reconnectAttempts: 5, // Максимальное количество попыток
rejectUnauthorized: false // Для самоподписанных сертификатов
}
});
```
## Дополнительная информация
Для детального описания всех возможностей WebSocket, смотрите [руководство по мышлению](./features/THINKING.md) и примеры в директории [examples/websocket](../examples/websocket).