solver-sdk
Version:
SDK для интеграции с Code Solver Backend API
342 lines (298 loc) • 12 kB
Markdown
as vscode from 'vscode';
import { CodeSolverSDK } from 'solver-sdk';
// Инициализация SDK
const sdk = new CodeSolverSDK({
baseURL: 'https://api.example.com',
apiKey: 'your-api-key',
websocket: {
reconnect: true,
reconnectAttempts: 5,
reconnectDelay: 3000,
rejectUnauthorized: false // для самоподписанных сертификатов
}
});
// Проверка доступности API
async function checkConnection() {
try {
const isHealthy = await sdk.checkHealth();
if (isHealthy) {
vscode.window.showInformationMessage('API доступен');
} else {
vscode.window.showErrorMessage('API недоступен');
}
} catch (error) {
vscode.window.showErrorMessage(`Ошибка соединения: ${error.message}`);
}
}
```
Пример автоматической работы с проектом при открытии рабочей области:
```typescript
import * as path from 'path';
// Получение проекта по пути рабочей области
async function handleWorkspace() {
try {
// Получаем путь к текущей рабочей области
const workspaceFolders = vscode.workspace.workspaceFolders;
if (!workspaceFolders || workspaceFolders.length === 0) {
vscode.window.showWarningMessage('Откройте папку проекта');
return;
}
const workspacePath = workspaceFolders[0].uri.fsPath;
const projectName = path.basename(workspacePath);
// Получаем проект или создаем новый
const project = await sdk.projects.getOrCreateProject(
workspacePath,
projectName
);
if (project) {
vscode.window.showInformationMessage(`Проект "${projectName}" идентифицирован (ID: ${project.id})`);
return project;
}
} catch (error) {
vscode.window.showErrorMessage(`Ошибка: ${error.message}`);
}
return null;
}
```
Пример отслеживания прогресса индексации:
```typescript
// Запуск индексации проекта
async function indexProject(projectId, projectName) {
try {
// Запускаем индексацию
await sdk.projects.indexProject(projectId);
// Показываем прогресс
vscode.window.withProgress({
location: vscode.ProgressLocation.Notification,
title: `Индексация проекта "${projectName}"`,
cancellable: true
}, async (progress, token) => {
// Подключаемся к WebSocket для индексации
await sdk.projects.connectWebSocket();
return new Promise((resolve) => {
// Отслеживаем прогресс
sdk.projects.on('indexing_progress', (data) => {
progress.report({
message: `${data.progress}% (${data.processedFiles}/${data.totalFiles} файлов)`,
increment: data.progress
});
});
// Отслеживаем завершение
sdk.projects.on('indexing_complete', (data) => {
if (data.success) {
vscode.window.showInformationMessage('Индексация успешно завершена!');
} else {
vscode.window.showWarningMessage(`Индексация завершена с ошибками: ${data.errorMessage || 'неизвестная ошибка'}`);
}
sdk.projects.disconnectWebSocket();
resolve();
});
// Обработка отмены
token.onCancellationRequested(() => {
sdk.projects.stopIndexing(projectId)
.then(() => {
vscode.window.showInformationMessage('Индексация отменена');
sdk.projects.disconnectWebSocket();
resolve();
});
});
});
});
} catch (error) {
vscode.window.showErrorMessage(`Ошибка индексации: ${error.message}`);
}
}
```
Пример использования потокового чата с мышлением:
```typescript
// Регистрация команды чата с мышлением
context.subscriptions.push(
vscode.commands.registerCommand('solver.chatWithThinking', async () => {
try {
// Запрашиваем ввод от пользователя
const question = await vscode.window.showInputBox({
prompt: 'Введите вопрос'
});
if (!question) return;
// Создаем и показываем панель для результата
const panel = vscode.window.createWebviewPanel(
'chatWithThinking',
'Ответ с мышлением',
vscode.ViewColumn.Beside,
{ enableScripts: true }
);
// Начальный HTML для панели
panel.webview.html = `
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: var(--vscode-font-family); padding: 10px; }
.thinking { color:
.answer { white-space: pre-wrap; }
</style>
</head>
<body>
<h3>Вопрос: ${question}</h3>
<div class="thinking" id="thinking"></div>
<h4>Ответ:</h4>
<div class="answer" id="answer"></div>
</body>
</html>
`;
// Сообщения для чата
const messages = [
{ role: 'user', content: question }
];
// Опции для чата
const options = {
model: 'claude-3-7-sonnet-20240229',
thinking: true,
temperature: 0.7
};
// Обработчик событий чата
const handleEvent = (eventType, data) => {
if (eventType === 'thinking_delta' && data.thinking) {
// Обновляем содержимое мышления
panel.webview.postMessage({
command: 'appendThinking',
content: data.thinking
});
} else if (eventType === 'text_delta' && data.text) {
// Обновляем содержимое ответа
panel.webview.postMessage({
command: 'appendAnswer',
content: data.text
});
}
};
// Отправляем запрос с мышлением
await sdk.chat.streamChatWithThinking(
messages,
options,
handleEvent
);
// Настраиваем обработку сообщений в WebView
panel.webview.onDidReceiveMessage(message => {
const thinkingElement = document.getElementById('thinking');
const answerElement = document.getElementById('answer');
if (message.command === 'appendThinking') {
thinkingElement.textContent += message.content;
} else if (message.command === 'appendAnswer') {
answerElement.textContent += message.content;
}
});
} catch (error) {
vscode.window.showErrorMessage(`Ошибка чата: ${error.message}`);
}
})
);
```
Пример семантического поиска в проекте:
```typescript
// Поиск в проекте
async function searchInProject(projectId, query) {
try {
// Показываем индикатор прогресса
return vscode.window.withProgress({
location: vscode.ProgressLocation.Notification,
title: 'Поиск в проекте...',
cancellable: false
}, async (progress) => {
// Выполняем поиск
const results = await sdk.search.semanticSearch(projectId, {
query: query,
limit: 10,
includeContent: true
});
if (results.results.length === 0) {
vscode.window.showInformationMessage('Результаты не найдены');
return;
}
// Отображаем результаты
const panel = vscode.window.createWebviewPanel(
'searchResults',
'Результаты поиска',
vscode.ViewColumn.Beside,
{ enableScripts: true }
);
// Формируем HTML для отображения результатов
panel.webview.html = `
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: var(--vscode-font-family); padding: 10px; }
.result { margin-bottom: 15px; padding: 10px; border: 1px solid
.path { cursor: pointer; color: var(--vscode-textLink-foreground); }
.snippet { background: var(--vscode-editor-inactiveSelectionBackground); padding: 10px; margin-top: 5px; white-space: pre-wrap; }
</style>
</head>
<body>
<h3>Результаты для: ${query}</h3>
${results.results.map((result, index) => `
<div class="result">
<div class="path" data-path="${result.filePath}" data-start="${result.startLine}" data-end="${result.endLine}">
${result.filePath}:${result.startLine}-${result.endLine}
</div>
<div class="snippet">${result.snippet || result.content || ''}</div>
</div>
`).join('')}
<script>
// Добавляем обработчик для открытия файлов
document.querySelectorAll('.path').forEach(elem => {
elem.addEventListener('click', () => {
const vscode = acquireVsCodeApi();
vscode.postMessage({
command: 'openFile',
filePath: elem.dataset.path,
startLine: parseInt(elem.dataset.start),
endLine: parseInt(elem.dataset.end)
});
});
});
</script>
</body>
</html>
`;
// Обработка сообщений от WebView
panel.webview.onDidReceiveMessage(
message => {
if (message.command === 'openFile') {
const uri = vscode.Uri.file(message.filePath);
vscode.workspace.openTextDocument(uri).then(doc => {
vscode.window.showTextDocument(doc).then(editor => {
const range = new vscode.Range(
new vscode.Position(message.startLine - 1, 0),
new vscode.Position(message.endLine - 1, 0)
);
editor.revealRange(range);
});
});
}
},
undefined,
context.subscriptions
);
return results;
});
} catch (error) {
vscode.window.showErrorMessage(`Ошибка поиска: ${error.message}`);
}
}
```
В этом документе приведены примеры использования SDK с VS Code или Cursor расширениями.
- [Инициализация SDK](
- [Работа с проектами](
- [Отслеживание прогресса индексации](
- [Потоковый чат с мышлением](
- [Поиск в коде](
Пример инициализации SDK в расширении VS Code/Cursor:
```typescript
import *