跳到主要内容

浏览器自动化

Hermes Agent 内置了完整的浏览器自动化工具集,并支持多种后端模式:

  • 通过 Browserbase 使用 Browserbase 云模式,获得托管云浏览器与反机器人能力
  • 通过 Browser Use 使用 Browser Use 云模式,作为另一种云浏览器大模型提供商(provider)
  • 通过 Firecrawl 使用 Firecrawl 云模式,获得自带抓取能力的云浏览器
  • 通过 Camofox 使用 Camofox 本地模式,在本地进行带反检测能力的浏览(基于 Firefox 指纹伪装)
  • 通过 CDP 连接本地 Chrome,使用 /browser connect 将浏览器工具连接到你自己的 Chrome 实例
  • 通过 agent-browser CLI 和本地 Chromium 使用 本地浏览器模式

无论采用哪种模式,智能体都可以导航网站、与页面元素交互、填写表单并提取信息。

概览

页面会被表示成 可访问性树(基于文本的快照),这对 LLM 智能体非常友好。交互元素会带有 ref ID(如 @e1@e2),智能体通过它们执行点击和输入。

核心能力包括:

  • 多大模型提供商(provider)云执行:Browserbase、Browser Use 或 Firecrawl,无需本地浏览器
  • 本地 Chrome 集成:通过 CDP 连接你正在运行的 Chrome,便于实时观察操作过程
  • 内置 stealth:随机指纹、验证码处理、住宅代理(Browserbase)
  • 会话隔离:每个任务都有独立浏览器会话
  • 自动清理:长时间不活动的会话会超时关闭
  • 视觉分析:支持截图 + AI 分析,处理纯文本快照无法覆盖的视觉信息

设置

Nous 订阅用户

如果你拥有付费 Nous Portal 订阅,可以通过 Tool Gateway 使用浏览器自动化,无需任何额外 API key。运行 hermes modelhermes tools 即可启用。

Browserbase 云模式

要使用 Browserbase 托管的云浏览器,请添加:

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

凭据可在 browserbase.com 获取。

Browser Use 云模式

要使用 Browser Use 作为云浏览器大模型提供商(provider),请添加:

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

API key 可在 browser-use.com 获取。Browser Use 通过其 REST API 提供云浏览器。如果同时配置了 Browserbase 与 Browser Use,优先使用 Browserbase。

Firecrawl 云模式

要使用 Firecrawl 作为云浏览器大模型提供商(provider),请添加:

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

API key 可在 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

Camofox 本地模式

Camofox 是一个自托管 Node.js 服务,封装了 Camoufox(带 C++ 指纹伪装的 Firefox 分支),可在无云依赖的情况下提供本地反检测浏览能力。

# 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 → Browser Automation → Camofox 中配置。

当设置了 CAMOFOX_URL 后,所有浏览器工具都会自动走 Camofox,而不是 Browserbase 或 agent-browser。

持久浏览器会话

默认情况下,每个 Camofox 会话都会获得一个随机身份,因此 cookies 和登录态不会跨 agent 重启保留。如果你想启用持久浏览器会话,请在 ~/.hermes/config.yaml 中加入:

browser:
camofox:
managed_persistence: true

设置后,请完整重启 Hermes 以使新配置生效。

Nested path matters

Hermes 读取的是 browser.camofox.managed_persistence不是 顶层 managed_persistence。一个常见错误写法如下:

# ❌ Wrong — Hermes ignores this
managed_persistence: true

如果标志写在错误路径上,Hermes 会静默回退到随机临时 userId,导致每次会话都丢失登录状态。

Hermes 会做什么
  • 向 Camofox 发送一个按 profile 作用域稳定生成的 userId,以便服务器复用同一个 Firefox profile
  • 清理时跳过服务端上下文销毁,因此 cookies 和登录状态可以跨任务保留
  • userId 绑定到当前 Hermes profile,不同 Hermes profile 会得到不同浏览器 profile
Hermes 不会做什么
  • 它不会强制 Camofox 服务器持久化。Hermes 只会发送稳定的 userId,真正的持久化仍取决于服务器是否把该 userId 映射到固定 Firefox profile 目录
  • 如果你的 Camofox 服务端实现把每次请求都当成临时会话处理,那么 Hermes 无法强行让它持久化。请确保你使用的 Camofox 版本支持基于 userId 的 profile 持久化
如何验证是否生效
  1. 启动 Hermes 和 Camofox 服务
  2. 在浏览器任务中打开 Google(或任意需要登录的网站)并手动登录
  3. 正常结束该浏览器任务
  4. 启动一个新的浏览器任务
  5. 再次打开同一网站,此时应仍保持登录状态

如果第 5 步发现已经退出登录,说明 Camofox 服务器没有正确使用稳定的 userId。请检查配置路径是否正确、编辑 config.yaml 后是否完整重启 Hermes,以及你当前的 Camofox 版本是否支持持久 profile。

状态存储在哪里

Hermes 会根据 profile 作用域目录 ~/.hermes/browser_auth/camofox/(非默认 profile 则位于对应 $HERMES_HOME 下)生成稳定 userId。实际浏览器 profile 数据存储在 Camofox 服务器端,并以该 userId 为键。如果要完全重置一个持久 profile,需要同时清理 Camofox 服务器端数据,并删除对应 Hermes profile 的本地状态目录。

VNC 实时预览

当 Camofox 以 headed 模式运行(可见浏览器窗口)时,它会在健康检查响应中暴露 VNC 端口。Hermes 会自动发现该端口,并在导航响应中附带 VNC URL,这样智能体就可以把链接发给你,让你实时观看浏览器操作。

通过 CDP 连接本地 Chrome(/browser connect

你也可以不使用云大模型提供商(provider),而是通过 Chrome DevTools Protocol(CDP)把 Hermes 浏览器工具连接到你自己的本地 Chrome 实例。这在以下场景中特别有用:你想实时看见智能体在做什么、需要使用你自己现成的 cookies / 会话,或者想避免云浏览器成本。

备注

/browser connect交互式 CLI 的 slash 命令,不会由 网关 分发。如果你在 WebUI、Telegram、Discord 或其他 网关 聊天中输入它,这条消息会被当作普通文本发送给智能体,而不会实际执行命令。请从终端启动 Hermes(hermeshermes chat),并在 CLI 中执行 /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 启动它。

提示

如果你要手动启用 CDP 模式启动 Chrome,请务必指定一个单独的 user-data-dir。否则当你的常规 Chrome profile 已在运行时,新窗口通常只是挂到已有进程上,而该进程并没有用 --remote-debugging-port 启动,于是 9222 端口并不会真正打开。

# 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 进程在跑,新启动命令通常不会创建全新的带调试端口进程,而只是打开新窗口。使用独立 user-data-dir 会强制拉起一个新的 Chrome 实例,让调试端口真正可用。--no-first-run --no-default-browser-check 则用于跳过新 profile 的首次启动向导。

连接成功后,所有浏览器工具(如 browser_navigatebrowser_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

安装 agent-browser CLI

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

你的配置中必须包含 browser 工具集,或通过 hermes config set toolsets '["hermes-cli", "browser"]' 启用它。

可用工具

browser_navigate

导航到一个 URL。在调用其他浏览器工具前必须先调用它。它也会初始化 Browserbase 会话。

Navigate to https://github.com/NousResearch
提示

如果只是简单抓取信息,更建议优先使用 web_searchweb_extract,因为它们更快、更便宜。只有在你需要 与页面交互(点击按钮、填写表单、处理动态内容)时,再使用浏览器工具。

browser_snapshot

获取当前页面可访问性树的文本快照。交互元素会带有像 @e1@e2 这样的 ref ID,可供 browser_clickbrowser_type 使用。

  • full=false(默认):紧凑视图,只显示交互元素
  • full=true:完整页面内容

超过 8000 字符的快照会自动由 LLM 做摘要。

browser_click

点击快照中通过 ref ID 标识的元素。

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

支持的按键包括 EnterTabEscapeArrowDownArrowUp 等。

browser_back

回到浏览器历史中的上一页。

browser_get_images

列出当前页面上的全部图片,包括 URL 和 alt 文本,适合用于寻找待分析图片。

browser_vision

截图并调用视觉 AI 做分析。当文本快照无法体现关键视觉信息时使用它,尤其适合验证码、复杂布局或视觉验证场景。

截图会持久保存,文件路径会和 AI 分析结果一起返回。在消息平台(Telegram、Discord、Slack、WhatsApp)中,你可以要求智能体把截图发出来,系统会通过 MEDIA: 机制以原生图片附件方式发送。

What does the chart on this page show?

截图保存在 ~/.hermes/cache/screenshots/ 中,并会在 24 小时后自动清理。

browser_console

获取当前页面的浏览器控制台输出(log / warn / error)以及未捕获的 JavaScript 异常。这对发现可访问性树中看不到的静默 JS 错误非常重要。

Check the browser console for any JavaScript errors

使用 clear=True 可在读取后清空控制台,这样后续调用只会看到新增消息。

browser_cdp

原始 Chrome DevTools Protocol 透传工具,是浏览器操作中的“逃生口”。当其他浏览器工具无法覆盖某类操作时,可用它处理原生对话框、iframe 作用域执行、cookie / network 控制,或任意 CDP 方法。

只有在会话开始时存在可用 CDP 端点时才可使用,也就是你已经通过 /browser connect 连接到运行中的 Chrome,或在 config.yaml 中设置了 browser.cdp_url。默认的本地 agent-browser 模式、Camofox 模式,以及 Browserbase / Browser Use / Firecrawl 这类云大模型提供商(provider)当前都不会向该工具暴露 CDP。

CDP 方法参考: https://chromedevtools.github.io/devtools-protocol/

常见模式:

# 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.getTargets 获取的 target_id。每次调用彼此独立,状态不会跨调用保存。

实际示例

填写网页表单

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/。支持本地与云模式(Browserbase)。超过 72 小时的录制文件会被自动清理。

Stealth 特性

Browserbase 提供自动 stealth 能力:

特性默认值说明
Basic StealthAlways on随机指纹、viewport 随机化、验证码处理
Residential ProxiesOn通过住宅 IP 路由以提升访问成功率
Advanced StealthOff自定义 Chromium 构建,需要 Scale Plan
Keep AliveOn网络抖动后重连会话
备注

如果你的套餐不支持付费能力,Hermes 会自动逐级回退,先关闭 keepAlive,再关闭代理,从而保证免费套餐下浏览仍能工作。

会话管理

  • 每个任务都会通过 Browserbase 获得独立浏览器会话
  • 会话在不活动一段时间后会自动清理(默认 2 分钟)
  • 后台线程每 30 秒检查一次过期会话
  • 进程退出时会执行紧急清理,避免遗留僵尸会话
  • 会话通过 Browserbase API 的 REQUEST_RELEASE 状态释放

限制

  • 基于文本的交互:依赖可访问性树,而不是像素坐标
  • 快照大小限制:大页面可能在 8000 字符处截断或被 LLM 摘要
  • 会话超时:云会话会按你的大模型提供商(provider)套餐规则过期
  • 成本:云会话会消耗大模型提供商(provider)额度;会话会在对话结束或不活动后自动清理。若想免费使用本地浏览,请使用 /browser connect
  • 不支持文件下载:目前无法通过浏览器工具下载文件