Разработчики тратят часы на поиск в документации и написание шаблонного кода. Наше AI-расширение встраивается прямо в редактор и ускоряет рутинные задачи в 2–3 раза. За 5 лет мы разработали более 20 инструментов с интеграцией LLM — от простого автодополнения до полноценных чат-панелей с контекстом проекта. Интеграция с API Anthropic и OpenAI позволяет гибко выбирать модель под задачу, а стриминг через client.messages.stream() даёт первые токены за 200–300 мс. Средняя стоимость одного объяснения кода через Claude Haiku — около $0.25, а генерация тестов через GPT-4o mini — $0.15 за 1K токенов.
Одна из частых проблем — задержка при генерации. Мы используем стриминг, первые токены появляются за 200–300 мс. P99 latency для коротких запросов — менее 1.5 с. Чтобы снизить галлюцинации, добавляем контекст из активного файла и few-shot примеры — это уменьшает число неверных подсказок на 40%. В результате разработчик получает релевантные предложения без необходимости перепроверять каждое. Экономия времени позволяет сократить затраты на разработку на 30–50%.
Какие проблемы решаем?
- Задержки при генерации — модели с низкой задержкой (Claude Haiku, GPT-4o mini), стриминг и debounce 300 мс.
- Галлюцинации — контекст проекта, few-shot, кастомные промпты под ваш стек (Django, React, FastAPI).
- Интеграция с Extension API — типовые ошибки: пропущенный cleanup в
deactivate(), утечки в WebView. Мы прорабатываем это на код-ревью. - Публикация в Marketplace — подготовка иконок, описание, тестирование на разных версиях VS Code (1–2 дня).
Как мы это делаем?
Стек: TypeScript, VS Code Extension API, Anthropic SDK / OpenAI SDK. Для inline completion используем InlineCompletionItemProvider, для чата — WebView с acquireVsCodeApi(). Все вызовы LLM асинхронные, с повторными попытками при таймаутах. Ниже — сравнение моделей для разных задач.
| Задача | Рекомендуемая модель | Задержка p99 | Стоимость за 1K токенов |
|---|---|---|---|
| Explain code | Claude Haiku 4 | ~0.8 с | ~$0.25 |
| Refactor | Claude Sonnet 4 | ~1.2 с | ~$3.0 |
| Generate tests | GPT-4o mini | ~1.0 с | ~$0.15 |
| Chat history | GPT-4o | ~2.0 с | ~$5.0 |
| Подход | Гибкость | Производительность | Сложность разработки |
|---|---|---|---|
| Встроенные модели VS Code | Низкая | Высокая | Низкая |
| API LLM (наша реализация) | Высокая | Средняя (зависит от модели) | Средняя |
| Локальный LLM через ONNX | Средняя | Низкая (зависит от GPU) | Высокая |
VS Code Extension API предоставляет богатые возможности для интеграции AI-сервисов. Документация
Пример конфигурации для OpenAI
{ "aiAssistant.model": "gpt-4o-mini", "aiAssistant.apiKey": "sk-..." } Почему кастомное расширение лучше готового?
Готовые решения из Marketplace часто не знают специфику вашего стека. Мы настраиваем промпты под ваши библиотеки и добавляем code actions для конкретных ошибок. Например, расширение может автоматически предлагать try/except для блоков с риском исключений. Это сокращает время код-ревью в 2–3 раза.
Что входит в работу?
- Исходный код расширения с документацией.
- Интеграция с вашей LLM (бесплатные ключи не предоставляем).
- Настройка CI/CD для публикации.
- Поддержка в течение 1 месяца после сдачи.
Как устроен провайдер inline completion?
Провайдер реализует интерфейс InlineCompletionItemProvider. При каждом вводе символа отправляется запрос к LLM с контекстом текущего файла. Мы используем debounce 300 мс и кэшируем результаты для одинаковых контекстов. Это позволяет держать latency p99 ниже 1.5 с.
Структура расширения
Код ниже — конфигурация для четырёх команд и code actions.
{ "name": "ai-dev-assistant", "displayName": "AI Dev Assistant", "engines": { "vscode": "^1.85.0" }, "activationEvents": ["onStartupFinished"], "contributes": { "commands": [ { "command": "aiAssistant.explainCode", "title": "AI: Explain Code" }, { "command": "aiAssistant.refactor", "title": "AI: Refactor Selection" }, { "command": "aiAssistant.generateTests", "title": "AI: Generate Tests" }, { "command": "aiAssistant.openChat", "title": "AI: Open Chat" } ], "keybindings": [ { "command": "aiAssistant.explainCode", "key": "ctrl+shift+e", "when": "editorTextFocus" } ], "configuration": { "title": "AI Assistant", "properties": { "aiAssistant.apiKey": { "type": "string", "description": "Anthropic API Key" }, "aiAssistant.model": { "type": "string", "default": "claude-haiku-4-5", "enum": ["claude-haiku-4-5", "claude-sonnet-4-5"] } } } }, "main": "./out/extension.js" } Основной файл расширения
import * as vscode from 'vscode'; import Anthropic from '@anthropic-ai/sdk'; let client: Anthropic; export function activate(context: vscode.ExtensionContext) { const config = vscode.workspace.getConfiguration('aiAssistant'); client = new Anthropic({ apiKey: config.get('apiKey') || '' }); context.subscriptions.push( vscode.commands.registerCommand('aiAssistant.explainCode', explainSelectedCode) ); // ... другие команды } async function explainSelectedCode() { const editor = vscode.window.activeTextEditor; if (!editor) return; const selection = editor.selection; const selectedText = editor.document.getText(selection); if (!selectedText) { vscode.window.showWarningMessage('Выберите код для объяснения'); return; } await vscode.window.withProgress( { location: vscode.ProgressLocation.Notification, title: 'AI анализирует код...' }, async () => { const response = await client.messages.create({ model: 'claude-haiku-4-5', max_tokens: 1024, messages: [{ role: 'user', content: `Объясни этот код кратко и понятно:\n\`\`\`\n${selectedText}\n\`\`\`` }] }); const explanation = response.content[0].type === 'text' ? response.content[0].text : ''; const outputChannel = vscode.window.createOutputChannel('AI Assistant'); outputChannel.appendLine('=== AI Объяснение ==='); outputChannel.appendLine(explanation); outputChannel.show(); } ); } Chat Panel
class ChatPanel { private static currentPanel?: ChatPanel; private readonly panel: vscode.WebviewPanel; static createOrShow(extensionUri: vscode.Uri) { if (ChatPanel.currentPanel) { ChatPanel.currentPanel.panel.reveal(); return; } const panel = vscode.window.createWebviewPanel( 'aiChat', 'AI Chat', vscode.ViewColumn.Beside, { enableScripts: true } ); ChatPanel.currentPanel = new ChatPanel(panel, extensionUri); } constructor(panel: vscode.WebviewPanel, extensionUri: vscode.Uri) { this.panel = panel; this.panel.webview.html = this.getWebviewContent(); this.panel.webview.onDidReceiveMessage(async message => { if (message.type === 'chat') { const stream = await client.messages.stream({ model: 'claude-sonnet-4-5', max_tokens: 2048, messages: message.history, }); for await (const chunk of stream.textStream) { this.panel.webview.postMessage({ type: 'token', text: chunk }); } this.panel.webview.postMessage({ type: 'done' }); } }); } private getWebviewContent(): string { return `<!DOCTYPE html> <html> <head><style>/* styles */</style></head> <body> <div id="messages"></div> <input type="text" id="input" placeholder="Задайте вопрос..." /> <button onclick="sendMessage()">Отправить</button> <script> const vscode = acquireVsCodeApi(); const history = []; function sendMessage() { const input = document.getElementById('input'); history.push({ role: 'user', content: input.value }); vscode.postMessage({ type: 'chat', history }); input.value = ''; } window.addEventListener('message', event => { const msg = event.data; if (msg.type === 'token') { // Append token } }); </script> </body> </html>`; } } Code Actions Provider
class AICodeActionProvider implements vscode.CodeActionProvider { provideCodeActions( document: vscode.TextDocument, range: vscode.Range, ): vscode.CodeAction[] { const actions: vscode.CodeAction[] = []; const selectedText = document.getText(range); if (!selectedText) return actions; const explainAction = new vscode.CodeAction('AI: Объяснить', vscode.CodeActionKind.RefactorRewrite); explainAction.command = { command: 'aiAssistant.explainCode', title: 'Объяснить' }; actions.push(explainAction); return actions; } } Процесс работы
- Аналитика — изучаем ваши сценарии, выбираем модель LLM.
- Проектирование — проектируем команды, WebView, провайдеры.
- Разработка — пишем код на TypeScript, настраиваем API-клиенты.
- Тестирование — тестируем на реальных проектах, замеряем latency.
- Публикация — публикуем в VS Code Marketplace, настраиваем CI/CD.
Сроки ориентировочно
- Базовые команды (explain, refactor): 3–5 дней.
- Chat panel с WebView: 1 неделя.
- Inline completion provider: 1–2 недели.
- Публикация в Marketplace: 1–2 дня.
Типичные ошибки при самостоятельной разработке
- Использование
activate()без вызоваcontext.subscriptions.push()— команды не регистрируются. - Игнорирование
dispose()для WebView — утечка памяти. - Отсутствие fallback при недоступности API — пользователь видит пустой экран.
Свяжитесь с нами для оценки вашего проекта. Закажите разработку AI-расширения, которое будет работать именно под ваши задачи. Опыт нашей команды — 5 лет, гарантируем качество и поддержку в течение 30 дней после публикации. Расскажите о своем проекте — мы предложим оптимальную архитектуру расширения.







