浏览器自动化
Hermes Agent 内置了完整的浏览器自动化工具集,并支持多种后端模式:
- 通过 Browserbase 使用 Browserbase 云模式,获得托管云浏览器与反机器人能力
- 通过 Browser Use 使用 Browser Use 云模式,作为另一种云浏览器大模型提供商(provider)
- 通过 Firecrawl 使用 Firecrawl 云模式,获得自带抓取能力的云浏览器
- 通过 Camofox 使用 Camofox 本地模式,在本地进行带反检测能力的浏览(基于 Firefox 指纹伪装)
- 通过 CDP 连接本地 Chrome,使用
/browser connect将浏览器工具连接到你自己的 Chrome 实例 - 通过
agent-browserCLI 和本地 Chromium 使用 本地浏览器模式
无论采用哪种模式,智能体都可以导航网站、与页面元素交互、填写表单并提取信息。
概览
页面会被表示成 可访问性树(基于文本的快照),这对 LLM 智能体非常友好。交互元素会带有 ref ID(如 @e1、@e2),智能体通过它们执行点击和输入。
核心能力包括:
- 多大模型提供商(provider)云执行:Browserbase、Browser Use 或 Firecrawl,无需本地浏览器
- 本地 Chrome 集成:通过 CDP 连接你正在运行的 Chrome,便于实时观察操作过程
- 内置 stealth:随机指纹、验证码处理、住宅代理(Browserbase)
- 会话隔离:每个任务都有独立浏览器会话
- 自动清理:长时间不活动的会话会超时关闭
- 视觉分析:支持截图 + AI 分析,处理纯文本快照无法覆盖的视觉信息
设置
如果你拥有付费 Nous Portal 订阅,可以通过 Tool Gateway 使用浏览器自动化,无需任何额外 API key。运行 hermes model 或 hermes 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 以使新配置生效。
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 持久化
如何验证是否生效
- 启动 Hermes 和 Camofox 服务
- 在浏览器任务中打开 Google(或任意需要登录的网站)并手动登录
- 正常结束该浏览器任务
- 启动一个新的浏览器任务
- 再次打开同一网站,此时应仍保持登录状态
如果第 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(hermes 或 hermes 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_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
安装 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_search 或 web_extract,因为它们更快、更便宜。只有在你需要 与页面交互(点击按钮、填写表单、处理动态内容)时,再使用浏览器工具。
browser_snapshot
获取当前页面可访问性树的文本快照。交互元素会带有像 @e1、@e2 这样的 ref ID,可供 browser_click 和 browser_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
支持的按键包括 Enter、Tab、Escape、ArrowDown、ArrowUp 等。
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 Stealth | Always on | 随机指纹、viewport 随机化、验证码处理 |
| Residential Proxies | On | 通过住宅 IP 路由以提升访问成功率 |
| Advanced Stealth | Off | 自定义 Chromium 构建,需要 Scale Plan |
| Keep Alive | On | 网络抖动后重连会话 |
如果你的套餐不支持付费能力,Hermes 会自动逐级回退,先关闭 keepAlive,再关闭代理,从而保证免费套餐下浏览仍能工作。
会话管理
- 每个任务都会通过 Browserbase 获得独立浏览器会话
- 会话在不活动一段时间后会自动清理(默认 2 分钟)
- 后台线程每 30 秒检查一次过期会话
- 进程退出时会执行紧急清理,避免遗留僵尸会话
- 会话通过 Browserbase API 的
REQUEST_RELEASE状态释放
限制
- 基于文本的交互:依赖可访问性树,而不是像素坐标
- 快照大小限制:大页面可能在 8000 字符处截断或被 LLM 摘要
- 会话超时:云会话会按你的大模型提供商(provider)套餐规则过期
- 成本:云会话会消耗大模型提供商(provider)额度;会话会在对话结束或不活动后自动清理。若想免费使用本地浏览,请使用
/browser connect - 不支持文件下载:目前无法通过浏览器工具下载文件