AI 驱动的 Bark 消息推送中间层服务 + 跨平台桌面客户端。
Bark 是一款支持个人部署服务端、以设备为基本推送目标的 iOS/macOS 推送工具。AIBark 在 Bark 之上构建了一个完全兼容的智能中间层,核心解决三个问题:
- 推送消息太原始 — 外部系统(监控告警、NAS 通知、定时任务)推来的消息往往冗长混乱。AIBark 通过 AI 自动改写为简洁的标题 + 摘要,并根据内容智能选择推送分组和优先级。
- 一个用户多台设备 — 原版 Bark 一个 key 对应一台设备,多设备需手动逐一推送。AIBark 引入用户 key(
AU_)和用户组 key(AG_),一次请求广播到所有设备。 - Windows/Linux 没有 Bark — AIBark 提供桌面客户端,通过增量同步 API 在非 Apple 平台也能接收和浏览推送消息。
- 完全兼容 Bark API — 支持所有 Bark URL 格式和参数,可直接替换 Bark 服务端地址
- AI 智能路由 — 根据消息内容自动分组(告警 / 新闻 / 系统通知 / 通用),每组独立的 AI 提示词和处理模型
- AI 内容改写 — 将原始消息改写为适合移动端推送的标题 + 摘要格式,支持
{{original_body}}等变量引用原文 - 多模型支持 — 兼容所有 OpenAI 格式 API(GPT / Claude / GLM / Ollama 等),支持模型组 fallback / random 策略
- 自定义 API 参数 — 模型配置中的
choices字段支持任意参数,点号表示法自动展开为嵌套对象 - 消息持久化 — 所有推送内容保存到 SQLite,点击通知可查看完整原文
- 消息更新与召回 — 支持通过 Bark ID 更新已推送的通知内容,或从通知中心召回
- 管理后台 — 内置 Web 管理界面:用户管理、AI 配置、消息历史、处理队列
- MCP 协议 — 兼容 Bark MCP,可作为 AI Agent 的推送工具
- Docker 部署 — 提供 Dockerfile 和 docker-compose,一键部署
- 系统托盘驻留 — 常驻右下角,单击显示/隐藏主窗口
- 分组标签页浏览 — 以消息分组为标签页,按最新消息时间排序
- 增量同步 — 以云端消息为主、推送为辅,本地仅做展示缓存
- 通知弹窗 — 新消息桌面通知,点击打开对应消息
- CLI 模式 — 打包后支持命令行查询消息
外部调用方 (curl / MCP / 脚本 / App)
│
▼
┌─────────────────────────────┐
│ AIBark Server (API) │ ← 兼容 Bark URL 格式
│ ┌──────────────────────┐ │
│ │ Key 解析器 │ │ ← 区分设备key / 用户key / 组key
│ │ AI 路由器 (Step 1) │ │ ← 关键词匹配 → AI 自动分组
│ │ AI 处理器 (Step 2) │ │ ← 改写标题/内容/调整参数
│ │ Bark 推送 (Step 3) │ │ ← 批量转发到 Bark 服务端
│ │ 消息存储 (SQLite) │ │ ← 持久化 + 查阅 URL
│ │ 增量同步 API │ │ ← 供桌面客户端拉取
│ └──────────────────────┘ │
└─────────┬───────────────────┘
│
┌─────┴─────┐
▼ ▼
iOS/macOS Windows/Linux
(Bark App) (AIBark Client)
# 1. 创建工作目录
mkdir aibark && cd aibark
# 2. 创建 docker-compose.yml
cat > docker-compose.yml << 'EOF'
services:
aibark:
image: your-registry/aibark:latest
container_name: aibark-server
ports:
- "8000:8000"
volumes:
- ./config:/app/config
- ./data:/app/data
environment:
- AIBARK_CONFIG_DIR=/app/config
- AIBARK_DATA_DIR=/app/data
restart: unless-stopped
EOF
# 3. 启动
docker-compose up -d
# 4. 打开浏览器完成初始设置
# http://your-server:8000/setup首次启动时,若 config/ 为空,会自动从内置样例复制默认配置并生成 admin key(记录在日志和 config/admin.json 中)。
cd aibark-server
# 安装依赖(Python 3.12+)
pip install -r requirements.txt
# 启动(默认端口 8999,开发模式自动重载)
python -m uvicorn main:app --host 0.0.0.0 --port 8999 --reload
# 或使用脚本(Windows PowerShell)
.\run.ps1
.\run.ps1 -Port 9000 -NoReload首次访问 http://your-server/setup,设置:
- 服务端外网地址 — 用于生成消息查阅链接(如
https://aibark.example.com) - Bark 服务端地址 — 实际推送的目标 Bark 服务器(如
https://api.day.app或你自建的地址) - 管理员密钥 — 自动生成,用于登录管理后台
设置完成后访问 /admin/dashboard 登录管理后台。
AIBark 完全兼容标准 Bark 的 URL 格式:
# URL 路径格式
GET /:key/:body
GET /:key/:title/:body
GET /:key/:title/:subtitle/:body
# GET 请求
curl "https://aibark.example.com/AU_abc123/推送内容?group=分组"
# POST JSON
curl -X POST "https://aibark.example.com/AU_abc123" \
-H 'Content-Type: application/json' \
-d '{"title": "标题", "body": "内容"}'
# /push 端点
curl -X POST "https://aibark.example.com/push" \
-H 'Content-Type: application/json' \
-d '{"device_key": "AU_abc123", "title": "标题", "body": "内容"}'| Key 类型 | 前缀 | 示例 | 说明 |
|---|---|---|---|
| 原版设备 key | 无 | aBcDeFgH... |
直接透传到 Bark 服务端,不经过 AI |
| 用户 key | AU_ |
AU_abc123 |
AI 处理后广播到该用户所有设备 |
| 用户组 key | AG_ |
AG_team01 |
AI 处理后广播到组内所有用户的所有设备 |
在标准 Bark 参数之上,AIBark 新增:
| 参数 | 说明 | 默认值 |
|---|---|---|
ai |
设为 0 跳过 AI 处理,原文直接推送 |
1(启用) |
ai_history |
设为 1 将同分组历史消息作为上下文传给 AI |
0 |
{
"servers": {
"aibark": {
"type": "http",
"url": "https://aibark.example.com/mcp/{key}"
}
}
}收到推送请求
│
├─ 原版设备 key → 直接代理转发到 Bark
│
└─ 用户/组 key → 展开为所有目标设备
│
Step 1: 路由
│ 指定分组 → 直接使用
│ 分组映射 → 映射到系统分组
│ 关键词匹配 → 快速分组(无 AI 调用)
│ 以上都不匹配 → 调用路由 AI 选择分组
│
Step 2: 处理
│ 分组设置为 direct → 原文直发
│ 否则 → 调用处理 AI 改写标题/内容/参数
│ 支持 {{original_body}} 等变量引用原文
│
Step 3: 推送
│ 保存到 SQLite,生成查阅 URL
│ 设置 url 参数为查阅链接
│ 调用 Bark 批量接口推送到所有设备
▼
推送完成
所有配置文件位于 config/ 目录,JSON 格式。首次启动自动从 config-sample/ 复制。
{
"admin_key": "自动生成的管理员密钥",
"setup_completed": true,
"server_url": "https://aibark.example.com",
"bark_server": "https://api.day.app"
}{
"user1": {
"aibark_key": "AU_example_key",
"bark_url": [
"https://api.day.app/device_key_1",
"https://api.day.app/device_key_2"
],
"nickname": "用户一",
"default_Router": "",
"default_MessageHandler": ""
}
}bark_url:该用户所有设备的 Bark 推送地址,支持不同 Bark 服务器default_Router/default_MessageHandler:用户级别的模型组覆盖
{
"family": {
"aibark_key": "AG_family_group",
"user_ids": ["user1", "user2"]
}
}{
"models": {
"gpt4o-mini": {
"model": "gpt-4o-mini",
"API_type": "OpenAI",
"url": "https://api.openai.com/v1/chat/completions",
"API_key": "sk-your-api-key",
"timeout": 30,
"choices": {
"response_format": "json_object"
}
},
"glm-4.7-nothink": {
"model": "glm-4.7",
"API_type": "OpenAI",
"url": "https://open.bigmodel.cn/api/coding/paas/v4/chat/completions",
"API_key": "your-api-key",
"timeout": 120,
"choices": {
"response_format": "json_object",
"thinking.type": "disabled"
}
},
"local-ollama": {
"model": "qwen2.5:7b",
"API_type": "OpenAI",
"url": "http://localhost:11434/v1/chat/completions",
"API_key": "ollama",
"timeout": 120,
"choices": {
"response_format": "json_object",
"options.temperature": 0.7
}
}
},
"model_Group": {
"default_group": {
"type": "random",
"models": ["gpt4o-mini", "glm-4.7-nothink"]
},
"fast_group": {
"type": "fallback",
"models": ["gpt4o-mini", "local-ollama"]
}
},
"default_Router": "default_group",
"default_MessageHandler": "default_group"
}模型组策略:
random:随机选择一个模型,失败后尝试其余fallback:按顺序逐个尝试,第一个成功即停止
choices 自定义参数:
choices 中的所有字段会合并到 API 请求 payload。支持点号表示法自动展开为嵌套对象:
{"thinking.type": "disabled"} → 发送为 {"thinking": {"type": "disabled"}}
{"options.temperature": 0.7} → 发送为 {"options": {"temperature": 0.7}}
{"response_format": "json_object"} → 发送为 {"response_format": {"type": "json_object"}}适用于不同 AI 服务商的特有参数(GLM thinking 开关、Ollama options 等)。
{
"router": {
"system_prompt": "路由器系统提示词...",
"model_group": "default_group",
"group_mapping": {
"stock": "finance",
"crypto": "finance"
}
},
"groups": {
"alerts": {
"description": "告警和监控类消息",
"keywords": ["alert", "告警", "error"],
"handler_model_group": "default_group",
"use_history": false,
"handler_prompt": "你是一个告警消息处理器...",
"default_params": {
"level": "timeSensitive",
"sound": "glass"
}
}
}
}路由优先级: 指定分组 → 分组映射 → 关键词匹配 → AI 路由
分组配置项:
description:分组描述(AI 路由时参考)keywords:关键词列表,用于快速分组(无需调用 AI)handler_model_group:该分组使用的模型组(设为direct则跳过 AI 原文直发)use_history:是否将同分组历史消息作为上下文handler_prompt:AI 处理提示词(描述角色和规则即可,JSON 输出格式由系统自动附加)default_params:默认 Bark 推送参数(level / sound / badge 等)
访问 /admin/dashboard,使用 admin_key 登录。
功能:
- 概览 — 系统状态、用户数、消息统计
- 用户管理 — 增删改查用户、设备、模型组覆盖
- 用户组 — 管理广播组
- AI 分组与提示词 — 路由器配置、分组管理、提示词编辑
- AI 模型 — 模型和模型组管理
- 处理队列 — 查看处理状态,支持重试 / 跳过 / 编辑 / 删除
- 消息记录 — 历史消息浏览,支持重发 / 召回 / 批量删除
- 发送消息 — 向用户或组发送测试消息
- 系统设置 — 服务端地址、Bark 服务器配置
消息详情页展示完整的 AI 传递过程(3 步 timeline):
- Step 1 路由:路由来源、处理分组、使用模型、AI API 请求参数
- Step 2 处理:AI 输入/输出、提示词、原始回复
- Step 3 推送:Bark 推送地址、设备数量、完整载荷
弥补 Bark 仅支持 iOS/macOS 的不足。
cd aibark-client
pip install -r requirements.txt
python main.py# Windows: PyInstaller 打包为单文件 exe
pyinstaller aibark-client.spec
# Linux: 同样使用 PyInstaller,或直接 python main.py首次启动时通过界面配置,或编辑 data/client.json:
{
"server_url": "https://aibark.example.com",
"aibark_key": "AU_your_key"
}aibark-server/ # 服务端
├── main.py # FastAPI 应用入口
├── Dockerfile / docker-compose.yml
├── requirements.txt
├── routers/
│ ├── bark.py # Bark 兼容推送端点
│ ├── mcp.py # MCP 协议端点
│ ├── message.py # 消息查阅页面
│ ├── sync.py # 客户端增量同步 API
│ ├── admin.py # 管理后台 API
│ └── admin_ui.py # 管理后台前端
├── core/
│ ├── key_resolver.py # Key 类型判断与展开
│ ├── ai_router.py # AI 分组路由 (Step 1)
│ ├── ai_handler.py # AI 消息处理 (Step 2)
│ ├── ai_client.py # AI 模型调用(支持 fallback/random)
│ ├── bark_client.py # Bark 推送转发 (Step 3)
│ ├── async_processor.py # 后台异步处理队列
│ └── config_manager.py # 配置文件管理
├── models/
│ └── db.py # SQLite 数据模型
├── config-sample/ # 配置样例
└── utils/
├── first_run.py # 首次启动初始化
└── oauth2.py # OAuth2 登录(可选)
aibark-client/ # 桌面客户端
├── main.py # 程序入口
├── requirements.txt
├── aibark-client.spec # PyInstaller 打包配置
├── ui/
│ ├── tray.py # 系统托盘图标
│ └── main_window.py # 主窗口
├── core/
│ ├── sync.py # 增量同步
│ ├── cache.py # 本地 SQLite 缓存
│ └── cli.py # CLI 接口
└── config/
└── client.json # 客户端配置
| 变量 | 说明 | 默认值 |
|---|---|---|
AIBARK_CONFIG_DIR |
配置文件目录 | ./config |
AIBARK_DATA_DIR |
数据目录(SQLite + 日志) | ./data |
AIBARK_PORT |
服务端口(仅影响日志提示) | 8999 |
AIBark/
├── main/ # 主线分支(与远端同步)
└── vibe-YYMMDD-00X-TaskerName/ # Vibe Coding 工作分支
MIT