UNPKG

solver-sdk

Version:

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

328 lines (285 loc) 11.4 kB
# Примеры интеграции SDK В этом документе приведены примеры использования 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> <script> const vscode = acquireVsCodeApi(); window.addEventListener('message', event => { const message = event.data; if (message.command === 'appendThinking') { document.getElementById('thinking').textContent += message.content; } else if (message.command === 'appendAnswer') { document.getElementById('answer').textContent += message.content; } }); </script> </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 ); } 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 для отображения результатов let resultsHtml = ''; results.results.forEach((result, index) => { resultsHtml += ` <div class="result"> <div class="path" data-path="${result.path}">${result.path}</div> <div class="snippet">${result.content || 'Содержимое недоступно'}</div> </div> `; }); 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> ${resultsHtml} <script> const vscode = acquireVsCodeApi(); document.querySelectorAll('.path').forEach(element => { element.addEventListener('click', () => { vscode.postMessage({ command: 'openFile', path: element.getAttribute('data-path') }); }); }); </script> </body> </html> `; // Обработчик сообщений от WebView panel.webview.onDidReceiveMessage(message => { if (message.command === 'openFile') { const filePath = message.path; vscode.workspace.openTextDocument(filePath) .then(doc => vscode.window.showTextDocument(doc)); } }); }); } catch (error) { vscode.window.showErrorMessage(`Ошибка поиска: ${error.message}`); } }