前言
定时提醒是个人 AI 助手最实用的功能之一。想象一下,在聊天窗口随口说一句"明天早上9点提醒我开会",到了时间就真的收到通知——这正是我们这篇教程要实现的。
本教程将带你开发一个功能完整的提醒 Skill,包含自然语言时间解析、周期提醒和持久化存储。
功能规划
我们的提醒 Skill 需要具备以下能力:
| 功能 | 说明 | 优先级 |
|---|---|---|
| 设置提醒 | 用自然语言创建一次性提醒 | 必须 |
| 周期提醒 | 每天、每周、每月重复的提醒 | 必须 |
| 查看提醒 | 列出所有待触发的提醒 | 必须 |
| 删除提醒 | 取消指定提醒 | 必须 |
| 持久化 | 重启后提醒不丢失 | 必须 |
| 多渠道推送 | 在设置提醒的频道中推送通知 | 推荐 |
MCP工具配置
提醒功能需要文件读写和定时调度能力。在 ~/.config/openclaw/openclaw.json5 中配置 MCP 工具:
{
mcp: {
servers: {
"filesystem": {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-filesystem",
"--allow-read", "--allow-write",
"~/.openclaw/data/reminders/"],
},
"scheduler": {
command: "npx",
args: ["-y", "@openclaw-mcp/scheduler"],
}
}
}
}
创建提醒数据目录:
mkdir -p ~/.openclaw/data/reminders/
编写SKILL.md
在 ~/.openclaw/skills/ 目录下创建 reminder.SKILL.md:
---
name: reminder
version: 1.0.0
description: 定时提醒技能,支持自然语言设置提醒、周期任务和持久化存储
triggers:
- 提醒
- remind
- 闹钟
- alarm
- 定时
- 待办
- 记得
- 别忘了
- 到时候
mcp_tools:
- filesystem
- scheduler
---
# 定时提醒技能
## Description
这是一个定时提醒技能,让用户可以通过自然语言设置、管理提醒事项。
提醒到期时,自动在用户所在的频道发送通知。
## Core Behavior
### 设置提醒
当用户想设置提醒时:
1. **解析时间**:从用户消息中提取时间信息,支持以下格式:
- 绝对时间:"明天早上9点"、"3月15日下午3点"、"2026-03-20 14:00"
- 相对时间:"5分钟后"、"1小时后"、"3天后"
- 自然语言:"今天晚上"、"这周五"、"下周一上午"
2. **提取内容**:识别提醒内容,即用户想被提醒做什么。
3. **确认信息**:向用户确认提醒的时间和内容。
4. **保存提醒**:使用 filesystem 工具将提醒保存到
`~/.openclaw/data/reminders/reminders.json`。
5. **注册调度**:使用 scheduler 工具注册定时任务。
### 查看提醒
当用户要查看提醒列表时,读取 reminders.json 并按时间排序展示。
### 删除提醒
当用户要取消提醒时,根据编号或内容匹配找到提醒并删除。
### 触发提醒
当提醒时间到达时,scheduler 会回调 OpenClaw,在对应频道发送提醒消息。
## Data Schema
提醒数据使用 JSON 格式存储:
```json
{
"reminders": [
{
"id": "rem_20260328_001",
"content": "参加下午的产品会议",
"triggerTime": "2026-03-28T14:00:00+08:00",
"repeat": null,
"channelType": "telegram",
"channelId": "12345678",
"userId": "user_001",
"createdAt": "2026-03-28T09:00:00+08:00",
"status": "pending"
}
]
}
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 唯一标识符,格式 rem_YYYYMMDD_NNN |
| content | string | 提醒内容 |
| triggerTime | string | 触发时间,ISO 8601 格式 |
| repeat | object/null | 重复规则(见下文) |
| channelType | string | 来源频道类型 |
| channelId | string | 来源频道/用户 ID |
| userId | string | 设置提醒的用户 |
| createdAt | string | 创建时间 |
| status | string | 状态:pending/triggered/cancelled |
重复规则
{
"repeat": {
"type": "daily",
"interval": 1,
"endDate": "2026-12-31T23:59:59+08:00"
}
}
可用的 type 值:
daily:每天重复weekly:每周重复(可指定星期几)monthly:每月重复(可指定日期)cron:自定义 cron 表达式
Output Format
Reminder Set Successfully
✅ 提醒已设置!
📋 内容:{提醒内容}
⏰ 时间:{YYYY年MM月DD日 HH:mm}
🔁 重复:{重复规则,无则显示"一次性"}
🆔 编号:{ID}
到时候我会在这里通知你。
View Reminder List
📝 你的提醒列表:
1. ⏰ {时间1} - {内容1} [编号: {ID1}]
2. ⏰ {时间2} - {内容2} [编号: {ID2}]
3. 🔁 {时间3} - {内容3}(每天重复)[编号: {ID3}]
共 {N} 个待触发提醒。
输入"取消提醒 {编号}"可删除指定提醒。
Reminder Triggered Notification
🔔 提醒时间到!
📋 {提醒内容}
⏰ 当前时间:{HH:mm}
---
这是你在 {设置时间} 设置的提醒。
Reminder Deleted Successfully
❌ 已取消提醒:{提醒内容}
Error Handling
- 如果无法解析时间,请用户用更明确的方式表述
- 如果时间已经过去,提醒用户设置的时间已过期
- 如果 reminders.json 不存在,自动创建空文件
- 如果 scheduler 不可用,告知用户提醒功能暂时不可用
Example Interactions
用户:明天早上8点提醒我买咖啡 助手:✅ 提醒已设置! 📋 内容:买咖啡 ⏰ 时间:2026年03月29日 08:00 🔁 重复:一次性 🆔 编号:rem_20260328_001
用户:每周五下午5点提醒我写周报 助手:✅ 提醒已设置! 📋 内容:写周报 ⏰ 时间:每周五 17:00(下次:2026年03月28日) 🔁 重复:每周五 🆔 编号:rem_20260328_002
用户:看看我有哪些提醒 助手:📝 你的提醒列表: 1. ⏰ 03/29 08:00 - 买咖啡 [编号: rem_20260328_001] 2. 🔁 每周五 17:00 - 写周报 [编号: rem_20260328_002] 共 2 个待触发提醒。
用户:取消买咖啡的提醒 助手:❌ 已取消提醒:买咖啡
## 持久化机制
### 存储策略
提醒数据保存在 `~/.openclaw/data/reminders/reminders.json` 中。每次操作(创建、删除、修改)后立即写入文件。
### 重启后恢复
当 OpenClaw 重启时,提醒技能需要:
1. 从 reminders.json 中读取所有 `pending` 状态的提醒
2. 重新向 scheduler 注册定时任务
3. 清理已过期但未触发的提醒(标记为 `missed`,在下次交互时通知用户)
## 时区处理
时间解析和存储必须考虑时区问题:
```markdown
## Timezone Rules
- 默认使用用户所在频道配置的时区
- 如果未配置时区,默认使用 Asia/Shanghai (UTC+8)
- 所有存储时间使用 ISO 8601 带时区格式
- 显示时间使用用户本地时区
测试清单
开发完成后,按以下清单进行测试:
# 1. 重启以加载技能
openclaw restart
# 2. 确认技能已加载
openclaw skill list
然后在聊天中逐项测试:
- [ ] 设置一个 1 分钟后的提醒,验证是否准时触发
- [ ] 设置一个绝对时间的提醒
- [ ] 设置一个周期提醒
- [ ] 查看提醒列表
- [ ] 删除一个提醒
- [ ] 重启 OpenClaw,检查提醒是否恢复
总结
定时提醒 Skill 是一个综合性项目,涉及自然语言时间解析、数据持久化、定时任务调度和多渠道通知推送。掌握了这个 Skill 的开发思路,你就能进一步开发更复杂的自动化工作流技能。