GitHub Copilot runtime на Rust: 832 тыс. строк и 18× in-process

16 сентября 2026 года GitHub в посте Migrating the GitHub Copilot runtime to Rust, using Copilot разобрала, как Copilot agent runtime уехал с TypeScript и Node на больше чем 800 тысяч строк production Rust. Если вы поднимаете Copilot CLI, Copilot app или Copilot SDK в хосте, боте или IDE, это про тот же движок: меньше второго процесса с V8, быстрее старт сессии, меньше памяти на клиент.

Автор текста – Stephen Toub, Distinguished Engineer в Microsoft. Runtime изначально писали на TypeScript под Node и V8 для того, что сейчас GitHub Copilot cloud agent. На нём же выросли Copilot CLI, Copilot app, последние релизы VS Code и Visual Studio, Copilot Code Review, Copilot Cowork, Copilot Studio и оболочка ИИ в Excel, Outlook, PowerPoint и Word. Общий harness, разные оболочки.

832 тысячи строк in-place

План в начале мая 2026 оценивал runtime примерно в 130 тысяч строк TypeScript. Через порт, пишет Toub, прошло около 430 тысяч: в runtime спускали куски из TUI, а рядом десятки разработчиков с агентами лили сотни PR в неделю. К 21 августа production-слой стал на 100% Rust: 832 378 строк кода и 468 689 строк unit-тестов, плюс 174 675 строк E2E на TypeScript. В отдельном репозитории SDK ещё около 130 тысяч строк E2E на шести языках.

Переписывали не веткой-бомбой. 128 PR сажали в main по кускам: TypeScript-компонент меняли на тонкий шим в Rust и сразу гоняли существующие тесты. За roughly 14,5 недели ушло 135 релизов CLI: 100 pre-release и 35 stable, около 1,3 релиза в день. В семидневной выборке npm pre-release дали 10,5% скачиваний. К 14 сентября десятки известных регрессий порта уже закрыли.

Код писали в основном агенты Copilot: Copilot app и Copilot CLI, 128 PR, один ведущий разработчик при живой команде, которая в это же время расширяла runtime. Раньше, пишет Toub, такой объём занял бы целую команду на год-два и просто не взяли бы в работу.

C ABI вместо Node-процесса

Пока runtime жил внутри CLI, SDK поднимал его как subprocess: JSON-RPC по stdin/stdout, отдельный Node и V8, порядка 100 МБ working set на клиент, даже если хосту этот runtime был не нужен. C#, Python, Go, Java, TypeScript и Rust платили вторым языковым движком. Падение Node рвало сессию. Наблюдать приходилось два процесса.

Цель порта – нативный бинарь с C ABI: in-process через FFI всех шести SDK и по желанию stdin/stdout или сокет, если процесс всё же нужен отдельно. TUI CLI должны были снять с runtime; сегодня CLI ещё ходит во внутренности в нескольких местах, полный выход на публичную поверхность SDK – текущая работа. Это перевод поведения, не новая модель и не новый id в чате.

unsafe в runtime-crate: 158 блоков в 36 файлах. Все про внешний контур: C ABI 32,3%, Windows API 31%, POSIX/libc 29,1%, SQLite 4,4%. Borrow checker в диагностиках rustc занял 1,7%. Основная каша – имена, поля, типы и trait bounds.

5.25 с → 292 мс

Замеры – C# SDK, локальный детерминированный chat completion, без сети и без инференса модели. Сравнивают систему целиком: 12 мая TypeScript runtime через Node по stdio против 21 августа Rust, out-of-process и in-process. Другие изменения за те же месяцы тоже попали в цифру, автор это прямо оговаривает.

Клиент, сессия, один ход и teardown: 5.25 с → 1.33 с out-of-process (4×) → 292 мс in-process (18×). Resume сессии на 32 хода: 5.64 с → 264 мс in-process (21,4×). Десять клиентов параллельно: 12.34 с → 742 мс (16,6×). Тысяча one-turn жизненных циклов на общем клиенте: 132.52 с → 20.93 с; throughput 7.55 → 120 сессий в секунду. В том же разделе график сводит create/session/turn/teardown in-process к 55.3 мс.

Память десяти клиентов над baseline: 1 383 МБ у дерева процессов до порта, 247 МБ у Rust out-of-process, 126 МБ in-process. Минус 91% на in-process контуре. CPU на той же нагрузке 100×10: 312 с суммарно у TypeScript, около 110 с у Rust. Для хоста, который держит много независимых сессий на одной машине, это плотность, не бенчмарк «Rust всегда в 16 раз быстрее».

$120 тысяч токенов

Счёт Toub за порт: около 136.3 млрд токенов, из них 130.6 млрд cached input read, 4.2 млрд cache write, 900 млн свежего входа и 600 млн выхода. Деньги: примерно $120 000. Cache hit rate 96.22%. По доле PR это около 20% его работы в окне порта, грубо три недели одного разработчика плюс команда на FFI, упаковку бинарей и нарезку crate. В логах сессий 12.76 млн событий и около 2 600 человеческих сообщений: в основном ревью, споры о дизайне и «это ещё не готово», а не «напиши весь runtime».

Для человека с сайтом, ботом или ключом 16 сентября нового тарифа и Linux-пакета не появилось. Появился движок, который шесть SDK могут грузить in-process без Node в зависимостях. Если вы уже на Copilot SDK, имеет смысл смотреть августовские сборки и не ждать, что CLI внезапно станет другим продуктом: TUI ещё живёт рядом, внутренние вызовы runtime из CLI ещё есть. Если Copilot у вас только как автодополнение в редакторе, этот пост можно закрыть как инженерный отчёт про harness, а не как смену модели в чате.

Источники и ссылки


Комментарии загружаются…