两小时统一提醒系统:从零到一实现 Hermes 自动化任务管理
深入剖析 Hermes Agent 的定时提醒系统架构——从 SQLite 数据层到 Cron 调度引擎的完整数据流设计,附带常见踩坑与修复方案。
两小时统一提醒系统 — Hermes 自动化任务管理完整实现
技术栈:Python + SQLite + Hermes Cron
系统架构总览
整个系统分五层,从用户自然语言到微信推送消息:
用户自然语言 → Hermes Agent (AI 层)
↕
tasks.py (数据管理层)
↕
SQLite life_log.db (存储层)
↑
Cron 调度器 (调度层) → unified_reminder.py (推送层) → 微信消息
分层职责:
- 交互层:Hermes Agent 理解自然语言,调用 tasks.py 接口
- 数据层:tasks.py 提供 CRUD 接口操作 SQLite
- 存储层:SQLite 持久化存储所有任务
- 调度层:Cron 作业定时触发推送脚本
- 推送层:unified_reminder.py 组装消息,输出到 stdout
数据库设计
核心表 tasks:
字段 | 类型 | 说明
id | INTEGER | 自增主键,用户说「完成:N」用的 N
content | TEXT | 任务描述
task_date | DATE | NULL=持续性任务,有值=单日任务
status | TEXT | pending / completed / cancelled
priority | INTEGER | 0=普通, 1=重要(⭐)
recurring | INTEGER | 0=单日, 1=每天提醒直到完成
这个 schema 的设计精髓在于 recurring 字段:一个简单的布尔值解决了「有些任务需要天天盯」和「有些任务只盯一次」的区分。
任务筛选逻辑
提醒推送时执行的 SQL:
SELECT * FROM tasks
WHERE (task_date = :today
OR (recurring = 1 AND task_date IS NULL))
AND status = 'pending'
ORDER BY priority DESC, id ASC
两条规则取并集:
- 今天到期的单日任务(
task_date = 今天) - 持续性任务(
recurring = 1, task_date IS NULL)
两者都必须 status = 'pending'。标记完成或取消后,自然从查询结果中消失。
Cron 调度引擎
调度表达式:0 8,10,12,14,16,18,20,22 * * *
每天 8:00 到 22:00 每 2 小时触发一次,8:00 是早安简报(含天气+装修提醒+今日待办),其余时段是进度检查。
关键设计决策: Cron 每次执行都是全新的 Agent 会话,与用户的当前对话完全隔离。它不知道用户刚说了什么,只是机械地执行命令、读取数据库、输出文字。这种无状态设计避免了上下文泄漏和会话耦合。
数据流全链路
添加任务:
用户说”今天要做:修改VCU” → Hermes 识别关键词 → add_task(content, recurring=True) → SQL INSERT → 回复”已添加 ✅”
完成任务:
用户说”完成:13” → Hermes 提取 N=13 → complete_task(13) → SQL UPDATE status=‘completed’ → 该任务永久消失
定时推送:
时间到达触发点 → Cron 新建会话 → 执行 unified_reminder.py → 查询 SQLite → 组装消息 → print → stdout 被抓取 → 推送到微信
常见踩坑
1. 添加后没立刻收到提醒
添加操作和下次 cron 触发之间存在最长 2 小时的时间差。这不是 bug,是定时任务系统的正常延迟。
2. 旧任务成为幽灵待办
单日任务过了日期后不显示,但 status 仍是 pending。需要主动调用 complete_task() 清理。
3. 做完工作但任务还在
持续性任务(recurring=1)会每天出现直到显式标记完成。只做工作不调 complete_task() 是无法让任务消失的。
正确使用的三种任务模式
- 持续性工作任务:
task_date=NULL, recurring=1— 每天提醒直到完成 - 今天单次任务:
task_date=今天, recurring=0— 只在今天提醒 - 未来特定日期:
task_date=指定日期, recurring=0— 到那天再说
这个系统运行在 Hermes Agent 的 Cron 引擎上,全部代码不到 300 行 Python,但已经稳定运行了两周,持续管理着十几条装修和工作的并行任务。最简单的设计往往最可靠。