mecjy/browser-use
Browser-Use AI Agent API
基于 browser-use 的 AI 浏览器自动化 REST API 服务。

✨ 功能特性
- 🤖 多 LLM 支持:DeepSeek、OpenAI、Anthropic、Google Gemini、Groq、Ollama、硅基流动等
- 🌐 浏览器自动化:自动搜索、点击、输入、滚动、截图
- 📸 截图功能:每步操作自动截图,支持压缩(节省 50-70% 空间)
- 🖥️ 实时画面:WebSocket 实时浏览器画面流,支持全屏和拖动
- 📋 实时日志:SSE 实时任务日志流
- 🔔 Webhook 通知:实时推送任务状态,支持 HMAC 签名验证
- ⏱️ 自定义超时:支持 60-1800 秒自定义任务超时
- ⚡ 性能优化:浏览器连接池复用,任务超时控制
- 🖥️ Web 界面:内置任务管理界面,无需编写代码
- 🔒 访问控制:支持密码保护
🚀 快速开始
方式一:Hugging Face Spaces 部署(推荐)
- 访问 Hugging Face Spaces
- 点击 Create new Space,选择 Docker SDK
- 上传项目文件:
app.py、Dockerfile、requirements.txt、README.md - 创建一个私有 Dataset 仓库用于持久化配置(如
your-username/your-space-configs),命名格式为<Space名>-configs - 在 Space 的 Settings → Repository secrets 中配置:
HF_TOKEN=hf_xxx # HF Token(需要 write 权限,用于读写配置到 Dataset 仓库)
ACCESS_PASSWORD=xxx # 访问密码(保护所有 API 和 Web UI)
CONFIG_PASSWORD=xxx # 配置管理密码(保护 LLM 配置的增删改操作)- 等待构建完成,访问
https://your-username-your-space.hf.space
方式二:Docker 本地部署
# 克隆代码
git clone https://huggingface.co/spaces/your-username/your-space
cd your-space
# 构建并运行
docker build -t browser-use-api .
docker run -d -p 7860:7860 \
-e ACCESS_PASSWORD=your-password \
browser-use-api
# 访问
open http://localhost:7860方式三:本地直接运行
# 安装依赖
pip install -r requirements.txt
playwright install chromium --with-deps
# 运行服务
python app.py📖 API 使用
基础信息
- Base URL:
https://your-space.hf.space - 认证方式: Header
X-Access-Password: your-password或 Query?password=your-password - API 文档:
/docs(Swagger UI)
创建任务
curl -X POST https://your-space.hf.space/task \
-H "Content-Type: application/json" \
-H "X-Access-Password: your-password" \
-d '{
"task": "访问百度,搜索今天的天气",
"headless": true,
"save_screenshots": true,
"compress_screenshots": true,
"use_vision": false,
"llm_config": {
"provider": "deepseek",
"model": "deepseek-chat",
"api_key": "sk-xxx"
}
}'响应:
{
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "pending",
"message": "任务已提交"
}查询任务状态
curl -H "X-Access-Password: your-password" \
https://your-space.hf.space/task/{task_id}响应:
{
"task_id": "550e8400-...",
"status": "completed",
"result": "今天北京天气晴,温度15-25度",
"steps": [...],
"screenshots": ["550e8400_1_120001", "550e8400_2_120005"]
}获取截图
# 获取最新截图
curl -H "X-Access-Password: your-password" \
https://your-space.hf.space/task/{task_id}/screenshot/latest -o latest.png
# 获取指定截图
curl -H "X-Access-Password: your-password" \
https://your-space.hf.space/screenshot/{screenshot_id} -o screenshot.pngWebhook 通知
curl -X POST https://your-space.hf.space/task \
-H "Content-Type: application/json" \
-H "X-Access-Password: your-password" \
-d '{
"task": "搜索新闻",
"llm_config": {...},
"webhook": {
"url": "https://your-server.com/webhook",
"secret": "your-secret-key",
"events": ["task.started", "task.completed"]
}
}'Webhook 事件:
task.started- 任务开始task.step- 每步完成task.completed- 任务完成task.failed- 任务失败task.cancelled- 任务取消
🔧 配置参数
任务参数
LLM 配置
环境变量
配置持久化
LLM 配置(模型、API Key 等)通过 HF Dataset 仓库持久化存储:
- Space 启动时自动从 Dataset 仓库拉取
configs.json - 每次保存配置时自动异步推送到 Dataset 仓库
- Dataset 仓库命名规则:
<用户名>/<Space名>-configs(需提前手动创建为私有仓库) - API Key 使用 Fernet 加密存储,可通过
ENCRYPTION_KEY环境变量自定义密钥
密码说明
两个密码建议设不同值,这样可以把访问密码分享给他人使用,而只有管理员能修改 LLM 配置。
🎯 支持的 LLM
⚠️ 重要提示:Browser-Use 底层使用结构化输出(Structured Output),只有完全兼容 OpenAI API 规范的模型才能正常工作。
支持的提供商
推荐使用
- DeepSeek(性价比最高)
- OpenAI GPT-4/O3(效果最好)
- Ollama(本地免费)
- 硅基流动(国内访问快)
使用示例
DeepSeek:
{
"provider": "deepseek",
"model": "deepseek-chat",
"api_key": "sk-xxx"
}Ollama(本地):
{
"provider": "ollama",
"model": "qwen2.5:14b",
"base_url": "http://localhost:11434"
}硅基流动(仅推荐 DeepSeek):
{
"provider": "siliconflow",
"model": "Pro/deepseek-ai/DeepSeek-V3",
"api_key": "sk-xxx"
}⚠️ 注意:硅基流动上的其他模型(如 Qwen、GLM 等)可能不支持 browser-use 需要的结构化输出格式,会导致任务失败。推荐使用 DeepSeek-V3 或 DeepSeek-R1 系列。
自定义 API:
{
"provider": "custom",
"model": "DeepSeek-R1",
"api_key": "sk-xxx",
"base_url": "https://llmapi.blsc.cn/v1"
}📝 完整示例
Python 客户端
import requests
import time
BASE_URL = "https://your-space.hf.space"
PASSWORD = "your-password"
HEADERS = {"X-Access-Password": PASSWORD}
# 1. 创建任务
response = requests.post(
f"{BASE_URL}/task",
headers=HEADERS,
json={
"task": "访问百度,搜索今天的天气",
"llm_config": {
"provider": "deepseek",
"model": "deepseek-chat",
"api_key": "sk-xxx"
}
}
)
task_id = response.json()["task_id"]
print(f"任务已创建: {task_id}")
# 2. 轮询等待完成
while True:
result = requests.get(f"{BASE_URL}/task/{task_id}", headers=HEADERS).json()
status = result["status"]
print(f"状态: {status}")
if status in ["completed", "failed", "cancelled"]:
break
time.sleep(3)
# 3. 获取结果
if status == "completed":
print(f"结果: {result['result']}")
# 下载截图
for i, screenshot_id in enumerate(result["screenshots"]):
img = requests.get(f"{BASE_URL}/screenshot/{screenshot_id}", headers=HEADERS)
with open(f"screenshot_{i+1}.png", "wb") as f:
f.write(img.content)JavaScript 示例
const BASE_URL = 'https://your-space.hf.space';
const PASSWORD = 'your-password';
const headers = { 'X-Access-Password': PASSWORD };
// 创建任务
const response = await fetch(`${BASE_URL}/task`, {
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json' },
body: JSON.stringify({
task: '访问百度,搜索今天的天气',
llm_config: {
provider: 'deepseek',
model: 'deepseek-chat',
api_key: 'sk-xxx'
}
})
});
const { task_id } = await response.json();
console.log(`任务已创建: ${task_id}`);
// 轮询等待完成
let result;
while (true) {
const res = await fetch(`${BASE_URL}/task/${task_id}`, { headers });
result = await res.json();
if (['completed', 'failed', 'cancelled'].includes(result.status)) {
break;
}
await new Promise(resolve => setTimeout(resolve, 3000));
}
console.log(`结果: ${result.result}`);🔒 私有 Space 访问
如果 Space 设置为 Private,需要使用 HuggingFace Access Token:
# 获取 Token: https://huggingface.co/settings/tokens
curl -H "Authorization: Bearer hf_xxx" \
https://your-space.hf.space/health⚡ 性能优化
浏览器连接池
- 浏览器实例复用,减少启动时间 83%
- 空闲超时自动清理
- 可配置池大小
任务超时控制
- 防止任务无限期运行
- 自动清理超时任务
- 可配置超时时间
截图压缩
- PNG → JPEG 转换
- 质量 70%,节省 50-70% 空间
- 可选功能
推荐配置(HF Spaces 免费版):
MAX_CONCURRENT_TASKS=2
MAX_BROWSER_POOL_SIZE=2
TASK_TIMEOUT=300
BROWSER_IDLE_TIMEOUT=60🐛 常见问题
Q: 任务一直处于 pending 状态?
A: 检查 LLM API Key 是否正确,访问 /health 确认服务状态。
Q: 提示 "guided decoding is not supported"?
A: 第三方 API 可能不支持结构化输出,设置 use_vision: false 或使用官方 API。
Q: 硅基流动上的模型报错?
A: Browser-use 需要支持结构化输出的模型。硅基流动上只推荐使用 DeepSeek-V3 或 DeepSeek-R1 系列,其他模型(如 Qwen、GLM)可能返回错误的 action schema 格式导致任务失败。
Q: 截图是空白的?
A: 某些网站需要更长加载时间,或有反爬机制。
Q: 如何处理需要登录的网站?
A: 目前不支持持久化登录状态,可在任务描述中包含登录步骤。
Q: 私有 Space 返回 401 错误?
A: 需要添加 Authorization: Bearer hf_xxx 头。
📚 API 参考
主要端点
实时画面(WebSocket)
// 建立 WebSocket 连接
const ws = new WebSocket('wss://your-space.hf.space/task/{task_id}/screen/stream?password=xxx');
ws.onmessage = function(event) {
const data = JSON.parse(event.data);
if (data.event === 'frame') {
// data.data 是 base64 编码的 JPEG 图片(已压缩优化)
document.getElementById('screen').src = 'data:image/jpeg;base64,' + data.data;
} else if (data.event === 'waiting') {
// 等待浏览器启动...
} else if (data.event === 'task_ended') {
// 任务已结束
}
};实时日志(SSE)
// 建立 SSE 连接
const eventSource = new EventSource('/task/{task_id}/logs/stream?password=xxx');
eventSource.onmessage = function(event) {
const log = JSON.parse(event.data);
console.log(`[${log.type}] Step ${log.step}: ${log.content}`);
};
eventSource.onerror = function() {
eventSource.close();
};详细 API 文档请访问 /docs 查看 Swagger UI。
📄 License
MIT License
🔗 相关链接
- browser-use - 核心浏览器自动化库
- Hugging Face Spaces - 部署平台
- FastAPI - Web 框架
- Playwright - 浏览器自动化
🙏 致谢
本项目基于 browser-use 构建,感谢开源社区的贡献。
