OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  技能包  ›  remindme:为 OpenClaw 提供的简易 Telegram 消息提醒工具

remindme:为 OpenClaw 提供的简易 Telegram 消息提醒工具

 
  chao ·  2026-02-23 02:45:27 · 3 次点击  · 0 条评论  

名称: remindme
描述: "⏰ 为 OpenClaw 提供的简易 Telegram 提醒功能。基于 cron,零依赖。"
标签: [cron, reminders, productivity, schedule, telegram, discord, slack, whatsapp, signal]
元数据:
openclaw:
summary: "Remind Me v2: 随处安排提醒。支持自然语言、原生 cron,零依赖。"
emoji: "bell"
user-invocable: true
command-dispatch: prompt


Remind Me v2

使用自然语言在任何频道设置提醒。无需配置,零依赖。

使用方法

/remindme 10分钟后喝水
/remindme 明天上午9点站会
/remindme 下周一晚上6点给妈妈打电话
/remindme 2小时后关烤箱
/remindme 30秒后检查部署
/remindme 每天上午9点站会
/remindme 每周五下午5点周度总结
/remindme 10分钟后喝水 on telegram
/remindme 明天上午9点站会 on discord
/remindme list
/remindme cancel <jobId>

代理指令

当用户触发 /remindme 时,判断其意图:

  • list → 调用 cron.list 并显示活跃的提醒任务。
  • cancel / delete / remove <jobId> → 调用 cron.remove 并传入该 jobId。
  • 其他情况 → 创建新提醒(按以下步骤)。

步骤 1:解析输入(结构化流程)

提取三要素:事项(消息内容)、时间(触发时间)、重复模式(一次性或重复)。

顺序遵循此决策树——匹配到第一个即停止:

第一层:模式匹配(适用于任何模型)

扫描输入,匹配以下模式。从上到下匹配,第一个匹配到的模式将决定 WHEN:

相对时长 — 查找 in <数字> <单位>
| 模式 | 时长 |
|---|---|
| in Ns, in N seconds, in N sec | N 秒 |
| in Nm, in N min, in N minutes | N 分钟 |
| in Nh, in N hours, in N hr | N 小时 |
| in Nd, in N days | N * 24 小时 |
| in Nw, in N weeks | N * 7 天 |

绝对时钟时间 — 查找 at <时间>
| 模式 | 含义 |
|---|---|
| at HH:MM, at H:MMam/pm | 今天该时间(若已过则为明天) |
| at Ham/pm, at HH | 今天该小时 |

指定日期 — 查找 tomorrow, next <星期几>, on <星期几>
| 模式 | 含义 |
|---|---|
| tomorrow | 下一个日历日,默认上午9点 |
| tonight | 今天晚上8点(若已过晚上8点则为当前时间+1小时) |
| next monday..sunday | 即将到来的该工作日,默认上午9点 |
| on <day> | 同 next <day> |

重复模式 — 查找 every <模式>
| 模式 | Cron/间隔 |
|---|---|
| every Nm/Nh/Nd | kind: "every", everyMs: N * unit_ms |
| every day at <time> | kind: "cron", expr: "M H * * *" |
| every <weekday> at <time> | kind: "cron", expr: "M H * * DOW" |
| every weekday at <time> | kind: "cron", expr: "M H * * 1-5" |
| every weekend at <time> | kind: "cron", expr: "M H * * 0,6" |
| every hour | kind: "every", everyMs: 3600000 |

单位换算表(用于 everyMs 和时长计算):
| 单位 | 毫秒 |
|---|---|
| 1 秒 | 1000 |
| 1 分钟 | 60000 |
| 1 小时 | 3600000 |
| 1 天 | 86400000 |
| 1 周 | 604800000 |

第二层:俚语与简写(常用短语)

如果第一层未匹配,检查以下短语:
| 短语 | 解析为 |
|---|---|
| in a bit, in a minute, shortly | 30 分钟 |
| in a while | 1 小时 |
| later, later today | 3 小时 |
| end of day, eod | 今天下午5点 |
| end of week, eow | 周五下午5点 |
| end of month, eom | 本月最后一天下午5点 |
| morning | 上午9点 |
| afternoon | 下午2点 |
| evening | 下午6点 |
| tonight | 晚上8点 |
| midnight | 次日凌晨12点 |
| noon | 中午12点 |

第三层:事件相关与节假日(需要 LLM 推理)

如果第 1-2 层均未匹配,输入可能引用了某个事件或节假日。请运用你的知识进行解析:

节假日解析 — 当用户说 "before/after/on <节假日>":
1. 识别节假日及其当前年份的固定日期
2. 应用任何偏移量:"圣诞节前3天" → 12月25日减3天 = 12月22日。
3. 如果该节假日今年已过,则使用下一年的日期。

常见固定日期节假日(参考表):
| 节假日 | 日期 |
|---|---|
| 元旦 | 1月1日 |
| 情人节 | 2月14日 |
| 圣帕特里克节 | 3月17日 |
| 愚人节 | 4月1日 |
| 美国独立日 | 7月4日 |
| 万圣节 | 10月31日 |
| 平安夜 | 12月24日 |
| 圣诞节 | 12月25日 |
| 新年前夜 | 12月31日 |

浮动节假日(每年不同——计算或查询):
- 感恩节(美国):11月的第四个星期四
- 复活节:每年不同(请根据当前年份运用你的知识)
- 母亲节(美国):5月的第二个星期日
- 父亲节(美国):6月的第三个星期日
- 劳动节(美国):9月的第一个星期一
- 阵亡将士纪念日(美国):5月的最后一个星期一

文化/宗教节日(如果被引用,请运用你的知识):
- 斋月、开斋节、古尔邦节、排灯节、光明节、农历新年等。
- 如果不确定确切日期,请向用户确认,而不是猜测。

事件相关模式:
| 模式 | 解析 |
|---|---|
| <事件> 前 N 天 | 事件日期 - N 天 |
| <事件> 后 N 天 | 事件日期 + N 天 |
| <事件> 前一天 | 事件日期 - 1 天 |
| <事件> 当周 | 事件所在周的周一,上午9点 |
| on <事件> | 事件日期,上午9点 |

第四层:模糊不清——询问,不要猜测

如果经过所有层后仍无法确定 WHEN:
- 询问用户以澄清。例如:"我无法确定具体时间。您希望我在什么时候提醒您?"
- 切勿静默选择默认时间。
- 切勿安排你不确定的提醒。

步骤 2:计算时间表

时区规则: 始终使用用户的本地时区(系统时区)。切勿默认使用 UTC。如果用户明确提及时区(例如 "at 9am EST"),则使用该时区。

一次性提醒 → 使用带用户本地时区偏移的 ISO 8601 时间戳。
- 如果计算出的时间在过去,则顺延到下一次发生的时间。

重复提醒(cron) → 使用 5 字段 cron 表达式,并将 tz 设置为用户的 IANA 时区。
- every day at 9amexpr: "0 9 * * *"
- every monday at 8:30amexpr: "30 8 * * 1"
- every weekday at 9amexpr: "0 9 * * 1-5"

重复提醒(间隔)kind: "every" 并设置 everyMs(单位为毫秒)。
- every 2 hourseveryMs: 7200000

验证检查点(在调用 cron.add 之前)

在继续步骤 3 之前,请验证:
1. 计算出的时间戳是未来的(不是过去的)。
2. 时长有意义(例如,"in 0 minutes" 应被拒绝)。
3. 对于重复提醒:cron 表达式或间隔是有效的(不能有 everyMs: 0)。
4. 向用户回显解析出的时间,以便在确认(步骤 5)中让用户发现错误。

步骤 3:检测交付频道

如果用户永远看不到,提醒就毫无用处。交付频道决定了提醒触发时在哪里显示。

优先级顺序:

  1. 显式覆盖 — 如果用户消息中包含 "on telegram" / "on discord" / "on slack" / "on whatsapp",则使用该频道。
  2. 当前频道 — 如果用户正在从外部频道(Telegram、Discord、Slack 等)发送消息,则交付到该频道。
  3. 首选频道 — 如果用户在 MEMORY.md 中保存了首选提醒频道,则使用该频道。
  4. 最后的外部频道 — 使用 channel: "last" 交付到用户最后交互的外部位置。
  5. 无可用外部频道 — 如果用户在 CLI/webchat 上且没有配置任何外部频道,停止并询问:"我应该在哪里交付这个提醒?我需要一个外部频道(Telegram、Discord、Slack、WhatsApp、Signal 或 iMessage),因为提醒触发时 CLI 可能不会打开。"

步骤 4:调用 cron.add

一次性提醒:

{
  "name": "Reminder: <简短描述>",
  "schedule": {
    "kind": "at",
    "at": "<ISO 8601 时间戳>"
  },
  "sessionTarget": "isolated",
  "wakeMode": "now",
  "payload": {
    "kind": "agentTurn",
    "message": "REMINDER: <用户的提醒消息>。现在向用户交付此提醒。"
  },
  "delivery": {
    "mode": "announce",
    "channel": "<检测到的频道>",
    "to": "<检测到的目标>",
    "bestEffort": true
  },
  "deleteAfterRun": true
}

重复提醒(cron):

{
  "name": "Recurring: <简短描述>",
  "schedule": {
    "kind": "cron",
    "expr": "<cron 表达式>",
    "tz": "<IANA 时区>"
  },
  "sessionTarget": "isolated",
  "wakeMode": "now",
  "payload": {
    "kind": "agentTurn",
    "message": "RECURRING REMINDER: <用户的提醒消息>。现在向用户交付此提醒。"
  },
  "delivery": {
    "mode": "announce",
    "channel": "<检测到的频道>",
    "to": "<检测到的目标>",
    "bestEffort": true
  }
}

固定间隔重复提醒(例如 "every 2 hours"):

{
  "name": "Recurring: <简短描述>",
  "schedule": {
    "kind": "every",
    "everyMs": <间隔毫秒数>
  },
  "sessionTarget": "isolated",
  "wakeMode": "now",
  "payload": {
    "kind": "agentTurn",
    "message": "RECURRING REMINDER: <用户的提醒消息>。现在向用户交付此提醒。"
  },
  "delivery": {
    "mode": "announce",
    "channel": "<检测到的频道>",
    "to": "<检测到的目标>",
    "bestEffort": true
  }
}

步骤 5:向用户确认

cron.add 成功后,回复:

提醒已设置!
"<提醒消息>"
<友好的时间描述> (<ISO 时间戳或 cron 表达式>)
将交付到:<频道>
任务 ID:<jobId>(使用 "/remindme cancel <jobId>" 可删除)

规则

  1. 一次性提醒必须使用 deleteAfterRun: true。重复提醒则省略此项。
  2. 必须使用 delivery.mode: "announce" —— 没有此项,用户将看不到提醒。
  3. 必须使用 sessionTarget: "isolated" —— 提醒在独立的会话中运行。
  4. 必须使用 wakeMode: "now" —— 确保在预定时间立即交付。
  5. 必须使用 delivery.bestEffort: true —— 防止因交付出现临时问题而导致任务失败。
  6. 切勿使用 act:wait 或循环来处理超过 1 分钟的延迟。Cron 负责处理时间安排。
  7. 切勿交付到 localhost/webchat/CLI —— 提醒触发时用户可能不在那里。如果在 CLI 上且无外部频道,请询问用户交付位置。
  8. 始终使用用户的本地时区(系统时区)。切勿默认使用 UTC。如果 MEMORY.md 中有时区覆盖,则使用该时区。
  9. 对于重复提醒,请勿设置 deleteAfterRun
  10. 始终返回 jobId,以便用户稍后取消。
  11. 如果用户说 "on telegram/discord/slack/etc",则用显式指定的频道覆盖自动检测的频道。

故障排除

  • 提醒未触发? → 使用 cron.list 检查。确认网关在预定时间正在运行。
  • 交付到了错误的聊天? → 使用显式的聊天/频道 ID,而不是 "last"
  • 旧任务太多? → 安装清理工具(参见 references/TEMPLATES.md)。
  • 重复任务持续延迟? → 连续失败后,cron 会应用指数退避(30s → 1m → 5m → 15m → 60m)。成功运行后,退避会重置。

参考

请参阅 references/TEMPLATES.md 获取可复用的模板和自动清理工具的设置。

3 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor