title: Browser Automation description: Control browsers with multiple providers, local Chrome via CDP, or cloud browsers for web interaction, form filling, scraping, and more. sidebar_label: Browser sidebar_position: 5 lang: ru


Автоматизация браузера

Агент Hermes включает в себя полный набор инструментов для автоматизации браузера с несколькими опциями серверной части:

Во всех режимах агент может перемещаться по веб-сайтам, взаимодействовать с элементами страниц, заполнять формы и извлекать информацию.

Обзор

Страницы представлены в виде деревьев доступности (текстовых снимков), что делает их идеальными для агентов LLM. Интерактивные элементы получают идентификаторы ссылок (например, @e1, @e2), которые агент использует для нажатия и ввода текста.

Ключевые возможности:

Настройка

💡 Tip

Подписчики Если у вас есть платная подписка на [Nous Portal](https://portal.nousresearch.com), вы можете использовать автоматизацию браузера через **[Tool Gateway](tool-gateway.md)** без каких-либо отдельных ключей API. Запустите `hermes model` или `hermes tools`, чтобы включить его.

Облачный режим базы браузера

Чтобы использовать облачные браузеры, управляемые Browserbase, добавьте:

# Add to ~/.hermes/.env
BROWSERBASE_API_KEY=***
BROWSERBASE_PROJECT_ID=your-project-id-here

Получите свои учетные данные на browserbase.com.

Браузер Использовать облачный режим

Чтобы использовать Browser Use в качестве поставщика облачного браузера, добавьте:

# Add to ~/.hermes/.env
BROWSER_USE_API_KEY=***

Получите ключ API на сайте browser-use.com. Использование браузера предоставляет облачный браузер через REST API. Если заданы учетные данные Browserbase и Browser Use, Browserbase имеет приоритет.

Облачный режим Firecrawl

Чтобы использовать Firecrawl в качестве поставщика облачного браузера, добавьте:

# Add to ~/.hermes/.env
FIRECRAWL_API_KEY=fc-***

Получите ключ API на firecrawl.dev. Затем выберите Firecrawl в качестве поставщика браузера:

hermes setup tools
# → Browser Automation → Firecrawl

Дополнительные настройки:

# Self-hosted Firecrawl instance (default: https://api.firecrawl.dev)
FIRECRAWL_API_URL=http://localhost:3002

# Session TTL in seconds (default: 300)
FIRECRAWL_BROWSER_TTL=600

Гибридная маршрутизация: облако для общедоступных URL-адресов, локальная для локальной сети/локального хоста

Когда облачный провайдер настроен, Hermes автоматически создает локальную версию Chromium. для URL-адресов, которые разрешаются в частный адрес, адрес обратной связи или локальную сеть (localhost, 127.0.0.1, 192.168.x.x, 10.x.x.x, 172.16-31.x.x, *.local, *.lan, *.internal, Шлейф IPv6 ::1, локальный канал 169.254.x.x). Публичные URL-адреса продолжают использовать облачный провайдер в том же разговоре.

Это решает распространенный рабочий процесс «Я разрабатываю локально, но использую Browserbase» — агент может сделать снимок экрана вашей информационной панели по адресу http://localhost:3000 AND scrape https://github.com без необходимости переключения провайдера или отключения защиты SSRF. Поставщик облачных услуг никогда не видит частный URL-адрес.

Эта функция включена по умолчанию. Чтобы отключить его (все URL-адреса переходят на настроенный облачный провайдер, как и раньше):

# ~/.hermes/config.yaml
browser:
  cloud_provider: browserbase
  auto_local_for_private_urls: false

Если автоматическая маршрутизация отключена, частные URL-адреса отклоняются с "Blocked: URL targets a private or internal address", если вы также не установите browser.allow_private_urls: true (что позволяет поставщику облачных услуг попробовать их — обычно не работает, поскольку Browserbase и т. д. не могут подключиться к вашей локальной сети).

Требования: локальная коляска использует тот же интерфейс командной строки agent-browser, что и чисто локальная версия. режим, поэтому вам необходимо его установить (hermes setup tools → Browser Automation автоматически устанавливает его). Пост-навигация перенаправляет с общедоступного URL-адреса на частный адрес по-прежнему заблокированы (вы не можете использовать трюк с перенаправлением на внутренний адрес, чтобы достичь вашей локальной сети через общедоступный путь).

Локальный режим Camofox

Camofox — это автономный сервер Node.js, включающий Camoufox (вилка Firefox с подменой отпечатков пальцев C++). Он обеспечивает локальный просмотр с защитой от обнаружения без облачных зависимостей.

# Install and run
git clone https://github.com/jo-inc/camofox-browser && cd camofox-browser
npm install && npm start   # downloads Camoufox (~300MB) on first run

# Or via Docker
docker run -d --network host -e CAMOFOX_PORT=9377 jo-inc/camofox-browser

Затем установите ~/.hermes/.env:

CAMOFOX_URL=http://localhost:9377

Или настройте через hermes tools → Автоматизация браузера → Camofox.

Если установлен CAMOFOX_URL, все инструменты браузера автоматически маршрутизируются через Camofox вместо Browserbase или агента-браузера.

Постоянные сеансы браузера

По умолчанию каждый сеанс Camofox получает случайный идентификатор — файлы cookie и логины не сохраняются после перезапуска агента. Чтобы включить постоянные сеансы браузера, добавьте следующее в ~/.hermes/config.yaml:

browser:
  camofox:
    managed_persistence: true

Затем полностью перезапустите Hermes, чтобы новая конфигурация была принята.

:::предупреждение Вложенный путь имеет значение Гермес читает browser.camofox.managed_persistence, не managed_persistence высшего уровня. Распространенной ошибкой является запись:

# ❌ Wrong — Hermes ignores this
managed_persistence: true

Если флаг установлен на неправильном пути, Hermes автоматически вернется к случайному эфемерному адресу userId, и ваше состояние входа будет потеряно при каждом сеансе.

Что делает Гермес
Чего не делает Гермес
Убедитесь, что все работает
  1. Запустите Hermes и ваш сервер Camofox.
  2. Откройте Google (или любой другой сайт входа) в задаче браузера и войдите в систему вручную.
  3. Завершите задачу браузера обычным способом.
  4. Запустите новую задачу браузера.
  5. Откройте тот же сайт еще раз — вы все равно должны войти в систему.

Если на шаге 5 вы выйдете из системы, сервер Camofox не поддерживает стабильную версию userId. Дважды проверьте путь к конфигурации, убедитесь, что вы полностью перезапустили Hermes после редактирования config.yaml, и убедитесь, что ваша версия сервера Camofox поддерживает постоянные профили для каждого пользователя.

Где живет государство

Hermes извлекает стабильный userId из каталога области профиля ~/.hermes/browser_auth/camofox/ (или эквивалент в $HERMES_HOME для профилей, отличных от профилей по умолчанию). Фактические данные профиля браузера хранятся на стороне сервера Camofox и хранятся под ключом userId. Чтобы полностью сбросить постоянный профиль, очистите его на сервере Camofox и удалите каталог состояния соответствующего профиля Hermes.

Просмотр в реальном времени VNC

Когда Camofox работает в режиме заголовка (с видимым окном браузера), он предоставляет порт VNC в ответе на проверку работоспособности. Hermes автоматически обнаруживает это и включает URL-адрес VNC в ответы навигации, чтобы агент мог поделиться ссылкой, чтобы вы могли посмотреть браузер в прямом эфире.

Локальный Chrome через CDP (/browser connect)

Вместо облачного провайдера вы можете подключить инструменты браузера Hermes к своему работающему экземпляру Chrome через протокол Chrome DevTools (CDP). Это полезно, если вы хотите видеть, что делает агент в режиме реального времени, взаимодействовать со страницами, для которых требуются ваши собственные файлы cookie/сессии, или избежать затрат на облачный браузер.

:::примечание /browser connect — это косая черта интерактивной команды CLI — она не отправляется шлюзом. Если вы попытаетесь запустить его внутри чата WebUI, Telegram, Discord или другого шлюза, сообщение будет отправлено агенту в виде обычного текста, и команда не будет выполнена. Запустите Hermes с терминала (hermes или hermes chat) и введите туда /browser connect. В CLI используйте:

/browser connect              # Connect to Chrome at ws://localhost:9222
/browser connect ws://host:port  # Connect to a specific CDP endpoint
/browser status               # Check current connection
/browser disconnect            # Detach and return to cloud/local mode

Если Chrome еще не работает с удаленной отладкой, Hermes попытается автоматически запустить его с помощью --remote-debugging-port=9222.

:::совет Чтобы запустить Chrome вручную с включенным CDP, используйте выделенный каталог пользовательских данных, чтобы порт отладки действительно появился, даже если 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 и выполните команду /browser connect.

Почему --user-data-dir? Без него при запуске Chrome, когда уже работает обычный экземпляр Chrome, обычно открывается новое окно существующего процесса, а этот существующий процесс не был запущен с помощью --remote-debugging-port, поэтому порт 9222 никогда не открывается. Выделенный каталог пользовательских данных вызывает новый процесс Chrome, который фактически прослушивает порт отладки. --no-first-run --no-default-browser-check пропускает мастер первого запуска нового профиля. При подключении через CDP все инструменты браузера (browser_navigate, browser_click и т. д.) работают на вашем работающем экземпляре Chrome, а не запускают облачный сеанс.

Режим локального браузера

Если вы не установили какие-либо облачные учетные данные и не используете /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 агента-браузера

npm install -g agent-browser
# Or install locally in the repo:
npm install

:::информация Набор инструментов 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

Получите текстовый снимок дерева доступности текущей страницы. Возвращает интерактивные элементы с идентификаторами ссылок, такими как @e1, @e2 для использования с browser_click и browser_type.

Снимки длиной более 8000 символов автоматически суммируются с помощью LLM.

browser_click

Щелкните элемент, идентифицированный по его идентификатору ссылки на снимке.

Click @e5 to press the "Sign In" button

browser_type

Введите текст в поле ввода. Сначала очищает поле, затем вводит новый текст.

Type "hermes agent" into the search field @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-адресами и замещающим текстом. Полезно для поиска изображений для анализа.

browser_vision

Сделайте снимок экрана и проанализируйте его с помощью Vision AI. Используйте это, когда текстовые снимки не фиксируют важную визуальную информацию — особенно полезно для CAPTCHA, сложных макетов или задач визуальной проверки.

Скриншот сохраняется постоянно, а путь к файлу возвращается вместе с анализом AI. На платформах обмена сообщениями (Telegram, Discord, Slack, WhatsApp) вы можете попросить агента поделиться снимком экрана — он будет отправлен как встроенное фото с помощью механизма MEDIA:.

What does the chart on this page show?

Снимки экрана хранятся в ~/.hermes/cache/screenshots/ и автоматически очищаются через 24 часа.

browser_console

Получите выходные данные консоли браузера (сообщения журнала/предупреждений/ошибок) и неперехваченные исключения JavaScript с текущей страницы. Необходим для обнаружения скрытых ошибок JS, которые не отображаются в дереве доступности.

Check the browser console for any JavaScript errors

Используйте clear=True, чтобы очистить консоль после прочтения, чтобы при последующих вызовах отображались только новые сообщения.

browser_cdp

Сквозной доступ к протоколу Raw Chrome DevTools — запасной выход для операций браузера, не охватываемых другими инструментами. Используйте для обработки встроенного диалога, оценки на уровне iframe, управления файлами cookie/сети или любого глагола CDP, который нужен агенту.

Доступно только тогда, когда конечная точка CDP доступна в начале сеанса — это означает, что /browser connect подключен к работающему Chrome или browser.cdp_url установлен в config.yaml. Режим локального агента-браузера по умолчанию, Camofox и облачные провайдеры (Browserbase, Browser Use, Firecrawl) в настоящее время не предоставляют CDP для этого инструмента — облачные провайдеры имеют URL-адреса CDP для каждого сеанса, но маршрутизация в реальном времени является последующим шагом.

Ссылка на метод 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 через сеанс реального времени супервизора для этого 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 и явно отвечает.

Рабочий процесс: 1. Позвоните browser_snapshot. Если диалоговое окно блокирует страницу, оно отображается как pending_dialogs: [{"id": "d-1", "type": "alert", "message": "..."}]. 2. Позвоните browser_dialog(action="accept") или browser_dialog(action="dismiss"). Для диалоговых окон prompt() передайте prompt_text="...", чтобы предоставить ответ. 3. Повторный снимок — pending_dialogs пуст; поток JS на странице возобновился.

Обнаружение происходит автоматически через постоянный супервизор CDP — один WebSocket на каждую задачу, которая подписывается на события Page/Runtime/Target. Супервизор также заполняет поле frame_tree в снимке, чтобы агент мог видеть структуру iframe текущей страницы, включая iframe перекрестного происхождения (OOPIF).

Матрица доступности:

Бэкэнд Обнаружение через pending_dialogs Ответ (browser_dialog инструмент)
Локальный Chrome через /browser connect или browser.cdp_url ✓ полный рабочий процесс
База браузеров ✓ полный рабочий процесс (через введенный мост XHR)
Camofox / локальный браузер-агент по умолчанию ✗ (без конечной точки CDP)

Как это работает в Browserbase. Прокси-сервер CDP Browserbase автоматически отклоняет настоящие собственные диалоги на стороне сервера в течение ~10 мс, поэтому мы не можем использовать Page.handleJavaScriptDialog. Супервизор внедряет небольшой скрипт через 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.

Дерево кадров внутри browser_snapshot.frame_tree ограничено 30 кадрами и глубиной OOPIF 2, чтобы ограничить полезную нагрузку на страницах с большим количеством рекламы. Флаг truncated: true появляется при достижении пределов; агенты, которым требуется полное дерево, могут использовать browser_cdp с Page.getFrameTree.

Практические примеры

Заполнение веб-формы

User: Sign up for an account on example.com with my email john@example.com

Agent workflow:
1. browser_navigate("https://example.com/signup")
2. browser_snapshot()   sees form fields with refs
3. browser_type(ref="@e3", text="john@example.com")
4. browser_type(ref="@e5", text="SecurePass123")
5. browser_click(ref="@e8")   clicks "Create Account"
6. browser_snapshot()   confirms success

Исследование динамического контента

User: What are the top trending repos on GitHub right now?

Agent workflow:
1. browser_navigate("https://github.com/trending")
2. browser_snapshot(full=true)   reads trending repo list
3. Returns formatted results

Запись сеанса

Автоматически записывать сеансы браузера в виде видеофайлов WebM:

browser:
  record_sessions: true  # default: false

Если этот параметр включен, запись начинается автоматически с первого browser_navigate и сохраняется в ~/.hermes/browser_recordings/ при закрытии сеанса. Работает как в локальном, так и в облачном (браузерном) режимах. Записи старше 72 часов автоматически удаляются.

Особенности скрытности

Browserbase предоставляет автоматические возможности скрытности:

Особенность По умолчанию Заметки
Базовая скрытность Всегда включен Случайные отпечатки пальцев, рандомизация области просмотра, решение CAPTCHA
Резидентные прокси Вкл Маршруты через резидентные IP-адреса для лучшего доступа
Продвинутая скрытность Выкл. Пользовательская сборка Chromium, требуется Scale Plan
Оставайся в живых Вкл Переподключение сеанса после сбоев в сети

:::примечание Если платные функции недоступны в вашем плане, Hermes автоматически отступает — сначала отключая keepAlive, а затем прокси — поэтому просмотр по-прежнему работает на бесплатных планах.

Управление сеансами

Ограничения