Содержание
Коротко
Языковая модель умеет продолжать текст. Агент появляется, когда вокруг неё собирают обвязку: вызовы инструментов, память, правила, подтверждение человека. Статья на Хабре показывает следующий шаг: дать модели писать короткий JavaScript в узкой песочнице, чтобы арифметика, даты и фильтры JSON не жрали контекст и не ломались на «рассуждениях». Это не «запускай любой код на хосте», а сознательно урезанный вычислительный слой.
Что произошло
Автор напоминает: одна и та же модель в разных обвязках даёт разный результат. Системная инструкция, набор инструментов и цикл вызовов часто важнее названия флагмана. Каждый вызов инструмента — это ещё один запрос и ответ в контексте; на длинных цепочках решение дорожает, хотя часть логики — школьная арифметика.
Опасный путь — полный доступ к оболочке и сети: ошибка модели, превратное толкование «удали это» или внедрение инструкций со страницы могут стереть файлы или утащить секреты. Полноценная песочница (контейнер, внешний исполнитель) лечит это ценой сложности. Более узкий вариант — интерпретатор JavaScript без файловой системы хоста и без сети: модель пишет скрипт, обвязка его выполняет с лимитом времени и памяти.
В LM Studio плагин js-code-sandbox даёт инструмент run_javascript. Без него модель отвечает датой из обучения; со скриптом берёт текущую дату из среды выполнения. Сложнее: «третий четверг после ближайшего полнолуния» — модель сама пишет расчёт, а не держит в голове цепочку шагов. Автор честно оговаривает: это линейное приближение фаз Луны, не астрономический движок — но идея ясна.
В LangChain тот же приём оформлен как CodeInterpreterMiddleware на QuickJS. В системную инструкцию явно кладут ограничения: нет fetch, нет настоящей файловой системы, таймаут около 5 с, потолок памяти 64 МБ. По умолчанию «текущая дата» из скрипта запрещена: дата — отдельный инструмент, а не скрытая суперсила интерпретатора. Если скрипту разрешить вызывать объявленные инструменты (programmatic tool calling), модель один раз вызывает eval, а уже скрипт дергает tools.getCurrentDatetime() и считает дальше — без хоровода «спросить дату → подумать → снова вызвать eval».
Почему это важно
Команды часто наращивают каталог инструментов: калькулятор, сумма, процентиль, фильтр. Один интерпретатор закрывает этот класс задач синтаксисом, который модели и так знают. Детерминированный код быстрее и честнее длинного внутреннего монолога — особенно на списках, датах и JSON, который только что вернул другой инструмент.
Цена — дисциплина границ. Песочница в процессе без сети не прочитает ~/.ssh, но зависший цикл всё равно нуждается в таймауте. Подтверждение «каждый подозрительный шаг» быстро превращается в автосогласие. Если скрипту открыть вызов внешних инструментов, снова появляется поверхность атаки: внедрение инструкций может попросить вызов, который уже не является чистой арифметикой.
Для архитектора агента это развилка: не «JS вместо протокола контекста моделей», а где логика должна быть исполняемой, а где — решением модели. Обвязка важнее модели — та же мысль, что в материалах про контур агента, только здесь конкретный рычаг: вычислительный слой внутри цикла.
На практике
- Отделите класс задач «посчитать / отфильтровать / преобразовать» от класса «решить, какой инструмент вызвать». Первым дайте интерпретатор, вторым — явный каталог.
- Режьте возможности песочницы: без сети, без произвольной файловой системы хоста, с лимитом времени и памяти; логируйте исходный скрипт.
- Не прячьте «текущую дату» и доступ к системе клиентов внутрь интерпретатора «потому что удобно» — объявляйте отдельные инструменты и, если скрипту нужны вызовы из кода, белый список этих вызовов.
- Повторите простой сценарий локально в
LM Studio, прежде чем тащитьQuickJSв свой агент: видно, пишет ли модель скрипт или продолжает гадать. - Считайте стоимость: один
evalвместо пяти раундов рассуждений часто дешевле, но ошибочный скрипт всё равно нужно ловить тестом или схемой результата.
Итог
JavaScript в обвязке — способ отдать модели то, в чём она слаба (точная арифметика, стабильные преобразования), не выдавая ей ключи от машины. Сила не в «ещё одном инструменте», а в том, что детерминированная логика перестаёт занимать контекст и ломаться на каждом шаге цепочки. Границы песочницы и белый список вызовов важнее, чем сам факт, что агент «умеет писать код».

