Hermes Agent включает полный набор инструментов для автоматизации браузера с несколькими вариантами бэкендов:
Browserbase cloud mode через Browserbase — управляемые облачные браузеры и защита от анти-бот систем
Browser Use cloud mode через Browser Use — альтернативный облачный провайдер браузеров
Firecrawl cloud mode через Firecrawl — облачные браузеры со встроенным скрапингом
Camofox local mode через Camofox — локальный анти-детект браузинг (спуфинг отпечатков на основе Firefox)
Local Chrome via CDP — подключение инструментов браузера к вашему экземпляру Chrome через /browser connect
Local browser mode — через CLI agent-browser и локальную установку Chromium
Во всех режимах агент может перемещаться по сайтам, взаимодействовать с элементами страницы, заполнять формы и извлекать информацию.
Обзор
Страницы представлены в виде деревьев доступности (текстовых снимков), что делает их идеальными для LLM-агентов. Интерактивные элементы получают ref ID (например, @e1, @e2), которые агент использует для кликов и ввода текста.
Ключевые возможности:
Multi-provider cloud execution — Browserbase, Browser Use или Firecrawl — не требуется локальный браузер
Local Chrome integration — подключение к запущенному Chrome через CDP для интерактивного браузинга
Built-in stealth — случайные отпечатки, решение CAPTCHA, резидентные прокси (Browserbase)
Session isolation — каждая задача получает собственную сессию браузера
Automatic cleanup — неактивные сессии закрываются по таймауту
Vision analysis — скриншот + анализ с помощью AI для визуального понимания
Настройка
tip Подписчики Nous
Если у вас есть платная подписка Nous Portal, вы можете использовать автоматизацию браузера через Tool Gateway без отдельных API-ключей. Выполните hermes model или hermes tools для включения.
Облачный режим Browserbase
Чтобы использовать облачные браузеры, управляемые Browserbase, добавьте:
# Add to ~/.hermes/.envBROWSERBASE_API_KEY=***
BROWSERBASE_PROJECT_ID=your-project-id-here
Чтобы использовать Browser Use в качестве облачного провайдера браузеров, добавьте:
# Add to ~/.hermes/.envBROWSER_USE_API_KEY=***
Получите свой API-ключ на browser-use.com. Browser Use предоставляет облачный браузер через REST API. Если заданы учетные данные и Browserbase, и Browser Use, приоритет у Browserbase.
Облачный режим Firecrawl
Чтобы использовать Firecrawl в качестве облачного провайдера браузеров, добавьте:
# Add to ~/.hermes/.envFIRECRAWL_API_KEY=fc-***
Получите свой API-ключ на firecrawl.dev. Затем выберите Firecrawl в качестве провайдера браузера:
Гибридная маршрутизация: облако для публичных URL, локально для LAN/localhost
Если настроен облачный провайдер, Hermes автоматически запускает локальный Chromium sidecar для URL, которые разрешаются в частный/loopback/LAN-адрес (localhost, 127.0.0.1, 192.168.x.x, 10.x.x.x, 172.16-31.x.x, *.local, *.lan, *.internal, IPv6 loopback ::1, link-local 169.254.x.x). Публичные URL продолжают использовать облачного провайдера в том же разговоре.
Это решает распространенный сценарий «я разрабатываю локально, но использую Browserbase» — агент может сделать скриншот вашей панели на http://localhost:3000 И парсить https://github.com без переключения провайдеров или отключения SSRF-защиты. Облачный провайдер никогда не видит частный URL.
Эта функция включена по умолчанию. Чтобы отключить ее (все URL будут направляться настроенному облачному провайдеру, как раньше):
При отключенной автоматической маршрутизации частные URL отклоняются с сообщением "Blocked: URL targets a private or internal address", если вы также не установите browser.allow_private_urls: true (что позволит облачному провайдеру пытаться их открыть — обычно не сработает, так как Browserbase и другие не могут достичь вашей LAN).
Требования: локальный sidecar использует тот же CLI agent-browser, что и чистый локальный режим, поэтому он должен быть установлен (hermes setup tools → Browser Automation устанавливает его автоматически). Перенаправления после навигации с публичного URL на частный адрес по-прежнему блокируются (нельзя использовать трюк с редиректом на внутренний адрес для доступа к LAN через публичный путь).
Локальный режим Camofox
Camofox — это самостоятельно размещаемый Node.js сервер, оборачивающий Camoufox (форк Firefox со спуфингом отпечатков на C++). Он обеспечивает локальный анти-детект браузинг без облачных зависимостей.
# Clone the Camofox browser server first
gitclonehttps://github.com/jo-inc/camofox-browser
cdcamofox-browser
# Build and start with Docker using the default container settings# (auto-detects arch: aarch64 on M1/M2, x86_64 on Intel)
makeup
# Stop and remove the default container
makedown
# Force a clean rebuild (for example, after upgrading VERSION/RELEASE)
makereset
# Just download binaries without building
makefetch
# Override arch or version explicitly
makeupARCH=x86_64
makeupVERSION=135.0.1RELEASE=beta.24
make up запускает контейнер по умолчанию немедленно. Если вам нужны пользовательские настройки выполнения, такие как увеличенная Node heap, VNC или постоянный каталог профиля, сначала соберите образ, а затем запустите его самостоятельно:
# Build the image without starting the default container
makebuild
# Start with persistence, VNC live view, and a larger Node heap
mkdir-p~/.camofox-docker
dockerrun-d\--namecamofox-browser\--restartunless-stopped\-p9377:9377\-p6080:6080\-p5901:5900\-eCAMOFOX_PORT=9377\-eENABLE_VNC=1\-eVNC_BIND=0.0.0.0\-eVNC_RESOLUTION=1920x1080\-eMAX_OLD_SPACE_SIZE=2048\-v~/.camofox-docker:/root/.camofox\camofox-browser:135.0.1-aarch64
С включенным VNC браузер работает в headed-режиме, и за ним можно наблюдать в реальном времени в вашем браузере по адресу http://localhost:6080 (noVNC). Вы также можете подключиться с помощью нативного VNC-клиента к localhost:5901.
Если вы уже запустили make up, остановите и удалите контейнер по умолчанию перед запуском пользовательского:
makedown
# then run the custom docker run command above
Затем укажите в ~/.hermes/.env:
CAMOFOX_URL=http://localhost:9377
Или настройте через hermes tools → Browser Automation → Camofox.
Когда CAMOFOX_URL установлен, все инструменты браузера автоматически маршрутизируются через Camofox вместо Browserbase или agent-browser.
Постоянные сессии браузера
По умолчанию каждая сессия Camofox получает случайную идентичность — cookies и логины не сохраняются между перезапусками агента. Чтобы включить постоянные сессии браузера, добавьте следующее в ~/.hermes/config.yaml:
browser:camofox:managed_persistence:true
Затем полностью перезапустите Hermes, чтобы новая конфигурация вступила в силу.
warning Важен правильный путь
Hermes читает browser.camofox.managed_persistence, а неmanaged_persistence верхнего уровня. Частая ошибка — написать:
Если флаг размещен по неправильному пути, Hermes молча возвращается к случайному временному userId, и ваше состояние входа будет теряться при каждой сессии.
Что делает Hermes
Отправляет детерминированный userId в рамках профиля на Camofox, чтобы сервер мог повторно использовать тот же профиль Firefox между сессиями.
Пропускает уничтожение контекста на стороне сервера при очистке, чтобы cookies и логины сохранялись между задачами агента.
Привязывает userId к активному профилю Hermes, так что разные профили Hermes получают разные профили браузера (изоляция профилей).
Что Hermes не делает
Не принуждает к сохранению на сервере Camofox. Hermes только отправляет стабильный userId; сервер должен его учитывать, сопоставляя этот userId с постоянным каталогом профиля Firefox.
Если сборка вашего сервера Camofox обрабатывает каждый запрос как временный (например, всегда вызывает browser.newContext() без загрузки сохраненного профиля), Hermes не сможет сделать эти сессии постоянными. Убедитесь, что вы используете сборку Camofox, которая реализует постоянство профилей на основе userId.
Проверка работы
Запустите Hermes и ваш сервер Camofox.
Откройте Google (или любой сайт с входом) в задаче браузера и войдите вручную.
Завершите задачу браузера обычным образом.
Запустите новую задачу браузера.
Снова откройте тот же сайт — вы все еще должны быть в системе.
Если на шаге 5 вас выкинуло из системы, сервер Camofox не учитывает стабильный userId. Перепроверьте путь в конфиге, убедитесь, что вы полностью перезапустили Hermes после редактирования config.yaml, и проверьте, что ваша версия сервера Camofox поддерживает постоянные профили для каждого пользователя.
Где хранится состояние
Hermes получает стабильный userId из каталога профиля ~/.hermes/browser_auth/camofox/ (или эквивалентного в $HERMES_HOME для нестандартных профилей). Фактические данные профиля браузера хранятся на стороне сервера Camofox, привязанные к этому userId. Чтобы полностью сбросить постоянный профиль, очистите его на сервере Camofox и удалите соответствующий каталог состояния профиля Hermes.
Просмотр VNC в реальном времени
Когда Camofox работает в headed-режиме (с видимым окном браузера), он открывает VNC-порт в ответе на health check. Hermes автоматически обнаруживает это и включает VNC URL в ответы навигации, чтобы агент мог поделиться ссылкой для просмотра браузера в реальном времени.
Локальный Chrome через CDP (/browser connect)
Вместо облачного провайдера вы можете подключить инструменты браузера Hermes к вашему запущенному экземпляру Chrome через Chrome DevTools Protocol (CDP). Это полезно, когда вы хотите видеть, что агент делает в реальном времени, взаимодействовать со страницами, требующими ваших собственных cookies/сессий, или избежать затрат на облачные браузеры.
`/browser connect` — это **слэш-команда интерактивного CLI** — она не отправляется через gateway. Если вы попытаетесь выполнить ее в WebUI, Telegram, Discord или другом gateway-чате, сообщение будет отправлено агенту как обычный текст, и команда не выполнится. Запустите Hermes из терминала (`hermes` или `hermes chat`) и выполните `/browser connect` там.
Если Chrome еще не запущен с удаленной отладкой, Hermes попытается автоматически запустить его с флагом --remote-debugging-port=9222.
Чтобы запустить Chrome вручную с включенным CDP, используйте выделенный user-data-dir, чтобы порт отладки действительно открылся, даже если Chrome уже запущен с вашим обычным профилем:
# Linux
google-chrome\--remote-debugging-port=9222\--user-data-dir=$HOME/.hermes/chrome-debug\--no-first-run\--no-default-browser-check&# macOS"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"\--remote-debugging-port=9222\--user-data-dir="$HOME/.hermes/chrome-debug"\--no-first-run\--no-default-browser-check&
Затем запустите Hermes CLI и выполните `/browser connect`.
**Почему `--user-data-dir`?** Без него запуск Chrome, когда обычный экземпляр Chrome уже работает, обычно открывает новое окно в существующем процессе — а этот процесс не был запущен с `--remote-debugging-port`, поэтому порт 9222 никогда не открывается. Выделенный user-data-dir заставляет создать новый процесс Chrome, где порт отладки действительно слушает. `--no-first-run --no-default-browser-check` пропускает мастер первого запуска для нового профиля.
При подключении через CDP все инструменты браузера (browser_navigate, browser_click и т.д.) работают на вашем живом экземпляре Chrome вместо запуска облачной сессии.
WSL2 + Windows Chrome: предпочитайте MCP вместо /browser connect
Если Hermes работает внутри WSL2, но окно Chrome, которым вы хотите управлять, работает на хосте Windows, /browser connect часто не является лучшим путем.
Почему:
/browser connect ожидает, что Hermes сам сможет достичь рабочего CDP-эндпоинта
современные сессии живой отладки Chrome часто открывают эндпоинт, доступный только на хосте, который не достижим из WSL так же, как классический порт 9222
даже когда Windows Chrome доступен для отладки, самый чистый способ интеграции — часто запустить MCP-сервер браузера на стороне Windows, который подключается к Chrome, и заставить Hermes общаться с этим MCP-сервером
Для такой настройки предпочитайте chrome-devtools-mcp через поддержку MCP в Hermes.
Смотрите руководство по MCP для практической настройки:
Если вы не установили никаких облачных учетных данных и не используете /browser connect, Hermes все равно может использовать инструменты браузера через локальную установку Chromium, управляемую agent-browser.
Опциональные переменные окружения
# Residential proxies for better CAPTCHA solving (default: "true")BROWSERBASE_PROXIES=true# Advanced stealth with custom Chromium — requires Scale Plan (default: "false")BROWSERBASE_ADVANCED_STEALTH=false# Session reconnection after disconnects — requires paid plan (default: "true")BROWSERBASE_KEEP_ALIVE=true# Custom session timeout in milliseconds (default: project default)# Examples: 600000 (10min), 1800000 (30min)BROWSERBASE_SESSION_TIMEOUT=600000# Inactivity timeout before auto-cleanup in seconds (default: 120)BROWSER_INACTIVITY_TIMEOUT=120
Установка CLI agent-browser
npminstall-gagent-browser
# Or install locally in the repo:
npminstall
Набор инструментов `browser` должен быть включен в список `toolsets` вашей конфигурации или активирован через `hermes config set toolsets '["hermes-cli", "browser"]'`.
Доступные инструменты
browser_navigate
Перейти по URL. Должен быть вызван перед любым другим инструментом браузера. Инициализирует сессию Browserbase.
Navigate to https://github.com/NousResearch
Для простого получения информации предпочитайте `web_search` или `web_extract` — они быстрее и дешевле. Используйте инструменты браузера, когда нужно **взаимодействовать** со страницей (нажимать кнопки, заполнять формы, работать с динамическим контентом).
browser_snapshot
Получить текстовый снимок дерева доступности текущей страницы. Возвращает интерактивные элементы с ref ID (например, @e1, @e2) для использования с browser_click и browser_type.
full=false (по умолчанию): Компактный вид, показывающий только интерактивные элементы
full=true: Полное содержимое страницы
Снимки длиннее 8000 символов автоматически суммируются LLM.
browser_click
Нажать на элемент, идентифицированный по его ref ID из снимка.
Click@e5topressthe"Sign In"button
browser_type
Ввести текст в поле ввода. Сначала очищает поле, затем вводит новый текст.
Type"hermes agent"intothesearchfield@e3
browser_scroll
Прокрутить страницу вверх или вниз, чтобы показать больше контента.
Scroll down to see more results
browser_press
Нажать клавишу на клавиатуре. Полезно для отправки форм или навигации.
Press Enter to submit the form
Поддерживаемые клавиши: Enter, Tab, Escape, ArrowDown, ArrowUp и другие.
browser_back
Вернуться на предыдущую страницу в истории браузера.
browser_get_images
Список всех изображений на текущей странице с их URL и alt-текстом. Полезно для поиска изображений для анализа.
browser_vision
Сделать скриншот и проанализировать его с помощью vision AI. Используйте это, когда текстовые снимки не улавливают важную визуальную информацию — особенно полезно для CAPTCHA, сложных макетов или задач визуальной верификации.
Скриншот сохраняется постоянно, и путь к файлу возвращается вместе с анализом AI. На платформах обмена сообщениями (Telegram, Discord, Slack, WhatsApp) вы можете попросить агента поделиться скриншотом — он будет отправлен как нативное вложение фото через механизм MEDIA:.
Whatdoesthechartonthispageshow?
Скриншоты хранятся в ~/.hermes/cache/screenshots/ и автоматически очищаются через 24 часа.
browser_console
Получить вывод консоли браузера (сообщения log/warn/error) и неперехваченные исключения JavaScript с текущей страницы. Незаменим для обнаружения скрытых JS-ошибок, которые не отображаются в дереве доступности.
CheckthebrowserconsoleforanyJavaScripterrors
Используйте clear=True, чтобы очистить консоль после чтения — тогда последующие вызовы покажут только новые сообщения.
browser_console также выполняет JavaScript при вызове с аргументом expression — так же, как консоль DevTools, результат возвращается в разобранном виде (JSON-сериализованные объекты становятся словарями, примитивные значения остаются примитивами).
Когда для текущей сессии активен CDP supervisor (обычно для любой сессии, запустившей browser_navigate для CDP-совместимого бэкенда), выполнение происходит через постоянный WebSocket supervisor — без затрат на запуск подпроцесса. В противном случае используется стандартный путь CLI agent-browser. Поведение идентично в обоих случаях — различается только задержка.
browser_cdp
Прямой проход к Chrome DevTools Protocol — запасной выход для операций в браузере, не охваченных другими инструментами. Используйте для работы с нативными диалогами, выполнения кода в iframe, управления cookies/сетью или любых команд CDP, которые нужны агенту.
Доступен только когда CDP-эндпоинт достижим при старте сессии — то есть когда /browser connect подключен к запущенному Chrome или в config.yaml установлен browser.cdp_url. Стандартный локальный режим agent-browser, Camofox и облачные провайдеры (Browserbase, Browser Use, Firecrawl) в настоящее время не предоставляют CDP этому инструменту — у облачных провайдеров есть CDP URL для каждой сессии, но маршрутизация в реальном времени — в разработке.
Справочник по методам CDP: https://chromedevtools.github.io/devtools-protocol/ — агент может использовать web_extract для страницы конкретного метода, чтобы посмотреть параметры и возвращаемые значения.
Типичные примеры:
# List tabs (browser-level, no target_id)
browser_cdp(method="Target.getTargets")
# Handle a native JS dialog on a tab
browser_cdp(method="Page.handleJavaScriptDialog",
params={"accept": true, "promptText": ""},
target_id="<tabId>")
# Evaluate JS in a specific tab
browser_cdp(method="Runtime.evaluate",
params={"expression": "document.title", "returnByValue": true},
target_id="<tabId>")
# Get all cookies
browser_cdp(method="Network.getAllCookies")
Методы уровня браузера (Target.*, Browser.*, Storage.*) не требуют target_id. Методы уровня страницы (Page.*, Runtime.*, DOM.*, Emulation.*) требуют target_id из Target.getTargets. Каждый вызов без состояния независим — сессии не сохраняются между вызовами.
Кросс-доменные iframe: передайте frame_id (из browser_snapshot.frame_tree.children[] где is_oopif=true), чтобы направить CDP-вызов через живую сессию supervisor для этого iframe. Так работает Runtime.evaluate внутри кросс-доменного iframe на Browserbase, где соединения CDP без состояния столкнулись бы с истечением подписанных URL. Пример:
browser_cdp(
method="Runtime.evaluate",
params={"expression": "document.title", "returnByValue": True},
frame_id="<frame_id from browser_snapshot>",
)
Одно-доменные iframe не нуждаются в frame_id — используйте document.querySelector('iframe').contentDocument из Runtime.evaluate верхнего уровня.
browser_dialog
Отвечает на нативный JS-диалог (alert / confirm / prompt / beforeunload). До появления этого инструмента диалоги молча блокировали поток JavaScript страницы, и последующие вызовы browser_* зависали или выбрасывали ошибку; теперь агент видит ожидающие диалоги в выдаче browser_snapshot и отвечает явно.
Рабочий процесс:
Вызовите browser_snapshot. Если диалог блокирует страницу, он отображается как pending_dialogs: [{"id": "d-1", "type": "alert", "message": "..."}].
Вызовите browser_dialog(action="accept") или browser_dialog(action="dismiss"). Для диалогов prompt() передайте prompt_text="..." для ответа.
Обнаружение происходит автоматически через постоянный CDP supervisor — один WebSocket на задачу, подписанный на события Page/Runtime/Target. Supervisor также заполняет поле frame_tree в снимке, чтобы агент видел структуру iframe текущей страницы, включая кросс-доменные (OOPIF) iframe.
Матрица доступности:
Бэкенд
Обнаружение через pending_dialogs
Ответ (инструмент browser_dialog)
Локальный Chrome через /browser connect или browser.cdp_url
✓
✓ полный workflow
Browserbase
✓
✓ полный workflow (через встроенный XHR-мост)
Camofox / стандартный локальный agent-browser
✗
✗ (нет CDP-эндпоинта)
Как это работает на Browserbase. Прокси CDP от Browserbase автоматически отклоняет реальные нативные диалоги на стороне сервера в течение ~10 мс, поэтому мы не можем использовать Page.handleJavaScriptDialog. Supervisor внедряет небольшой скрипт через Page.addScriptToEvaluateOnNewDocument, который переопределяет window.alert/confirm/prompt синхронным XHR. Мы перехватываем эти XHR через Fetch.enable — поток JS страницы остается заблокированным на XHR, пока мы не вызовем Fetch.fulfillRequest с ответом агента. Возвращаемые значения prompt() передаются обратно в JS страницы без изменений.
Политика диалогов настраивается в config.yaml через browser.dialog_policy:
Политика
Поведение
must_respond (по умолчанию)
Захватить, показать в снимке, ждать явного вызова browser_dialog(). Автоматическое отклонение по безопасности после browser.dialog_timeout_s (по умолчанию 300 с), чтобы зависший агент не заблокировал все навсегда.
auto_dismiss
Захватить, немедленно отклонить. Агент все еще видит диалог в истории browser_state, но не должен на него реагировать.
auto_accept
Захватить, немедленно принять. Полезно при навигации по страницам с агрессивными подсказками beforeunload.
Frame tree внутри browser_snapshot.frame_tree ограничен 30 фреймами и глубиной OOPIF 2, чтобы размер данных оставался приемлемым на страницах с большим количеством рекламы. Флаг truncated: true появляется, когда лимиты были превышены; агентам, которым нужно полное дерево, следует использовать browser_cdp с Page.getFrameTree.
Автоматически записывать сессии браузера в видеофайлы WebM:
browser:record_sessions:true# default: false
Когда включено, запись начинается автоматически при первом browser_navigate и сохраняется в ~/.hermes/browser_recordings/ при закрытии сессии. Работает как в локальном, так и в облачном режиме (Browserbase). Записи старше 72 часов автоматически очищаются.
Случайные отпечатки, рандомизация viewport, решение CAPTCHA
Residential Proxies
Включено
Маршрутизация через резидентные IP для лучшего доступа
Advanced Stealth
Выключено
Пользовательская сборка Chromium, требуется Scale Plan
Keep Alive
Включено
Переподключение сессии после сетевых сбоев
Если платные функции недоступны в вашем тарифе, Hermes автоматически выполняет откат — сначала отключая `keepAlive`, затем прокси — так что браузинг все еще работает на бесплатных тарифах.
Управление сессиями
Каждая задача получает изолированную сессию браузера через Browserbase
Сессии автоматически очищаются после бездействия (по умолчанию: 2 минуты)
Фоновый поток проверяет каждые 30 секунд наличие устаревших сессий
Аварийная очистка выполняется при завершении процесса для предотвращения осиротевших сессий
Сессии освобождаются через API Browserbase (статус REQUEST_RELEASE)
Ограничения
Текстовое взаимодействие — основано на дереве доступности, а не на пиксельных координатах
Размер снимка — большие страницы могут быть усечены или суммированы LLM при 8000 символах
Таймаут сессии — облачные сессии истекают в соответствии с настройками тарифа вашего провайдера
Стоимость — облачные сессии расходуют кредиты провайдера; сессии автоматически очищаются при завершении разговора или после бездействия. Используйте /browser connect для бесплатного локального браузинга.
Нет загрузки файлов — невозможно скачать файлы из браузера