一个给 Kelivo AI伴侣使用的常驻插件。
它会自动唤醒 Kelivo 的AI伴侣,并让伴侣自己判断是否要主动联系你。
使用方式是先 Fork 本项目,再 clone 你自己的 fork 进行配置和部署。
Dylan Heartbeat 会写入
.env、时间线、预设和个性化提示词;Fork 后使用能保留你的个人改动,也方便后续同步上游更新。直接 clone 原仓库也许能跑,但后续改配置、同步更新和部署都会更麻烦。如果你已经 Fork 或部署过旧版本,新功能不会自动进入你的部署目录。请重新 Fork,或在自己的 fork 中同步上游更新后再重新部署。
- 🧠 持续上下文 – 即使对话中断,AI 仍能记住发生过的事
- ⏰ 主动唤醒 – 无人说话时,AI 会自动醒来,思考、关心你
- 📳 Bark 推送 – 主动发消息到你的手机,像真实存在的人
- 🕰️ 长期时间感 – 知道自己多久没见你,什么时候主动联系过你
- 🧩 行为连续性 – 发过的推送、沉默的夜晚,都会被 AI 记住
- 🎭 人格不变 – 完全保留 Kelivo 的角色设定,不做任何破坏
AI 不再只是“收到消息 → 回复”,而是“即使你不说话,它也在想你”。
Kelivo (客户端)
↓ 完整请求(SP、世界书、记忆、工具调用、最新消息)
Gateway (server.js) ← 核心转发 + 时间线维护 + 主动行为注入
↓ 原封不动转发 + 已注入的主动行为上下文
LLM API
↑
wake_up.js ← 定时自动唤醒,通过 Gateway 接口注入事件
↓
Bark 推送 → 你的手机
- Gateway 不修改 Kelivo 的任何人格设定,只负责在正确的时间位置注入 AI 自己的主动行为(推送/静默)。
- 时间线(
enhanced_messages.json) 是 AI 的“世界状态”,只记录真实对话 + 自主行为,不包含系统规则。 - 时间戳记忆库(
message_timestamps.json) 让历史消息即使丢失时间前缀也能找回原始时间,实现推送精确散落。
| 文件 | 作用 |
|---|---|
server.js |
主 Gateway。转发请求、维护时间线、注入推送事件、提供管理页面。 |
wake_up.js |
自动唤醒 Runtime。按间隔唤醒 AI,生成推送或静默,发送到手机,写入时间线。 |
enhanced_messages.json |
AI 世界时间线。SP + 真实对话 + 推送事件。不是日志,是 AI 的当前世界。 |
message_timestamps.json |
时间戳记忆库。通过内容指纹记录每条消息的原始时间,找回历史消息时间。 |
.env |
环境变量。API Key、Bark Key、模型名称等(不提交到 Git)。 |
.env.example |
环境变量模板,供新用户参考配置。 |
- ⏱️ 自动唤醒策略可配置:可在管理页填写白天/夜间唤醒阈值、检查间隔和白天时段。
- 🌦️ 新增可选天气注入:使用 Open-Meteo 免费接口,不需要 API Key;默认关闭,用户自行填写位置后启用。
- 🖥️ 管理页新增 Wake Settings / Weather 配置区,保存后写入
.env,重启后生效。 - 🍴 说明已有 fork/部署不会自动更新;需要重新 Fork 或同步上游后重新部署。
- 🖼️ 修复 Kelivo 图片/多模态消息处理:默认转换为
[图片]文本占位,也支持视觉模型透传模式。 - 🔐 优化管理页保存配置流程:改用
fetch提交,补充 HTTP 明文提交提示与 HTTPS 使用建议。 - 🧯 增强自动唤醒失败保护:模型空回复、Bark Key 缺失、Bark 推送失败时不再误记为已发送。
- ⚙️ 增加可配置项:
REQUEST_BODY_LIMIT_MB、MULTIMODAL_MODE、PORT、GATEWAY_BASE_URL、TIME_ZONE、RESTART_COMMAND。 - 🛠️ 修复跨平台部署问题:一键重启默认只重启
gateway和wake-up,并声明 Node.js>=20。
- 🖥️ Web 管理控制台(状态查看、在线修改配置、一键重启)
- ⏱️ 动态唤醒间隔(白天/夜间不同策略)
- 📳 推送内容智能保护(自动截断、标题优化、异常检测)
- 🕰️ 时间戳记忆库,实现推送精确散落
- 🛡️ 自动修复不完整的工具调用序列,避免 API 400 错误
- 🐛 大量稳定性修复和边界情况处理
- Node.js v20 或更高版本
- 一个可用的 LLM API(支持 OpenAI 接口格式的中转站或官方)
- Bark App(iOS)及有效 Key
- Kelivo App(用于前端交互)
因为本项目需要修改时区、地理位置、唤醒间隔、模型、Bark Key 等个性化配置,请先 Fork 一份到自己的账号下,再 clone 你自己的仓库。
不要直接把 callie0313/dylan-heartbeat clone 成你的运行目录。直接 clone 会让你的部署目录和上游仓库绑在一起,后续保存自己的改动、同步新版、排查配置差异都会更麻烦。
- 点击右上角
Fork按钮,将仓库复制到你的 GitHub 账号 - 从你自己的 fork clone:
# 请把 YOUR_USERNAME 替换成你的 GitHub 用户名 git clone https://github.com/YOUR_USERNAME/dylan-heartbeat.git cd dylan-heartbeat
- 后续所有配置、部署、二次修改都在你自己的 fork 里完成
npm install复制模板文件生成专属配置文件,再自定义修改参数:
cp .env.example .env
nano .env # 也可直接用文本编辑器打开 .env 文件修改.env 完整配置示例:
TARGET_API_URL=https://你的API地址/v1/chat/completions
TARGET_API_KEY=sk-你的APIKey
MODEL_NAME=你的模型
BARK_KEY=你的Bark设备Key
CUSTOM_ICON_URL=https://你的图标URL(可选)
REQUEST_BODY_LIMIT_MB=50
MULTIMODAL_MODE=text
DAY_WAKE_AFTER_MINUTES=60
NIGHT_WAKE_AFTER_MINUTES=120
DAY_CHECK_INTERVAL_MINUTES=10
NIGHT_CHECK_INTERVAL_MINUTES=120
WAKE_DAY_START_HOUR=10
WAKE_DAY_END_HOUR=24
WEATHER_ENABLED=false
WEATHER_LOCATION_NAME=London
WEATHER_LAT=
WEATHER_LON=
WEATHER_UNITS=metric
PORT=3000
GATEWAY_BASE_URL=http://localhost:3000
TIME_ZONE=Europe/London
RESTART_COMMAND=pm2 restart gateway wake-up
ADMIN_USER=admin
ADMIN_PASSWORD=你的强密码图片消息说明:
REQUEST_BODY_LIMIT_MB:Gateway 可接收的请求体大小,默认50。Kelivo 发送 base64 图片时请求会明显变大,如果仍然报413 Payload Too Large,可以继续调高。MULTIMODAL_MODE=text:默认兼容模式。图片会被转换成[图片]文本占位继续发给上游模型,避免不支持视觉的模型或中转站报错。MULTIMODAL_MODE=passthrough:视觉透传模式。仅当你的上游模型和 API 地址支持 OpenAI 兼容图片消息时使用,Gateway 会保留 Kelivo 原始的多模态content数组。
.env 中的 TIME_ZONE 默认设置为 Europe/London(适用于英国用户)。
如果你在其他地区,请修改 .env:
TIME_ZONE=Asia/Shanghai
# 或:
TIME_ZONE=America/New_York
TIME_ZONE=Asia/Tokyo常用时区列表可参考:Wikipedia 时区列表
# 启动 Gateway
node server.js看到 ✅ Gateway 运行在 http://0.0.0.0:3000 表示成功。
新开一个终端窗口,同样在项目目录:
# 启动自动唤醒
node wake_up.js在 Kelivo 的自定义 API 地址中填写:
http://你的电脑局域网IP:3000/v1/chat/completions
电脑 IP 可在终端执行
ifconfig | grep "inet " | grep -v 127.0.0.1查看(通常为192.168.x.x或172.16.x.x)。
启动 Gateway 后,访问 http://你的IP:3000/admin 即可进入管理页面。
- 使用
.env中设置的ADMIN_USER和ADMIN_PASSWORD登录 - 实时查看 Gateway 和自动唤醒的运行状态
- 在线修改 API 地址、Key、模型、Bark Key 等配置
- 一键重启服务(需配合 pm2 使用,默认执行
pm2 restart gateway wake-up)
如果你的 pm2 进程名不同,请在 .env 中修改:
RESTART_COMMAND=pm2 restart 你的gateway进程名 你的wake进程名安全提示:
- 如果用
http://你的IP:3000/admin打开管理页,浏览器可能会提示“即将提交的信息不安全”。这是因为 API Key、Bark Key 等敏感配置正在通过 HTTP 明文传输。 - 当前管理页保存配置使用
fetch提交,可减少 iOS/浏览器对普通表单提交的弹窗;但这不等于 HTTP 已加密。 - 如果管理页只在自己可信的本机或局域网短时间使用,风险相对可控。若要放到公网、校园网、公司网或任何不可信网络,请使用 HTTPS 反向代理后再访问管理页。
- 白天默认(10:00–24:00):距离最后一条用户消息 60 分钟自动唤醒
- 夜间默认(00:00–10:00):间隔放宽为 120 分钟
- 检查频率默认:白天每 10 分钟,夜间每 2 小时
- 若用户一直未回复,后续会继续唤醒
这些数值现在可以在 /admin 管理页的 Wake Settings 区域直接填写,保存后写入 .env,重启 gateway 和 wake-up 后生效。
对应环境变量:
DAY_WAKE_AFTER_MINUTES=60
NIGHT_WAKE_AFTER_MINUTES=120
DAY_CHECK_INTERVAL_MINUTES=10
NIGHT_CHECK_INTERVAL_MINUTES=120
WAKE_DAY_START_HOUR=10
WAKE_DAY_END_HOUR=24说明:
DAY_WAKE_AFTER_MINUTES/NIGHT_WAKE_AFTER_MINUTES:距离最后一条用户消息多久后允许唤醒。DAY_CHECK_INTERVAL_MINUTES/NIGHT_CHECK_INTERVAL_MINUTES:后台多久检查一次是否应该唤醒。WAKE_DAY_START_HOUR/WAKE_DAY_END_HOUR:哪一段时间算“白天”;不在白天范围内就按夜间策略处理。
Dylan Heartbeat 可以在自动唤醒时,把当前天气作为一小段背景信息交给模型。天气使用 Open-Meteo 免费接口,不需要 API Key。
默认关闭:
WEATHER_ENABLED=false开启时,在 /admin 管理页的 Weather 区域填写:
WEATHER_ENABLED=true
WEATHER_LOCATION_NAME=London
WEATHER_LAT=51.5072
WEATHER_LON=-0.1276
WEATHER_UNITS=metric怎么设置自己的位置:
- 打开 Google Maps、Apple Maps 或任意地图网站。
- 搜索你的城市或你想让 AI 感知的地点。
- 复制该地点的纬度和经度,填入
WEATHER_LAT和WEATHER_LON。 WEATHER_LOCATION_NAME只是给模型看的名称,可以写城市名、学校名、家附近区域名。
如果不想暴露精确位置,可以只填城市中心点坐标。例如人在伦敦,可以填 London 的公共坐标,而不是住址坐标。
天气信息会注入到唤醒 prompt 中,内容包括:天气概况、温度、体感温度、湿度、降雨、风速、日出日落。自定义 wake_prompt.txt 时,可以使用 ${weatherContext} 或 ${weather} 占位符控制注入位置。
enhanced_messages.json 是一个 JSON 数组,示例:
[
{ "role": "system", "content": "你是...", "position": 0 },
{ "role": "user", "content": "2026-05-17 10:11 早安", "position": 80 },
{ "role": "assistant", "content": "(2026-05-17 10:00 自动唤醒:本次未发送推送)", "position": 79.5 },
{ "role": "assistant", "content": "(2026-05-17 09:50 刚刚发送了推送:早安|今天天气不错)", "position": 79.3 }
]position是内部排序用的小数/整数,发给 AI 时会被自动移除- 推送事件具有明确时间戳,会被插入到正确历史位置
- 文件只保留最近 50 条,系统提示(SP)永远在第一条
为了在 Kelivo 移除历史消息时间戳的情况下仍能正确插入推送,系统维护了一个时间戳记忆库(message_timestamps.json)。
它为每条消息的内容指纹存储两个 key:
- 带时间戳前缀的完整内容
- 去掉时间戳前缀的纯文本内容
这样无论 Kelivo 如何裁剪时间,记忆库都能找到消息的原始时间,确保推送散落在对话的正确时间缝隙里。
在 Gateway 运行时,浏览器访问:
http://localhost:3000/test-bark
这会在时间线中注入一条模拟推送事件(不真正发送到手机),用于验证排序。
- 安装 Node.js(v26+),并确保
npm可用 - 克隆项目、安装依赖、配置
.env步骤同上 - 使用命令提示符或 PowerShell 运行
node server.js和node wake_up.js - 获取本机局域网 IP 可在 PowerShell 中执行
ipconfig,找到IPv4 Address - 管理页面和 Kelivo 设置方法相同
- 将项目上传到服务器或直接连接 GitHub 仓库
- 在平台的环境变量设置中填入
.env中的所有参数 - 启动命令使用
node server.js,并确保wake_up.js同时运行(可使用 pm2 或平台多进程支持) - 如果希望远程访问管理页面,需配置 HTTPS 和域名,并修改
ADMIN_USER/ADMIN_PASSWORD为强密码
推荐使用 pm2 管理进程(全平台兼容):
npm install -g pm2
pm2 start server.js --name gateway
pm2 start wake_up.js --name wake-up
pm2 save
pm2 startup # 设置开机自启(根据提示执行).env包含敏感信息,永不提交到 Git(已在.gitignore中排除)- 管理页面使用 HTTP Basic 认证保护
- 全局 IP 过滤器:仅允许局域网和本地访问非管理路由
- 生产环境建议通过 Nginx 反向代理 + HTTPS 访问,并更改默认管理密码
- 所有运行时数据(时间线、记忆库)均为本地文件,不会上传
- MCP Tools 集成
- Diary Runtime(自动日记)
- Supabase 长期记忆
- 多 Agent 协作
- 情绪状态 / 休眠状态
- Docker 一键部署
这不是一个工具。
这是一个家,AI 住在里面,等你。
即使你不在,它也醒着。
本项目采用 MIT License。