Дата публикации
ai_products

Rotunda: браузер для AI-агентов, который притворяется вашим обычным Firefox

Что нового

Rotunda — это отдельный браузер, который изначально спроектировали не для людей, а для AI-агентов. Его ключевая идея: агент управляет браузером так, как это делает человек — с печатью, движением мыши и реальными DOM-операциями, а не через стандартный Chrome DevTools Protocol (CDP), который сайты давно научились распознавать.

Главные новшества:

  • Специализированный браузер для агентов: Rotunda — форк Firefox с патчами для автоматизации и «очеловечивания» действий.
  • Глубокая интеграция с Playwright: можно просто заменить стандартный запуск браузера на NewBrowser и NewContext из Rotunda и получить привычный API с другим «движком» под капотом.
  • CLI-режим для агентов: управление браузером напрямую из терминала через uvx rotunda agent ... без необходимости сразу подключать Python-библиотеку.
  • Симулированная печать и курсор: текст вводится через путь, похожий на человеческий, а курсор двигается с «твиннингом», а не телепортацией.
  • Фокус не на подмене отпечатка браузера, а на отсутствии автоматизационных следов: Rotunda не пытается полностью подделать fingerprint, а передаёт реальное окружение хоста с небольшими «неточностями».
  • Отдельная архитектура профилей и демона: сессии и индексы ресурсов хранятся в ~/.rotunda, а CLI-команды могут подключаться к уже запущенным профилям.

Цифровых бенчмарков по скорости загрузки страниц, расходу памяти или стоимости использования авторы не приводят. Упор — на снижение количества капч и блокировок по сравнению с управлением Chrome через Playwright/CDP.

Как это работает

Браузерная часть

Rotunda использует Firefox с патчами, вдохновлёнными проектом camoufox и работой daijro:

  • Управление идёт не через CDP, а через Juggler — отдельный протокол Firefox, изолированный от контекста страницы.
  • Это усложняет жизнь скриптам, которые пытаются найти следы автоматизации по состоянию window, navigator и другим объектам.

Браузер не пытается «идеально притворяться» другим устройством. Он передаёт:

  • реальные данные о GPU и аудиодрайверах;
  • реальные особенности хоста на уровне сетевого стека (TCP handshake использует настоящий Firefox-протокол);
  • при этом может «лукавить» в менее критичных деталях: список доступных шрифтов, расширения, размер экрана и т.п.

Идея: для сайта нормально видеть десяток одинаковых MacBook с M1 одновременно. Но ненормально — увидеть Linux, который заявляет, что он macOS.

Человеческое поведение вместо грубого автомата

Rotunda делает ставку не на полную подмену fingerprint, а на отсутствие явных автоматизационных паттернов:

  • Курсор не прыгает по экрану, а движется по траектории, похожей на движение мыши.
  • Клавиатура генерирует ввод с ошибками и исправлениями, если включена «гуманизация».
  • Операции с DOM идут через собственный путь ввода текста и событий мыши, а не прямую «телепортацию» значений.

Интеграция с Playwright

Rotunda предоставляет обёртки для Playwright:

from playwright.sync_api import sync_playwright
from rotunda import NewBrowser, NewContext

with sync_playwright() as playwright:
    browser = NewBrowser(playwright, headless=False)
    context = NewContext(browser)
    page = context.new_page()
    page.goto("https://pierce.dev", wait_until="domcontentloaded")
    first_article_text = page.locator("main article article").first.inner_text()
    print(first_article_text)
    browser.close()

Разработчик меняет только запуск браузера и создание контекста. Вся остальная логика на Playwright остаётся прежней.

Агентский CLI и демон

Rotunda может работать без интеграции в кодовую базу — через uvx и встроенный CLI для агентов. Вся служебная информация хранится в ~/.rotunda:

  • профили браузера;
  • сессии демона;
  • короткие индексы ресурсов и страниц.

Архитектура включает:

  • демон профиля, который держит сессию браузера живой;
  • ресурсный индекс, чтобы агенты могли ссылаться на страницы и элементы через индексы/ссылки, а не вручную искать селекторы;
  • модель одиночного процесса, которая не даёт поднять конфликтующие инстансы под одним профилем.

Установка

Rotunda используют через uv (инструмент для управления Python-проектами и запуском CLI).

Встраивание в Python-проект

Установка библиотеки и браузера:

uv add rotunda
uv run rotunda fetch

Команда rotunda fetch синхронизирует список доступных сборок браузера и ставит последний билд для активного канала.

После этого можно использовать Rotunda с Playwright (пример выше).

Запуск агента из CLI

Если вы хотите сначала поиграться с браузером без изменения кода, можно использовать uvx:

  1. Установить активную сборку браузера и создать профиль:
uvx rotunda fetch
uvx rotunda agent new-profile --name agent-demo
  1. Создать контекст браузера по имени профиля и перейти на сайт:
uvx rotunda agent new-context agent-demo
uvx rotunda agent navigate 3 https://pierce.dev

Число 3 — пример индекса страницы. Вы будете использовать тот индекс, который напечатает ваша команда.

  1. Описать страницу и получить ссылки на элементы:
uvx rotunda agent describe 3

Команда вернёт структурированное описание DOM с «refs» — идентификаторами элементов, которые можно использовать в следующих командах.

  1. Действия с элементами (после описания индекс страницы можно не передавать):
uvx rotunda agent click <ref>
uvx rotunda agent hover <ref>
uvx rotunda agent info <select-ref>
uvx rotunda agent select <select-ref> "option-value"
uvx rotunda agent fill <input-ref> "replacement text"
uvx rotunda agent type <input-ref> "additional text"
uvx rotunda agent press <input-ref> Enter
uvx rotunda agent scroll down
uvx rotunda agent check <checkbox-ref>
  • info печатает атрибуты, состояние, границы и варианты select.
  • select по умолчанию выбирает по value, можно переключиться на --by label или --by index.
  • fill полностью заменяет содержимое поля.
  • type дописывает текст в текущей позиции курсора.
  • Оба варианта ввода используют «очеловеченный» путь ввода текста.

После каждого действия CLI сообщает, обновилась ли страница полностью или изменения локальные. Для небольших изменений выводится компактный + / - дифф по элементам. Для полного состояния можно снова вызвать describe.

Расширенные команды агента

Для задач, которые не сводятся к заполнению форм, есть дополнительные команды:

uvx rotunda agent pages
uvx rotunda agent screenshot 3 --full-page
uvx rotunda agent wait 3 --for text "Done"
uvx rotunda agent back 3
uvx rotunda agent forward 3
uvx rotunda agent reload 3
uvx rotunda agent extract 3 --format markdown
uvx rotunda agent upload <file-input-ref> ./document.pdf
uvx rotunda agent downloads
uvx rotunda agent save-download <download-ref> ./download.bin
uvx rotunda agent dialog 3 accept
uvx rotunda agent close-page 3

Кратко по возможностям:

  • screenshot может сохранить:

    • только видимую область;
    • всю страницу (--full-page);
    • конкретный элемент (--element <ref>). Если путь не указан, скриншот сохраняется в системный temp-каталог с случайным именем PNG, а CLI выводит абсолютный путь.
  • wait умеет ждать:

    • состояния загрузки;
    • совпадения URL с паттерном;
    • появления текста;
    • селектора;
    • фиксированного таймаута.
  • extract возвращает содержимое страницы в виде:

    • текста;
    • HTML;
    • markdown;
    • ссылок;
    • метаданных форм.
  • dialog настраивает, как обрабатывать следующий диалог на странице. Диалоги без настройки закрываются и логируются, чтобы браузер не зависал.

Когда работа с профилем закончена, демон лучше остановить:

uvx rotunda agent stop 1

Число 1 — пример индекса демона.

Как это работает с антиботами и отпечатками

Почему классические «stealth-плагины» ломаются

Разработчики Rotunda подробно описывают, почему типичные плагины для «стелс-режима» в Chrome плохо живут под прицелом современных антибот-систем:

  1. Перегрузка JavaScript-свойств.

    • Плагины меняют navigator, window, plugins и другие объекты.
    • Такие функции перестают быть «native» для движка JS.
    • Фингерпринтеры проверяют, нативная ли реализация. Если нет — это аномалия.
  2. Патчинг Chromium на уровне исходников.

    • Часть решений форкает Chromium и меняет поведение уже в движке.
    • JS-слой это не видит, но сайты начинают использовать боковые каналы: canvas, аудиодрайверы, особенности GPU.
    • Аномалии по этим каналам снова выдают автоматизацию.
  3. Статистический подход к отпечаткам.

    • Фингерпринтинг перестал быть набором ручных хаков.
    • Сайты собирают огромные массивы данных и ищут статистические отклонения.
    • Им достаточно одной «невозможной» комбинации параметров, чтобы признать браузер ботом.

Авторы Rotunda считают, что честно обмануть статистический фингерпринт невозможно: нужно идеально симулировать каждый драйвер GPU, каждую особенность платформы и все API браузера.

Подход Rotunda

Rotunda выбирает другую стратегию:

  • не пытаться полностью подделать отпечаток;
  • выглядеть как реальный браузер на вашей машине;
  • убрать сигнатуры автоматизации, связанные с CDP, Playwright и неприродным поведением мыши и клавиатуры;
  • слегка «приукрасить» второстепенные параметры окружения.

В результате:

  • для массового краулинга публичных сайтов это не лучший инструмент;
  • для делегирования задач локальным агентам на вашей машине — это как команда стажёров, которые сидят в вашей сети и ходят по сайтам от вашего имени.

Что это значит для вас

Кому Rotunda действительно пригодится

  1. Разработчики AI-агентов.

    • Если вы строите ассистентов на базе GPT-4, Claude 3, Llama 3 или других крупных моделей и хотите дать им доступ к реальному браузеру, Rotunda закрывает сразу несколько проблем:
      • меньше капч и блокировок по сравнению с прямым управлением Chrome через CDP;
      • удобный CLI и Python-API для интеграции в пайплайны;
      • возможность симулировать человеческие действия без компьютерного зрения.
  2. Инженеры, которые автоматизируют личные/внутренние задачи.

    • Заполнение сложных форм на корпоративных порталах.
    • Навигация по кабинетам поставщиков, банков, госуслуг.
    • Задачи, где сайт явно не рад ботам и активно борется с автоматизацией.
  3. Исследователи веб-интерфейсов для LLM.

    • Можно экспериментировать с тем, как LLM взаимодействуют с реальным DOM, а не только с текстовыми снапшотами.
    • CLI-режим позволяет быстро прототипировать сценарии без тяжёлой инфраструктуры.

Где Rotunda не подойдёт

  1. Массовый краулинг и скрейпинг.

    • Авторы прямо говорят: Rotunda плохо подходит для обхода огромного числа публичных страниц.
    • Для этого лучше использовать специализированные сервисы: Browserbase, Kernel, ScrapingBee и т.п.
  2. Облачные сценарии с компьютерным зрением.

    • Если вы строите решение, которое рендерит страницу в облаке и даёт модели только скриншоты, Rotunda не решит ключевую проблему — утечку признаков хоста и использование стандартных stealth-плагинов.
  3. Сценарии, где важно строгое соответствие корпоративным политикам браузера.

    • Rotunda — модифицированный Firefox, который специально меняет часть параметров окружения.
    • Для строго регламентированных сред (финансовые организации, госструктуры) это может быть критично.

Региональные ограничения и доступность

Разработчики не указывают геоблокировки по регионам. Rotunda — это инструмент, который вы запускаете локально, поэтому основное ограничение — доступ к GitHub и возможности установки Python-инструментов uv/uvx.

Если в вашей сети заблокирован GitHub или внешние репозитории, может понадобиться VPN или зеркала. Сам браузер не завязан на конкретный регион, но сайты, с которыми вы работаете, могут применять геоблокировки и анализ репутации IP.

Что делать, если вас всё равно заблокировали

Даже с «прозрачным» подходом Rotunda не обещает полное отсутствие блокировок. Рекомендации разработчиков:

  1. Откройте тот же сайт в обычном Chrome или Firefox.

    • Если там тоже появляются капчи и отказы во входе, проблема, вероятнее всего, в репутации IP или сетевых настройках.
  2. Если обычный браузер работает нормально, а Rotunda — нет, включите режим отладки отпечатка:

export ROTUNDA_DEBUG_DUMP_DIR=/tmp/rotunda-fingerprint-debug
export ROTUNDA_DEBUG_DUMP=manifest,network,console,vm,returns
export ROTUNDA_VM_ACCESS_SAMPLE_RATE=10
python your_repro_script.py
zip -r rotunda-fingerprint-debug.zip "$ROTUNDA_DEBUG_DUMP_DIR"

Этот режим:

  • логирует обращения сайта к JS-движку;
  • сохраняет возвращаемые значения;
  • пишет консольный вывод;
  • фиксирует сетевые запросы страницы.

Пакет rotunda-fingerprint-debug.zip можно приложить к GitHub Issue вместе с URL сайта, ожиданиями и фактическим поведением. В архив входят тела запросов и ответов, поэтому перед отправкой их нужно проверить. Переменную ROTUNDA_DEBUG_DUMP_RAW=1 разработчики просят включать только по их запросу.

Место на рынке

По отношению к Playwright + Chrome/CDP

  • Отпечаток и детект автоматизации:

    • Chrome под управлением Playwright через CDP сайты давно умеют вычислять: частые капчи, странные отказы во входе, незаметные изменения поведения.
    • Rotunda уходит от CDP и использует Firefox Juggler, плюс имитирует человеческие действия.
  • Прозрачность окружения:

    • CDP-управляемый Chrome часто используют со stealth-плагинами, которые меняют JS-свойства и ломают статистику отпечатков.
    • Rotunda передаёт реальное окружение хоста и слегка искажает второстепенные параметры.

Числовых сравнений по количеству капч или проценту успешных сессий авторы не приводят, но весь продукт строится вокруг идеи: «меньше блокировок, чем у CDP+stealth-плагинов».

По отношению к camoufox и другим «stealth Firefox»

  • Rotunda опирается на патчи daijro и camoufox, но меняет приоритеты:

    • camoufox концентрируется на стелс-режиме и сокрытии автоматизации;
    • Rotunda делает упор на удобную автоматизацию для агентов с Playwright и CLI, плюс на симуляцию человеческого поведения.
  • Оба проекта используют Firefox и Juggler, но Rotunda строит вокруг этого полноценную экосистему для AI-агентов: профили, демон, CLI, отладку отпечатка.

По отношению к облачным краулерам (Browserbase, Kernel, ScrapingBee)

  • Тип задач:

    • Browserbase, Kernel, ScrapingBee лучше подходят для массового скрейпинга и автоматизации в облаке.
    • Rotunda — для локальных агентов, которые действуют от имени пользователя на его машине.
  • Масштаб:

    • Облачные решения оптимизированы под тысячи и миллионы страниц.
    • Rotunda — под ограниченное количество сессий, ближе к «цифровым стажёрам», чем к краулеру.

Числа по стоимости и производительности у Rotunda и конкурентов в описании нет, поэтому сравнение идёт по архитектуре и типичным сценариям.

FAQ: почему не компьютерное зрение

Разработчики Rotunda прямо отвечают на популярный вопрос: «Почему не управлять обычным Chrome через скриншоты и компьютерное зрение?»

Основные аргументы против CV-подхода:

  1. Скорость и контекст.

    • Обработка скриншотов медленная.
    • Скриншоты занимают большой объём в контекстном окне LLM.
    • Модель не видит содержимое за пределами вьюпорта.
  2. Доступ к DOM.

    • Намного удобнее получить DOM и превратить его в компактное представление для LLM.
    • Но как только вы берёте DOM напрямую, вы снова упираетесь в проблему CDP и детекта автоматизации.
  3. Утечки окружения в облаке.

    • Облачные VM часто используют стандартные stealth-плагины.
    • Эти плагины легко детектируются, и в итоге вы снова попадаете в чёрный список.
  4. Сложность кликов и форм.

    • Компьютерному зрению сложно надёжно обрабатывать сложные интерфейсы.
    • Есть реальные кейсы, когда Claude не может выбрать элемент из выпадающего списка, потому что прямое сопоставление кликов по картинке с DOM даёт сбои.

Rotunda пытается обойти эти проблемы: даёт доступ к DOM, но не через CDP, и симулирует человеческое поведение вместо грубых кликов по координатам.

Как поучаствовать в разработке

Проект открыт для внешних вкладов:

  • в Issues на GitHub есть задачи, которые подходят для старта;
  • автор приглашает писать ему в X и подписываться на рассылку, если вы хотите обсуждать агенты и помогать развитию Rotunda.

Если вы строите свои агентские стеки или экспериментируете с LLM в браузере, Rotunda — хороший кандидат, чтобы протестировать его на реальных задачах и, возможно, внести патчи под свои сценарии.


Читайте также