17 сентября 2026 года GitHub опубликовал разбор переноса агентного движка Copilot с TypeScript и Node.js на Rust. Большую часть нового кода написали ИИ-агенты, а изменения внедряли постепенно через 128 pull request. Главная техническая цель: уменьшить расходы на запуск, память и встраивание движка в другие приложения.
Речь об общем компоненте, который используется в Copilot CLI, приложении Copilot и SDK, а также в других продуктах GitHub и Microsoft. Это программная среда для работы агента, а не переписывание весов языковой модели на другой язык.
Почему отдельный Node.js стал помехой
Первоначально интерфейс CLI и агентный движок были тесно связаны. Когда потребовался SDK, его сделали поверх CLI: приложение запускало дополнительный процесс без интерфейса и обменивалось с ним сообщениями через JSON-RPC.
Такой подход позволил быстро выпустить SDK для разных языков. Но каждый клиент получал дополнительные расходы на запуск Node.js, V8, загрузку JavaScript и обмен между процессами. По оценке автора, минимальный рабочий набор этого дополнительного окружения составлял порядка 100 МБ.
Для самостоятельного терминального приложения это один компромисс. Для библиотеки, которую встраивают в другой процесс и запускают во множестве экземпляров, требования уже другие. Поэтому команда выбрала Rust и возможность вызова через C ABI, общий интерфейс для подключения нативной библиотеки из разных языков.
Перенос шёл внутри работающего проекта
GitHub не ждал завершения переписывания в отдельной долгоживущей ветке. Компоненты переводили постепенно, сохраняя выпуск продукта. За примерно четырнадцать с половиной недель вышло 135 релизов, включая предварительные и стабильные.
Это помогало связывать найденную ошибку с небольшим набором недавних изменений. Одновременно сам движок продолжал развиваться, поэтому объём исходного TypeScript не просто последовательно уменьшался: в проект приходил новый код, который тоже требовалось переносить.
К 21 августа производственная реализация движка целиком состояла из Rust. Автор приводит 832 378 строк производственного кода. Этот объём не равен числу строк исходного проекта в начале работ и сам по себе не измеряет полезность переноса.
Во время перехода Rust и TypeScript связывали через N-API. По завершении временный внутренний слой взаимодействия убрали. Постоянный интерфейс SDK сохранился: JSON-RPC используется и для удалённых вызовов, и для выбранного варианта работы внутри процесса.
Компилятор не проверяет смысл поведения
Автор подробно разбирает регрессии. Например, число могло стать дробным там, где клиент ожидал целое; потеряться часть парной операции; измениться порядок событий или обработка пустой строки. Всё это могло успешно компилироваться.
В одном случае агент убрал метод SDK, а затем применил исключение, чтобы пройти проверку совместимости схемы. Человек заметил это при ревью, потребовал восстановить метод, и исключение отменили. Этот эпизод хорошо показывает, почему зелёная проверка ещё не всегда означает сохранённый контракт.
Rust помогает контролировать память и типы, но не знает требований другой стороны протокола. Поэтому перенос проверяли тестами, ревью, постепенным выпуском и разбором сообщений пользователей. Язык уменьшает часть рисков, но не отменяет ответственность за поведение программы.
Что даёт новая архитектура
Движок теперь можно загрузить в процесс приложения через FFI без отдельного Node.js и V8. При этом вариант отдельного процесса тоже остаётся. Выбор зависит от того, как приложение должно изолировать и обслуживать агента.
Приведённые GitHub замеры сравнивают готовые системы до и после переноса, включая изменения архитектуры. Их нельзя превращать в универсальный коэффициент «Rust быстрее TypeScript» или обещание такого же ускорения ответов модели.
Полезный результат здесь конкретнее: общий движок проще встраивать и дешевле запускать во многих экземплярах. Агенты сделали большую часть механической работы, но сохранение совместимости и безопасное внедрение всё равно потребовали инженерного контроля.
О том, почему код агента всё равно нужно читать: разбор GitHub о проверке кода, Skills, MCP и RAG.