Браузерный агент, который не смотрит на скриншоты: он читает таблицу элементов, выбирает операцию и цель одним запросом и кликает по проверенному узлу. Разбираем, что даёт такая схема, откуда берутся 7 секунд на поиск авиабилетов и где заканчиваются её возможности.
Коротко: Jev Ultrafast — открытый браузерный агент от Browser Use и TypeSafe. Вместо цикла «скриншот → модель → координаты» он строит индексированную таблицу элементов страницы и за один запрос к модели выбирает операцию и цель: CLICK [7], TYPE_TEXT [3], SELECT. Текст печатает маленькая модель, только когда операция — ввод. Заявленный результат — поиск рейса Цюрих → Лондон на Google Flights за 7,073 с при скорости записи 1×. Репозиторий browser-use/jev-ultrafast — 23 999 звёзд и 1 836 форков на 01.11.2026, лицензия MIT.
Классический браузерный агент ходит по кругу: снимает скриншот, отправляет его большой модели, получает координаты клика, кликает, снимает новый скриншот. Каждый шаг — дорогой вызов зрения и десятки тысяч токенов на изображение. Jev ломает этот цикл иначе: он не смотрит на картинку, а вытаскивает одним вызовом браузера таблицу видимых контролов — номер, тип, подпись, текущее значение.
Дальше начинается главное. Вместо свободного текста модель отвечает структурой: операция из закрытого набора и индекс элемента из той же таблицы. Набор ограничен: CLICK, TYPE_TEXT, SELECT, SCROLL_UP, SCROLL_DOWN, WAIT, DONE, BLOCKED. Если операция не требует текста, текстовая модель не вызывается вовсе — за клик платят один запрос, а не два.
Третья деталь — валидация цели. Выбранный узел перепроверяется перед вводом: документ и форма не изменились, элемент не перекрыт оверлеем, геометрия актуальна. Вывод модели никогда не превращается в селектор, координаты или JavaScript — он превращается в индекс, который резолвится в конкретный DOM-узел. Это резко сужает класс ошибок «модель придумала, куда кликнуть».
Одна из сильных сторон проекта — размер. Авторы специально держат цикл компактным: agent.py — сам цикл и передача текстовой модели, snapshot.js — атомарный снимок DOM и индексация контролов, browser.py — подключение, геометрия, исполнение, model.py — динамические головы операции и цели, questions.py — инструкции модели. Такой код можно прочитать за вечер, что для агентной инфраструктуры редкость.
Отдельный слой — Browser Harness, которым Jev подключается к Chrome по протоколу отладки. Он ставится зависимостью и умеет сам диагностировать подключение командой uv run browser-harness --doctor. Для проверки нужен Chrome с разрешённой удалённой отладкой: агент работает в вашем профиле, а не в призрачной виртуальной машине.
| Операция | Что делает | Комментарий |
|---|---|---|
| CLICK | клик по индексированному узлу | перед вводом — проверка перекрытия и геометрии |
| TYPE_TEXT | ввод текста в поле | текст генерирует маленькая LLM, не модель решений |
| SELECT | выбор опции нативного списка | цель несёт наблюдаемый индекс опции |
| SCROLL_UP / SCROLL_DOWN | прокрутка страницы | без координат и без скриншотов |
| WAIT | пауза на короткий интервал | используется, когда состояние ещё не готово |
| DONE / BLOCKED | завершение или отказ | DONE не считается доказательством успеха |
Закрытый набор — это ещё и объяснимость. Инспектор показывает вероятности по операциям и целям до исполнения, поэтому ошибку видно на шаг раньше, чем она случилась: «почему он выбрал поле прибытия вместо поля отправления» превращается в конкретную строку таблицы, а не в рассуждение о том, что модель «неправильно поняла скриншот».
Протокол в docs/performance.md описан аккуратно: шесть чередующихся прогонов одной задачи в одном профиле Chrome, одинаковые условия — цель на естественном языке, независимый проверяющий результат, вьюпорт 1120×780, версия TypeSafe jev-1.13.0, модель inception/mercury-2.5 без рассуждений, лимиты действий и запросов. Начальная навигация исключена из замера, каждая попытка создаёт и закрывает свою вкладку, все шесть попыток включены в результат.
Медиана упала с 9,450 до 7,092 секунды, то есть на 25,0%. Но интереснее, за счёт чего: медиана числа запросов к TypeSafe снизилась с 22 до 17, а число вызовов протокола браузера — с 1 092 до 101. Второе число объясняет всё: старый цикл перечитывал дерево доступности и резолвил сотни узлов на каждое изменение DOM, включая анимации. Новый снимок читает видимые HTML/ARIA-контролы одним вызовом.
| Метрика | Исходный | Оптимизированный | Разница |
|---|---|---|---|
| Медиана времени | 9,450 с | 7,092 с | −25,0% |
| Запросов к TypeSafe (медиана) | 22 | 17 | −5 |
| Вызовов протокола браузера | 1 092 | 101 | −991 |
| Валидация результата | 3/3 | 3/3 | обе руки |
В записи конкретного быстрого прогона: 17 запросов к Jev, 10 взаимодействий плюс один явный WAIT, две вспомогательные вызовы (Цюрих за 581 мс, Лондон за 346 мс), медианная задержка Jev 178 мс. Поиск выполнился на 5,217 с, финальное подтверждённое завершение — на 7,073 с; разрыв ушёл на загрузку результатов Google и решение о готовности.
Локальный запуск описан в README: клонирование, uv sync, копия .env.example, два ключа — TYPESAFE_API_KEY для решений и TEXT_MODEL_API_KEY для текстовой модели. В примере конфигурации текстовая модель — ключ OpenRouter с моделью inception/mercury-2.5 без рассуждений; Gemini, GLM и DeepSeek тоже подключаются через OpenAI-совместимый хелпер, если выставить модель, эндпоинт и режим рассуждений.
git clone https://github.com/browser-use/jev-ultrafast.git cd jev-ultrafast && uv sync
cp .env.example .env
uv run browser-harness --doctor
uv run jev
uv run --env-file .env python examples/run.py \ --url https://en.wikipedia.org/wiki/Main_Page \ --goal 'Find and open the article about Godel incompleteness theorems.'
Цены Jev мы не публикуем: TypeSafe считает запросы по своему прайсу, Browser Use предлагает хостинговый вариант BU Ultrafast на всех планах облака (модель bu-ultrafast), а текстовая модель тарифицируется отдельно вашим провайдером — сверяйте на официальных страницах. Единственная опубликованная цифра — стоимость двух текстовых вызовов в записанном прогоне: $0,00006272 по счёту OpenRouter. Это плата только за текстового помощника, без решений TypeSafe и без браузера.
model: bu-ultrafast. Тогда вы платите за облако, но теряете доступ к инспектору и к пошаговому разбору решений.Класс браузерных агентов за два года стал плотным. Browser Use — самый крупный проект с 119 712 звёздами, Stagehand и Skyvern идут в той же лиге, Moli приносит headless-браузер на Rust, а Jev занимает нишу «быстро и дёшево на повторяющихся сценариях». Разница между ними не в звёздах, а в том, чем агент платит за решение: скриншотами, DOM-снимками или заранее описанными действиями.
| Подход | Что видит модель | Сильная сторона | Слабое место |
|---|---|---|---|
| Скриншоты + координаты | изображение страницы | переносимость на любые сайты | дорого по токенам, хрупко к вёрстке |
| DOM-снимок + индексы (Jev) | таблица видимых контролов | быстро и дёшево, проверяемая цель | только HTML/ARIA-контролы, без canvas |
| Скрипты действий (Stagehand-стиль) | описанные шаги | предсказуемость на повторных сценариях | требует ручной подготовки под сайт |
Авторы не прячут слабые места, и это стоит прочитать до внедрения. Снимок поддерживает обычные HTML и ARIA-контролы, но не реализует полный алгоритм доступных имён и не проходит в shadow roots и фреймы. Canvas, загрузка файлов, новые вкладки, вложенная прокрутка и произвольные клавиатурные виджеты не поддерживаются вовсе. Валидная операция при этом всё равно может быть неверной, а DONE никогда не считается доказательством успеха — результат проверяет отдельный код.