基于OpenClaw与CalDAV协议构建AI日程管理智能体
1. 项目概述:当AI智能体遇上你的日程管理
最近在折腾一个挺有意思的自动化场景:让AI智能体帮我自动管理苹果日历。听起来是不是有点科幻?其实核心就是利用一个叫OpenClaw的开源AI智能体框架,让它作为我的“数字助理”,去和苹果日历的API打交道,实现任务的自动添加和智能提醒。这不仅仅是简单的“定时发送请求”,而是让AI理解我的自然语言指令,比如“明天下午三点和客户开会,记得提前半小时提醒我”,然后自动在日历里创建好事件,并设置好提醒。对于我这种日程繁杂、又希望一切井井有条的人来说,这简直是生产力神器。
OpenClaw本身是一个功能强大的AI智能体(Agent)框架,它允许你通过配置“技能”(Skill)来赋予AI执行特定任务的能力。而苹果日历(通过iCloud)提供了完善的CalDAV协议接口。这个项目的核心,就是为OpenClaw开发或配置一个能与CalDAV服务通信的Skill,打通从自然语言指令到日历事件创建、再到提醒触发的完整链路。整个过程涉及本地AI模型部署、网络服务配置、API鉴权等多个环节,虽然有些技术细节,但一旦跑通,带来的自动化体验是革命性的。
2. 核心思路与方案选型
要实现这个目标,有几个关键的技术决策点。首先,我们需要一个“大脑”来理解指令,其次需要一个“执行器”去操作日历,最后还需要一个可靠的“通信管道”把它们连接起来。
2.1 为什么选择OpenClaw作为核心框架?
市面上AI智能体框架不少,比如LangChain、AutoGPT等。我选择OpenClaw主要基于几个实际考量:
- 轻量与模块化:OpenClaw的设计相对轻量,核心是技能(Skill)和工具(Tool)的组装。对于“操作日历API”这种单一但需要精准执行的任务,它的架构很清晰,不需要引入过于复杂的工作流引擎。
- 本地化部署友好:OpenClaw可以很好地与本地部署的大语言模型(如通过Ollama运行的模型)集成。这意味着我的日程数据完全在本地处理,无需上传到第三方AI服务,隐私和安全有保障。这对于处理包含会议主题、参会人甚至可能涉及商业机密的日历信息至关重要。
- 技能生态与扩展性:虽然OpenClaw的官方技能库可能不如一些明星项目丰富,但其技能开发模式比较直接。对于操作标准协议(如CalDAV)的任务,自己开发一个专用技能的复杂度是可控的。而且,一旦这个技能开发完成,它可以很容易地被复用到其他需要日程管理的自动化场景中。
2.2 与苹果日历交互的技术路径分析
苹果日历本身没有官方提供的、像Google Calendar那样直接的REST API。通常,与苹果日历(iCloud日历)交互,主流且稳定的方式是使用其支持的CalDAV协议。CalDAV是一种基于WebDAV扩展的日历数据访问协议,是行业标准。
因此,我们的技术路径就很明确了:
- 在OpenClaw中创建一个“Calendar Skill”:这个技能的核心是封装对CalDAV服务器的操作。
- 寻找或开发一个可靠的CalDAV客户端库:在Python生态中,
caldav库是一个成熟的选择。它封装了与CalDAV服务器通信的细节,提供了创建、查询、更新、删除日历事件等高级接口。 - 处理身份认证:需要获取iCloud的App专用密码(因为开启了两步验证的账户无法直接使用账户密码),并使用该密码通过CalDAV库进行认证。
- 设计指令解析与执行逻辑:让OpenClaw的大模型理解“明天下午三点开会”这样的自然语言,并从中提取出事件标题、开始时间、结束时间、提醒规则等结构化数据,然后调用CalDAV客户端库执行创建操作。
注意:直接使用iCloud账户密码进行CalDAV认证可能会失败,尤其是开启了双重认证的账户。必须在苹果账户的安全设置中生成一个“App专用密码”用于此类第三方应用登录。
2.3 整体架构设计
最终的方案架构图在脑中清晰起来:
用户自然语言指令 -> OpenClaw Agent -> (LLM理解与规划) -> 调用 Calendar Skill -> (参数提取与格式化) -> CalDAV Client -> iCloud CalDAV Server -> 苹果日历App/设备收到事件与提醒这个链条中,OpenClaw Agent负责总控和对话,Calendar Skill是具体的执行模块,CalDAV Client是底层通信工具。我们需要让OpenClaw学会在合适的时机调用这个Skill。
3. 环境准备与核心组件部署
动手之前,得把“舞台”搭好。这个项目对运行环境有一定要求,建议在Linux或macOS系统上进行,Windows下通过WSL2也能获得较好体验。
3.1 基础环境搭建
首先确保系统有Python 3.10或更高版本。我强烈建议使用虚拟环境来管理依赖,避免污染系统环境。
# 创建项目目录并进入 mkdir openclaw-calendar-sync && cd openclaw-calendar-sync # 创建Python虚拟环境 python3 -m venv venv # 激活虚拟环境 (Linux/macOS) source venv/bin/activate # 激活虚拟环境 (Windows PowerShell) .\venv\Scripts\Activate.ps13.2 部署本地大语言模型(Ollama)
OpenClaw需要一个大语言模型作为推理核心。为了隐私和速度,我们在本地用Ollama来运行一个轻量级但能力不错的模型。
- 安装Ollama:访问Ollama官网,根据你的操作系统下载并安装。安装后,Ollama服务会自动在后台运行。
- 拉取模型:打开终端,运行以下命令拉取一个适合的模型。对于任务解析,不需要追求最大的参数规模,追求响应速度和指令跟随能力更重要。我推荐使用
qwen2.5:7b或llama3.2:3b,它们在准确性和速度上取得了很好的平衡。ollama pull qwen2.5:7b - 验证模型:运行
ollama run qwen2.5:7b并输入简单问题,确认模型能正常响应。
3.3 安装与配置OpenClaw
OpenClaw的安装可以通过pip直接进行。但需要注意,由于其迭代较快,有时直接安装最新版可能会遇到依赖冲突。我找到一个相对稳定的版本组合。
# 安装OpenClaw核心包 pip install openclaw # 安装我们即将用到的CalDAV库 pip install caldav安装完成后,你需要对OpenClaw进行基础配置。通常,配置文件是一个YAML文件(例如config.yaml),需要指定使用的模型端点。因为我们用Ollama本地服务,所以模型端点通常是http://localhost:11434。
一个最简化的配置示例如下:
# config.yaml model: provider: "ollama" # 指定使用Ollama base_url: "http://localhost:11434" # Ollama服务地址 model: "qwen2.5:7b" # 使用的具体模型名称3.4 获取iCloud CalDAV配置信息
这是最关键也最容易出错的一步。你需要从iCloud获取连接CalDAV服务所需的信息。
生成App专用密码:
- 登录苹果ID账户管理页面。
- 在“安全”部分,找到“App专用密码”。
- 生成一个新密码,并为其命名,例如“OpenClaw-Calendar”。务必立即复制并妥善保存这个密码,因为它只显示一次。
查找你的CalDAV服务器地址和日历主路径:
- 对于iCloud,CalDAV服务器地址通常是:
https://caldav.icloud.com - 你的日历主路径(principal URL)通常是:
https://caldav.icloud.com/123456789/principal/,其中123456789是你的iCloud账户唯一数字标识。 - 如何找到这个路径?一个实用的方法是使用任何支持CalDAV的客户端(如macOS的“日历”App在添加CalDAV账户时)进行调试,或者使用
caldav库写一个简单的测试脚本去发现。
- 对于iCloud,CalDAV服务器地址通常是:
4. 开发OpenClaw日历技能(Calendar Skill)
现在进入核心环节——为OpenClaw编写一个能够操作日历的技能。在OpenClaw的架构里,Skill是一个独立的模块,它声明自己能处理什么任务,并在被Agent调用时执行具体的操作。
4.1 技能结构与定义
创建一个Python文件,例如calendar_skill.py。一个Skill通常包含以下几个部分:
- 技能描述:告诉OpenClaw这个技能是干什么的,以及如何调用它。
- 输入参数定义:明确技能需要哪些信息才能工作。
- 执行函数:包含具体的业务逻辑代码。
首先,我们定义技能的基本信息和参数。我们需要让AI知道,要创建一个日历事件,至少需要事件标题、开始时间和结束时间。
# calendar_skill.py from openclaw.skills import BaseSkill from datetime import datetime import caldav from icalendar import Calendar, Event import pytz class CalendarSkill(BaseSkill): """一个用于管理苹果日历(iCloud)的技能,可以添加事件和设置提醒。""" name = "calendar_manager" description = "在苹果日历中创建新的事件,并为其设置提醒。" # 定义技能所需的输入参数 args = { "title": { "type": "string", "description": "日历事件的标题或名称,例如:'团队周会'", "required": True }, "start_time": { "type": "string", "description": "事件的开始时间,格式应为'YYYY-MM-DD HH:MM'或'YYYY-MM-DDTHH:MM:SS',例如:'2024-01-15 14:30'", "required": True }, "end_time": { "type": "string", "description": "事件的结束时间,格式同上。", "required": True }, "description": { "type": "string", "description": "事件的详细描述或备注,可选。", "required": False }, "reminder_minutes_before": { "type": "integer", "description": "在事件开始前多少分钟发送提醒,例如:15 表示提前15分钟提醒。默认为10分钟。", "required": False, "default": 10 } }4.2 实现CalDAV客户端与事件创建逻辑
接下来,在技能的execute方法中,我们要实现连接iCloud、创建日历事件的核心逻辑。这里会用到之前安装的caldav库。
def execute(self, **kwargs): """执行技能:在默认日历中创建新事件。""" # 从传入的参数中获取值 title = kwargs.get('title') start_time_str = kwargs.get('start_time') end_time_str = kwargs.get('end_time') description = kwargs.get('description', '') reminder_minutes = kwargs.get('reminder_minutes_before', 10) # 1. 解析时间字符串 # 这里需要处理多种可能的时间格式,增加鲁棒性 time_formats = ['%Y-%m-%d %H:%M', '%Y-%m-%dT%H:%M:%S', '%Y/%m/%d %H:%M'] start_dt = end_dt = None for fmt in time_formats: try: start_dt = datetime.strptime(start_time_str, fmt) end_dt = datetime.strptime(end_time_str, fmt) break except ValueError: continue if not start_dt or not end_dt: return {"status": "error", "message": f"无法解析时间格式。请使用类似 '2024-01-15 14:30' 的格式。"} # 假设时间为本地时间,并转换为UTC时间(iCloud CalDAV通常存储UTC时间) local_tz = pytz.timezone('Asia/Shanghai') # 根据你的时区修改 start_dt = local_tz.localize(start_dt).astimezone(pytz.utc) end_dt = local_tz.localize(end_dt).astimezone(pytz.utc) # 2. 连接CalDAV服务器 # !!! 重要:将以下占位符替换为你自己的真实信息 !!! caldav_url = 'https://caldav.icloud.com' username = 'your_apple_id@icloud.com' # 你的Apple ID邮箱 password = 'your-app-specific-password' # 你的App专用密码 principal_url = 'https://caldav.icloud.com/123456789/principal/' # 你的Principal URL try: client = caldav.DAVClient(url=caldav_url, username=username, password=password) principal = client.principal(url=principal_url) # 3. 获取或创建默认日历 # 列出所有日历,通常第一个是默认日历 calendars = principal.calendars() if not calendars: # 如果没有日历,可以创建一个 default_cal = principal.make_calendar(name="OpenClaw Calendar") else: # 使用找到的第一个日历(通常是主日历) default_cal = calendars[0] # 4. 创建iCalendar事件对象 cal = Calendar() cal.add('prodid', '-//OpenClaw Calendar Skill//') cal.add('version', '2.0') event = Event() event.add('summary', title) event.add('dtstart', start_dt) event.add('dtend', end_dt) if description: event.add('description', description) event.add('dtstamp', datetime.now(pytz.utc)) # 事件创建时间戳 # 5. 添加提醒(VALARM组件) # 这是实现提醒功能的关键 alarm = Alarm() alarm.add('action', 'DISPLAY') # 提醒动作为显示 alarm.add('description', f'Reminder: {title}') # 触发时间:事件开始前 N 分钟 alarm.add('trigger', timedelta(minutes=-reminder_minutes)) event.add_component(alarm) cal.add_component(event) # 6. 将事件保存到日历 # 需要将iCalendar对象转换为字符串 ical_data = cal.to_ical().decode('utf-8') new_event = default_cal.save_event(ical_data) # 获取创建事件的唯一ID,便于后续引用 event_id = new_event.id event_url = new_event.url return { "status": "success", "message": f"日历事件 '{title}' 创建成功!", "data": { "event_id": event_id, "event_url": event_url, "start": start_dt.isoformat(), "end": end_dt.isoformat() } } except caldav.lib.error.AuthorizationError: return {"status": "error", "message": "CalDAV认证失败,请检查Apple ID、App专用密码或服务器地址。"} except Exception as e: return {"status": "error", "message": f"创建日历事件时发生未知错误:{str(e)}"}实操心得:在编写CalDAV交互代码时,最头疼的就是时区处理。iCloud CalDAV服务器存储的是UTC时间。如果你的输入时间是本地时间,必须先将其本地化(赋予时区信息),再转换为UTC时间进行存储。否则,创建出来的事件时间会错乱。上面的代码展示了这一转换过程。另外,
icalendar库中的Alarm组件是设置提醒的核心,其trigger参数支持相对时间(如-PT15M表示提前15分钟),非常方便。
4.3 将技能注册到OpenClaw Agent
技能写好了,还得让OpenClaw认识它。我们需要创建一个主程序文件(例如main.py)来初始化OpenClaw Agent,并加载我们的日历技能。
# main.py from openclaw import OpenClaw from openclaw.skills.registry import register_skill from calendar_skill import CalendarSkill # 导入我们刚写的技能 # 1. 注册技能 # 这样OpenClaw就知道有这么一个可用的工具了 register_skill(CalendarSkill()) # 2. 创建并配置OpenClaw Agent # 这里会读取我们之前准备的config.yaml agent = OpenClaw(config_path="./config.yaml") # 3. 运行一个简单的测试指令 if __name__ == "__main__": # 这是一个模拟的自然语言指令,实际中会由对话触发 test_instruction = "请帮我创建一个日历事件,标题是'项目方案评审会',明天下午3点开始,4点半结束,并提前20分钟提醒我。" print(f"用户指令: {test_instruction}") print("Agent正在思考并执行...") # Agent会根据指令,自动规划并调用合适的技能(这里应该会调用我们的calendar_manager) response = agent.run(task=test_instruction) print("\n--- Agent 回复 ---") print(response)5. 指令解析与大模型提示工程
上面的测试指令是结构化的。但在真实场景中,用户会说“明天下午三点记得提醒我和老王开会”。如何让OpenClaw的LLM准确理解并提取出title、start_time等参数,是另一个挑战。这需要通过精心设计系统提示词(System Prompt)来实现。
5.1 设计系统提示词引导参数提取
我们需要在OpenClaw的配置或初始化时,给大模型一个明确的“角色设定”和“任务规范”。这通常在config.yaml中或创建Agent时指定。
在config.yaml中增强模型配置部分:
# config.yaml (补充) model: provider: "ollama" base_url: "http://localhost:11434" model: "qwen2.5:7b" # 系统提示词至关重要 system_prompt: | 你是一个专业的日历管理助手。你的唯一功能是帮助用户在苹果日历中创建事件。 用户会给你自然语言的指令,你需要从中提取出以下关键信息: 1. 事件标题 (title) 2. 事件开始时间 (start_time) 3. 事件结束时间 (end_time) 4. 事件描述 (description,可选) 5. 提前提醒的分钟数 (reminder_minutes_before,可选,默认10分钟) 时间解析规则: - 如果用户说“明天”、“后天”,请推算为具体的日期。 - 如果用户说“下午三点”,请转换为24小时制“15:00”。 - 如果用户没有指定日期,默认为今天。 - 如果用户没有指定结束时间,默认事件持续1小时。 - 输出时间格式必须严格为:YYYY-MM-DD HH:MM,例如:2024-01-16 15:00 你只能使用一个名为“calendar_manager”的技能来创建事件。 在回复用户时,先简要确认你理解的事件信息,然后直接调用该技能。 不要解释你是如何提取信息的,直接输出行动和结果。5.2 测试自然语言指令解析
更新配置后,我们再次运行main.py,但这次使用更自然的指令。
# 修改main.py中的测试指令 natural_instruction = “我明天下午两点有个牙医预约,大概一小时,记得提前半小时提醒我。” response = agent.run(task=natural_instruction) print(response)理想情况下,OpenClaw的LLM会这样思考:
- 解析指令:标题=
牙医预约,开始时间=明天 14:00,持续时间=1小时-> 结束时间=明天 15:00,提醒=提前30分钟。 - 规划行动:调用
calendar_manager技能,并传入解析出的参数。 - 执行技能:我们的
CalendarSkill.execute()方法被调用,连接iCloud并创建事件。 - 返回结果:将技能执行的成功或失败信息整合成自然语言回复给用户。
这个过程体现了AI智能体的核心价值:将非结构化的自然语言,转化为结构化的API调用。
6. 部署与自动化运行
让这个程序一直运行在后台,随时响应我们的指令,才是最终目标。有几种部署方式:
6.1 本地常驻运行(系统服务)
在Linux/macOS上,可以将其配置为系统服务(如systemd服务)。
创建一个服务文件/etc/systemd/system/openclaw-calendar.service:
[Unit] Description=OpenClaw Calendar Assistant After=network.target ollama.service # 确保在网络和Ollama服务之后启动 [Service] Type=simple User=your_username WorkingDirectory=/path/to/your/openclaw-calendar-sync Environment="PATH=/path/to/your/venv/bin" ExecStart=/path/to/your/venv/bin/python /path/to/your/openclaw-calendar-sync/main.py --server-mode Restart=always RestartSec=10 [Install] WantedBy=multi-user.target然后启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable openclaw-calendar.service sudo systemctl start openclaw-calendar.service这样,程序就会在后台持续运行。你可以通过journalctl -u openclaw-calendar -f来查看日志。
6.2 容器化部署(Docker)
为了环境隔离和迁移方便,Docker是更优雅的方案。
编写Dockerfile:
FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . # 假设我们有一个启动脚本 start.sh CMD ["./start.sh"]编写启动脚本和依赖文件:
requirements.txt内容:openclaw caldav icalendar pytzstart.sh内容:#!/bin/bash # 等待Ollama服务就绪(假设Ollama运行在另一个容器或宿主机) # 这里可以添加健康检查逻辑 python main.py --server-mode使用Docker Compose编排:更推荐将OpenClaw和Ollama放在一起管理。
# docker-compose.yml version: '3.8' services: ollama: image: ollama/ollama:latest container_name: ollama ports: - "11434:11434" volumes: - ollama_data:/root/.ollama restart: unless-stopped openclaw: build: . container_name: openclaw-calendar depends_on: - ollama environment: - OLLAMA_HOST=http://ollama:11434 # 将配置文件、技能代码等通过卷挂载进来 volumes: - ./config.yaml:/app/config.yaml - ./calendar_skill.py:/app/calendar_skill.py - ./main.py:/app/main.py restart: unless-stopped volumes: ollama_data:运行
docker-compose up -d即可一键启动整个环境。
6.3 如何触发任务添加?
程序在后台运行后,如何向它发送指令呢?这需要为OpenClaw Agent提供一个交互接口。OpenClaw本身可能提供简单的HTTP API或WebSocket接口,但通常功能较基础。一个更实用的方法是:
- 集成到聊天工具:为OpenClaw配置一个“连接器”(Connector),例如接入飞书、钉钉、Slack或微信的机器人。当你在聊天窗口中@机器人并说“添加任务...”,消息会通过连接器传给OpenClaw Agent处理。
- 提供简易HTTP API:在
main.py中,使用FastAPI或Flask快速搭建一个HTTP端点。
然后你就可以通过curl、Postman或任何能发送HTTP请求的工具来添加任务了。from fastapi import FastAPI app = FastAPI() @app.post("/add_event") async def add_event(instruction: str): response = agent.run(task=instruction) return {"response": response}
7. 常见问题与深度排查指南
在实际搭建和运行过程中,你几乎一定会遇到下面这些问题。我把踩过的坑和解决方案整理出来,希望能帮你节省大量时间。
7.1 CalDAV连接与认证失败
这是最高频的问题,症状通常是caldav.lib.error.AuthorizationError。
问题1:密码错误
- 排查:确保使用的是App专用密码,而不是你的Apple ID密码。去苹果ID账户页面重新生成一个试试。
- 技巧:在Python脚本里先用一个简单的测试代码单独验证CalDAV连接,排除OpenClaw框架的干扰。
import caldav client = caldav.DAVClient(url='https://caldav.icloud.com', username='你的邮箱', password='专用密码') principal = client.principal() print("连接成功!日历列表:", principal.calendars())问题2:服务器地址或Principal URL错误
- 排查:iCloud的CalDAV地址是
https://caldav.icloud.com。Principal URL需要正确获取。一个自动发现的方法是:
client = caldav.DAVClient(...) # 不指定principal_url,让库自动发现 principal = client.principal() print("Principal URL:", principal.url)- 注意:自动发现可能会慢一点,但最准确。
- 排查:iCloud的CalDAV地址是
问题3:网络问题或SSL证书验证失败
- 排查:如果你在代理环境下,可能需要为
caldav.DAVClient配置代理。对于自签名证书环境(极少见),可以传递ssl_verify_cert=False参数,但极度不推荐用于iCloud,存在安全风险。
- 排查:如果你在代理环境下,可能需要为
7.2 事件创建成功但时间不对
- 症状:日历里事件的时间比预期早了或晚了8小时(或其他整数)。
- 根因:时区处理错误。没有将本地时间正确转换为UTC,或者转换时弄错了时区偏移。
- 解决:严格遵循“本地时间 -> 附加本地时区 -> 转换为UTC”的流程。使用
pytz库确保时区对象正确。检查你的系统时区和脚本中指定的时区(如Asia/Shanghai)是否一致。
7.3 提醒不生效
- 症状:事件创建了,但到了时间没有弹出提醒。
- 排查步骤:
- 检查Alarm组件:确保在iCalendar事件中正确添加了
VALARM组件,并且trigger参数设置正确(负值表示提前)。 - 检查提醒同步:在iCloud网页版日历或iPhone的“日历”App中查看该事件的详情,看“提醒”选项是否被正确设置。有时CalDAV服务器对提醒的支持有差异。
- 设备同步延迟:CalDAV同步可能有几分钟延迟。耐心等待一下,或手动在设备上刷新日历。
- 客户端设置:确保你的iPhone/mac的日历App通知是开启的。
- 检查Alarm组件:确保在iCalendar事件中正确添加了
7.4 OpenClaw Agent不调用Calendar Skill
- 症状:Agent回复说“我不知道如何做这个”,或者尝试用其他方式回答,而不是调用我们的技能。
- 排查:
- 技能注册成功了吗?检查
main.py中是否确实执行了register_skill。 - 技能描述清晰吗?检查
CalendarSkill类中的name和description。description要足够清晰,让LLM能理解这个技能是干什么的。例如,描述中包含“添加事件”、“创建日历”、“设置提醒”等关键词,有助于LLM匹配。 - 系统提示词够强力吗?系统提示词中必须明确指令LLM“只能使用
calendar_manager技能”。强化LLM的“工具使用”意识。 - LLM能力问题:如果使用的本地模型太小(如3B参数),其工具调用和指令跟随能力可能不足。尝试换用更大的模型(如7B、14B),或者使用GPT-3.5/4等API模型(如果不在意隐私)。
- 技能注册成功了吗?检查
7.5 性能与稳定性优化
- 连接池:频繁创建和销毁CalDAV连接开销大。可以在Skill的
__init__方法中初始化客户端,并在多次调用间复用。但要注意处理连接超时和重连。 - 错误重试:网络请求可能偶尔失败。在
execute方法中,对CalDAV库的调用(如client.principal(),calendar.save_event())添加重试逻辑(例如使用tenacity库)。 - 日志记录:在关键步骤(如开始执行、连接服务器、保存事件前后)添加详细的日志记录(使用Python的
logging模块),这对于排查线上问题至关重要。将日志输出到文件,方便后续查看。 - 参数验证:在
execute方法最开始,加强对输入参数的验证。例如,检查end_time是否晚于start_time,reminder_minutes_before是否为合理正数等,给出友好的错误提示,避免无效请求发送到服务器。
这个项目从构想到稳定运行,我花了差不多一个周末的时间,大部分都耗在CalDAV的细节调试和提示词打磨上。但当第一次用语音对手机说“提醒我明天下午三点取快递”,然后看到电脑和手机上的日历同时弹出这个事件和提醒时,那种自动化带来的顺畅感,让人觉得所有的折腾都是值得的。它不仅仅是一个工具,更是朝着让AI真正融入个人工作流迈出的扎实一步。你可以基于这个日历技能,继续扩展,比如让它自动读取邮件提取会议邀请、或者结合项目管理系统自动生成周报日程,想象空间很大。
