Skip to content

Browser Agent

AceGuru-mjh edited this page Oct 1, 2026 · 4 revisions

浏览器智能体

🔧 能力 · 🏠 首页 › Browser-Agent

Home Version Kotlin Modules Tools License

Browser-Agent

📑 本页目录

对标 Operit 的 BrowserAgent:DOM 级网页操控,而不是"截图 → 盲点坐标"。 实现落在 app/.../browser/(含一整套 Chrome 风 UI 与 bridge),向 LLM 暴露 15 个 browser_* 工具。

1. 15 个 browser_* 工具

动作 工具
导航 / 生命周期 browser_navigate browser_show
交互 browser_click browser_input browser_scroll browser_select browser_toggle browser_date_input browser_file_upload
观察 browser_screenshot browser_snapshot browser_context_summary
下载 browser_download_list
诊断 browser_network_log browser_debug_dump

Note

这些工具只有在浏览器 UI(Chrome 风 Fragment/Activity 桥)存在时才有意义, 因此全部注册在 :app 而不是纯 JVM 的 core 模块 —— 见 模块地图。

2. 为什么是 DOM 级

维度 截图 + 坐标点击 DOM 级(本项目)
分辨率/缩放变化 坐标立即失效 不受影响
元素定位精度 依赖视觉模型猜坐标 直接命中 DOM 节点
token 成本 每步都要发图片(贵) 只发快照结构(省)
SPA 局部刷新 截图不一致 ref 依然有效(见下)
需要 VISION 模型 是 否

3. 语义哈希稳定 ref

元素引用基于语义哈希而非 DOM 序号:

ref = hash(tag + role + 稳定属性集合 + 文本内容摘要 + 结构位置特征)

这样 SPA 局部刷新(列表重排、广告插入、懒加载)之后 ref 依然有效 —— DOM XPath 式的 /html/body/div[3]/div[1] 在这里是不可用的。

4. 轨迹与重试

组件 作用
BrowserTracer 环形缓冲(容量 100)记录操作轨迹:动作、ref、URL、结果摘要
RetryPolicy 断点续控:某步失败可按策略重试并保留已完成的上下文
browser_context_summary 给 LLM 一页精简版的"当前页面能干什么",降低回合数
browser_network_log / browser_debug_dump 卡住时把网络请求与 DOM 诊断信息交给 LLM 自主排错

5. 让 Agent 逛网页的最小闭环

flowchart LR
    N["browser_navigate(url)"] --> S["browser_snapshot()<br/>拿到带 ref 的 DOM 摘要"]
    S --> D{"LLM 决策下一步"}
    D -->|点击| C["browser_click(ref)"]
    D -->|输入| I["browser_input(ref, text)"]
    D -->|提取| X["browser_context_summary()"]
    C --> S
    I --> S
    X --> A["答案 / 抽取结果"]
    S -->|元素找不到| F["browser_debug_dump() 找原因 → 重试"]
Loading

6. 安全与节制

  • 网页内容不可信:LLM 看到的 DOM 文本里可能混入提示注入(prompt injection)。 实践上用 browser_context_summary 限制注入面,别把整页原文无脑拼进 prompt;
  • 涉及登录态/支付/隐私表单时建议配合 Assist 模式 让人来点最后一步;
  • browser_debug_dump 会输出较多内容,注意 上下文压缩 水位。

7. 相关页面

footer

🏠 返回首页 · 📚 文档索引 · ❓ FAQ · 🔧 故障排查 · 🗺️ 路线图 · 🐛 提 Issue

Android Guru Agent · v1.4.4 · Kotlin 2.0.21 · Compose · PRoot · Room

Clone this wiki locally