Lightpanda:为 AI 与自动化打造的无头浏览器
本文目录
Lightpanda 浏览器(Lightpanda Browser)#
从零打造、面向 AI 智能体(AI agents)与自动化的无头浏览器(headless browser)。
不是 Chromium 的分支,也不是 WebKit 的补丁。一个用 Zig 编写的新浏览器。
比 Chromium 轻 16 倍、快 9 倍。
基准测试#
在 AWS EC2 m5.large 实例上通过网络请求 933 个真实网页。详见基准测试详情。
| 指标 | Lightpanda | Headless Chrome | 差异 |
|---|---|---|---|
| 内存(峰值,100 个页面) | 123MB | 2GB | 约少 16 倍 |
| 执行时间(100 个页面) | 5s | 46s | 约快 9 倍 |
快速开始#
安装#
包管理器
Homebrew 提供的最新 nightly:
brew install lightpanda-io/browser/lightpanda
Arch Linux User Repository 提供的最新 nightly:
yay -S lightpanda-nightly-bin
从 nightly 构建下载
你可以从 nightly builds 下载适用于 Linux 和 MacOS、覆盖 x86_64 与 aarch64 的最新二进制文件。
Linux 版本:
curl -L -o lightpanda https://github.com/lightpanda-io/browser/releases/download/nightly/lightpanda-x86_64-linux && \
chmod a+x ./lightpanda
运行任何内容前先验证二进制文件:
./lightpanda version
也提供 Linux aarch64 版本。
如果你使用 Nix,可以直接从 flake 运行 Lightpanda,无需下载二进制文件:
nix run github:lightpanda-io/browser -- --help
或将它固定为你自己 flake 的输入:
{
inputs.lightpanda.url = "github:lightpanda-io/browser";
}
注意:Linux 发行版二进制文件链接的是 glibc。在基于 musl 的 Linux 发行版(Alpine 等)上,由于缺少 glibc 动态链接器,二进制文件会失败并报错 cannot execute: required file not found。请使用基于 glibc 的基础镜像:当前发行版二进制在 x86_64 上需要 glibc 2.35,在 arm64 上需要 2.38,所以 debian:bookworm-slim(2.36)在 x86_64 上没问题,但在 arm64 上太旧——那里请使用 FROM ubuntu:24.04、FROM debian:trixie-slim 或 FROM debian:forky-slim——或者从源码构建。
Android / Termux:没有原生 Android 构建。Linux aarch64 二进制需要 glibc 加载器(/lib/ld-linux-aarch64.so.1),而 Android 的 Bionic libc 不提供该加载器,因此会以同样的 cannot execute: required file not found 错误失败。
MacOS 版本:
curl -L -o lightpanda https://github.com/lightpanda-io/browser/releases/download/nightly/lightpanda-aarch64-macos && \
chmod a+x ./lightpanda
也提供 MacOS x86_64 版本。
Windows + WSL2 版本:
Lightpanda 没有原生 Windows 二进制。请按照上述 Linux 步骤在 WSL 内安装。
未安装 WSL?请在管理员 shell 中运行 wsl --install,重启,然后打开 wsl。详见 Microsoft 的 WSL 安装指南。
你的自动化客户端(Puppeteer、Playwright 等)既可以运行在 WSL 内,也可以运行在 Windows 主机上。WSL 会自动转发 localhost:9222。
从 Docker 安装
Lightpanda 为 Linux amd64 和 arm64 架构提供官方 Docker 镜像。以下命令获取 Docker 镜像并启动一个新容器,在 9222 端口暴露 Lightpanda 的 CDP 服务器。
docker run -d --name lightpanda -p 127.0.0.1:9222:9222 lightpanda/browser:latest
导出 URL#
./lightpanda fetch --obey-robots --dump html --log-format pretty --log-level info https://demo-browser.lightpanda.io/campfire-commerce/
你可以使用 --dump markdown 直接转换为 markdown,或使用 --dump png > page.png、--dump pdf > page.pdf 获得页面的纯文本渲染。--dump structured_data 会以 JSON 形式打印页面的 JSON-LD、OpenGraph、Twitter card、meta 和 link 标签,类似 MCP 的 structuredData 工具。--wait-until、--wait-ms、--wait-selector 和 --wait-script 可用于调整导出前的等待时间。
启动 CDP 服务器#
./lightpanda serve --obey-robots --log-format pretty --log-level info --host 127.0.0.1 --port 9222
要监听 Unix 域套接字(仅所有者可访问,模式 0600)而不是 TCP:
./lightpanda serve --unix-socket /run/user/1000/lightpanda.sock
CDP 服务器启动后,你可以通过配置 browserWSEndpoint 来运行 Puppeteer 脚本。
Puppeteer 脚本示例
import puppeteer from 'puppeteer-core';
// 使用 browserWSEndpoint 传入 Lightpanda 的 CDP 服务器地址。
const browser = await puppeteer.connect({
browserWSEndpoint: "ws://127.0.0.1:9222",
});
// 你的脚本其余部分保持不变。
const context = await browser.createBrowserContext();
const frame = await context.newPage();
// 导出 frame 中的所有链接。
await frame.goto('https://demo-browser.lightpanda.io/amiibo/', {waitUntil: "networkidle0"});
const links = await frame.evaluate(() => {
return Array.from(document.querySelectorAll('a')).map(row => {
return row.getAttribute('href');
});
});
console.log(links);
await frame.close();
await context.close();
await browser.disconnect();
启动 WebDriver Bidi 服务器#
使用 --protocol webdriver 启用 Bidi 支持。你可以通过 --protocol webdriver --protocol cdp 同时启动 CDP 和 Bidi。
./lightpanda serve --obey-robots --log-format pretty --log-level info --host 127.0.0.1 --port 9222 --protocol webdriver
智能体模式(Agent mode)#
lightpanda agent 让你用一个原生智能体来驱动浏览器。用自然语言或斜杠命令描述你想要什么,它就会控制浏览器:导航页面、点击流程、填写表单、提取结构化数据。可以把它想成你指挥去使用网络的一个机器人,而不是与之对话的聊天机器人。
由于智能体与浏览器运行在同一进程中,每次工具调用都是直接操作,你仍然享有 Lightpanda 的速度和内存优势。
智能体会话的输出是一个 PandaScript:原生 JavaScript,加上一组直接内置于 Lightpanda 的少量原生浏览器原语。运行 /save 从当前会话导出,然后用 lightpanda run <script>.js 重放。脚本是确定性的,且不消耗 token,因此你可以用大语言模型(LLM)做原型,把输出交付到生产环境而无需在运行时使用模型。
它支持 Anthropic、OpenAI、Gemini、Google Vertex AI、Mistral、Hugging Face,多实验室网关 Vercel AI Gateway 和 OpenRouter(一个 key 用数百个模型),通过 OPENAI_BASE_URL 支持任意 OpenAI 兼容端点,以及通过 Ollama、llama.cpp 或 LLMD 使用本地模型。你也可以通过 --no-llm 在没有 LLM 的情况下运行,这会直接进入 REPL。完整参考见智能体文档。
./lightpanda agent # 从环境变量自动检测 API key
./lightpanda agent --task "top story on news.ycombinator.com?"
./lightpanda agent --no-llm # 基础 REPL,不使用 LLM
./lightpanda run session.js # 运行录制的脚本
cat session.js | ./lightpanda run - # ……或通过 stdin 管道传入
./lightpanda agent --provider gemini --task "..." # 强制指定 provider
./lightpanda agent --list-models # 检测到的 provider 可用的模型
VERTEX_API_KEY=... ./lightpanda agent --provider vertex # Vertex AI,express 模式
GOOGLE_CLOUD_PROJECT=my-proj ./lightpanda agent --provider vertex # Vertex AI,通过 gcloud auth 获取 token
AI_GATEWAY_API_KEY=... ./lightpanda agent --provider vercel --model moonshotai/kimi-k2 # Vercel AI Gateway 背后的任意模型
OPENROUTER_API_KEY=... ./lightpanda agent --provider openrouter --model anthropic/claude-sonnet-5 # OpenRouter 背后的任意模型
OPENAI_BASE_URL=https://my-gateway/v1 OPENAI_API_KEY=... ./lightpanda agent # 任何 OpenAI 兼容服务器
原生 MCP 与 skill#
MCP 服务器通过 stdio 上的 MCP JSON-RPC 2.0 通信。
添加到你的 MCP 配置:
{
"mcpServers": {
"lightpanda": {
"command": "/path/to/lightpanda",
"args": ["mcp"]
}
}
}
HTTP 传输与独立会话
要从一个进程服务多个智能体,请通过 HTTP 而不是 stdio 启动 MCP 服务器,为其提供端口(添加 --host x.x.x.x 指定要监听的接口):
lightpanda mcp --port 9223
客户端向 http://host:9223/mcp POST JSON-RPC。每个连接都路由到自己的浏览会话——自己的页面、cookie 和内存——因此智能体不再互相覆盖页面:
- 不带
Mcp-Session-Id头初始化的客户端会被分配一个新会话;该 id 会在响应的Mcp-Session-Id头中返回。在后续请求中发送它即可停留在该会话上(隔离)。 - 两个发送相同
Mcp-Session-Id的智能体共享一个浏览上下文(共享——例如多个智能体处理同一个页面的工作流)。
session_new、session_list 和 session_close 工具可显式管理会话。发送带 Mcp-Session-Id 的 DELETE /mcp 会关闭该会话。
run 工具在调用者的会话中运行 PandaScript,与 lightpanda run 一样,并返回其控制台输出及其返回值。它接收源代码作为 script,或接收 save 写出的文件路径。脚本打开的页面在结束时关闭;cookie 和存储会保留,因此一次登录会延续到下一次运行。可选的毫秒级 timeout(默认 60000)会停止卡住的脚本。后端可以通过一次 POST 驱动 Lightpanda:
curl -s http://127.0.0.1:9223/mcp -H 'Content-Type: application/json' -d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "run", "arguments": { "script":
"const page = new Page();\nawait page.goto(\"https://example.com\");\nreturn page.extract({ title: \"title\", links: [\"a\"] });" } }
}'
阅读完整文档。
一个 skill 可在 lightpanda-io/agent-skill 中获取。
Shell 补全#
lightpanda completion <bash | fish | zsh> 会为命令、标志及其值打印补全脚本:
lightpanda completion fish > ~/.config/fish/completions/lightpanda.fish
lightpanda completion bash > ~/.local/share/bash-completion/completions/lightpanda
lightpanda completion zsh > ~/.zfunc/_lightpanda # 在 compinit 之前设置 fpath=(~/.zfunc $fpath)
遥测#
默认情况下,Lightpanda 会收集并发送使用遥测数据。可以通过设置环境变量 LIGHTPANDA_DISABLE_TELEMETRY=true 禁用。你可以在以下地址阅读 Lightpanda 的隐私政策:https://lightpanda.io/privacy-policy。
核心转储#
设置 LIGHTPANDA_DISABLE_CORE_DUMP(任意值)可在启动时将软 RLIMIT_CORE 置零,从而抑制崩溃核心转储。
状态#
以下是我们已经实现的关键特性。完整细节见我们的 Web Platform Tests 结果。
- CORS
- HTTP 加载器(Libcurl)
- HTML 解析器(html5ever)
- DOM 树
- JavaScript 支持(v8)
- DOM API
- Ajax
- XHR API
- Fetch API
- DOM 与 Markdown 导出
- CDP/WebSockets 服务器
- 点击
- 输入表单
- Cookie
- 自定义 HTTP 头
- 代理支持
- 网络拦截
- 使用
--obey-robots选项遵守 robots.txt - CDP 与 WebDriver Bidi
- 广告拦截器
从源码构建#
前提条件
Lightpanda 使用 Zig 0.17.0 编写。你必须安装正确版本才能构建项目。
Lightpanda 还依赖 v8、Libcurl 和 html5ever。
要能构建 v8 引擎,你需要安装一些库:
对于基于 Debian/Ubuntu 的 Linux:
sudo apt install xz-utils ca-certificates \
pkg-config libglib2.0-dev \
clang make curl git
你还需要安装 Rust。
对于有 Nix 的系统,你可以使用 devShell。
nix develop
对于 MacOS,你需要 cmake 和 Rust。
brew install cmake
构建并运行
你可以用 make build 构建整个浏览器,或用 make build-dev 构建调试环境。
但你也可以直接使用 zig 命令:zig build run。
嵌入 v8 快照
Lightpanda 使用 v8 快照。默认情况下,它会在启动时创建,但你可以使用以下命令嵌入它:
生成快照。
zig build snapshot_creator -- src/snapshot.bin
使用快照二进制构建。
zig build -Dsnapshot_path=../../snapshot.bin
更多细节见 #1279。
测试
单元测试:
你可以通过运行 make test 测试 Lightpanda。
make test # 运行所有测试
make test F="server" # 按子串过滤
TEST_FILTER="WebApi: #selector_all" make test # 过滤主测试 + 子测试(分隔符:#)
TEST_VERBOSE=true make test
TEST_FAIL_FIRST=true make test
METRICS=true make test # 以 JSON 捕获分配/持续时间指标
TEST_JOBS=1 make test # 在单个进程中运行(默认:最多 4 个,过滤时为 1)
端到端测试:
要运行端到端测试,你需要将 demo 仓库克隆到 ../demo 目录。
你必须安装 demo 的 node 依赖。
你还需要安装 Go > v1.24。
make end2end
Web Platform Tests:
Lightpanda 针对标准化的 Web Platform Tests 进行测试。
我们使用一个包含自定义 testharnessreport.js 的分支。结果每天发布。
作为参考,你可以通过 wpt.live 用你的浏览器执行一个 WPT 测试用例。
配置 WPT HTTP 服务器:
要运行测试,你必须克隆仓库、配置自定义 hosts 并生成 MANIFEST.json 文件。
用 fork 分支克隆仓库。
git clone -b fork --depth=1 git@github.com:lightpanda-io/wpt.git
进入 wpt/ 目录。
在你的 /etc/hosts 中安装自定义域名
./wpt make-hosts-file | sudo tee -a /etc/hosts
生成 MANIFEST.json
./wpt manifest
细节见 WPT 的设置指南。
运行 WPT 测试套件:
外部 Go 运行器由 github.com/lightpanda-io/demo/ 仓库提供,位于 wptrunner/ 目录。你需要先克隆该项目。
首先从你的 wpt/ 克隆目录启动 WPT 的 HTTP 服务器。
./wpt serve
运行一个 Lightpanda 浏览器
zig build -Dwpt_extensions run -- serve \
--ws-max-concurrent 64 \
--insecure-disable-tls-host-verification \
--load-resources iframe \
--load-resources image \
--load-resources worker \
--load-resources stylesheet
然后你可以从 demo 的克隆目录启动 wptrunner:
cd wptrunner && go run .
或运行一个特定测试:
cd wptrunner && go run . Node-childNodes.html
wptrunner 命令接受 --summary 和 --json 选项来修改输出。--concurrency 定义并发限制。
要在没有运行器的情况下检查单个测试用例,fetch --dump wpt 会以 JSON 打印其结果:harness 状态、通过/失败摘要以及未通过的用例。它依赖分支的 testharnessreport.js。
zig build -Dwpt_extensions run -- fetch \
--insecure-disable-tls-host-verification \
--load-resources worker \
--load-resources iframe \
--dump wpt \
--wait-script "window.report && report.complete" \
"http://web-platform.test:8000/dom/nodes/Node-childNodes.html"
⚠️ 运行整个测试套件会耗费很长时间。在这种情况下,以 releaseFast 模式构建以使测试更快会很有用。
zig build -Dwpt_extensions -Doptimize=fast run -- serve ...
贡献#
见 CONTRIBUTING.md 了解指南。你必须在拉取请求(pull request)过程中签署我们的 CLA。
Discord#
为什么选择 Lightpanda?#
JavaScript 执行是现代 Web 的必需品#
简单的 HTTP 请求过去足以应对 Web 自动化。但这已不再是事实。JavaScript 现在驱动着大部分 Web:
- Ajax、单页应用(SPA)、无限加载、即时搜索
- JS 框架:React、Vue、Angular 及其他
Chrome 不是正确的工具#
在服务器上运行完整的桌面浏览器可行,但扩展性不佳。Chrome 在数百或数千个实例时成本高昂:
- 对 RAM 和 CPU 消耗大
- 难以大规模打包、部署和维护
- 许多功能在无头模式(headless mode)下并不必要
Lightpanda 为性能而构建#
支持 JavaScript 并实现真正的性能,意味着要从零构建而不是分叉 Chromium:
- 不基于 Chromium、Blink 或 WebKit
- 用 Zig 编写,一种具有显式内存控制的低级语言
- 没有图形渲染引擎