名称: 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
使用自然语言在任何频道设置提醒。无需配置,零依赖。
/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 时,判断其意图:
cron.list 并显示活跃的提醒任务。<jobId> → 调用 cron.remove 并传入该 jobId。提取三要素:事项(消息内容)、时间(触发时间)、重复模式(一次性或重复)。
按顺序遵循此决策树——匹配到第一个即停止:
扫描输入,匹配以下模式。从上到下匹配,第一个匹配到的模式将决定 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点 |
如果第 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:
- 询问用户以澄清。例如:"我无法确定具体时间。您希望我在什么时候提醒您?"
- 切勿静默选择默认时间。
- 切勿安排你不确定的提醒。
时区规则: 始终使用用户的本地时区(系统时区)。切勿默认使用 UTC。如果用户明确提及时区(例如 "at 9am EST"),则使用该时区。
一次性提醒 → 使用带用户本地时区偏移的 ISO 8601 时间戳。
- 如果计算出的时间在过去,则顺延到下一次发生的时间。
重复提醒(cron) → 使用 5 字段 cron 表达式,并将 tz 设置为用户的 IANA 时区。
- every day at 9am → expr: "0 9 * * *"
- every monday at 8:30am → expr: "30 8 * * 1"
- every weekday at 9am → expr: "0 9 * * 1-5"
重复提醒(间隔) → kind: "every" 并设置 everyMs(单位为毫秒)。
- every 2 hours → everyMs: 7200000
在继续步骤 3 之前,请验证:
1. 计算出的时间戳是未来的(不是过去的)。
2. 时长有意义(例如,"in 0 minutes" 应被拒绝)。
3. 对于重复提醒:cron 表达式或间隔是有效的(不能有 everyMs: 0)。
4. 向用户回显解析出的时间,以便在确认(步骤 5)中让用户发现错误。
如果用户永远看不到,提醒就毫无用处。交付频道决定了提醒触发时在哪里显示。
优先级顺序:
channel: "last" 交付到用户最后交互的外部位置。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
}
}
cron.add 成功后,回复:
提醒已设置!
"<提醒消息>"
<友好的时间描述> (<ISO 时间戳或 cron 表达式>)
将交付到:<频道>
任务 ID:<jobId>(使用 "/remindme cancel <jobId>" 可删除)
deleteAfterRun: true。重复提醒则省略此项。delivery.mode: "announce" —— 没有此项,用户将看不到提醒。sessionTarget: "isolated" —— 提醒在独立的会话中运行。wakeMode: "now" —— 确保在预定时间立即交付。delivery.bestEffort: true —— 防止因交付出现临时问题而导致任务失败。act:wait 或循环来处理超过 1 分钟的延迟。Cron 负责处理时间安排。deleteAfterRun。cron.list 检查。确认网关在预定时间正在运行。"last"。references/TEMPLATES.md)。请参阅 references/TEMPLATES.md 获取可复用的模板和自动清理工具的设置。