Анатомия контекстного окна: что AI coding tools отправляют в API

Я перехватил 3177 запросов: что AI-ассистенты прячут в контексте

Представьте ситуацию: вы работаете с AI-ассистентом для кода, нажимаете Tab, получаете идеальное автодополнение. Магия? Не совсем. За каждым нажатием клавиши скрывается сложная инженерная система, которая решает критический вопрос: что именно отправить в контекстное окно языковой модели?

Один инженер решил приподнять завесу тайны и провёл техническое исследование, достойное детективного романа. Он написал MITM-прокси, перехватил 3,177 API-вызовов от четырёх популярных AI coding tools и проанализировал каждый байт данных, отправленный в облако. Результаты переворачивают представление о том, как работают современные AI-ассистенты для разработчиков.

Методология: reverse engineering контекстного окна

Задача звучит просто: посмотреть, что именно 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). Результаты контринтуитивны:

  • GitHub Copilot (1,500 токенов): 78% релевантных предложений
  • Cursor (4,500 токенов): 81% релевантных предложений
  • Windsurf (12,000 токенов): 62% релевантных предложений
  • Cody (adaptive): 71% релевантных предложений

Windsurf с его гигантскими контекстами проигрывает всем остальным по качеству! В чём проблема?

Context noise. Языковые модели испытывают трудности с извлечением релевантной информации из огромных промптов. Это подтверждается исследованиями "Lost in the Middle" (Liu et al., 2023) — модели хуже работают с информацией в середине длинного контекста.

В видео выше я подробно разбираю каждый инструмент, показываю примеры перехваченных промптов и объясняю, почему semantic ranking важнее raw context size.

Анатомия промпта: что попадает в API

Детальный анализ перехваченных запросов показывает, как именно формируется контекстное окно:

Базовые компоненты (все инструменты)

  • Текущий файл — 100% включения
  • LSP-метаданные — определения функций, type hints, docstrings
  • Cursor position — где находится каретка

Продвинутые компоненты (selective)

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 по векторной базе кодобазы. Но реализации отличаются:

  • Cursor: top-5 файлов по cosine similarity
  • Windsurf: top-20 файлов (отсюда раздутый контекст)
  • Cody: adaptive threshold-based retrieval

Documentation (только Windsurf): автоматическое подключение external docs (MDN, Python docs). Часто добавляет noise — generic информация вместо project-specific контекста.

Критическое упущение

Terminal output не включается НИКЕМ автоматически. Ваши compilation errors, test failures, stack traces остаются за бортом контекста. Приходится копировать вручную в chat.

Privacy nightmare: что утекает в облако

Самая тревожная часть исследования — какие данные попадают в API непреднамеренно.

API keys в контексте

Если у вас открыт .env файл в соседней вкладке редактора, некоторые инструменты включают его в контекст:

  • Cursor, Cody: фильтруют файлы по .gitignore.env исключается
  • Copilot, Windsurf: НЕ фильтруют — ключи утекают в OpenAI API

Реальный пример из логов:

# Перехваченный запрос от Windsurf
context: [
  "config.py",
  ".env",  # ← WTF?
  "database.py"
]

PII (Personally Identifiable Information)

Email адреса из комментариев, внутренние URLs, имена клиентов из тестовых данных — всё это отправляется в облако без санитизации.

Proprietary algorithms

Semantic search может найти и включить файлы из совсем других модулей проекта. Если у вас есть секретный ML-алгоритм в models/proprietary/, а вы работаете над UI — есть шанс, что часть алгоритма попадёт в контекст через similarity search.

Решения

  1. Используйте ignore-файлы: .cursorignore, .codiignore с паттернами секретных папок
  2. Закрывайте sensitive файлы в редакторе
  3. Enterprise: только self-hosted решения (Cody on-premises, Tabnine Enterprise)
  4. Аудит: периодически проверяйте, что отправляется (MITM proxy в dev-режиме)

Performance: latency убивает developer experience

Размер контекста прямо влияет на время отклика. Измерения latency (от keypress до suggestion):

  • GitHub Copilot: 180-300ms — мгновенно, не прерывает flow
  • Cursor: 400-600ms — комфортно, почти незаметно
  • Cody: 500-900ms — ощутимая задержка
  • Windsurf: 800-1,500ms — раздражает, ломает typing rhythm

Разница в 1 секунду кажется несущественной, но для developer experience это критично. При latency >500ms разработчики начинают ждать предложения вместо того, чтобы печатать естественно. Flow state разрушается.

Экономика токенов

Оценочная стоимость при активном использовании (8 часов coding/день):

  • Copilot: $10/month flat rate (не зависит от usage)
  • Cursor: ~$25-40/month на API credits
  • Cody: ~$15-30/month (зависит от tier)
  • Windsurf: ~$60-80/month

Windsurf в 6 раз дороже по токенам из-за раздутых контекстов. Pricing model скрывает это от пользователя, но при scale (team из 50 devs) разница становится существенной.

Модели под капотом: кто использует какой LLM

Перехваченные API-запросы раскрывают, какие именно модели работают в каждом инструменте:

GitHub Copilot:

  • gpt-3.5-turbo для autocomplete (fast, cheap)
  • gpt-4 для chat/explain команд

Cursor:

  • claude-3-haiku для fast completions
  • claude-3.5-sonnet для complex refactoring
  • gpt-4o-mini как fallback при rate limits

Windsurf:

  • Proprietary fine-tuned model (похоже на Codestral-based)
  • gpt-4 для explain/refactor режимов

Cody:

  • claude-3.5-sonnet primary
  • Support для custom models (Llama 3, Mixtral, StarCoder)

Интересно: 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/
  • При работе над большой фичей — создавайте temporary workspace с minimal context

Privacy checklist:

  • Никогда не держите .env открытым при работе с AI
  • Проверьте Privacy Policy инструмента (OpenAI использует данные для обучения, Anthropic — нет)
  • Для proprietary code — только self-hosted решения

Performance tuning:

  • Если инструмент тормозит — проверьте размер проекта (>100k files создают lag в semantic search)
  • Используйте SSD для кодобазы (embeddings generation требует fast I/O)
  • Отключайте automatic documentation fetching в Windsurf

Hybrid approach:

  • Copilot для autocomplete (fast, cheap)
  • Claude/GPT в браузере для архитектурных вопросов (полный контроль над контекстом)
  • Local code models (StarCoder, DeepSeek Coder) для sensitive code

Это исследование доказывает: AI coding tools — не чёрные ящики. Это engineered systems с измеримыми trade-offs между контекстом, скоростью, стоимостью и приватностью. Понимание их архитектуры делает вас эффективнее — и безопаснее.

Можно ещё почитать:
Loading...
Пожалуйста ждите...