代理浏览器
一个真正的、可见的AI代理光标浏览器。 真正的铬。真正的类人物理学。真实的审计追踪。代理以人类的方式驱动它:拖动、单击、键入、滚动——同时记录、回放和验证每个动作。
与每个主要的法学硕士合作:拟人克劳德、OpenAI GPT、谷歌双子座、Groq、Together、Fireworks、DeepInfra、Mistral、Cohere、xAI Grok、OpenRouter、困惑、Ollama(本地)、Ollama-Cloud(托管)、vLLM、LM Studio、llama.cpp或任何与OpenAI兼容的软件。 零锁定。
┌──────────────────────────────────────────────────────────────────┐
│ Agent (your code) │
│ "submit the payment form" ──┐ │
└────────────────────────────────┼─────────────────────────────────┘
│ HTTP POST /sessions/:id/plan
▼
┌──────────────────────────────────────────────────────────────────┐
│ AgentBrowser runtime │
│ Planner ──▶ findAndClick (DOM ▶ vision-LLM) ──▶ cursor │
│ │ │ │ │
│ │ ▼ ▼ │
│ │ verifier (DOM diff) Bezier trajectory │
│ │ │ + CDP raw events │
│ ▼ ▼ │ │
│ action action.completed event ──▶ recorder (JSONL) │
│ memory │ │
│ (skip LLM ▼ │
│ on visit WebSocket / SSE │
│ #2+) to operator UI │
└──────────────────────────────────────────────────────────────────┘
│
▼
Real visible cursor moves on real Chromium______________________________________________________________________
为什么存在
每一个现有的浏览器自动化工具都是首先为人类构建的,并为代理进行了改装。他们讲DOM操作。它们生成8000个标记HTML转储。他们每次跑步都会重新学习每个网站。他们没有审计追踪。他们被每一个cookie横幅屏蔽了。
AgentBrowser反转了这一点。 光标是真实可见的。所有输入都经过CDP原始鼠标事件。API用目标说话,而不是用选择器说话。失败的操作会自动恢复。每一个动作都会得到验证。该系统永久学习每个网站,并在各个领域共享知识。
Other tools │ AgentBrowser
─────────────────────────────────│──────────────────────────────────
8000 tokens of HTML │ 50 tokens of structured meaning
agent guesses #submit-btn-v2 │ { goal: "submit the form" }
no replay, no audit │ JSONL trace, deterministic replay
re-learns every visit │ action memory, 7x faster on visit 3
blocked by every cookie wall │ auto-dismiss + force-removal
no captcha story │ 2Captcha / hCaptcha / Turnstile
no fingerprint defenses │ per-context WebGL/canvas/audio noise
single integration: library │ library + MCP + HTTP + WS + SSE + replay
locked to one LLM vendor │ 17 providers, one env var swap (Claude/GPT/
│ Gemini/Ollama/vLLM/Groq/Together/Fireworks/...)______________________________________________________________________
五分钟演示
git clone https://github.com/AshtonVaughan/agentbrowser
cd agentbrowser
npm install && npx playwright install chromium && npm run build
# Pick ANY LLM provider:
ANTHROPIC_API_KEY=sk-ant-... npm run http # Claude (default)
# or
OPENAI_API_KEY=sk-... npm run http # GPT
# or
GOOGLE_API_KEY=... npm run http # Gemini
# or
GROQ_API_KEY=gsk_... npm run http # Groq (Llama on LPUs)
# or run fully local with Ollama:
ollama serve &
AGENTBROWSER_LLM_PROVIDER=ollama OLLAMA_MODEL=llama3.2-vision npm run http
# or use Ollama Cloud:
OLLAMA_CLOUD_API_KEY=... npm run http在另一个终端中:
# Create a session
curl -X POST localhost:3100/api/v1/sessions
# → { "session_id": "abc123..." }
# Plan + execute a goal end-to-end
curl -X POST localhost:3100/api/v1/sessions/abc123/plan \
-H 'content-type: application/json' \
-d '{"goal":"go to news.ycombinator.com and click the top story"}'
# → { success: true, steps: [...], duration_ms: 4200 }
# Watch it live
open ui/operator/index.html代理的光标在屏幕上以人工方式移动。每个cursor.move、click、page change都会实时流式传输到操作员UI。每一个动作都被记录下来 ~/.agentbrowser/traces/ 用于重播。
______________________________________________________________________
你得到了什么
可见的类人光标
- 通过上下文初始化脚本注入SVG光标精灵
- 贝塞尔曲线轨迹具有抖动、易于进出、可选过冲
- 所有输入均通过CDP
Input.dispatchMouseEvent(非剧作家定位器) - 点击涟漪动画,淡化14点光标轨迹
- 用于重放再现性的每条轨迹确定性种子
混合动作层
| 层 | 它做什么 |
|---|---|
cursor.click(x, y) | 通过CDP直接点击视口 |
cursor.clickBySelector(sel) | Bbox解析,滚动查看,人性化点击。通过可访问的名称查找自动恢复过时的元素。 |
cursor.clickByText(text) | 视觉上相似的元素之间的文本消歧 |
cursor.clickByRole(role, {name}) | ARIA驱动的目标定位 |
findAndClick({goal, ...}) | DOM选择器→ text → role → 视觉LLM,每一步都经过验证 |
executor.executeAction(name) | 动作记忆快速路径→ 回退以查找并单击 |
planner.planAndExecute(goal) | LLM目标分解→ 具有重试预算的多步骤运行 |
愿景管道
extractElementBoxes(page)返回丰富元素目录:id/role/tag/可访问名称/值/bbox/选择器/禁用bboxScreenshot(sessionId)返回一个视口PNG,其中在每个交互式目标+元素列表上绘制了带有编号的青色框VisionLLM.decide(goal, screenshot, elements)发送给克劳德·索内特,解析{element_id, action, rationale}cursor.clickByBox(bbox)用可见光标点击视觉导出的坐标
自我修复
- 动作验证器 快照每次操作前的ElementBoxes,结算后的diffs,在URL更改/添加/删除/textChanged/移动元素时声明verified=true
- 陈旧元素回收 在
cursor.clickBySelector回落到getByText(originalText)选择器故障 - 模态断续器 在视口中心检测固定/绝对高z索引对话框,将其分类为阻止程序(cookie/同意/订阅关键字)或用户相关程序(登录对话框),自动关闭阻止程序并重试
- 选择器库仅从验证结果中学习 -除非点击确实改变了页面,否则内存中没有条目
站点+动作记忆
- SQLite WAL用于并发读取。每个域选择器库+页面模型缓存。
ActionMemory-SHA-1页面签名×目标哈希→ 选择器×成功/失败计数器。访问第2个已知页面不需要LLM调用。- 跨域转移:
recallByGoal(goal, excludeDomain)返回来自其他域的同一逻辑目标的获胜选择器。系统学习了“提交付款”→ stripe.com上的“#pay-btn”按钮;它在paddle.com上尝试了与假设相同的选择器。 decay(unusedSinceMs)将过时的条目计数减半,这样图书馆在网站发生变化时也能保持健康。
录音+回放
- 每个操作都以JSONL格式流式传输到
~/.agentbrowser/traces/.jsonl ReplayEngine读取跟踪,以可配置的速度将事件分派到新会话compactTrace()折叠60个事件cursor。将轨迹移动到1,合并连续的cursor类型事件,丢弃微等待- 计划审核 在每个步骤边界捕获屏幕截图+元素列表-合规级回放图元
技能库
- “技能”是一个带有命名槽令牌的记录痕迹(
$email,$password) SkillLibrary.parameterize(events, slots)用标记替换文字值(最长优先,以避免部分匹配错误)- 通过JSON文件保存/加载/列出/删除
~/.agentbrowser/skills/ - 便携.skill.json包 使用magic+version+元数据(作者、许可证、标签)的格式-将技能与代理代码捆绑在一起或发布到注册表;用户导入+绑定自己的凭据
验证码
TwoCaptchaSolver通过2Captcha API为hCaptcha+reCAPTCHA v2+Cloudflare旋转闸门- 页面侧
DETECT_CAPTCHA_SCRIPT查找所有三种类型的站点密钥 solveCaptchaIfPresent(page, solver)链:检测→ 解决→ 注入令牌→ 火灾变化/输入事件→ 调用数据回调- 可插拔过孔
CaptchaSolver界面(插入AntiCaptcha、CapMonster等)
防指纹
applyFingerprintShield(context)按上下文初始化脚本- 恶搞WebGL UNMASKED_VENDOR/RENDELER(5个GPU配置文件)、navigator.hardwareConcurrency、navigator.deviceMemory、AudioContext(1e-7噪声)、画布到数据URL(~0.08%像素抖动)、navigater.plugins
- 根据上下文确定的种子指纹在会话内保持稳定,但在会话之间有所不同
多标签
engine.newTab(sessionId, url?)在同一上下文中打开一个选项卡(共享cookie/auth)- 每个选项卡都有自己的
HumanCursor.switchTab/closeTab/listTabs. - HTTP:GET/POST/DELETE
/sessions/:id/tabs,POST/tabs/:tab/switch
通用LLM提供商支持(零锁定)
- 17家供应商有线 -通过设置一个环境变量来交换它们中的任何一个
LLMProvider接口(complete()+completeWithImage())分析器+视觉LLM+规划器都使用这种抽象,从不使用SDK- 启动时的自动检测从环境变量中选择正确的提供程序
| 提供者 | 设置 | 注释 |
|---|---|---|
| 人物克劳德 | ANTHROPIC_API_KEY | 默认值(如果未设置其他值) |
| OpenAI | OPENAI_API_KEY | gpt-4o-mini默认值 |
| 谷歌双子座 | GOOGLE_API_KEY 或 GEMINI_API_KEY | gemini-2.5-flash,视觉原生 |
| Groq | GROQ_API_KEY | LPU上的超快Llama/Mixtral |
| 一起AI | TOGETHER_API_KEY | 开源模型 |
| 烟花 | FIREWORKS_API_KEY | 开源模型 |
深度侵权。 DEEPINFRA_API_KEY | 开源模型 | |
| 米斯特拉尔 | MISTRAL_API_KEY | mistral大最新 |
| 科恩 | COHERE_API_KEY | command-r-plus通过/兼容性 |
| xAI Grok | XAI_API_KEY | grok-2视觉 |
| OpenRouter | OPENROUTER_API_KEY | 一个API后面有300多个型号 |
| 困惑 | PERPLEXITY_API_KEY | 在线搜索模型 |
| Azure OpenAI | AZURE_OPENAI_API_KEY + AZURE_OPENAI_BASE_URL | 企业租户 |
| Ollama(当地) | OLLAMA_BASE_URL (默认值 localhost:11434) | 调用3.2、调用3.2-vision、qwen2.5vl等 |
| 奥利玛云 | OLLAMA_CLOUD_API_KEY | 为Ollama提供涡轮增压车型 |
| vLLM | VLLM_BASE_URL (默认值 localhost:8000) | 自托管生产推理 |
| LM工作室 | LMSTUDIO_BASE_URL (默认值 localhost:1234) | 桌面图形用户界面 |
| llama.cpp服务器 | LLAMACPP_BASE_URL (默认值 localhost:8080) | 小型自托管 |
| 任何与OpenAI兼容的东西 | presets.openaiCompatible(url) | 输入您的URL |
// Pick a provider explicitly (any of the 17):
import { AgentBrowserHttpServer, presets } from 'agentbrowser';
const server = new AgentBrowserHttpServer({
llm_provider: presets.ollamaCloud(), // or .openai() or .groq() etc
// ...
});或者只是设置 AGENTBROWSER_LLM_PROVIDER=ollama 服务器自动连线。用以下内容覆盖模型 _MODEL=.
Chrome扩展程序(使用Cookie驱动Chrome)
- 安装
extensions/chrome/在开发模式下(chrome://extensions→ 装载未包装) - 单击代理浏览器图标,粘贴服务器URL+API键,单击连接
- 现在有个特工在打电话
POST /api/v1/agents//cmd使用您的Cookie和登录状态驱动您的Chrome - 清单v3+
chrome.debugger用于真实的CDP鼠标事件+chrome.scripting视觉/提取 - 看
extensions/chrome/README.md对于完整的安全模型
操作员+记录器+内存+技能UI
ui/operator/index.html-实时截图+光标轨迹叠加+事件时间线+快速操作面板ui/recorder/index.html-实时WebSocket事件流+多通道时间线画布+回放洗涤器+JSONL导出ui/memory/index.html-按域分页的动作内存浏览器+衰减控制+JSON导出docs/pricing.html-4层定价页面已连接到/api/v1/billing/checkout用于自助支付Stripedocs/skills.html-技能市场登陆8项精选技能(登录条纹、登录谷歌、亚马逊添加到购物车、github创建问题等)- 所有这些都是单文件香草HTML/CSS/JS。无构建步骤。
转录助手(“观看”视频的代理)
findCaptionTracks(page)检测HTML5 `油管playerCaptionsTracklistRenderer` +自定义播放器标记parseVTT(text)/parseJSON3(json)将标准字幕格式转换为键入格式TranscriptSegment[]transcribeFromCaptions(page)一枪:检测→ 获取→ parsetranscriptToText(segments)连接以供LLM使用
生产运行时间
- Fastify上的HTTP REST API+WebSocket+SSE,带有承载令牌身份验证+每密钥速率限制
- 30多个端点,OpenAPI 3.1规范
/api/v1/openapi.json - 条纹计费有线(结账+webhook+签名验证+许可证发放)
- 普罗米修斯
/metrics+准备状态探测+仪表板摘要端点 - 4层许可证脚手架(免费/专业/团队/企业),带功能门和配额跟踪
- 多级Dockerfile,docker用持久卷+1GB shm_size为Chromium编写
- Python+TypeScript SDK客户端
______________________________________________________________________
建筑
┌─────────────────────────────────────────────────────────────────┐
│ Operator UI (browser-based dashboard) │
│ - live screenshot stream - cursor trail viz │
│ - action log + reasoning - manual takeover │
│ Recorder UI │
│ - timeline scrubber - replay export │
└─────────────────────────────────────────────────────────────────┘
▲
│ WebSocket events + SSE frames + REST
┌─────────────────────────┴───────────────────────────────────────┐
│ AgentBrowser HTTP Control Plane │
│ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ REST + WS + SSE │ │ Bearer auth + │ │ License + │ │
│ │ Fastify │ │ per-key rate │ │ quota system │ │
│ └──────────────────┘ └──────────────────┘ └────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
▲
│
┌─────────────────────────┴───────────────────────────────────────┐
│ AgentBrowser Core Runtime │
│ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ Planner │ │ findAndClick │ │ Recorder + │ │
│ │ (goal → steps) │ │ hybrid action │ │ Replay engine │ │
│ └──────────────────┘ └──────────────────┘ └────────────────┘ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ Verifier │ │ Modal │ │ Action memory │ │
│ │ (diff snapshots)│ │ interrupter │ │ (skip LLM) │ │
│ └──────────────────┘ └──────────────────┘ └────────────────┘ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ Vision pipeline │ │ HumanCursor │ │ Site memory │ │
│ │ bbox + annotate │ │ Bezier + CDP │ │ WAL SQLite │ │
│ │ + VisionLLM │ │ trail + ripple │ │ + selectors │ │
│ └──────────────────┘ └──────────────────┘ └────────────────┘ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌────────────────┐ │
│ │ Anti-fingerprint│ │ Captcha solver │ │ LLM provider │ │
│ │ (canvas/WebGL) │ │ + auto-inject │ │ (Anthropic / │ │
│ │ │ │ │ │ OpenAI / etc)│ │
│ └──────────────────┘ └──────────────────┘ └────────────────┘ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Browser Engine - Playwright + stealth + multi-tab │ │
│ │ ↓ │ │
│ │ Chromium (the real browser, with the visible cursor) │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘______________________________________________________________________
快速入门-4种方法
作为TypeScript库
import { AgentBrowser } from 'agentbrowser';
const browser = new AgentBrowser({
anthropic_api_key: process.env.ANTHROPIC_API_KEY,
headless: false, // watch the cursor move
stealth: true,
});
await browser.launch();
const state = await browser.navigate('https://news.ycombinator.com');
console.log(state.page_type); // 'listing'
console.log(state.available_actions); // [{ name: 'navigate_to_new', ... }, ...]
await browser.action('navigate_to_new');
const data = await browser.extract({
top_story: 'title of the top story',
points: 'upvote count',
author: 'submitter username',
});
await browser.close();通过HTTP
curl -X POST http://localhost:3100/api/v1/sessions
curl -X POST http://localhost:3100/api/v1/sessions/$ID/navigate -d '{"url":"https://example.com"}'
curl -X POST http://localhost:3100/api/v1/sessions/$ID/find_and_click -d '{"goal":"submit the form"}'
curl http://localhost:3100/api/v1/sessions/$ID/screenshot/bbox开发包
from agentbrowser import AgentBrowserClient
client = AgentBrowserClient("http://localhost:3100", api_key="...")
with client.create_session() as s:
s.navigate("https://example.com")
s.click(selector="a")
png, elements = s.annotated_screenshot()MCP服务器(克劳德代码等)
添加 ~/.claude.json:
{
"mcpServers": {
"agentbrowser": {
"command": "node",
"args": ["/path/to/agentbrowser/dist/server/mcp.js"],
"env": { "ANTHROPIC_API_KEY": "sk-..." }
}
}
}______________________________________________________________________
存储库结构
src/
├── engine/ Browser lifecycle, sessions, tabs
│ ├── browser.ts Playwright wrapper, cursor wiring, popup handling
│ └── tabs.ts Multi-tab manager
├── input/ Cursor + physics + fingerprint shield
│ ├── cursor.ts HumanCursor: SVG overlay, CDP input, click/drag/type
│ ├── trajectory.ts Bezier path generator with jitter + overshoot
│ └── fingerprint.ts WebGL/canvas/audio anti-fingerprint patches
├── vision/ Vision pipeline
│ ├── bbox.ts Element catalog extraction
│ ├── annotate.ts Numbered-box screenshot annotator
│ ├── diff.ts Snapshot diff (added/removed/moved/textChanged)
│ └── llm.ts Claude vision integration
├── runtime/ Action execution + autonomy
│ ├── executor.ts Action runner with action-memory hot path
│ ├── find.ts Hybrid DOM-then-vision findAndClick
│ ├── verifier.ts Action verification via snapshot diff
│ ├── modal-interrupter.ts Cookie/consent/popup detection
│ ├── planner.ts LLM goal decomposition + multi-step execution
│ ├── plan-audit.ts Per-step screenshot + element capture
│ ├── recorder.ts JSONL action stream
│ ├── replay.ts Deterministic trace replay
│ ├── compactor.ts Trace compaction (collapse cursor.move runs)
│ ├── events.ts In-process event broker (pub/sub)
│ ├── captcha.ts 2Captcha API integration
│ └── captcha-solver.ts Detect → solve → inject pipeline
├── memory/ Persistent storage
│ ├── store.ts Site memory (page model cache + selector library)
│ └── action-memory.ts Per-(page,goal) selector cache + cross-domain transfer
├── llm/ Provider abstraction
│ ├── provider.ts LLMProvider interface
│ ├── anthropic.ts Anthropic SDK wrapper
│ ├── openai.ts OpenAI-compatible (works with vLLM/Ollama too)
│ └── index.ts autoDetectProvider
├── semantic/ Page analysis
│ └── analyzer.ts Page-to-SemanticPageModel via LLM
├── skills/ Skill library
│ ├── skills.ts Parameterize/save/load/run
│ └── package.ts .skill.json export/import format
├── server/ Production server surfaces
│ ├── http.ts Fastify + REST + WS + SSE + auth + rate limit
│ ├── openapi.ts OpenAPI 3.1 spec
│ ├── license.ts Tier system + quota tracking
│ └── mcp.ts MCP server for Claude Code et al.
├── bin/
│ └── http.ts HTTP server entry point
├── util/
│ └── coords.ts Viewport ↔ document ↔ screenshot coord conversions
├── types.ts Shared types (SemanticPageModel, ActionDefinition, ...)
└── index.ts Public API barrel
tests/ Vitest suite (119 tests, 21 files)
clients/
├── python/ Python SDK (zero deps, stdlib urllib)
└── typescript/ TypeScript SDK (browser + Node compatible)
ui/
├── operator/ Live dashboard (single HTML file)
└── recorder/ Real-time trace timeline (single HTML file)
docs/ Public docs site (single HTML file)
examples/ Working agent demos
.agentbrowser-meta/ Internal build planning + iteration log
Dockerfile Multi-stage slim image (~700MB with Chromium)
docker-compose.yml Local stack with persistent volume______________________________________________________________________
API表面
22个HTTP端点,当配置API密钥时,所有承载器都经过身份验证。完整的OpenAPI 3.1 /api/v1/openapi.json.
| 方法 | 路径 | 目的 | |||
|---|---|---|---|---|---|
| 得到 | /health | 真实性(无身份验证) | |||
| 职位 | /api/v1/sessions | 创建会话 | |||
| 删除 | /api/v1/sessions/:id | 销毁会话 | |||
| 职位 | /api/v1/sessions/:id/navigate | 转到URL | |||
| 职位 | /api/v1/sessions/:id/cursor/{move,click,drag,scroll,type,press} | 光标图元 | |||
| 职位 | /api/v1/sessions/:id/find_and_click | 混合DOM→ 愿景LLM行动 | |||
| 职位 | /api/v1/sessions/:id/plan | LLM目标分解+多步骤执行 | |||
| 职位 | /api/v1/sessions/:id/extract | 模式驱动的LLM提取 | |||
| 职位 | /api/v1/sessions/:id/fill | 填写命名表格 | |||
| 得到 | /api/v1/sessions/:id/screenshot | 视口PNG | |||
| 得到 | /api/v1/sessions/:id/screenshot/bbox | 带注释的PNG+元素列表 | |||
| 得到 | /api/v1/sessions/:id/screenshot/stream | SSE PNG帧 | |||
| WS | /api/v1/sessions/:id/screenshot/ws | 二进制PNG帧 | |||
| 得到 | /api/v1/sessions/:id/state | 当前语义页面模型 | |||
| 得到 | /api/v1/sessions/:id/elements | 元素框\[\] | |||
| 获取/发布/删除 | /api/v1/sessions/:id/tabs | 多标签控制 | |||
| 职位 | /api/v1/sessions/:id/solve_captcha | 检测+求解+注入 | |||
| WS | /api/v1/sessions/:id/events | 现场活动流 | |||
| 职位 | /api/v1/sessions/:id/back | 历史回顾 | |||
| 职位 | /api/v1/sessions/:id/forward | 历史前进 | |||
| 职位 | /api/v1/sessions/:id/reload | 重新加载当前页面 | |||
| 职位 | /api/v1/sessions/:id/dialog | 接受/取消下一个本地警报/确认/提示 | |||
| 获取/发布/删除 | /api/v1/sessions/:id/cookies | 读取/写入/清除浏览器Cookie | |||
| 获取/发布/删除 | /api/v1/sessions/:id/storage | 读/写/清除本地存储或会话存储(?kind=local | session) | ||
| 职位 | /api/v1/sessions/:id/upload | 在文件输入上设置文件({selector, paths}) | |||
| 职位 | /api/v1/sessions/:id/print | 将当前页面渲染为PDF(返回应用程序/PDF) | |||
| 职位 | /api/v1/sessions/:id/route/block | 阻止所有与glob模式匹配的请求 | |||
| 职位 | /api/v1/sessions/:id/route/headers | 将标头注入到与模式匹配的请求中 | |||
| 职位 | /api/v1/sessions/:id/route/mock | 用于匹配请求的模拟响应体 | |||
| 删除 | /api/v1/sessions/:id/route | 删除所有路由处理程序(passthrough) | |||
| 职位 | /api/v1/sessions/:id/geolocation | 覆盖报告的坐标(或为空以清除) | |||
| 职位 | /api/v1/sessions/:id/viewport | 在会话中期调整视口大小 | |||
| 职位 | /api/v1/sessions/:id/headers | 为所有请求设置额外的HTTP标头 | |||
| 职位 | /api/v1/sessions/:id/har/start | 启动HAR网络捕获 | |||
| 得到 | /api/v1/sessions/:id/har/peek | 不停止获取当前条目 | |||
| 职位 | /api/v1/sessions/:id/har/stop | 停止并返回所有捕获的条目 | |||
| 职位 | `/api/v1/sessions/:id/console/start\ | peek\ | stop` | 捕获控制台消息+未捕获的错误 | |
| 职位 | /api/v1/sessions/:id/throttle/network | 节流网络(下载吞吐量/上传吞吐量/延迟Ms/离线) | |||
| 职位 | /api/v1/sessions/:id/throttle/cpu | CPU速度减慢倍数(1=本机,4=慢4倍) | |||
| 职位 | /api/v1/sessions/:id/locale | 覆盖navigator.language+接受语言 | |||
| 职位 | /api/v1/sessions/:id/timezone | 覆盖页面时区(例如“亚洲/东京”) | |||
| 发布/删除 | /api/v1/sessions/:id/permissions | 授予/清除浏览器权限(剪贴板、通知等) | |||
| 职位 | /api/v1/sessions/:id/record/start | 开始记忆记录技能创造 | |||
| 得到 | /api/v1/sessions/:id/record/peek | 录制时的实时事件计数 | |||
| 职位 | /api/v1/sessions/:id/record/stop | 停止并(可选)将事件保存为技能({name, slots, description}) | |||
| 职位 | /api/v1/sessions/:id/har/replay | 重新执行HAR条目并比较状态 | |||
| 得到 | /api/v1/sessions/:id/service-workers | 列出现役军人 | |||
| 获取/发布 | /api/v1/sessions/:id/snapshot | 导出完整会话状态(Cookie+存储+IDB);发布 /snapshot/restore 进口 | |||
| 发布/获取 | `/api/v1/sessions/:id/downloads/start\ | stop` | 自动将所有下载捕获到标记为dir的会话中 | ||
| 获取/发布 | /api/v1/sessions/:id/clipboard | 通过navigator.clipboard读取/写入页面的剪贴板 | |||
| 职位 | `/api/v1/sessions/:id/wait/selector\ | text\ | network-idle\ | function` | 聪明的服务员会超时 |
| 得到 | /api/v1/sessions/:id/markdown | 从当前页面提取干净的RAG友好标记 | |||
| 得到 | /api/v1/skills/:name/versions | 列出技能的存档版本 | |||
| 职位 | /api/v1/skills/:name/rollback | 还原以前的版本({version: N}) | |||
| 得到 | /api/v1/sessions/:id/activity | 会话的空闲时间(毫秒) | |||
| 职位 | /api/v1/sessions/:id/touch | 重置空闲计数器 | |||
| 得到 | /api/v1/sessions/expired | 列出超过空闲超时的会话 | |||
| 职位 | /api/v1/snapshot/diff | 区分两个快照({a, b})返回添加/删除/更改 | |||
| 职位 | /api/v1/sessions/:id/click_by_description | 仅视觉点击(“蓝色提交按钮”) | |||
| 职位 | /api/v1/pool/warmup | 为低于100ms的会话创建预先创建N个空上下文 | |||
| 得到 | /api/v1/pool/status | 温水游泳池大小+最年长的入场年龄 | |||
| 职位 | /api/v1/pool/drain | 关闭所有温暖的上下文 | |||
| 职位 | /api/v1/sessions/:id/copilot/install | 为“AI在这里”提示注入高亮叠加 | |||
| 职位 | /api/v1/sessions/:id/copilot/highlight | 突出显示带有可选标签的bbox | |||
| 职位 | `/api/v1/pool/auto_refill/start\ | stop` | 后台作业,保持池满 | ||
| 职位 | /api/v1/action_memory/predict | 凭记忆预测下一步行动({url, elements, goal?}) | |||
| 得到 | /api/v1/skills/marketplace | GitHub Pages托管的静态技能目录(slug、标签、质量、运行、成功率) | |||
| 得到 | /api/v1/vision/cache/stats | 如果SQLite支持,则Vision LLM缓存命中/未命中+persistent_size | |||
| 职位 | /api/v1/vision/cache/clear | 内存中为空+磁盘上的视觉缓存 | |||
| 得到 | /api/v1/sessions/:id/har/export | 捕获的HAR导出为标准HAR 1.2(Chrome DevTools可导入) | |||
| 职位 | /api/v1/vision/cache/prune | 删除最旧的条目 cache_max_disk_entries +真空 | |||
| 职位 | /api/v1/traces/diff | 区分两个跟踪事件数组(回归测试) | |||
| 职位 | /api/v1/sessions/:id/shortcut | 执行指定的键盘快捷键(newTab/copy/find等) | |||
| 得到 | /api/v1/shortcuts | 列出可用的命名快捷方式 | |||
| 得到 | /api/v1/dump | 所有服务器状态的单次调用快照 | |||
| 发布/获取/删除 | /api/v1/plans[/:slug] | 保存/列出/加载/删除可重复使用的计划蓝图 | |||
| 职位 | /api/v1/sessions/:id/shortcut/chain | 按顺序执行多个命名快捷方式 | |||
| 得到 | /api/v1/metrics/summary | 根据直方图p50/p95/p99/平均值/计数百分位数 | |||
| 获取/发布/删除 | /api/v1/rate_limits | 每个域RPS限制(导航时的令牌桶限制) | |||
| 职位 | /api/v1/sessions/:id/plans/:slug/run | 加载并执行已保存的计划蓝图 | |||
| 职位 | /api/v1/skills/:name/to_plan | 将记录的技能转化为计划({save?, slug?}) | |||
| 得到 | /api/v1/action_memory/search?pattern=... | 按选择器子字符串搜索动作内存 | |||
| 职位 | /api/v1/parallel/extract | 生成N个并行会话,从每个URL中提取标记 | |||
| 职位 | /api/v1/plans/compose | Chain N将计划保存为超级计划 | |||
| 职位 | /api/v1/sessions/:id/form/autofill | 按名称/标签/占位符匹配自动填写表单输入 | |||
| 职位 | /api/v1/skills/diff | 比较两种技能的事件({a, b}) | |||
| 获取/发布/删除 | /api/v1/webhooks[/:id] | 订阅事件,POST到外部URL(HMAC签名时 secret 设置) | |||
| 职位 | /api/v1/webhooks/:id/test | 启动测试交付以验证连接 | |||
| 职位 | /api/v1/batch/csv | 处理CSV:按行导航,提取标记,返回丰富的结果 | |||
| 得到 | /api/v1/webhooks/queue | 等待的webhook重试计数 | |||
| 发布/获取 | /api/v1/skills/:name/cost | 记录/读取每项技能LLM成本(代币使用×费率) | |||
| 得到 | /api/v1/skills/cost/leaderboard | 总成本排名前N的最昂贵技能 | |||
| 职位 | /api/v1/skills/validate | 保存前验证技能的结构({skill}) | |||
| 职位 | /api/v1/skills/:name/auto_tag | LLM建议从技能描述+事件中添加3-5个标签 | |||
| 职位 | /api/v1/traces/render | 将TraceEvent\[\]渲染为自包含的HTML时间线页面 | |||
| 职位 | /api/v1/skills/:name/auto_describe | LLM从技能事件中写一行描述 | |||
| 得到 | /api/v1/skills/:name/suggested_selectors | 跨技能:在其他领域为同一目标工作的选择器 | |||
| 得到 | /api/v1/action_memory/export.csv | 将动作记忆下载为CSV格式(?domain=&limit=) | |||
| 职位 | /api/v1/action_memory/query | 复合过滤器+排序查询(域、目标子串、选择器子串、min_success_rate、min_run、sort_by) | |||
| 得到 | /api/v1/sessions/:id/a11y | 可访问性审计(缺少alt/标签、标题跳过、空链接、缺少lang) | |||
| 得到 | /api/v1/skills/:name/bundle | 将技能导出为.agbpkg(技能+计划+统计数据+自述文件) | |||
| 职位 | /api/v1/skills/bundle/import | 导入.agbpkg捆绑包 | |||
| 得到 | /api/v1/analytics/domain/:domain | 每个域操作内存分析+顶级选择器 | |||
| 获取/发布/删除 | /api/v1/schedules[/:id] | 重复技能执行({skill_name, spec: "every 5m", bindings}) | |||
| 职位 | /api/v1/skills/recommend | 推荐与目标文本相匹配的技能({goal, limit?, min_score?}) | |||
| 职位 | /api/v1/plan_templates/:name/to_skill | 将内置的计划模板转换为可运行的技能 | |||
| 发布/获取 | `/api/v1/sessions/:id/network/start\ | peek\ | stop` | 每会话网络字节跟踪 | |
| 得到 | /api/v1/sessions/:id/contrast | WCAG颜色对比度审计 | |||
| 得到 | /api/v1/fingerprints | 列出浏览器指纹预设(mac chrome、iphone-15-pro、东京iphone等) | |||
| 职位 | /api/v1/sessions/:id/fingerprint | 应用预设({preset_id})-视口+UA+区域设置+时区 | |||
| 得到 | /api/v1/sessions/:id/memory | 从会话创建到每个会话堆/rss/外部增量 | |||
| 职位 | /api/v1/sessions/:id/memory/snapshot | 重新设定会话内存快照的基线 | |||
| 得到 | /api/v1/health/full | 详细的系统健康状况:进程、引擎、调度程序、计费、身份验证状态 | |||
| 得到 | /api/v1/sessions/:id/cpu | 每会话CPU增量(用户/系统/墙ms+CPU_percent) | |||
| 职位 | /api/v1/sessions/:id/cpu/snapshot | 重新设定会话CPU快照的基线 | |||
| 职位 | /api/v1/action_memory/distill | 跨不同领域的顶级选择器(作为入门包提供) | |||
| 职位 | /api/v1/action_memory/import_patterns | 使用从另一个部署中提取的模式种子内存 | |||
| 职位 | /api/v1/sessions/:id/skills/auto_run | 将目标与最佳技能相匹配并执行(无LLM往返) | |||
| 获取/发布/删除 | /api/v1/skills/ab[/:key] | 在技能版本之间注册加权A/B路线 | |||
| 职位 | /api/v1/sessions/:id/skills/ab/:key/run | 运行A/B路由技能(加权变体选择) | |||
| WS | /api/v1/skills/events/ws | 现场技能成果消防水带(?skill= 过滤器) | |||
| 获取/删除 | /api/v1/skills/ab/:key/stats | 每个变体的汇总成功/失败统计数据 | |||
| 职位 | /api/v1/skills/ab/:key/promote | 自动推广获胜变体(z-test门控) | |||
| 获取/删除 | /api/v1/skills/percentiles[?skill=] | 根据技能p50/p95/p99潜伏期直方图 | |||
| 获取/发布/删除 | /api/v1/skills | 技能库CRUD | |||
| 得到 | /api/v1/skills/:name/export | 下载.skill.json | |||
| 职位 | /api/v1/skills/import | 导入.skill.json | |||
| 职位 | /api/v1/sessions/:id/skills/:name/run | 绑定回放技能 | |||
| 得到 | /api/v1/action_memory/stats | 内存统计信息 | |||
| 得到 | /api/v1/action_memory/by_domain/:domain | 系统知道什么:域 | |||
| 得到 | /api/v1/action_memory/selectors/:domain | 每个域具有成功/失败统计信息的顶级选择器 | |||
| 职位 | /api/v1/action_memory/recall_by_goal | 跨域选择器假设 | |||
| 职位 | /api/v1/action_memory/similar | TF-IDF/嵌入动作记忆搜索 | |||
| 职位 | /api/v1/action_memory/similar_embedded | 仅强制嵌入搜索 | |||
| 职位 | /api/v1/action_memory/decay | 将过期条目数量减半 | |||
| 职位 | /api/v1/page_similarity | 对两个页面快照之间的相似性进行评分 | |||
| 职位 | /api/v1/skills/discover | 建议与当前页面相关的技能 | |||
| 职位 | /api/v1/skills/compose | 按顺序运行多种技能 | |||
| 得到 | /api/v1/skills/stats | 按技能成功/失败历史(按筛选 ?skill= 对于每个域行) | |||
| 得到 | /api/v1/skills/leaderboard | 按成功数排名前N的表演技巧 | |||
| 得到 | /api/v1/skills/hot | 高置信度技能(成功率≥0.9,默认≥10次运行) | |||
| 职位 | /api/v1/skills/prune | 删除低于成功阈值的技能(默认情况下为模拟运行) | |||
| 删除 | /api/v1/skills/:name | 按名称删除技能 | |||
| 得到 | /api/v1/plan_templates | 列出内置计划模板 | |||
| 得到 | /api/v1/diagnose | 远程健康诊断(镜像 agb-doctor) | |||
| 职位 | /api/v1/traces/compact | 压缩跟踪文件 | |||
| 得到 | /api/v1/openapi.json | 完整的OpenAPI 3.1规范 | |||
| 得到 | /api/v1/dashboard | 汇总统计数据:网站记忆+动作记忆+技能+提供者 | |||
| 得到 | /api/v1/billing/pricing | 含价格+限额的层级列表(权力定价页面) | |||
| 职位 | /api/v1/billing/checkout | 条纹结账会议 {tier, email} | |||
| 职位 | /api/v1/billing/webhook | 条纹webhook接收器(签名已验证) | |||
| 得到 | /metrics | 普罗米修斯刮(无身份验证) | |||
| 得到 | /ready | 准备就绪探头(503,直到发动机启动) | |||
| 得到 | /api/v1/agents | 列出当前连接的Chrome扩展程序代理 | |||
| 得到 | /api/v1/agents/:id/poll | 下一个命令的长轮询(由Chrome扩展程序使用) | |||
| 职位 | /api/v1/agents/:id/cmd | 向已连接的Chrome扩展程序发送命令 | |||
| 职位 | /api/v1/agents/:id/result | 扩展发布命令结果 | |||
| 删除 | /api/v1/agents/:id | 删除代理状态 |
______________________________________________________________________
生产部署
码头工人
docker compose up -d
# AgentBrowser on http://localhost:3100
# Memory + traces persist in named volume认证+速率限制
AGENTBROWSER_API_KEYS=key1,key2 \
ANTHROPIC_API_KEY=sk-ant-... \
node dist/bin/http.js速率限制默认为600 req/min/key。覆盖 AGENTBROWSER_RATE_LIMIT_PER_MINUTE.
可观测性
- 每个动作都会发出一个类型
SessionEvent到进程内代理 - WebSocket客户端在以下位置订阅
/api/v1/sessions/:id/events(有200个事件回放缓冲区用于重新连接) - JSONL跟踪位于
~/.agentbrowser/traces/是审核日志吗 compactTrace()保持长轨迹小而不失保真度
______________________________________________________________________
测试地点:
| 能力 | 状态 |
|---|---|
类型检查(tsc) | 干净 |
| 测试套件 | 119/119通过21个文件 |
构建(npm run build) | 干净 |
| 真正的Chromium导航 | 已验证 |
| 机器人检测旁路 | 通过Cloudflare填隙、OneTrust、Cookiebot、资金选择、Reddit GDPR、Stack Overflow注册墙 |
| 光标点击→ DOM事件 | 端到端验证 |
| 动作验证器 | 在URL更改+元素添加/删除/文本更改时验证 |
| 视觉流水线 | 通过魔术字节+元素列表验证的带注释的PNG |
| HTTP API | 针对完整Fastify堆栈的13次集成测试 |
| 重播确定性 | 每个种子的轨迹生成器确定性 |
______________________________________________________________________
许可证
MIT。鼓励商业使用。
有关收购或合伙企业的询问: ashtonluca@gmail.com.
