两小时统一提醒系统:从零到一实现 Hermes 自动化任务管理

深入剖析 Hermes Agent 的定时提醒系统架构——从 SQLite 数据层到 Cron 调度引擎的完整数据流设计,附带常见踩坑与修复方案。

目录 系统架构总览数据库设计任务筛选逻辑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,但已经稳定运行了两周,持续管理着十几条装修和工作的并行任务。最简单的设计往往最可靠。

继续阅读