从零搭建AI待办系统:用Vikunja+OpenClaw实现7×24小时智能任务管理
你有没有这样的经历:待办列表越来越长,但真正完成的没几个?不是你不够努力,而是传统工具缺少一个能主动帮你执行的AI搭档。
手机备忘录记了一堆事,回头就忘了看。Trello看板建得很漂亮,但卡片越堆越多。不是你偷懒,是从"想到一件事"到"把它记下来并跟踪执行",中间的摩擦太大了。
这篇文章会带你从零搭建一套AI待办管理系统。用Vikunja(开源任务管理工具)做任务存储,用OpenClaw(开源AI助手平台)做智能交互。
搭完之后,你在Telegram或飞书里说一句"帮我记一下明天下午开会",系统就自动帮你创建任务。每天早上它会推送今日待办,快到期的任务还会主动提醒你。
为什么需要AI待办管理
传统任务管理工具有一个根本问题:只记录,不执行。
你在Todoist里建了50个任务,完成10个,剩下40个静静躺在那里。工具不会催你,不会帮你拆分,不会在合适的时候提醒你。时间一长,待办列表变成了"待办墓地"。
AI解决了这个问题中的执行摩擦。具体来说,它能在三个环节帮到你:
- 自然语言创建任务:不用打开App,说一句"周五前交报告"就行
- 自动检查逾期:AI定时扫描,发现快到期的任务主动提醒你
- 智能查询汇总:问一句"今天有什么事",直接给你整理好
Vikunja和OpenClaw的组合,恰好能覆盖这些场景。Vikunja提供稳定的任务管理后端,OpenClaw提供7×24在线的AI助手。两个都是开源项目,数据在自己服务器上,隐私有保障。
图1:系统整体架构——用户通过消息渠道与OpenClaw交互,OpenClaw调用Vikunja API管理任务
核心思路很简单:AI负责执行,你负责决策。AI帮你记事、提醒、查询,但哪些事重要、先做什么,由你来定。
部署Vikunja:搭建你的任务管理中心
Vikunja是用Go和Vue.js开发的开源任务管理工具,支持列表、看板、甘特图等多种视图。它提供完整的REST API,是我们后续AI集成的基础。
Docker Compose部署
推荐用Docker Compose一键部署。创建一个docker-compose.yml文件:
version: '3.9'
services:
vikunja:
restart: always
container_name: vikunja
image: vikunja/vikunja:latest
volumes:
# 数据持久化:数据库文件
- /data/vikunja/db:/db
# 数据持久化:附件文件
- /data/vikunja/files:/app/vikunja/files
ports:
- '3456:3456'
environment:
- VIKUNJA_SERVICE_TIMEZONE=Asia/Shanghai
启动服务:
# 创建数据目录
mkdir -p /data/vikunja/db /data/vikunja/files
# 启动容器
docker compose up -d
# 查看运行状态
docker compose ps
启动后访问 http://<你的服务器IP>:3456,首次使用需要注册一个管理员账号。
注册完成后,登录界面就能看到Vikunja的看板。先创建一个项目(比如"个人待办"),记下这个项目的ID——后面API调用会用到。
提示:Vikunja默认使用SQLite,轻量且零配置。如果生产环境需要更高性能,可以切换到MySQL或PostgreSQL,官方文档有详细说明。
API Token与接口验证
要让AI操作Vikunja,需要先创建一个API Token(访问令牌)。
创建步骤:
- 登录Vikunja,点击右上角头像进入Settings
- 找到"API Tokens"选项,点击"Create new token"
- 给Token起个名字(比如"openclaw"),权限保持默认即可
- 复制生成的Token,保存好
核心API端点:
操作方法端点 列出项目任务GET/api/v1/projects/{id}/tasks
创建任务POST/api/v1/projects/{id}/tasks
更新任务PUT/api/v1/tasks/{id}
删除任务DELETE/api/v1/tasks/{id}
获取任务详情GET/api/v1/tasks/{id}
用curl验证API是否连通:
# 设置环境变量(替换为你的实际值)
export VIKUNJA_URL="http://你的服务器IP:3456"
export VIKUNJA_TOKEN="你刚才复制的Token"
# 列出项目ID为1的所有任务
curl -s -H "Authorization: Bearer ${VIKUNJA_TOKEN}" \
"${VIKUNJA_URL}/api/v1/projects/1/tasks" | jq '.'
如果返回了任务列表(新项目可能是空数组[]),说明连接正常。试一下创建任务:
# 创建一个测试任务
curl -s -X POST "${VIKUNJA_URL}/api/v1/projects/1/tasks" \
-H "Authorization: Bearer ${VIKUNJA_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"title": "测试任务",
"description": "验证API连通性",
"due_date": "2026-04-10T00:00:00Z",
"priority": 3
}' | jq '.id'
踩坑提醒:创建任务时,Vikunja要求
namespace_id字段。如果不传这个字段,API会返回3010错误。使用/projects/{id}/tasks端点创建任务时,Vikunja会自动关联namespace。但如果遇到问题,可以在请求body中手动加上"namespace_id": 1。
安装OpenClaw:你的7×24 AI助手
OpenClaw是一个开源的AI助手平台,前身是Clawdbot。它可以在本地运行一个AI Gateway(网关),连接Telegram、飞书、Discord等20多个消息渠道。这样你就能随时随地用自然语言和AI对话。
安装和初始化
OpenClaw需要Node.js 24(或22.16+)环境。安装过程很简单:
# 全局安装OpenClaw
npm install -g openclaw@latest
# 运行初始化向导
openclaw onboard --install-daemon
onboard命令会引导你完成四项配置:
- Gateway:本地控制中心,负责接收消息和调度AI
- Workspace:工作空间目录,存放配置和Skills
- Channel:消息渠道,比如Telegram Bot或飞书应用
- LLM Provider:AI模型提供商,支持OpenAI、Anthropic等
连接消息渠道
以Telegram为例,这是最常用的消息渠道:
- 在Telegram中搜索
@BotFather,创建一个新Bot - 获取Bot Token
- 在OpenClaw配置中添加Telegram渠道:
# 添加Telegram渠道
openclaw channels add telegram --token "你的Bot Token"
添加完成后,在Telegram中给你的Bot发一条消息。如果一切正常,Bot会回复你。至此,你已经有一个可以通过Telegram对话的AI助手了。
理解Tools和Skills架构
OpenClaw有两个核心概念需要理解:
Tools(工具) 是AI的能力器官。比如exec工具让AI能执行命令行,read和write工具让AI能读写文件,cron工具让AI能设置定时任务。OpenClaw内置了26种工具。
Skills(技能) 是工具的使用说明书。通过编写SKILL.md文件,你告诉AI在什么场景下、用什么工具、执行什么操作。可以理解为Tools是手和脚,Skills是教AI怎么用手脚完成具体任务。
图2:OpenClaw架构——Gateway作为控制中心连接各消息渠道,Skills指导AI使用Tools完成任务
Gateway是整个系统的守护进程,确保AI助手持续在线。它通过systemd(Linux)或launchd(macOS)注册为系统服务,开机自启动。
开发Vikunja Skill:教AI管理待办
有两种方式让OpenClaw学会操作Vikunja:安装现成Skill,或自己开发。先看快速方案。
快速方案:安装现成Skill
社区已经有人开发了Vikunja的Skill,一行命令就能装好:
# 安装Vikunja任务管理Skill
openclaw skills install nickian/vikunja-tasks
安装后,配置环境变量让Skill知道你的Vikunja在哪:
# 在OpenClaw配置中添加环境变量
# 方式一:编辑 ~/.openclaw/openclaw.json
# 方式二:在Shell中设置
export VIKUNJA_URL="http://你的服务器IP:3456"
export VIKUNJA_TOKEN="你的API Token"
然后直接在Telegram里跟Bot说:
"帮我创建一个任务:周五前交季度报告"
Bot就会调用Vikunja API帮你创建任务。你还可以说"今天有什么待办"、"把XX任务标记完成"来查看和操作任务。
进阶方案:自定义Skill开发
现成的Skill能满足基本需求,但如果你想做更多定制(比如特定的任务分类规则、自动打标签等),就需要自己写Skill。
SKILL.md文件结构
每个Skill就是一个SKILL.md文件,分两部分:Front Matter(元数据)和正文(指令)。
先创建Skill目录和文件:
mkdir -p ~/.openclaw/skills/vikunja-manager
然后创建~/.openclaw/skills/vikunja-manager/SKILL.md:
---
name: vikunja-manager
description: 通过自然语言管理Vikunja待办任务,支持创建、查询、完成、删除操作
requires:
- exec
os: []
---
# Vikunja 任务管理技能
你可以通过此技能管理我的Vikunja待办任务。以下是你需要遵守的规则。
## 环境变量
- VIKUNJA_URL: Vikunja实例地址(已配置)
- VIKUNJA_TOKEN: API Token(已配置)
- VIKUNJA_PROJECT_ID: 默认项目ID(默认为1)
## 操作指南
### 创建任务
当用户要求添加、创建、记录任务时:
1. 从用户的话中提取任务标题
2. 如果用户提到了截止日期,转换为ISO 8601格式
3. 如果用户提到了优先级,映射为数字(1=紧急,2=高,3=中,4=低,5=最低)
curl -s -X POST "${VIKUNJA_URL}/api/v1/projects/${VIKUNJA_PROJECT_ID}/tasks" \
-H "Authorization: Bearer ${VIKUNJA_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"title": "用户描述的任务标题",
"description": "补充说明(如果有)",
"due_date": "截止日期(如果有,ISO 8601格式)",
"priority": 优先级数字
}'
创建成功后,回复用户:"已创建任务:{title}"。
### 查看待办任务
当用户询问今天有什么任务、待办列表、还没做完的事时:
获取所有未完成的任务
curl -s -H "Authorization: Bearer ${VIKUNJA_TOKEN}" \
"${VIKUNJA_URL}/api/v1/projects/${VIKUNJA_PROJECT_ID}/tasks" | \
jq '[.[] | select(.done == false)]'
将结果整理为简洁的列表格式回复用户,按截止日期排序。格式:
- [紧急] 任务标题 - 截止:MM-DD
- [普通] 任务标题
### 标记任务完成
当用户说"完成XXX"、"XXX做完了"时:
1. 先搜索任务列表,找到匹配的任务ID
2. 调用API标记完成
第一步:搜索任务
curl -s -H "Authorization: Bearer ${VIKUNJA_TOKEN}" \
"${VIKUNJA_URL}/api/v1/projects/${VIKUNJA_PROJECT_ID}/tasks?search=关键词" | \
jq '[.[] | select(.done == false) | {id, title}]'
第二步:标记完成(用上一步获取的ID)
curl -s -X PUT "${VIKUNJA_URL}/api/v1/tasks/{TASK_ID}" \
-H "Authorization: Bearer ${VIKUNJA_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"done": true}'
### 检查逾期任务
当用户询问逾期任务,或需要定时检查时:
curl -s -H "Authorization: Bearer ${VIKUNJA_TOKEN}" \
"${VIKUNJA_URL}/api/v1/projects/${VIKUNJA_PROJECT_ID}/tasks" | \
jq '[.[] | select(.done == false and .due_date != null and (.due_date | sub("\\.[0-9]+Z$"; "Z") | fromdateiso8601) < now)]'
逾期任务用醒目的格式提醒用户,比如:"以下任务已逾期!"。
### 删除任务
当用户明确要求删除某个任务时:
先搜索确认,再删除
curl -s -X DELETE "${VIKUNJA_URL}/api/v1/tasks/{TASK_ID}" \
-H "Authorization: Bearer ${VIKUNJA_TOKEN}"
删除前务必和用户确认。
这个Skill定义了四个核心操作:创建、查询、完成、删除。每个操作都有明确的触发条件和执行步骤。
图3:用户输入自然语言后,OpenClaw解析意图、匹配Skill规则、调用API执行、返回友好结果的完整链路
调试技巧:开发Skill时,建议先用强模型(如Claude Opus)测试,因为它对复杂指令的理解更准确。流程跑通后,可以切换到更便宜的模型来执行日常操作。在OpenClaw的配置文件中可以针对不同Skill设置不同的模型。
namespace_id的处理:前面提到过,Vikunja创建任务时有时需要namespace_id。在Skill中可以加入一个预检查步骤:先查询项目的namespace信息,再创建任务。这样就不会因为缺少字段而报错。
自动化:让AI主动为你工作
手动让AI帮你记事只是第一步。真正的效率提升来自自动化——让AI主动帮你检查任务、推送提醒。
OpenClaw提供了两种自动化机制:Cron(定时任务) 和 Heartbeat(心跳)。
图4:Cron每日回顾和Heartbeat实时检查两条时间线协作,确保任务不被遗忘
Cron定时任务:每日回顾
Cron适合做定时、周期性的任务。比如每天早上8点推送今日待办,每天晚上9点半回顾未完成任务。
在OpenClaw中配置Cron任务:
{
"cron": [
{
"name": "morning-briefing",
"schedule": "0 8 * * *",
"prompt": "查看Vikunja中今天到期的任务和已逾期的任务,整理成简洁的晨报推送给用户。格式:今日待办N项,逾期M项,逐条列出。"
},
{
"name": "evening-review",
"schedule": "30 21 * * *",
"prompt": "检查Vikunja中所有未完成的任务,列出清单推送给用户。对逾期未完成的任务询问用户:推迟、归档还是放弃?确保每个任务都有归宿。"
}
]
}
每天早上8点,AI会自动查看你的Vikunja,整理出今日待办和逾期任务,通过Telegram或飞书推送给你。晚上9点半,它会检查所有未关闭的任务,请你做决定——推迟、归档还是放弃。
Heartbeat心跳:实时检查
Heartbeat是OpenClaw的独特机制。它每隔固定时间(比如30分钟)触发一次,适合做轻量级的实时检查。
配置Heartbeat,检查即将到期的任务:
{
"heartbeat": {
"interval_minutes": 30,
"prompt": "检查Vikunja中未来2小时内到期的未完成任务。如果有,推送提醒给用户:'以下任务即将到期:{任务列表}'。如果没有即将到期的任务,不做任何操作,静默返回。"
}
}
Heartbeat的关键设计是静默返回:没有需要提醒的任务时,AI什么都不说,不打扰用户。只有真正有事时才会推送消息。
双重提醒的设计思路
为什么用两套机制,而不是只用一个?
- Cron负责"重"检查:固定时间、全面扫描、需要用户决策
- Heartbeat负责"轻"检查:高频触发、只看紧急事项、被动提醒
两者搭配,形成完整的任务跟踪闭环。每天两次"重"检查确保任务不腐烂,30分钟一次"轻"检查确保不遗漏紧急事项。
最佳实践与避坑指南
系统搭好之后,用得好不好取决于几个关键原则。
AI边界:执行归AI,决策归你
AI擅长做确定性的事:记任务、查列表、发提醒。但优先级设定和价值判断不应外包给AI。
"今天应该先做哪个任务"——这需要你根据自己的目标来判断。AI可以告诉你"任务A今天到期,任务B明天到期",但不应该替你决定先做哪个。
好的做法是让AI提供信息,由你做决定:
你:今天有什么事?
AI:今天有3个任务:
[紧急] 提交季度报告 - 截止:今天
[普通] 预约下周会议 - 截止:明天
[低] 整理桌面 - 无截止日期
你:先做报告,会议推迟到下周。
AI:好的,已把"预约下周会议"截止日期推迟到下周一。
强制闭环机制
任务管理最大的敌人不是"忘记做",而是"做了但没关掉"。半完成的任务堆积在列表里,造成心理负担。
应对方法是强制闭环:每个任务最终必须达到以下状态之一:
- 完成:事情做完了
- 推迟:确实现在做不了,推迟到明确的时间
- 归档:事情已经不相关了
- 放弃:决定不做了,坦然接受
晚间回顾的Cron任务就是为了实现这个闭环。每天晚上AI帮你过一遍未关闭的任务,逐个确认去留。
模型选择策略
AI模型的调用成本差异很大。一个实用的策略:
- 调试阶段用强模型(Claude Opus、GPT-4),因为需要理解复杂的Skill指令
- 日常执行用便宜模型(Claude Haiku、GPT-4o-mini),因为流程已经固化
在OpenClaw中可以为不同场景配置不同模型:
{
"models": {
"default": "claude-haiku",
"cron": "claude-haiku",
"interactive": "claude-sonnet"
}
}
安全注意事项
最后几点安全建议:
- API Token最小权限:Vikunja的Token只给必要的权限,不要用管理员Token
- exec工具开启审批:在OpenClaw配置中,让exec工具执行命令前需要你确认
- Skill白名单管理:只加载你信任的Skill,不要随意安装来历不明的Skill
- 网络隔离:Vikunja如果部署在内网,用反向代理暴露API即可,不要直接开放端口

图5:AI负责执行确定性操作,人类专注于决策和优先级判断
总结与展望
这篇文章带你搭建了一套完整的AI待办管理系统。回顾一下关键步骤:
- Vikunja作为任务管理后端,Docker一键部署,REST API完备
- OpenClaw作为AI助手,连接消息渠道,Skills扩展能力
- 自定义Skill让AI学会操作Vikunja,用自然语言管理任务
- Cron + Heartbeat双重自动化,确保任务不遗漏不腐烂
方案的优点:
- 开源免费,数据自托管,隐私有保障
- 7×24在线,随时随地通过手机管理待办
- 高度可定制,Skill可以根据自己的需求调整
方案的局限:
- 初始搭建需要一定的技术基础(Docker、命令行)
- 依赖AI模型,复杂操作偶尔可能出错
- 目前更适合个人使用,团队协作需要额外配置
未来可以做的扩展:
- 团队协作:Vikunja本身支持团队功能,结合OpenClaw的多Agent协作,可以实现任务自动分配
- 多工具集成:把日历、邮件、GitHub等工具也接入OpenClaw,形成统一的工作流
- 更智能的提醒:根据你的习惯调整提醒策略,比如工作日和周末不同的推送节奏
如果你也在用各种工具管理待办但总觉得少了点什么,不妨试试这套方案。花一个下午搭好,之后每天都能省下不少精力。