Вы когда-нибудь хотели, чтобы ваша локальная LLM не просто болтала, а брала и делала? Кликала по кнопкам, скроллила страницы, отправляла формы? Раньше для этого приходилось городить огород из внешних скриптов и API. Но теперь в официальном WebUI llama.cpp появилась фича, от которой у любого гика зачешутся руки — выполнение произвольного JavaScript-кода через Web Workers. И это не просто гаджет, а полноценный инструмент для создания автономных веб-агентов.
Что за зверь: JS-выполнение внутри llama.cpp
Идея проста до безобразия: модель генерирует JavaScript-код, а Web UI выполняет его в изолированном Web Worker — отдельном потоке, который не блокирует интерфейс и не имеет прямого доступа к DOM главной страницы. Работает это как один из инструментов агента — в том же духе, что и уже знакомый нам web_fetch или exec_shell_command. Только теперь модель может манипулировать веб-страницами напрямую: читать содержимое, эмулировать клики, заполнять поля, делать fetch-запросы к любым API.
По сути, это превращает llama.cpp в браузерный движок автоматизации, работающий полностью на вашем железе. Никаких облачных серверов, никаких ключей — только модель и ваш браузер. И если раньше мы обсуждали запуск LLM прямо в браузере через WebGPU, то теперь модель еще и сама управляет этим браузером.
Почему это не очередная игрушка, а мощный инструмент
Сравните с подходами, которые были до этого. OpenAI Code Interpreter запускает Python в контейнере на сервере — это круто, но дорого и не для приватных данных. MLC и другие фреймворки позволяют инференсить модель локально, но не дают ей инструментов взаимодействия с вебом. А exec_shell_command из llama.cpp (о котором мы писали в гайде по RAG) опасен — дает модели доступ к вашей консоли. Новая фича же работает в песочнице браузера, и даже если модель попытается исполнить вредоносный код, она не выйдет за пределы вкладки.
Ключевое отличие: Web Worker изолирован от DOM основной страницы, но может общаться с ней через сообщения (postMessage). Это значит, что модель может запросить данные со страницы, обработать их и вернуть результат — и все это в рамках одного сеанса без перезагрузки.
Если раньше вы настраивали tool calling для Qwen 3.5, чтобы модель вызывала внешние функции, то теперь одна из этих функций — полноценный JavaScript-интерпретатор. В тандеме с Notebook-режимом WebUI это дает невероятную гибкость: вы пишете промпт, модель генерирует код, который тут же исполняется.
Реальные сценарии: когда это нужно
Представьте, что вы попросили модель «открыть страницу с документацией, найти там блок с параметрами API и вытащить все названия эндпоинтов». Она генерирует JS, который через fetch загружает HTML, парсит его и возвращает вам отфильтрованный список. Или вы даете задачу: «заполни форму заявки на этом сайте, используя данные из моего файла». Модель открывает форму, вставляет значения, нажимает «Отправить» — и все это локально, без единого внешнего сервиса.
Конечно, есть ограничения: модель не может кликать по элементам, если они не относятся к текущей странице (из-за политики same-origin), и ей нужен начальный URL. Но это решается комбинацией с web_fetch, который мы уже разбирали. В связке они образуют полноценного веб-агента.
Стоп-кран: всегда проверяйте, что именно генерирует модель. Один неправильный промпт — и она может запустить бесконечный цикл или сбор всех данных со страницы. Хотя Web Worker и изолирован, злоупотреблять не стоит.
Темная сторона: риски запуска JS моделью
Теперь о неприятном. Модель — не программист, она может ошибаться. В теории, если злоумышленник составит специальный промпт, он может заставить LLM выполнить код, который отправит ваши куки на внешний сервер или подменит содержимое страницы. Да, Web Worker не имеет доступа к DOM основной вкладки, но он может делать fetch на любой URL. Это потенциальный вектор для атак CSRF-типа.
Разработчики llama.cpp учли это: по умолчанию выполнение JS отключено, его нужно явно активировать в настройках. Кроме того, можно ограничить домены, к которым разрешены запросы. Но в целом, если вы используете эту фичу на сайте банка или вводите пароли — лучше дважды подумать. Для остальных сценариев риск минимален.
Кому это действительно нужно
Этот инструмент — находка для разработчиков, которые хотят быстро прототипировать агентов без поднятия отдельного сервера. Для тестировщиков, которым нужно проверить десяток страниц на наличие определенных элементов. Для энтузиастов локальных LLM, которые ищут способы автоматизировать рутину, не выходя из браузера. И для тех, кто уже использует последние версии llama.cpp с новыми фичами и хочет выжать максимум.
Если вы раньше мучились с Playwright или Puppeteer, настраивая селениум-гриды — теперь у вас есть альтернатива, которая работает «из коробки» с любимой моделью. Да, это не заменит промышленный Selenium, но для быстрых экспериментов — самое то.
Следите за тем, какие промпты вы даете модели. Иначе она может запустить скрипт, который удалит все ваши закладки. Шучу... или нет? В любом случае, если хотите попробовать — обновитесь до последней версии llama.cpp, включите опцию --web-ui-allow-js и начните с простых задач вроде «возьми заголовок с первой страницы Хабра». А потом — уже решайте, стоит ли доверять нейросети управление вашим браузером.