Openbrowser Ai

me.openbrowser由 openbrowser.me 发布v0.1.54更新于 Oct 24, 2026

AI browser automation. Write async Python to navigate, click, type, and extract data.

概览

AI 生成的概览

本地 MCP 服务器,让助手通过编写并执行 Python 代码来操控 Chromium 浏览器,完成导航、点击、输入和数据提取。

可以做什么
通过单一 execute_code 工具在持久命名空间中运行 Python 代码,只返回明确要求的结果。导航页面、后退、等待,切换或关闭标签页。点击、输入文本、滚动、发送按键、上传文件,并对画布、PDF 或嵌入内容使用坐标操作。读取页面状态与可交互元素,获取 CSS 选择器,在页面中执行 JavaScript。选择下拉项,使用浏览器 Cookie 下载文件并列出已下载文件。
适用场景
适合需要助手操作真实网站的场景:跨页面抓取结构化数据、填写表单与登录流程、端到端测试网页应用、审计页面,或下载需要登录会话的文件。
运行要求
以 Python 包形式在桌面本地运行(uvx openbrowser-ai --mcp)。需要 Chromium 系浏览器;若系统有 uvx,首次运行会自动安装 Chromium。MCP 模式无需 LLM API 密钥。可选环境变量:OPENBROWSER_HEADLESS、OPENBROWSER_ALLOWED_DOMAINS、OPENBROWSER_USER_DATA_DIR、OPENBROWSER_STORAGE_STATE、OPENBROWSER_MAX_OUTPUT、OPENBROWSER_COMPACT_DESCRIPTION、ANONYMIZED_TELEMETRY。
安装前请注意
助手会编写并执行任意 Python 代码,代码以你的用户权限运行。它可点击、输入、提交表单、上传和下载文件,可能在真实网站上改动数据或完成购买。浏览器配置目录保存 Cookie 和登录会话;OPENBROWSER_STORAGE_STATE 用于初始化,OPENBROWSER_USER_DATA_DIR 会将其持久化到磁盘。ANONYMIZED_TELEMETRY 默认开启,需手动关闭;OPENBROWSER_ALLOWED_DOMAINS 默认为空,即不限制访问域名。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Openbrowser Ai,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[OpenBrowser]

OpenBrowser

AI browser automation, powered by code.


Cloud dashboard for saved cookies and scheduled tasks is available in the hosted version. Join the waitlist for early access: https://openbrowser.me :

https://github.com/user-attachments/assets/b17f97f3-f9f8-4707-8e39-abbbbe1a693b

Automating Walmart Product Scraping:

https://github.com/user-attachments/assets/c517c739-9199-47b0-bac7-c2c642a21094

OpenBrowserAI Automatic Flight Booking:

https://github.com/user-attachments/assets/632128f6-3d09-497f-9e7d-e29b9cb65e0f

OpenBrowserAI Automatic Form Filling:

https://github.com/user-attachments/assets/16f7ef1a-beb1-45e2-a733-9592536e0ef7

[PyPI version] [Downloads] [Python 3.12+] [License: MIT] [Tests] [Coverage]

AI-powered browser automation using CodeAgent and CDP (Chrome DevTools Protocol)

OpenBrowser is a framework for intelligent browser automation. It combines direct CDP communication with a CodeAgent architecture, where the LLM writes Python code executed in a persistent namespace, to navigate, interact with, and extract information from web pages autonomously.

Table of Contents

Documentation

Full documentation: https://docs.openbrowser.me

Key Features

  • CodeAgent Architecture - LLM writes Python code in a persistent Jupyter-like namespace for browser automation
  • Raw CDP Communication - Direct Chrome DevTools Protocol for maximum control and speed
  • Vision Support - Screenshot analysis for visual understanding of pages
  • 15 LLM Providers - OpenAI, Anthropic, Google, Groq, AWS Bedrock, Azure, Ollama, DeepSeek, Cerebras, OpenRouter, OCI, and more
  • MCP Server - Model Context Protocol for Claude Desktop, Claude Code, Codex, OpenCode, and other AI assistants, with reusable saved login sessions
  • CLI Daemon - Persistent browser daemon with -c flag for direct code execution from Bash, saved login state, and 10-minute auto-shutdown
  • Workflow Recording - Record, replay, and export browser sessions to Jupyter notebooks or API crawler code
  • Video Recording - Record browser sessions as video files with ffmpeg
  • Cloud Platform - Full-stack web UI with real-time VNC streaming, saved logins (KMS-encrypted), scheduled workflows (EventBridge + SQS), and email notifications (SES)
  • Plugin System - Claude Code plugin with 7 guided skills (deep research, web scraping, form filling, e2e testing, page analysis, accessibility audit, file download)

Installation

Quick install (macOS / Linux)

bash
curl -fsSL https://raw.githubusercontent.com/billy-enrizky/openbrowser-ai/main/install.sh | sh

Quick install (Windows PowerShell)

powershell
irm https://raw.githubusercontent.com/billy-enrizky/openbrowser-ai/main/install.ps1 | iex

Detects uv, pipx, or pip and installs OpenBrowser automatically.

Install to ~/.local/bin without sudo:

bash
curl -fsSL https://raw.githubusercontent.com/billy-enrizky/openbrowser-ai/main/install.sh | sh -s -- --local

Homebrew (macOS / Linux)

bash
brew tap billy-enrizky/openbrowserbrew install openbrowser-ai

pip

bash
pip install openbrowser-ai

uv (recommended)

bash
uv pip install openbrowser-ai

uvx (zero install)

Run directly without installing -- uvx downloads and caches the package automatically:

bash
# MCP server modeuvx openbrowser-ai --mcp
# CLI daemon modeuvx openbrowser-ai -c "await navigate('https://example.com')"

pipx

bash
pipx install openbrowser-ai

From source

bash
git clone https://github.com/billy-enrizky/openbrowser-ai.gitcd openbrowser-aiuv pip install -e ".[agent]"

Optional Dependencies

bash
pip install openbrowser-ai[agent]      # LLM agent support (langgraph, langchain, litellm)pip install openbrowser-ai[all]        # All LLM providerspip install openbrowser-ai[anthropic]  # Anthropic Claudepip install openbrowser-ai[groq]       # Groqpip install openbrowser-ai[ollama]     # Ollama (local models)pip install openbrowser-ai[aws]        # AWS Bedrockpip install openbrowser-ai[azure]      # Azure OpenAIpip install openbrowser-ai[video]      # Video recording support

No separate browser install needed. OpenBrowser auto-detects any installed Chromium-based browser (Chrome, Edge, Brave, Chromium) and uses it directly. If none is found and uvx is available, Chromium is installed automatically on first run. To pre-install manually (requires uvx): openbrowser-ai install

Quick Start

Basic Usage

python
import asynciofrom openbrowser import CodeAgent, ChatGoogle
async def main():    agent = CodeAgent(        task="Go to google.com and search for 'Python tutorials'",        llm=ChatGoogle(model="gemini-3-flash"),    )
    result = await agent.run()    print(f"Result: {result}")
asyncio.run(main())

With Different LLM Providers

python
from openbrowser import CodeAgent, ChatOpenAI, ChatAnthropic, ChatGoogle
# OpenAIagent = CodeAgent(task="...", llm=ChatOpenAI(model="gpt-5.2"))
# Anthropicagent = CodeAgent(task="...", llm=ChatAnthropic(model="claude-sonnet-4-6"))
# Google Geminiagent = CodeAgent(task="...", llm=ChatGoogle(model="gemini-3-flash"))

Using Browser Session Directly

python
import asynciofrom openbrowser import BrowserSession, BrowserProfile
async def main():    profile = BrowserProfile(        headless=True,        viewport_width=1920,        viewport_height=1080,    )        session = BrowserSession(browser_profile=profile)    await session.start()        await session.navigate_to("https://example.com")    screenshot = await session.screenshot()        await session.stop()
asyncio.run(main())

Configuration

Environment Variables

bash
# Google (recommended)export GOOGLE_API_KEY="..."
# OpenAIexport OPENAI_API_KEY="sk-..."
# Anthropicexport ANTHROPIC_API_KEY="sk-ant-..."
# Groqexport GROQ_API_KEY="gsk_..."
# AWS Bedrockexport AWS_ACCESS_KEY_ID="..."export AWS_SECRET_ACCESS_KEY="..."export AWS_DEFAULT_REGION="us-west-2"
# Azure OpenAIexport AZURE_OPENAI_API_KEY="..."export AZURE_OPENAI_ENDPOINT="https://your-resource.openai.azure.com/"

BrowserProfile Options

python
from openbrowser import BrowserProfile
profile = BrowserProfile(    headless=True,    viewport_width=1280,    viewport_height=720,    disable_security=False,    extra_chromium_args=["--disable-gpu"],    record_video_dir="./recordings",    proxy={        "server": "http://proxy.example.com:8080",        "username": "user",        "password": "pass",    },)

Supported LLM Providers

ProviderClassModels
GoogleChatGooglegemini-3-flash, gemini-3-pro
OpenAIChatOpenAIgpt-5.2, o4-mini, o3
AnthropicChatAnthropicclaude-sonnet-4-6, claude-opus-4-6
GroqChatGroqllama-4-scout, qwen3-32b
AWS BedrockChatAWSBedrockanthropic.claude-sonnet-4-6, amazon.nova-pro
AWS Bedrock (Anthropic)ChatAnthropicBedrockClaude models via Anthropic Bedrock SDK
Azure OpenAIChatAzureOpenAIAny Azure-deployed model
OpenRouterChatOpenRouterAny model on openrouter.ai
DeepSeekChatDeepSeekdeepseek-chat, deepseek-r1
CerebrasChatCerebrasllama-4-scout, qwen-3-235b
OllamaChatOllamallama-4-scout, deepseek-r1 (local)
OCIChatOCIRawOracle Cloud GenAI models
Browser-UseChatBrowserUseExternal LLM service

Claude Code Plugin

Install OpenBrowser as a Claude Code plugin:

bash
# Add the marketplace (one-time)claude plugin marketplace add billy-enrizky/openbrowser-ai
# Install the pluginclaude plugin install openbrowser@openbrowser-ai

This installs the MCP server and 7 built-in skills:

SkillDescription
deep-researchConduct cited, multi-source web research and produce markdown and JSON reports
web-scrapingExtract structured data, handle pagination
form-fillingFill forms, login flows, multi-step wizards
e2e-testingTest web apps by simulating user interactions
page-analysisAnalyze page content, structure, metadata
accessibility-auditAudit pages for WCAG compliance
file-downloadDownload files (PDFs, CSVs) using browser session

See plugin/README.md for detailed tool parameter documentation.

Codex

OpenBrowser works with OpenAI Codex via native skill discovery.

Quick Install

Tell Codex:

Fetch and follow instructions from https://raw.githubusercontent.com/billy-enrizky/openbrowser-ai/refs/heads/main/.codex/INSTALL.md

Manual Install

bash
# Clone the repositorygit clone https://github.com/billy-enrizky/openbrowser-ai.git ~/.codex/openbrowser
# Symlink skills for native discoverymkdir -p ~/.agents/skillsln -s ~/.codex/openbrowser/plugin/skills ~/.agents/skills/openbrowser
# Restart Codex

Then configure the MCP server in your project (see MCP Server below).

Detailed docs: .codex/INSTALL.md

OpenCode

OpenBrowser works with OpenCode.ai via plugin and skill symlinks.

Quick Install

Tell OpenCode:

Fetch and follow instructions from https://raw.githubusercontent.com/billy-enrizky/openbrowser-ai/refs/heads/main/.opencode/INSTALL.md

Manual Install

bash
# Clone the repositorygit clone https://github.com/billy-enrizky/openbrowser-ai.git ~/.config/opencode/openbrowser
# Create directoriesmkdir -p ~/.config/opencode/plugins ~/.config/opencode/skills
# Symlink plugin and skillsln -s ~/.config/opencode/openbrowser/.opencode/plugins/openbrowser.js ~/.config/opencode/plugins/openbrowser.jsln -s ~/.config/opencode/openbrowser/plugin/skills ~/.config/opencode/skills/openbrowser
# Restart OpenCode

Then configure the MCP server in your project (see MCP Server below).

Detailed docs: .opencode/INSTALL.md

OpenClaw

OpenClaw supports OpenBrowser via the CLI daemon. Install OpenBrowser, then use openbrowser-ai -c from the Bash tool:

bash
openbrowser-ai -c "await navigate('https://example.com')"openbrowser-ai -c "print(await evaluate('document.title'))"

The daemon starts automatically on first use and persists variables across calls.

For OpenClaw plugin documentation, see docs.openclaw.ai/tools/plugin.

MCP Server

[MCP Registry]

OpenBrowser includes an MCP (Model Context Protocol) server that exposes browser automation as tools for AI assistants like Claude. Listed on the MCP Registry as me.openbrowser/openbrowser-ai. No external LLM API keys required -- the MCP client provides the intelligence.

By default, each MCP server process uses an isolated profile under ~/.config/openbrowser/profiles/mcp-<instance-id>. Its storage_state.json is seeded once from ~/.config/openbrowser/profiles/default/storage_state.json, so existing logins are available without allowing concurrent MCP servers to kill or corrupt one another's browser. The per-process profile is retained on disk but is not automatically reused by a later MCP process. Configure OPENBROWSER_USER_DATA_DIR for a profile that survives restarts; OPENBROWSER_STORAGE_STATE is a one-time seed for managed profiles, and later changes are saved to the active per-process copy rather than copied back automatically. OpenBrowser also auto-cleans disposable Chromium caches in managed profiles, which keeps disk usage down without deleting cookies or login state. If you explicitly configure the same OPENBROWSER_USER_DATA_DIR for multiple servers, the profile lease rejects the second owner with a clear error.

Quick Setup

Claude Code: add to your project's .mcp.json:

json
{  "mcpServers": {    "openbrowser": {      "command": "uvx",      "args": ["openbrowser-ai", "--mcp"]    }  }}

Claude Desktop: add to ~/Library/Application Support/Claude/claude_desktop_config.json:

json
{  "mcpServers": {    "openbrowser": {      "command": "uvx",      "args": ["openbrowser-ai", "--mcp"],      "env": {        "OPENBROWSER_HEADLESS": "true"      }    }  }}

Run directly:

bash
uvx openbrowser-ai --mcp

Tool

The MCP server exposes a single execute_code tool that runs Python code in a persistent namespace with browser automation functions. The LLM writes Python code to navigate, interact, and extract data, returning only what was explicitly requested.

Available functions (use await unless noted):

CategoryFunctions
Navigationnavigate(url, new_tab), go_back(), wait(seconds)
Interactionclick(index), input_text(index, text, clear), scroll(down, pages, index), send_keys(keys), upload_file(index, path)
Coordinate interactionclick_xy(x, y, button, click_count), hover_xy(x, y), scroll_xy(x, y, delta_x, delta_y) for no-index canvas, PDF, embedded, and native-rendered targets
Dropdownsselect_dropdown(index, text), dropdown_options(index)
Tabsswitch(tab_id), close(tab_id)
JavaScriptevaluate(code): run JS in page context, returns Python objects
Downloadsdownload_file(url, filename): download a file using browser cookies, list_downloads(): list downloaded files (sync, no await)
Statebrowser.get_browser_state_summary(): get page metadata and interactive elements
CSSget_selector_from_index(index): get CSS selector for an element
Completiondone(text, success): signal task completion

Prefer indexed actions whenever an element index exists. Coordinate actions use CSS viewport pixels, not screenshot pixels. If a screenshot uses a devicePixelRatio other than 1, divide its coordinates by window.devicePixelRatio before calling an *_xy function.

Pre-imported libraries: json, csv, re, datetime, asyncio, Path, requests, numpy, pandas, matplotlib, BeautifulSoup

Configuration

Environment VariableDescriptionDefault
OPENBROWSER_HEADLESSRun browser without GUItrue
OPENBROWSER_ALLOWED_DOMAINSComma-separated domain whitelist(none)
OPENBROWSER_USER_DATA_DIROptional explicit Chrome profile directory. Omit it for an isolated profile per MCP server instance(auto: ~/.config/openbrowser/profiles/mcp-<instance-id>)
OPENBROWSER_STORAGE_STATEOptional JSON file used as a one-time seed for cookies plus localStorage in managed MCP profiles(auto: per-process copy, seeded from profiles/default)
OPENBROWSER_COMPACT_DESCRIPTIONMinimal tool description (~500 tokens)false
OPENBROWSER_MAX_OUTPUTMax output characters per execution10000

Benchmark: Token Efficiency

CLI Benchmark: 4-Way Comparison (6 Tasks, N=3 runs)

Four CLI tools compared with a single Bash tool each. Claude Sonnet 4.6 on Bedrock. Randomized order. All achieve 100% accuracy.

[CLI Benchmark: Token Usage vs Duration]

CLI ToolDuration (mean +/- std)Tool CallsBedrock API TokensResponse Chars
openbrowser-ai84.8 +/- 10.9s15.3 +/- 2.336,010 +/- 6,0639,452 +/- 472
browser-use106.0 +/- 9.5s20.7 +/- 6.477,123 +/- 33,35436,241 +/- 12,940
agent-browser99.0 +/- 6.8s25.0 +/- 4.090,107 +/- 3,69856,009 +/- 39,733
playwright-cli118.3 +/- 21.4s25.7 +/- 8.194,130 +/- 35,98284,065 +/- 49,713

openbrowser-ai uses 2.1-2.6x fewer tokens than all competitors via Python code batching and compact DOM representation.

[CLI Benchmark: Overview]

Per-Task Token Usage

[CLI Benchmark: Per-Task Token Usage]

Taskopenbrowser-aibrowser-useplaywright-cliagent-browser
fact_lookup2,5044,71016,8579,676
form_fill7,88715,81131,75719,226
multi_page_extract2,3542,4058,8868,117
search_navigate16,53947,93627,77944,367
deep_navigation2,1783,7474,7055,534
content_analysis4,5482,5154,1473,189

openbrowser-ai wins 5 of 6 tasks. The advantage is largest on complex pages (search_navigate: 2.9x fewer tokens than browser-use) where code batching avoids repeated page state dumps.

Cost per Benchmark Run (6 Tasks)
Modelopenbrowser-aibrowser-useplaywright-cliagent-browser
Claude Sonnet 4.6 ($3/$15 per M)$0.12$0.24$0.29$0.27
Claude Opus 4.6 ($5/$25 per M)$0.24$0.45$0.56$0.51

Raw results are in benchmarks/e2e_4way_cli_results.json. Full 4-way comparison with methodology.

E2E LLM Benchmark: MCP Server Comparison (6 Tasks, N=5 runs)

[E2E LLM Benchmark: MCP Server Comparison]

MCP ServerPass RateDuration (mean +/- std)Tool CallsBedrock API Tokens
Playwright MCP (Microsoft)100%62.7 +/- 4.8s9.4 +/- 0.9158,787
Chrome DevTools MCP (Google)100%103.4 +/- 2.7s19.4 +/- 0.5299,486
OpenBrowser MCP100%77.0 +/- 6.7s13.8 +/- 2.050,195

OpenBrowser uses 3.2x fewer tokens than Playwright and 6.0x fewer than Chrome DevTools. MCP response sizes: Playwright 1,132,173 chars, Chrome DevTools 1,147,244 chars, OpenBrowser 7,853 chars -- a 144x difference.

Full MCP comparison with methodology

CLI Usage

bash
# Run a browser automation task with an LLM agentuvx openbrowser-ai -p "Search for Python tutorials on Google"
# Execute code directly via persistent daemonuvx openbrowser-ai -c "await navigate('https://example.com')"uvx openbrowser-ai -c "print(await evaluate('document.title'))"
# Daemon managementuvx openbrowser-ai daemon start     # Start daemon (auto-starts on first -c call)uvx openbrowser-ai daemon stop      # Stop daemon and browseruvx openbrowser-ai daemon status    # Show daemon infouvx openbrowser-ai daemon restart   # Restart daemon
# Install browseruvx openbrowser-ai install
# Run MCP serveruvx openbrowser-ai --mcp

The -c flag connects to a persistent browser daemon over a Unix socket (localhost TCP on Windows). Variables persist across calls while the daemon is running. The daemon starts automatically on first use and shuts down after 10 minutes of inactivity.

The CLI daemon stores its browser profile in ~/.config/openbrowser/profiles/daemon and also writes storage_state.json there, so cookies and login sessions survive daemon restarts. One-shot -p runs use ~/.config/openbrowser/profiles/cli with the same storage-state behavior. Managed profiles automatically clear disposable browser caches on startup and shutdown while keeping auth state.

Project Structure

openbrowser-ai/├── .claude-plugin/            # Claude Code marketplace config├── .codex/                    # Codex integration│   └── INSTALL.md├── .opencode/                 # OpenCode integration│   ├── INSTALL.md│   └── plugins/openbrowser.js├── plugin/                    # Plugin package (skills + MCP config)│   ├── .claude-plugin/│   ├── .mcp.json│   └── skills/                # 7 browser automation skills├── src/openbrowser/│   ├── __init__.py            # Main exports│   ├── cli.py                 # CLI commands│   ├── config.py              # Configuration│   ├── actor/                 # Element interaction│   ├── agent/                 # LangGraph agent│   ├── browser/               # CDP browser control│   ├── code_use/              # Code agent + shared executor│   ├── daemon/                # Persistent browser daemon (Unix socket)│   ├── dom/                   # DOM extraction│   ├── llm/                   # LLM providers│   ├── mcp/                   # MCP server│   └── tools/                 # Action registry├── benchmarks/                # MCP benchmarks and E2E tests│   ├── playwright_benchmark.py│   ├── cdp_benchmark.py│   ├── openbrowser_benchmark.py│   └── e2e_published_test.py└── tests/                     # Test suite

Testing

bash
# Run unit testspytest tests/
# Run with verbose outputpytest tests/ -v
# E2E test the MCP server against the published PyPI packageuv run python benchmarks/e2e_published_test.py

Benchmarks

Run individual MCP server benchmarks (JSON-RPC stdio, 5-step Wikipedia workflow):

bash
uv run python benchmarks/openbrowser_benchmark.py   # OpenBrowser MCPuv run python benchmarks/playwright_benchmark.py     # Playwright MCPuv run python benchmarks/cdp_benchmark.py            # Chrome DevTools MCP

Raw results are in benchmarks/e2e_4way_cli_results.json. See full comparison for methodology.

Backend and Frontend Deployment

The project includes a FastAPI backend and a Next.js frontend, both containerized with Docker.

Prerequisites

  • Docker and Docker Compose
  • A .env file in the project root with POSTGRES_PASSWORD and any LLM API keys (see backend/env.example)

Local Development (Docker Compose)

bash
# Start backend + PostgreSQL (frontend runs locally)docker-compose -f docker-compose.dev.yml up --build
# In a separate terminal, start the frontendcd frontend && npm install && npm run dev
ServiceURLDescription
Backendhttp://localhost:8000FastAPI + WebSocket + VNC
Frontendhttp://localhost:3000Next.js dev server
PostgreSQLlocalhost:5432Chat persistence
VNCws://localhost:6080Live browser view

The dev compose mounts backend/app/ and src/ as volumes for hot-reload. API keys are loaded from backend/.env via env_file. The POSTGRES_PASSWORD is read from the root .env file.

Full Stack (Docker Compose)

bash
# Start all services (backend + frontend + PostgreSQL)docker-compose up --build

This builds and runs both the backend and frontend containers together with PostgreSQL.

Backend

The backend is a FastAPI application in backend/ with a Dockerfile at backend/Dockerfile. It includes:

  • REST API on port 8000
  • WebSocket endpoint at /ws for real-time agent communication
  • VNC support (Xvfb + x11vnc + websockify) for live browser viewing on ports 6080-6090
  • Kiosk security: Openbox window manager, Chromium enterprise policies, X11 key grabber daemon
  • Health check at /health
bash
# Build the backend imagedocker build -f backend/Dockerfile -t openbrowser-backend .
# Run standalonedocker run -p 8000:8000 -p 6080:6080 \  --env-file backend/.env \  -e VNC_ENABLED=true \  -e AUTH_ENABLED=false \  --shm-size=2g \  openbrowser-backend

Frontend

The frontend is a Next.js application in frontend/ with a Dockerfile at frontend/Dockerfile.

bash
# Build the frontend imagecd frontend && docker build -t openbrowser-frontend .
# Run standalonedocker run -p 3000:3000 \  -e NEXT_PUBLIC_API_URL=http://localhost:8000 \  -e NEXT_PUBLIC_WS_URL=ws://localhost:8000/ws \  openbrowser-frontend

Environment Variables

Key environment variables for the backend (see backend/env.example for the full list):

VariableDescriptionDefault
GOOGLE_API_KEYGoogle/Gemini API key(required)
DEFAULT_LLM_MODELDefault model for agentsgemini-3-flash-preview
AUTH_ENABLEDEnable Cognito JWT authfalse
VNC_ENABLEDEnable VNC browser viewingtrue
DATABASE_URLPostgreSQL connection string(optional)
POSTGRES_PASSWORDPostgreSQL password (root .env)(required for compose)

Research: Reinforcement Fine-Tuning for Browser Agents

Beyond the framework, we conducted two independent research studies on improving browser agents through reinforcement learning, both using the FormFactory benchmark (1,250 form-filling tasks across 8 domains) and OpenBrowser's browser execution environment.

Study 1: Browser-in-the-Loop (Autoregressive RL)

We investigated whether reinforcement learning can improve a language model's ability to fill web forms beyond what supervised learning achieves.

  • Method: Two-phase pipeline -- SFT on Qwen3-8B with QLoRA (992 demonstrations), then online GRPO with live browser execution rewards (composite: 40% submission success + 40% field accuracy + 20% execution completeness)
  • Result: GRPO achieves 9.1% higher average reward than SFT alone on held-out validation (p=0.007, Wilcoxon signed-rank test). Improvement comes specifically from better form submission, not field filling.
  • Key finding: SFT is a prerequisite -- without it, the base model generates unstructured text and earns zero reward across all attempts.
  • Paper: Browser-in-the-Loop: Reinforcement Fine-Tuning LLM Agents for Web Form Filling
  • Models: Qwen3-8B-FormFactory-SFT-LoRA, Qwen3-8B-FormFactory-GRPO-LoRA

Study 2: Diffusion Language Models for Web Action Planning

We investigated whether diffusion language models -- which generate text by iteratively denoising an entire sequence in parallel rather than left-to-right -- can learn web action planning.

  • Models tested: ReFusion 8B (masked diffusion with causal LM backbone) and FS-DFM 1.3B (pure discrete flow matching)
  • Result: After SFT, diffusion models solve 60-69% of tasks vs. 100% for the AR baseline. Token-level RL is universally fragile (2/16 comparisons improve, both insignificant). Sequence-level RL succeeds: MDPO pushes ReFusion to 91.9% (+31.4pp) and ESPO pushes FS-DFM to 87.1% (+18.6pp).
  • Key finding: The appropriate RL formulation is architecture-dependent. ELBO-based optimization (ESPO) produces concentrated distributions across architectures, while per-step trajectory methods produce multimodal distributions.
  • Paper: Concentrate or Collapse: When Reinforcement Learning Meets Diffusion Language Models for Web Planning
  • Models: 10 trained models on HuggingFace including ReFusion-8B-MDPO, FS-DFM-1.3B-ESPO-mu8, and more

Reproducing RL Experiments

All training code is in infra/training/. Training runs on a single NVIDIA A10G GPU (24GB VRAM) via Anyscale.

bash
# Study 1: Autoregressive RL (Qwen3-8B)# SFT phase -- QLoRA fine-tuning on 992 FormFactory demonstrations (2-4 hours)python infra/training/finetuning/sft_trainer.py
# Online GRPO phase -- browser-in-the-loop reward (4-8 hours per epoch)# Requires headless Chromium + FormFactory forms serverpython infra/training/shared/formfactory_server.py &   # Start form serverpython infra/training/finetuning/online_grpo_trainer.py
# Evaluate SFT and GRPO checkpoints on val/test splitspython infra/training/finetuning/eval_sft.py
# Study 2: Diffusion LM RL (ReFusion 8B, FS-DFM 1.3B)# SFT phasepython infra/training/flow_matching/fsdfm_sft_trainer.py    # FS-DFM SFTpython infra/training/flow_matching/flow_sft_trainer.py      # ReFusion SFT
# Sequence-level RL (best results)python infra/training/flow_matching/espo_fsdfm_trainer.py    # ESPO on FS-DFMpython infra/training/flow_matching/espo_refusion_trainer.py # ESPO on ReFusionpython infra/training/flow_matching/mdpo_fsdfm_trainer.py    # MDPO on FS-DFMpython infra/training/flow_matching/mdpo_refusion_trainer.py # MDPO on ReFusion
# Submit jobs to Anyscale cloudpython infra/training/anyscale/submit_job.py --config infra/training/anyscale/online_grpo_job.yaml
# Push trained checkpoints to HuggingFacepython infra/training/anyscale/push_checkpoints_to_hf.py
# Serve trained model locally via vLLM or Ollamapython infra/training/serving/serve_vllm.pypython infra/training/serving/export_gguf.py   # Export to GGUF for Ollama

Reward function (in infra/training/shared/reward_functions.py): composite score = 0.4 * task completion + 0.4 * field accuracy + 0.2 * execution completeness. Online reward (online_reward.py) launches headless Chromium, executes the model's action plan, and computes the score from live browser state.

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Contact


Made with love for the AI automation community

来源:README.md,提交 48ec5d9

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

5
  1. v0.1.54最新Sep 22, 2026
  2. v0.1.53Sep 21, 2026
  3. v0.1.52Sep 21, 2026
  4. v0.1.51Sep 20, 2026
  5. v0.1.50Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分