solver-sdk
Version:
SDK для интеграции с Code Solver Backend API
285 lines (221 loc) • 12.2 kB
Markdown
# Работа с WebSocket в Solver SDK
Эта документация описывает, как использовать WebSocket соединения через высокоуровневые методы Solver SDK для работы в реальном времени.
## Инициализация SDK
```javascript
const { CodeSolverSDK } = require('solver-sdk');
// Создаем экземпляр SDK с настройками
const sdk = new CodeSolverSDK({
baseURL: 'https://api.example.com',
apiKey: 'your-api-key',
websocket: {
reconnect: true, // Автоматическое переподключение при разрыве соединения
reconnectAttempts: 5, // Максимальное количество попыток переподключения
reconnectDelay: 3000 // Задержка между попытками (мс)
}
});
// Общее подключение к базовым WebSocket сервисам
await sdk.connect();
```
## Работа с файловой системой
```javascript
// Обязательно: для файловой системы projectId всегда необходим
const projectId = 'your-project-id';
// Метод 1: Подключение через файловую систему
await sdk.filesystem.connectWebSocket(projectId);
// Метод 2: Альтернативный способ подключения
await sdk.filesystem.connectToProject(projectId);
// Чтение файла через REST API (предпочтительный метод)
const content = await sdk.context.getFileContent(projectId, 'src/index.js');
// Отключение
await sdk.filesystem.disconnectWebSocket();
```
## Работа с индексацией проектов
```javascript
// Подключение к WebSocket для проектов без указания projectId
await sdk.projects.connectWebSocket();
// Или можно сразу указать проект (projectId опциональный)
await sdk.projects.connectWebSocket('project-id');
// Отслеживание прогресса индексации
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.indexProject('project-id');
```
## Работа с рассуждениями (Reasoning)
```javascript
// Создание рассуждения
const reasoning = await sdk.reasoning.createReasoning({
projectId: 'project-id',
query: 'Объясни этот проект'
});
// Подключение к WebSocket для рассуждений
// Не требует projectId в методе connectWebSocket
await sdk.reasoning.connectWebSocket();
// Присоединение к конкретному рассуждению
await sdk.reasoning.joinReasoning(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);
```
## Работа с зависимостями
```javascript
// Подключение к WebSocket для зависимостей без указания projectId
await sdk.dependencies.connectWebSocket();
// Затем необходимо присоединиться к конкретному проекту
await sdk.dependencies.joinProject('your-project-id');
// Подписка на события зависимостей
sdk.dependencies.on('dependency_update', (data) => {
console.log('Обновление зависимостей:', data);
});
// Отключение
await sdk.dependencies.disconnectWebSocket();
```
## Смена активного проекта
SDK поддерживает концепцию "активного проекта", что позволяет переключаться между проектами без полного переподключения:
```javascript
// Установка активного проекта
sdk.setActiveProject('new-project-id');
// После этого вызова SDK автоматически переподключит
// filesystem-namespace к новому проекту
```
## Потоковый чат с мышлением 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,
projectId: 'project-id' // Указываем projectId для контекста проекта
};
// Отправка с потоковым получением ответа
const response = await sdk.chat.streamChatWithThinking(
messages,
options,
handleEvent
);
```
## Автоматический ping/pong и reconnect
WebSocket клиенты в SDK автоматически обрабатывают ping/pong сообщения и reconnect:
```javascript
// Все WebSocket клиенты имеют автоматический ping/pong
// с настраиваемыми таймаутами
const sdk = new CodeSolverSDK({
websocket: {
pingInterval: 25000, // Интервал отправки ping (мс)
pingTimeout: 10000, // Таймаут ожидания pong (мс)
reconnect: true, // Автоматическое переподключение
reconnectAttempts: 5 // Макс. количество попыток
}
});
// При разрыве соединения SDK попытается автоматически переподключиться
// Вам не нужно писать свой код для обработки reconnect
```
## Метод connect в SDK и пространства имен
Метод `sdk.connect()` подключает только базовые пространства имен и не устанавливает подключение ко всем сервисам:
```javascript
// Общее подключение не передает projectId для файловой системы
await sdk.connect();
// Поэтому для работы с файловой системой нужно явно подключиться
await sdk.filesystem.connectWebSocket('your-project-id');
// Или можно при подключении сразу указать projectId, который будет использован для подключения к файловой системе
await sdk.connect('your-project-id');
```
## Сравнение сигнатур методов connectWebSocket
| API | Метод | Требуется projectId? |
|-----|-------|---------------------|
| `sdk.filesystem` | `connectWebSocket(projectId)` | **Обязательно** |
| `sdk.filesystem` | `connectToProject(projectId)` | **Обязательно** |
| `sdk.projects` | `connectWebSocket([projectId])` | **Опционально** |
| `sdk.reasoning` | `connectWebSocket()` | **Нет** |
| `sdk.reasoning` | `joinReasoning(reasoningId)` | **Обязательно** |
| `sdk.dependencies` | `connectWebSocket()` | **Нет** |
| `sdk.dependencies` | `joinProject(projectId)` | **Обязательно** |
## Обработка ошибок и переподключение
Используйте параметры `reconnect` и `reconnectAttempts` для автоматического переподключения при разрыве соединения:
```javascript
// Инициализация SDK с настройками переподключения
const sdk = new CodeSolverSDK({
baseURL: 'https://api.example.com',
apiKey: 'your-api-key',
websocket: {
reconnect: true,
reconnectAttempts: 5,
reconnectDelay: 3000
}
});
// Проверка доступности сервера перед началом работы
const isHealthy = await sdk.checkHealth();
if (!isHealthy) {
console.error('API недоступен');
return;
}
// Подключение к WebSocket серверу
const connected = await sdk.connect();
if (!connected) {
console.warn('WebSocket соединение не установлено, работа будет ограничена');
}
// Для работы с файловой системой необходимо отдельное подключение с projectId
const projectId = 'your-project-id';
await sdk.filesystem.connectWebSocket(projectId);
```
## Использование в Cursor
В Cursor клиенте projectId обычно получается через API проектов:
```javascript
// Получаем projectId для текущей рабочей области
const workspacePath = '/path/to/project';
const project = await sdk.projects.getOrCreateProjectByPath(workspacePath);
const projectId = project.id;
// Используем полученный projectId для подключения к файловой системе
await sdk.filesystem.connectWebSocket(projectId);
```
## Статус реализации функций
| Функция | Статус | Примечание |
|---------|--------|------------|
| `sdk.connect()` | ✅ Реализовано | Включает базовое подключение ко всем namespace |
| `sdk.setActiveProject()` | ✅ Реализовано | Работает в связке с filesystem-клиентом |
| `sdk.filesystem.connectWebSocket()` | ✅ Реализовано | Подключение к WebSocket для файловой системы |
| `sdk.filesystem.connectToProject()` | ✅ Реализовано | Альтернативный синтаксис для connectWebSocket |
| `sdk.context.getFileContent()` | ✅ Реализовано | Рекомендуемый метод для чтения файлов (через REST) |
| `sdk.projects.connectWebSocket()` | ✅ Реализовано | Подключение к namespace индексации |
| `sdk.reasoning.connectWebSocket()` | ✅ Реализовано | Требует последующего `joinReasoning()` |
| `sdk.dependencies.connectWebSocket()` | ✅ Реализовано | Требует последующего `joinProject()` |
| `sdk.chat.streamChatWithThinking()` | ✅ Реализовано | Потоковое получение ответов с мышлением |
## Основные события WebSocket
| Событие | Описание |
|---------|----------|
| `message_start` | Начало сообщения |
| `thinking_delta` | Обновление мышления AI |
| `text_delta` | Часть текстового ответа |
| `message_stop` | Конец сообщения |
| `indexing_progress` | Прогресс индексации |
| `indexing_complete` | Завершение индексации |
| `error` | Уведомление об ошибке |