Представьте ситуацию: вы работаете с AI-ассистентом для кода, нажимаете Tab, получаете идеальное автодополнение. Магия? Не совсем. За каждым нажатием клавиши скрывается сложная инженерная система, которая решает критический вопрос: что именно отправить в контекстное окно языковой модели?
Один инженер решил приподнять завесу тайны и провёл техническое исследование, достойное детективного романа. Он написал MITM-прокси, перехватил 3,177 API-вызовов от четырёх популярных AI coding tools и проанализировал каждый байт данных, отправленный в облако. Результаты переворачивают представление о том, как работают современные AI-ассистенты для разработчиков.
Задача звучит просто: посмотреть, что именно Cursor, GitHub Copilot, Windsurf и Cody отправляют в API OpenAI и Anthropic. Но эти инструменты не оставляют debug-логов с полными промптами. Решение классическое для любого reverse engineering challenge — Man-in-the-Middle прокси.
Технический стек исследования:
mitmdump -s capture_script.py
# Custom addon для логирования
class APICapture:
def request(self, flow):
if "api.openai.com" in flow.request.url:
log_request(flow.request.content)
Исследователь работал над реальным проектом (Python-бэкенд на FastAPI) в течение недели, поочерёдно используя каждый инструмент. Никаких синтетических бенчмарков — только real-world coding patterns: рефакторинг, новые фичи, багфиксы, code review.
Каждый API-вызов логировался с метаданными: timestamp, размер контекста в токенах, используемая модель, latency, тип операции (autocomplete/chat/refactor).
Первая метрика, которая шокирует — разброс в размере контекстного окна. Разница между инструментами достигает 10x:
GitHub Copilot: 1,200-1,500 токенов в среднем. Минималистичный подход — текущий файл, несколько импортированных модулей, базовый LSP-контекст (определения функций, классы).
Cursor: 3,500-4,500 токенов. Умеренная стратегия — текущий файл, semantic search по кодобазе с ранжированием relevance, git diff для uncommitted changes, related files на основе import graph.
Windsurf: 8,000-12,000 токенов. Агрессивный подход — половина проекта в контексте, автоматическое подключение документации, все открытые файлы, history recent edits.
Cody: 2,000-20,000 токенов (adaptive). Переменная стратегия — контекст масштабируется в зависимости от сложности запроса. Простой autocomplete — 2k токенов, архитектурный рефакторинг — 20k.
Интуитивно кажется: больше контекста = лучше понимание кода = качественнее предложения. Данные показывают обратное.
Исследователь оценивал качество каждого предложения по шкале 1-5 (relevance, correctness, usefulness). Результаты контринтуитивны:
Windsurf с его гигантскими контекстами проигрывает всем остальным по качеству! В чём проблема?
Context noise. Языковые модели испытывают трудности с извлечением релевантной информации из огромных промптов. Это подтверждается исследованиями "Lost in the Middle" (Liu et al., 2023) — модели хуже работают с информацией в середине длинного контекста.
В видео выше я подробно разбираю каждый инструмент, показываю примеры перехваченных промптов и объясняю, почему semantic ranking важнее raw context size.
Детальный анализ перехваченных запросов показывает, как именно формируется контекстное окно:
Git diff (только Cursor): uncommitted changes отправляются в контекст. Гениальная идея — модель понимает ваш intent через паттерн правок.
# Пример контекста от Cursor
+ def process_user_data(user_id: int):
+ # TODO: add validation
Модель видит, что вы начали писать функцию и добавили TODO про validation — следующее предложение будет про input sanitization.
Linter errors (Cursor, Cody): красные подчёркивания в редакторе попадают в контекст как structured errors. Модель может исправить их проактивно.
Recent edits history (только Cursor): последние 10 операций редактирования включаются как "editing pattern". Если вы рефакторили 5 функций одинаково, модель продолжит паттерн.
Codebase embeddings (Cursor, Windsurf, Cody): semantic search по векторной базе кодобазы. Но реализации отличаются:
Documentation (только Windsurf): автоматическое подключение external docs (MDN, Python docs). Часто добавляет noise — generic информация вместо project-specific контекста.
Terminal output не включается НИКЕМ автоматически. Ваши compilation errors, test failures, stack traces остаются за бортом контекста. Приходится копировать вручную в chat.
Самая тревожная часть исследования — какие данные попадают в API непреднамеренно.
Если у вас открыт .env файл в соседней вкладке редактора, некоторые инструменты включают его в контекст:
.gitignore — .env исключаетсяРеальный пример из логов:
# Перехваченный запрос от Windsurf
context: [
"config.py",
".env", # ← WTF?
"database.py"
]
Email адреса из комментариев, внутренние URLs, имена клиентов из тестовых данных — всё это отправляется в облако без санитизации.
Semantic search может найти и включить файлы из совсем других модулей проекта. Если у вас есть секретный ML-алгоритм в models/proprietary/, а вы работаете над UI — есть шанс, что часть алгоритма попадёт в контекст через similarity search.
.cursorignore, .codiignore с паттернами секретных папокРазмер контекста прямо влияет на время отклика. Измерения latency (от keypress до suggestion):
Разница в 1 секунду кажется несущественной, но для developer experience это критично. При latency >500ms разработчики начинают ждать предложения вместо того, чтобы печатать естественно. Flow state разрушается.
Оценочная стоимость при активном использовании (8 часов coding/день):
Windsurf в 6 раз дороже по токенам из-за раздутых контекстов. Pricing model скрывает это от пользователя, но при scale (team из 50 devs) разница становится существенной.
Перехваченные API-запросы раскрывают, какие именно модели работают в каждом инструменте:
GitHub Copilot:
gpt-3.5-turbo для autocomplete (fast, cheap)gpt-4 для chat/explain командCursor:
claude-3-haiku для fast completionsclaude-3.5-sonnet для complex refactoringgpt-4o-mini как fallback при rate limitsWindsurf:
gpt-4 для explain/refactor режимовCody:
claude-3.5-sonnet primaryИнтересно: Cursor и Cody предпочитают Claude для code generation, Copilot остаётся на GPT. Это объясняет разницу в стиле предложений — Claude более "многословный" в комментариях, GPT более лаконичный.
После анализа 3,177 API-вызовов вырисовывается чёткая картина:
1. Оптимальный размер контекста — 4,000-5,000 токенов с intelligent ranking. Больше = noise, меньше = недостаток информации.
2. Privacy требует активных действий. Default behaviour всех инструментов — "отправить всё, что может быть релевантно". Защита данных — ваша ответственность.
3. Latency важнее feature set. 200ms vs 1000ms — разница между seamless experience и frustration.
4. Нет универсального лидера. Cursor лучше для complex refactoring, Copilot для быстрого autocomplete, Cody для enterprise с compliance требованиями.
5. Git context — недооценённая фича. Только Cursor включает uncommitted changes в контекст, но эффект огромный для понимания intent.
Как использовать эти знания в повседневной работе:
Оптимизация контекста:
.cursorignore / .codiignore для vendor/, build/, secrets/Privacy checklist:
.env открытым при работе с AIPerformance tuning:
Hybrid approach:
Это исследование доказывает: AI coding tools — не чёрные ящики. Это engineered systems с измеримыми trade-offs между контекстом, скоростью, стоимостью и приватностью. Понимание их архитектуры делает вас эффективнее — и безопаснее.