CoolFace
Apppublic

leeykike/browser-use

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes
App README

Browser-Use AI Agent API

基于 browser-use 的 AI 浏览器自动化 REST API 服务。

![Deploy to HF Spaces](https://huggingface.co/spaces)


✨ 功能特性

  • 🤖 多 LLM 支持:DeepSeek、OpenAI、Anthropic、Google Gemini、Groq、Ollama、硅基流动等
  • 🌐 浏览器自动化:自动搜索、点击、输入、滚动、截图
  • 📸 截图功能:每步操作自动截图,支持压缩(节省 50-70% 空间)
  • 🖥️ 实时画面:WebSocket 实时浏览器画面流,支持全屏和拖动
  • 📋 实时日志:SSE 实时任务日志流
  • 🔔 Webhook 通知:实时推送任务状态,支持 HMAC 签名验证
  • ⏱️ 自定义超时:支持 60-1800 秒自定义任务超时
  • 性能优化:浏览器连接池复用,任务超时控制
  • 🖥️ Web 界面:内置任务管理界面,无需编写代码
  • 🔒 访问控制:支持密码保护

🚀 快速开始

方式一:Hugging Face Spaces 部署(推荐)

  1. 1.访问 Hugging Face Spaces
  2. 2.点击 Create new Space,选择 Docker SDK
  3. 3.上传项目文件:app.pyDockerfilerequirements.txtREADME.md
  4. 4.创建一个私有 Dataset 仓库用于持久化配置(如 your-username/your-space-configs),命名格式为 <Space名>-configs
  5. 5.在 Space 的 Settings → Repository secrets 中配置:
   HF_TOKEN=hf_xxx          # HF Token(需要 write 权限,用于读写配置到 Dataset 仓库)
   ACCESS_PASSWORD=xxx       # 访问密码(保护所有 API 和 Web UI)
   CONFIG_PASSWORD=xxx       # 配置管理密码(保护 LLM 配置的增删改操作)
  1. 1.等待构建完成,访问 https://your-username-your-space.hf.space

方式二:Docker 本地部署

bash
# 克隆代码
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

方式三:本地直接运行

bash
# 安装依赖
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)

创建任务

bash
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"
    }
  }'

响应:

json
{
  "task_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "pending",
  "message": "任务已提交"
}

查询任务状态

bash
curl -H "X-Access-Password: your-password" \
  https://your-space.hf.space/task/{task_id}

响应:

json
{
  "task_id": "550e8400-...",
  "status": "completed",
  "result": "今天北京天气晴,温度15-25度",
  "steps": [...],
  "screenshots": ["550e8400_1_120001", "550e8400_2_120005"]
}

获取截图

bash
# 获取最新截图
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.png

Webhook 通知

bash
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 - 任务取消

🔧 配置参数

任务参数

参数类型默认值说明
taskstring-任务描述(必填)
headlessbooltrue无头模式(后台运行)
save_screenshotsbooltrue保存截图
compress_screenshotsbooltrue压缩截图(JPEG 70%)
use_visionboolfalse启用视觉功能
timeoutint300自定义超时时间(60-1800秒)
llm_configobject-LLM 配置(必填)
webhookobjectnullWebhook 配置(可选)

LLM 配置

参数类型必填说明
providerstring提供商(见下方支持列表)
modelstring模型名称
api_keystringAPI 密钥(Ollama 不需要)
base_urlstring自定义 API 地址
temperaturefloat温度参数(默认 0.0)

环境变量

变量默认值说明
ACCESS_PASSWORD-访问密码(不设置则无需密码)
CONFIG_PASSWORD-配置管理密码(不设置则仅需访问密码)
HF_TOKEN-HF Token(write 权限),用于将 LLM 配置持久化到 Dataset 仓库
MAX_CONCURRENT_TASKS3最大并发任务数
TASK_TIMEOUT300任务超时时间(秒)
MAX_BROWSER_POOL_SIZE2浏览器池大小
BROWSER_IDLE_TIMEOUT60浏览器空闲超时(秒)
TASK_RETENTION_HOURS24任务保留时间(小时)

配置持久化

LLM 配置(模型、API Key 等)通过 HF Dataset 仓库持久化存储:

  • Space 启动时自动从 Dataset 仓库拉取 configs.json
  • 每次保存配置时自动异步推送到 Dataset 仓库
  • Dataset 仓库命名规则:<用户名>/<Space名>-configs(需提前手动创建为私有仓库
  • API Key 使用 Fernet 加密存储,可通过 ENCRYPTION_KEY 环境变量自定义密钥

密码说明

密码作用范围说明
ACCESS_PASSWORD所有 API + Web UI基础访问控制,可分享给使用者
CONFIG_PASSWORD配置管理接口保护 LLM 配置的增删改,仅管理员知晓

两个密码建议设不同值,这样可以把访问密码分享给他人使用,而只有管理员能修改 LLM 配置。


🎯 支持的 LLM

⚠️ 重要提示:Browser-Use 底层使用结构化输出(Structured Output),只有完全兼容 OpenAI API 规范的模型才能正常工作。

支持的提供商

Provider默认 Base URL需要 API Key说明
deepseekhttps://api.deepseek.com/v1✅ 推荐,性价比高
openaihttps://api.openai.com/v1✅ 推荐,效果最好
anthropic-Claude 系列模型
google-Gemini 系列模型
groq-快速推理
ollamahttp://localhost:11434本地部署,免费
siliconflowhttps://api.siliconflow.cn/v1硅基流动,⚠️ 仅推荐 DeepSeek 系列
moonshothttps://api.moonshot.cn/v1⚠️ 可能不支持结构化输出
qwenhttps://dashscope.aliyuncs.com/compatible-mode/v1⚠️ 仅 qwen-vl-max
zhipuhttps://open.bigmodel.cn/api/paas/v4⚠️ 未测试
custom自定义自定义 OpenAI 兼容 API

推荐使用

  1. 1.DeepSeek(性价比最高)
  2. 2.OpenAI GPT-4/O3(效果最好)
  3. 3.Ollama(本地免费)
  4. 4.硅基流动(国内访问快)

使用示例

DeepSeek:

json
{
  "provider": "deepseek",
  "model": "deepseek-chat",
  "api_key": "sk-xxx"
}

Ollama(本地):

json
{
  "provider": "ollama",
  "model": "qwen2.5:14b",
  "base_url": "http://localhost:11434"
}

硅基流动(仅推荐 DeepSeek):

json
{
  "provider": "siliconflow",
  "model": "Pro/deepseek-ai/DeepSeek-V3",
  "api_key": "sk-xxx"
}
⚠️ 注意:硅基流动上的其他模型(如 Qwen、GLM 等)可能不支持 browser-use 需要的结构化输出格式,会导致任务失败。推荐使用 DeepSeek-V3 或 DeepSeek-R1 系列。

自定义 API:

json
{
  "provider": "custom",
  "model": "DeepSeek-R1",
  "api_key": "sk-xxx",
  "base_url": "https://llmapi.blsc.cn/v1"
}

📝 完整示例

Python 客户端

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 示例

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:

bash
# 获取 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 免费版):

bash
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-V3DeepSeek-R1 系列,其他模型(如 Qwen、GLM)可能返回错误的 action schema 格式导致任务失败。

Q: 截图是空白的?

A: 某些网站需要更长加载时间,或有反爬机制。

Q: 如何处理需要登录的网站?

A: 目前不支持持久化登录状态,可在任务描述中包含登录步骤。

Q: 私有 Space 返回 401 错误?

A: 需要添加 Authorization: Bearer hf_xxx 头。


📚 API 参考

主要端点

端点方法描述
/taskPOST创建任务
/task/{task_id}GET查询任务
/task/{task_id}DELETE删除任务
/task/{task_id}/cancelPOST取消任务
/tasksGET列出所有任务
/tasks/clearPOST清理已完成任务
/task/{task_id}/screenshot/latestGET获取最新截图
/task/{task_id}/screenshotsGET获取任务截图列表
/screenshot/{screenshot_id}GET获取指定截图
/task/{task_id}/logsGET获取任务日志
/task/{task_id}/logs/streamGET实时日志流(SSE)
/task/{task_id}/screen/streamWebSocket实时浏览器画面
/healthGET健康检查
/docsGETAPI 文档

实时画面(WebSocket)

javascript
// 建立 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)

javascript
// 建立 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 构建,感谢开源社区的贡献。