UNPKG

solver-sdk

Version:

SDK для интеграции с Code Solver Backend API

342 lines (298 loc) 12 kB
# Примеры интеграции с VS Code/Cursor В этом документе приведены примеры использования SDK с VS Code или Cursor расширениями. ## Содержание - [Инициализация SDK](#инициализация-sdk) - [Работа с проектами](#работа-с-проектами) - [Отслеживание прогресса индексации](#отслеживание-прогресса-индексации) - [Потоковый чат с мышлением](#потоковый-чат-с-мышлением) - [Поиск в коде](#поиск-в-коде) ## Инициализация SDK Пример инициализации SDK в расширении VS Code/Cursor: ```typescript import * 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: #666; font-style: italic; white-space: pre-wrap; } .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 #ccc; } .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}`); } } ```