浏览器自动化(Browser Automation)
Hermes Agent 内置完整的浏览器自动化工具集,支持多种后端选项:
- Browserbase 云端模式:通过 Browserbase 使用托管云端浏览器和反机器人工具
- Browser Use 云端模式:通过 Browser Use 作为替代云端浏览器提供商
- Firecrawl 云端模式:通过 Firecrawl 使用内置抓取功能的云端浏览器
- Camofox 本地模式:通过 Camofox 实现本地反检测浏览(基于 Firefox 的指纹欺骗)
- 本地 Chrome via CDP:使用
/browser connect将浏览器工具连接到你自己的 Chrome 实例 - 本地浏览器模式:通过
agent-browserCLI 和本地 Chromium 安装
在所有模式下,Agent 均可导航网站、与页面元素交互、填写表单和提取信息。
概述
页面以无障碍树(基于文本的快照)表示,非常适合 LLM Agent。交互元素会获得引用 ID(如 @e1、@e2),Agent 使用它们进行点击和输入。
核心能力:
- 多提供商云端执行 — Browserbase、Browser Use 或 Firecrawl — 无需本地浏览器
- 本地 Chrome 集成 — 通过 CDP 连接到运行中的 Chrome 进行实时浏览
- 内置隐身 — 随机指纹、验证码(CAPTCHA)解决、住宅代理(Browserbase)
- 会话隔离 — 每个任务都有独立的浏览器会话
- 自动清理 — 非活跃会话在超时后关闭
- 视觉分析 — 截图 + AI 分析以实现视觉理解
设置
如果你有付费的 Nous Portal 订阅,可以通过 Tool Gateway 使用浏览器自动化,无需单独的 API 密钥。运行 hermes model 或 hermes tools 来启用。
Browserbase 云端模式
要使用 Browserbase 托管的云端浏览器,添加:
# 添加到 ~/.hermes/.env
BROWSERBASE_API_KEY=***
BROWSERBASE_PROJECT_ID=your-project-id-here
在 browserbase.com 获取凭证。
Browser Use 云端模式
要使用 Browser Use 作为云端浏览器提供商,添加:
# 添加到 ~/.hermes/.env
BROWSER_USE_API_KEY=***
在 browser-use.com 获取 API 密钥。Browser Use 通过其 REST API 提供云端浏览器。如果同时设置了 Browserbase 和 Browser Use 凭证,Browserbase 优先。
Firecrawl 云端模式
要使用 Firecrawl 作为云端浏览器提供商,添加:
# 添加到 ~/.hermes/.env
FIRECRAWL_API_KEY=fc-***
在 firecrawl.dev 获取 API 密钥。然后选择 Firecrawl 作为浏览器提供商:
hermes setup tools
# → Browser Automation → Firecrawl
可选设置:
# 自托管 Firecrawl 实例(默认:https://api.firecrawl.dev)
FIRECRAWL_API_URL=http://localhost:3002
# 会话 TTL(秒)(默认:300)
FIRECRAWL_BROWSER_TTL=600
混合路由:公网 URL 使用云端,LAN/localhost 使用本地
当配置了云端提供商时,Hermes 会自动为解析到私有/回环/LAN 地址的 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)自动生成本地 Chromium 辅助进程。公网 URL 在同一对话中继续使用云端提供商。
这解决了常见的"本地开发但使用 Browserbase"场景——Agent 可以在 http://localhost:3000 截图你的仪表盘,同时也能抓取 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 等无法访问你的 LAN)。
要求:本地辅助进程使用与纯本地模式相同的 agent-browser CLI,因此需要安装它(hermes setup tools → Browser Automation 会自动安装)。从公网 URL 重定向到私有地址的情况仍会被阻止(不能通过重定向到内部的技巧通过公网路径访问你的 LAN)。
Camofox 本地模式
Camofox 是一个自托管的 Node.js 服务器,封装了 Camoufox(带有 C++ 指纹欺骗的 Firefox 分支)。它提供无需云端依赖的本地反检测浏览。
# 首先克隆 Camofox 浏览器服务器
git clone https://github.com/jo-inc/camofox-browser
cd camofox-browser
# 使用默认容器设置通过 Docker 构建并启动
# (自动检测架构:M1/M2 上为 aarch64,Intel 上为 x86_64)
make up
# 停止并移除默认容器
make down
# 强制重新构建(例如升级 VERSION/RELEASE 后)
make reset
# 仅下载二进制文件而不构建
make fetch
# 显式覆盖架构或版本
make up ARCH=x86_64
make up VERSION=135.0.1 RELEASE=beta.24
make up 立即启动默认容器。如果需要自定义运行时设置(如更大的 Node 堆、VNC 或持久配置目录),先构建镜像然后自行运行:
# 构建镜像但不启动默认容器
make build
# 使用持久化、VNC 实时预览和更大 Node 堆启动
mkdir -p ~/.camofox-docker
docker run -d \
--name camofox-browser \
--restart unless-stopped \
-p 9377:9377 \
-p 6080:6080 \
-p 5901:5900 \
-e CAMOFOX_PORT=9377 \
-e ENABLE_VNC=1 \
-e VNC_BIND=0.0.0.0 \
-e VNC_RESOLUTION=1920x1080 \
-e MAX_OLD_SPACE_SIZE=2048 \
-v ~/.camofox-docker:/root/.camofox \
camofox-browser:135.0.1-aarch64
启用 VNC 后,浏览器以有头模式运行,可通过浏览器访问 http://localhost:6080(noVNC)实时观看。也可以将原生 VNC 客户端连接到 localhost:5901。
如果已经运行了 make up,在启动自定义容器之前先停止并移除默认容器:
make down
# 然后运行上面的自定义 docker run 命令
然后在 ~/.hermes/.env 中设置:
CAMOFOX_URL=http://localhost:9377
或通过 hermes tools → Browser Automation → Camofox 配置。
设置 CAMOFOX_URL 后,所有浏览器工具会自动通过 Camofox 路由,而非 Browserbase 或 agent-browser。
持久化浏览器会话
默认情况下,每个 Camofox 会话获得随机身份——Cookie 和登录状态在 Agent 重启后不会保留。要启用持久化浏览器会话,在 ~/.hermes/config.yaml 中添加:
browser:
camofox:
managed_persistence: true
然后完全重启 Hermes 以使新配置生效。
Hermes 读取 browser.camofox.managed_persistence,而非顶层的 managed_persistence。常见错误是写成:
# ❌ 错误——Hermes 会忽略这个
managed_persistence: true
如果标志放在错误路径,Hermes 会静默回退到随机临时 userId,你的登录状态将在每次会话中丢失。
Hermes 的行为
- 向 Camofox 发送确定性的配置文件范围
userId,以便服务器可以跨会话复用相同的 Firefox 配置文件。 - 清理时跳过服务端上下文销毁,使 Cookie 和登录状态在 Agent 任务之间保留。
- 将
userId限定在活跃的 Hermes 配置文件,因此不同的 Hermes 配置文件会获得不同的浏览器配置文件(配置文件隔离)。
Hermes 不做的事
- 它不强制 Camofox 服务器进行持久化。Hermes 只发送稳定的
userId;服务器必须通过将该userId映射到持久化 Firefox 配置文件目录来遵守。 - 如果你的 Camofox 服务器构建将每个请求视为临时(例如,总是调用
browser.newContext()而不加载存储的配置文件),Hermes 无法使这些会话持久化。确保你运行的是实现了基于 userId 的配置文件持久化的 Camofox 构建。
验证是否正常工作
- 启动 Hermes 和你的 Camofox 服务器。
- 在浏览器任务中打开 Google(或任何登录网站)并手动登录。
- 正常结束浏览器任务。
- 启动新的浏览器任务。
- 再次打开相同的网站——你应该仍然处于登录状态。
如果第 5 步你被登出了,Camofox 服务器没有遵守稳定的 userId。检查配置路径,确认编辑 config.yaml 后完全重启了 Hermes,并验证你的 Camofox 服务器版本支持基于用户的持久化配置文件。
状态存放位置
Hermes 从配置文件范围的目录 ~/.hermes/browser_auth/camofox/(或非默认配置文件的 $HERMES_HOME 下的等效目录)派生稳定的 userId。实际的浏览器配置文件数据存放在 Camofox 服务器端,以该 userId 为键。要完全重置持久化配置文件,在 Camofox 服务器端清除它,并删除对应的 Hermes 配置文件状态目录。
Camofox 会话的外部管理
当另一个应用驱动可见的 Camofox 浏览器(桌面助手、自定义集成、其他 Agent)时,配置 Hermes 以在相同身份内操作,而不是生成其自己的隔离配置文件。
三个旋钮控制行为:
| 设置 | 环境变量 | 效果 |
|---|---|---|
browser.camofox.user_id | CAMOFOX_USER_ID | Hermes 创建标签页时使用的 Camofox userId。设置此项会将会话切换到"外部管理"模式。 |
browser.camofox.session_key | CAMOFOX_SESSION_KEY | 创建标签页时发送的 sessionKey(又称 listItemId)。用于在采用时匹配现有标签页。如果未设置,默认为每个任务生成的值。 |
browser.camofox.adopt_existing_tab | CAMOFOX_ADOPT_EXISTING_TAB | 为 true 时,Hermes 在首次使用时调用 GET /tabs?userId=<user_id> 并在创建新标签页之前重用现有标签页。 |
环境变量优先于 config.yaml。两种形式都可以:
browser:
camofox:
user_id: shared-camofox
session_key: visible-tab
adopt_existing_tab: true
CAMOFOX_USER_ID=shared-camofox
CAMOFOX_SESSION_KEY=visible-tab
CAMOFOX_ADOPT_EXISTING_TAB=true
设置 user_id 后有什么变化:
- Hermes 跳过任务结束时的破坏性清理(与
managed_persistence: true相同)。其他应用的标签页/Cookie/配置文件会保留。 - Hermes 不会调用
DELETE /sessions/<user_id>—— 该端点会清除所有用户数据,因此如果触发,会清除外部应用的会话。
标签页采用工作原理(当 adopt_existing_tab: true 时):
- 在进程启动后的第一个浏览器工具调用时,Hermes 发出
GET /tabs?userId=<user_id>(5秒超时)。 - 如果响应中的任何标签页具有
listItemId == session_key,Hermes 采用该组中最近创建的那个。 - 否则,Hermes 采用该用户最近创建的标签页(任何
listItemId)。 - 如果没有标签页存在或请求失败,Hermes 会在下一次操作时回退到创建新标签页。
采用只触发一次,直到会话填充了 tab_id。如果外部应用在运行中途关闭了采用的标签页,下一个浏览器工具调用将抛出 Camofox 错误 —— Hermes 不会在每次调用时重新轮询新标签页。
选择 session_key: 如果你想让 Hermes 可靠地附加到特定现有标签页,请将 session_key 设置为外部应用在创建它时使用的 listItemId。如果你不设置 session_key 而只设置 user_id,Hermes 会生成每个任务的 session_key(task_<id>) —— Hermes 将与外部应用共享 Cookie 和配置文件,但会在旁边打开自己的标签页,而不是重用现有标签页。
并发说明: 外部应用和 Hermes 可以同时驱动相同的 Camofox userId,但 Camofox 不会在客户端之间协调每个标签页的焦点。在应用层协调所有权(例如,外部应用在 Hermes 运行时暂停)。
VNC 实时预览
当 Camofox 在有头模式下运行(浏览器窗口可见)时,它在健康检查响应中暴露 VNC 端口。Hermes 自动发现此端口并在导航响应中包含 VNC URL,这样 Agent 就可以分享链接让你实时观看浏览器。
本地 Chrome via CDP(/browser connect)
你可以通过 Chrome DevTools Protocol(CDP)将 Hermes 浏览器工具连接到你自己运行的 Chrome 实例,而不是使用云端提供商。当你想实时看到 Agent 在做什么、与需要你自己 Cookie/会话的页面交互,或避免云端浏览器费用时,这非常有用。
/browser connect 是一个交互式 CLI 斜杠命令——它不通过网关分发。如果你在 WebUI、Telegram、Discord、WhatsApp 或其他网关聊天中尝试运行它,消息会作为纯文本发送给 Agent,命令不会执行。请从终端启动 Hermes(hermes 或 hermes chat)并在那里使用 /browser connect。
在 CLI 中使用:
/browser connect # 连接到 ws://localhost:9222 的 Chrome
/browser connect ws://host:port # 连接到特定 CDP 端点
/browser status # 检查当前连接
/browser disconnect # 断开连接并返回云端/本地模式
如果 Chrome 还没有以远程调试方式运行,Hermes 会尝试使用 --remote-debugging-port=9222 自动启动它。
要手动以 CDP 启用方式启动 Chrome,请使用专用的 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 实时调试会话通常暴露宿主机本地端点,与经典的
9222端口不同,无法从 WSL 直接访问 - 即使 Windows Chrome 可调试,最简洁的集成通常是让 Windows 端的浏览器 MCP 服务器连接到 Chrome,让 Hermes 与该 MCP 服务器通信
对于这种设置,优先通过 Hermes MCP 支持使用 chrome-devtools-mcp。
参见 MCP 指南了解实际设置:
本地浏览器模式
如果你没有设置任何云端凭证,也没有使用 /browser connect,Hermes 仍然可以通过 agent-browser 驱动的本地 Chromium 安装使用浏览器工具。
可选环境变量
# 更好 CAPTCHA 解决的住宅代理(默认:"true")
BROWSERBASE_PROXIES=true
# 使用自定义 Chromium 的高级隐身——需要 Scale 计划(默认:"false")
BROWSERBASE_ADVANCED_STEALTH=false
# 断开连接后的会话重新连接——需要付费计划(默认:"true")
BROWSERBASE_KEEP_ALIVE=true
# 自定义会话超时(毫秒)(默认:项目默认值)
# 示例:600000(10分钟),1800000(30分钟)
BROWSERBASE_SESSION_TIMEOUT=600000
# 自动清理前的非活跃超时(秒)(默认:120)
BROWSER_INACTIVITY_TIMEOUT=120
# 额外的 Chromium 启动标志(逗号或换行分隔)。Hermes 在检测到 root 或
# AppArmor 限制的非特权用户命名空间(Ubuntu 23.10+、DGX Spark、许多容器镜像)时
# 自动注入 `--no-sandbox,--disable-dev-shm-usage`,
# 因此大多数用户不需要设置此项。仅在你需要 Hermes 不会自动添加的
# 标志时手动设置;设置此项会禁用自动注入。
AGENT_BROWSER_ARGS=--no-sandbox
安装 agent-browser CLI
npm install -g agent-browser
# 或在仓库中本地安装:
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
获取当前页面无障碍树的基于文本的快照。返回带有引用 ID(如 @e1、@e2)的交互元素,供 browser_click 和 browser_type 使用。
full=false(默认):仅显示交互元素的紧凑视图full=true:完整页面内容
超过 8000 个字符的快照会由 LLM 自动总结。
browser_click
点击快照中通过引用 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 分析。当文本快照无法捕获重要的视觉信息时使用——对于验证码(CAPTCHA)、复杂布局或视觉验证挑战尤为有用。
截图持久保存,文件路径与 AI 分析结果一起返回。在消息平台(Telegram、Discord、Slack、WhatsApp)上,你可以要求 Agent 分享截图——它将通过 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_console 在调用时还支持使用 expression 参数评估 JavaScript —— 与 DevTools 控制台相同的形状,结果会解析后返回(JSON 序列化的对象变为字典;原始值保持原样)。
browser_console(expression="document.querySelector('h1').textContent")
browser_console(expression="JSON.stringify(performance.timing)")
当当前会话有活跃的 CDP 监督器时(典型情况是对支持 CDP 的后端运行过 browser_navigate 的任何会话),评估通过监督器的持久 WebSocket 运行 —— 没有子进程启动开销。否则会回退到标准的 agent-browser CLI 路径。行为在任何一种方式下都是相同的;只有延迟会变化。
browser_cdp
原始 Chrome DevTools Protocol 直通——针对其他工具未涵盖的浏览器操作的终极手段。用于原生对话框处理、iframe 范围内的求值、Cookie/网络控制,或 Agent 需要的任何 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/ —— Agent 可以对特定方法页面使用 web_extract 查找参数和返回格式。
常见用法:
# 列出标签页(浏览器级别,无需 target_id)
browser_cdp(method="Target.getTargets")
# 处理标签页上的原生 JS 对话框
browser_cdp(method="Page.handleJavaScriptDialog",
params={"accept": true, "promptText": ""},
target_id="<tabId>")
# 在特定标签页中执行 JS
browser_cdp(method="Runtime.evaluate",
params={"expression": "document.title", "returnByValue": true},
target_id="<tabId>")
# 获取所有 Cookie
browser_cdp(method="Network.getAllCookies")
浏览器级别方法(Target.*、Browser.*、Storage.*)省略 target_id。页面级别方法(Page.*、Runtime.*、DOM.*、Emulation.*)需要来自 Target.getTargets 的 target_id。每个无状态调用都是独立的——会话不在调用之间持久。
跨域 iframe: 传递 frame_id(来自 browser_snapshot.frame_tree.children[] 中 is_oopif=true 的项)以通过该 iframe 的监督器实时会话路由 CDP 调用。这是在 Browserbase 上 Runtime.evaluate 在跨域 iframe 内工作的方式,因为无状态 CDP 连接会遇到签名 URL 过期问题。示例:
browser_cdp(
method="Runtime.evaluate",
params={"expression": "document.title", "returnByValue": True},
frame_id="<frame_id from browser_snapshot>",
)
同源 iframe 不需要 frame_id——可以在顶层 Runtime.evaluate 中使用 document.querySelector('iframe').contentDocument。
browser_dialog
响应原生 JS 对话框(alert / confirm / prompt / beforeunload)。在此工具出现之前,对话框会静默阻塞页面的 JavaScript 线程,后续 browser_* 调用会挂起或抛出异常;现在 Agent 在 browser_snapshot 输出中看到待处理的对话框并明确响应。
工作流程:
- 调用
browser_snapshot。如果对话框正在阻塞页面,它会显示为pending_dialogs: [{"id": "d-1", "type": "alert", "message": "..."}]。 - 调用
browser_dialog(action="accept")或browser_dialog(action="dismiss")。对于prompt()对话框,传递prompt_text="..."来提供响应。 - 重新快照——
pending_dialogs为空;页面的 JS 线程已恢复。
检测通过持久化 CDP 监督器自动进行——每个任务一个 WebSocket,订阅 Page/Runtime/Target 事件。监督器还在快照中填充 frame_tree 字段,让 Agent 可以看到当前页面的 iframe 结构,包括跨域(OOPIF)iframe。
可用性矩阵:
| 后端 | 通过 pending_dialogs 检测 | 响应(browser_dialog 工具) |
|---|---|---|
通过 /browser connect 或 browser.cdp_url 的本地 Chrome | ✓ | ✓ 完整工作流 |
| Browserbase | ✓ | ✓ 完整工作流(通过注入的 XHR 桥接) |
| Camofox / 默认本地 agent-browser | ✗ | ✗(无 CDP 端点) |
在 Browserbase 上的工作原理。 Browserbase 的 CDP 代理在 ~10ms 内自动在服务端驳回真正的原生对话框,所以无法使用 Page.handleJavaScriptDialog。监督器通过 Page.addScriptToEvaluateOnNewDocument 注入一个小脚本,用同步 XHR 覆盖 window.alert/confirm/prompt。我们通过 Fetch.enable 拦截这些 XHR——页面的 JS 线程在 XHR 上保持阻塞,直到我们用 Agent 的响应调用 Fetch.fulfillRequest。prompt() 返回值原封不动地往返传回页面 JS。
对话框策略在 config.yaml 的 browser.dialog_policy 下配置:
| 策略 | 行为 |
|---|---|
must_respond(默认) | 捕获,在快照中显示,等待明确的 browser_dialog() 调用。在 browser.dialog_timeout_s(默认 300 秒)后安全自动驳回,防止有 bug 的 Agent 永远卡住。 |
auto_dismiss | 捕获,立即驳回。Agent 仍能在 browser_state 历史中看到对话框,但不需要采取行动。 |
auto_accept | 捕获,立即接受。适用于导航带有频繁 beforeunload 提示的页面。 |
browser_snapshot.frame_tree 中的帧树上限为 30 帧,OOPIF 深度 2,以保持广告密集页面上的有效负载有界。当达到限制时,truncated: true 标志会出现;需要完整树的 Agent 可以使用 browser_cdp 和 Page.getFrameTree。
实际示例
填写网络表单
用户:在 example.com 用我的邮箱 john@example.com 注册账号
Agent 工作流:
1. browser_navigate("https://example.com/signup")
2. browser_snapshot() → 看到带有引用的表单字段
3. browser_type(ref="@e3", text="john@example.com")
4. browser_type(ref="@e5", text="SecurePass123")
5. browser_click(ref="@e8") → 点击"创建账号"
6. browser_snapshot() → 确认成功
研究动态内容
用户:GitHub 上现在最热门的仓库是什么?
Agent 工作流:
1. browser_navigate("https://github.com/trending")
2. browser_snapshot(full=true) → 读取热门仓库列表
3. 返回格式化结果
会话录制
将浏览器会话自动录制为 WebM 视频文件:
browser:
record_sessions: true # 默认:false
启用后,录制在第一次 browser_navigate 时自动开始,会话关闭时保存到 ~/.hermes/browser_recordings/。在本地和云端(Browserbase)模式下均可工作。超过 72 小时的录制自动清理。
隐身功能
Browserbase 提供自动隐身能力:
| 功能 | 默认 | 备注 |
|---|---|---|
| 基础隐身 | 始终开启 | 随机指纹、视口随机化、验证码解决 |
| 住宅代理 | 开启 | 通过住宅 IP 路由以获得更好的访问 |
| 高级隐身 | 关闭 | 自定义 Chromium 构建,需要 Scale 计划 |
| 保持连接 | 开启 | 网络中断后重新连接会话 |
如果付费功能在你的计划中不可用,Hermes 会自动回退——先禁用 keepAlive,然后是代理——所以在免费计划上浏览仍然有效。
会话管理
- 每个任务通过 Browserbase 获得独立的浏览器会话
- 会话在非活跃后自动清理(默认:2 分钟)
- 后台线程每 30 秒检查一次过期会话
- 进程退出时运行紧急清理以防止孤立会话
- 通过 Browserbase API 释放会话(
REQUEST_RELEASE状态)
限制
- 基于文本的交互 — 依赖无障碍树,而非像素坐标
- 快照大小 — 大页面可能在 8000 个字符时被截断或由 LLM 总结
- 会话超时 — 云端会话根据你的提供商计划设置到期
- 费用 — 云端会话消耗提供商积分;对话结束或非活跃后会话自动清理。使用
/browser connect进行免费本地浏览。 - 不支持文件下载 — 无法从浏览器下载文件