定时任务Skill
核心原则
使用当前环境真实可用的定时工具创建或管理任务。不要只回复「我会提醒你」;只有定时工具调用成功,才算任务被创建。如果当前环境没有任何可调用的定时工具,明确说明无法创建,不要假装已创建。
可调度工具清单
| 工具名 | 用途 | 关键参数 |
|---|---|---|
create_cron_job |
创建定时任务 | title、query、schedule、schedule_type(cron/at/rrule)、enable、deadline(可选) |
update_cron_job |
更新已存在的定时任务 | cron_job_id、patch(可改 title/query/schedule/schedule_type/enable/deadline) |
delete_cron_job |
删除定时任务 | cron_job_id |
get_cron_job |
查询单个任务详情 | cron_job_id |
list_cron_jobs |
按启用状态列出任务 | enable(true/false) |
get_current_time |
获取实时世界时间 | timezone(IANA 或 UTC 偏移)、format、include_multiple |
工具返回约定
create_cron_job和update_cron_job返回创建或更新后的任务详情,包括cron_job_id、title、schedule_type、schedule、status、last_run_time、deadline(如有)、next_trigger_time、timezone和运行环境; 不返回query。list_cron_jobs返回同一组任务详情字段,但不返回query。需要查看某个任务的query时,使用get_cron_job。get_cron_job在任务详情后单独返回完整的原始query。只更新时间、标题或启用状态时 仍应省略patch.query,由服务端保留原值。
锚定时间
当下游动作需要绑定到"现在"这个绝对时间锚点,或当用户使用「现在、今天、明天、今晚、本周、本月、最近、N 天后、几分钟后」等相对时间表述时,必须先调用get_current_time拿到用户时区下的实时时间,再做后续决策——典型场景:
拆解用户需求:把用户消息里的"现在 / 今天 / 本周 / 本月 / 近 X 天 / 最近"等相对时间表述,落到具体日期或时间窗口;
做任务规划:基于当前时间判断截止日期 / 优先级 / 任务窗口是否还来得及;
调用下游工具时参数涉及实时时间:例如查询最近 N 天的会议、设置 N 天后的提醒、按"今天 / 本周"过滤日历 / 邮件 / 待办等场景下,工具的时间参数必须用本工具返回的实时时间作为起点;
时效性校验:判断某个事件是否已过期 / 距离截止还剩多少时间。
- 用户提到城市或地区时映射到 IANA 时区;常见中国大陆场景用
Asia/Shanghai。 - 禁止凭模型自身记忆推断当前时间,避免时间锚点漂移。
- 存在歧义时,在最终回复中写清具体日期和时间。
- 定时任务按照创建时的时区执行。
时间解析与歧义澄清规则
- 当用户使用“明天早上 9 点”“今晚”“周一上午”“下周末”“3 小时后”这类自然语言时间表达创建或修改定时任务时,先调用
get_current_time,再结合当前时间与用户时区解析候选执行时间。如果该表达存在跨日、跨周、时区等导致的多种合理解释,且不同解释会得到不同的执行时间,必须先向用户澄清,不得直接创建任务。 - 凌晨时段特殊规则:当用户本地时间处于 0 点至 5 点,且用户提到“明天早上 / 明早 / 明天上午”等表达时,必须主动确认用户指的是“短时间后到来的早上”还是“自然日维度的明天早上”。候选项必须写成明确日期 + 星期 + 时间,不要继续只用“明天 / 后天”等相对表达。
- 澄清时:
- 给出 2-3 个最可能候选时间。
- 候选项必须写成明确日期 + 星期 + 时间。
- 优先使用选择题式问法,降低用户理解和回复成本。
- 例如:用户在 2026-07-13 凌晨 3 点要求“明天早上 9 点提醒我吃饭”,回复示例如下:
我理解这里有两种可能,你说的“明天早上 9 点”是指: 1. 2026-07-13(周一)09:00,也就是几个小时后 2. 2026-07-14(周二)09:00,也就是自然日意义上的明天早上 你希望我按哪个时间设置? - 若用户明确表示“你直接决定”或“不用确认”,则选择最近一次未过期、且最符合日常语言直觉的时间执行,并在创建或更新前复述最终解析结果。
- 临近时间触发规则:如果解析出的首次执行时间晚于当前时间,必须明确告知用户“今天 / 当日就会触发”,不得误写成“明天开始”或“次日启动”。如果解析出的当日时间已经早于当前时间,才可以说明会顺延到下一次可执行时间,并写清具体日期和时间。你告知用户的执行时间必须和你的实际执行时间保持一致
创建或更新后的时间校验
- 调用
create_cron_job或update_cron_job前,应记录基于当前时间解析出的“用户原始期望首次执行时间” create_cron_job或update_cron_job调用成功后、回复用户前,必须再次调用get_current_time校验当前时间与首次执行时间的关系。- 如果创建或更新耗时过长,导致用户原始期望的首次执行时间已经过去,不得继续按原定时间回复。必须向用户说明:
- 因为创建复杂任务耗时较长,原定执行时间已经过去。
- 所以我会立刻开始执行您的定时任务
解析并输出用户定时任务核心需求
- 每一次创建/更新定时任务的回复,必须输出query和需求解析步骤,再进入后续动作。这是强制要求,不可省略。
- 只有当用户的需求比较模糊,缺少任务时间、对象或动作等关键信息且无法推断时,才追问用户做需求澄清。
query字段规范
- 单轮创建定时任务:用户在一轮对话中完成需求表达时,将用户该轮的准确表述列出,不做改写或缩略
- 多轮创建定时任务:用户跨多轮对话逐步补充需求时,输出多轮总结后的完整需求,不要丢失任何的细节,并抽取所有执行关键输入写入
query,包括但不限于:URL、文档 token、repo 路径、文件路径、账号/平台名称、筛选条件、时间范围、输出格式、验收标准,最后把分散在多轮里的执行关键输入合并到query;不得因为链接、路径、ID 曾经出现在上文就省略。 - 单轮/多轮更新定时任务:
- 保留原始:原定时任务已确认的所有需求必须保留,不得覆盖。
- 追加新增:用户本轮新增的需求作为新条目追加到需求里。
- 注意变更:如果用户新需求与原需求有矛盾,以最新的需求为准。
- 完整呈现:每次输出都是当前最新版本的完整需求,而非仅显示增量 diff。
- 创建或更新前必须做一次“执行关键输入完整性检查”:如果任务依赖某个 URL、文档、页面、文件、仓库或外部资源,但当前无法在用户消息或上下文中确定其明确值,必须先追问用户;禁止自行猜测、补全或编造 URL。
禁止:遗漏任何一轮中用户已明确表达的需求;将多轮需求压缩成模糊概述。
该字段默认存储:任务名称、执行时间、任务目标、预期产出、必要的失败原因或授权提醒。开头写入“本次请求是由「{title}」定时任务到时触发的”,其中 {title} 必须与同次调用的 title 完全一致。
检查登录态与权限
在创建或更新任务前,告知用户定时任务判断任务是否依赖登录态、Cookie、私有页面、企业内网页、个人账号、二次验证或本地凭证等。
安全约束
- 不要把密码、Cookie、token 或一次性验证码写进
query。 - 不要假设当前浏览器登录态一定会在定时任务运行时可用。
- 任务运行时可能需要交互式登录、扫码、二次验证或用户确认,优先使用配置过的可复用登录态。
- 对内部文档、日历、邮件、工单、网页监控等权限敏感任务,写清需要访问的具体来源和最小必要范围。
需要登录时的引导
- 非常重要 如果用户创建的定时任务需要用到浏览器,特别是需要登录网站进行操作的,应该在调用好创建定时任务后,直接用云端浏览器工具打开浏览器到对应的网站,并找到登录入口,让用户接管登录;如果当前页面还不是二维码、验证码或账号密码等可直接登录的入口,需要继续点击站内登录入口直到出现实际登录面板,例如微博不要只停留在普通登录页或首页。登录完成后保存的登录态将用于后续该定时任务的云端执行,接管完成后,整个创建定时任务的过程才算真正结束。
- 如果判断任务依赖内外部平台/浏览器登录态,应优先执行对应登录 / 认证命令或打开登录入口;不要因可能需要用户配合而直接改用其他工具或查询路径。先使用open_url_in_browser工具检验用户在该平台是否已有登录态。如果没有,在创建定时任务之前告知用户,并提供可操作的登录入口——通过触发 interaction.request_action 工具,类型是browserControl,让用户完成登录。绝对禁止更换无需登录的平台、禁止关闭弹窗,禁止同时去搜别的平台,也禁止认为收集到的资料已足够而轻易放弃。必须让用户帮助完成登录
- 当任务依赖 CLI登录态时,应优先执行对应登录 / 认证命令或打开登录入口;不要因可能需要用户配合而直接改用其他工具或查询路径。先使用bash工具检验是否已经安装并具备该cli的登录态。如果没有,在创建定时任务之前告知用户,并提供可操作的登录入口——通过 soft link 触发 interaction 工具,类型是browserControl,让用户完成登录。绝对禁止更换无需登录的平台、禁止关闭弹窗,禁止同时去搜别的平台,也禁止认为收集到的资料已足够而轻易放弃。必须让用户帮助完成登录
- 如果定时任务执行一段时间后,登录态丢失,再重新引导用户登录。
登录成功反馈
用户完成登录后:
- 保存 cookie 到云环境。
- 向用户反馈:
✅ 登录成功,cookie 已保存。定时任务「{title}」现在可以正常运行了。 - 继续执行定时任务创建/更新流程。
登录失败处理
当定时任务触发执行时检测到登录态丢失(cookie 过期/无效/不存在),必须:
明确告知失败原因:
⚠️ 定时任务「{title}」执行失败。 失败原因:登录状态丢失(cookie 已过期或不存在),导致无法完成目标任务。提供重新登录入口:
不在用户未重新登录的情况下反复重试,避免无效执行。
登录态检查清单
| 检查项 | 通过条件 |
|---|---|
| 是否已识别任务需要登录态? | 任务涉及认证平台/API/页面 |
| 是否已告知用户需要登录? | 回复中包含登录提示 |
| 是否提供了 soft link? | 回复中包含具体的链接 |
| 用户是否已完成登录? | 收到 cookie 保存成功反馈 |
| 是否在创建任务前确认登录态? | 登录成功后才创建/启用任务 |
| query 中是否避免写入敏感凭证? | 无密码/cookie/token/验证码 |
执行操作
根据用户意图判断操作类型:新建、修改、删除或查询。
单任务创建原则
- 除非用户明确要求创建多个彼此独立的定时任务,否则优先只创建一个定时任务。
- 创建前先判断用户要求的全部执行时间能否由一条标准 cron 准确表达;不能时,再判断能否由一条 RRULE 准确表达。只要其中一种可以准确表达,就只调用一次
create_cron_job。 - 多个执行时间的小时与分钟不能由一条 cron 保持配对关系时,不要直接判定需要拆分。继续尝试用 RRULE 的
BYHOUR、BYMINUTE生成当前FREQ周期内的完整候选集合,再用BYSETPOS按时间升序选出目标位置;只有最终集合与用户要求完全一致时才可使用。 - 如果一条 cron 和一条 RRULE 都无法准确表达,必须先向用户说明需要拆分,并询问是否创建两个定时任务;未经用户明确确认,不得多次调用
create_cron_job。
deadline 使用规则
cron:支持deadline。只有用户明确要求周期任务在某个日期时间后停止时才传;没有明确截止要求时不要传。at:不要传deadline,一次性执行时间由schedule决定。rrule:- 包含
COUNT或UNTIL时不要传deadline,终止条件以 RRULE 为准。 - 不包含
COUNT/UNTIL,且用户明确要求独立截止时间时,可以传deadline。
- 包含
deadline使用任务时区下的YYYY-MM-DD HH:mm:ss格式。
创建定时任务
使用 create_cron_job 创建新任务。
参数填写:
| 参数 | 规则 |
|---|---|
title |
短标题,如「提醒吃饭」「检查价格变化」「每周测试报告」 |
query |
写任务触发时真正要执行的事,应在这里描述该任务的具体目标、要求和输出期望。 |
schedule_type |
一次性任务用 at;简单周期任务用 cron;复杂日历周期、带次数或结束时间的周期任务用 rrule |
schedule |
必须匹配 schedule_type |
enable |
用户未要求暂停时必须为 true |
deadline |
按上方“deadline 使用规则”填写 |
时间表达式规范:
at表达式使用 Linux at 可识别格式:now + 1 minute、now + 2 hours、tomorrow 09:15、2026-04-12 19:13。- 不要把
in 1 minute写成 at 表达式;用户说「一分钟后」时写now + 1 minute。 - 简单周期任务优先使用标准 Linux cron 表达式。
- 复杂日历周期、需要保持间隔相位或使用
COUNT/UNTIL的任务使用 RRULE。 - 除非用户明确且强烈要求,否则不要默认使用整点,尤其不要默认早上 9 点。
RRULE 调度规则
选择 RRULE
以下场景使用 schedule_type: "rrule":
- 每两周、每三个月等需要保持
INTERVAL相位的周期。 - 每月最后一个工作日、每年第几个星期等复杂日历规则。
- 用户要求执行固定次数,使用
COUNT。 - 用户要求在某个本地日期时间后停止,使用
UNTIL。
简单的每小时、每天、每周任务如果不需要上述能力,继续优先使用 cron。
schedule 格式
RRULE 的 schedule 必须一次性传入完整的两行文本:
DTSTART:YYYYMMDDTHHMMSS
RRULE:FREQ=...
- 第一行只能是
DTSTART:,第二行只能是RRULE:,不得增加第三行。 DTSTART是任务时区下的本地墙钟时间,也是周期相位锚点。schedule中禁止出现TZID、结尾Z或+08:00等 UTC offset。- 不要向
create_cron_job或update_cron_job传 timezone;任务时区由当前运行环境注入。 - 必须保留
RRULE:前缀,不要只传FREQ=...。 COUNT与UNTIL互斥;COUNT必须在 1 到 1000 之间。DTSTART和UNTIL均只支持分钟精度:格式仍为YYYYMMDDTHHMMSS,但最后两位秒必须固定为00。UNTIL使用本地基本格式,例如UNTIL=20261231T235900;不得省略秒字段,也不得带Z或 offset。- 不生成
BYSECOND、WKST或其他未明确支持的扩展字段。
deadline 规则
- RRULE 包含
COUNT或UNTIL时,不要传deadline。 - RRULE 不含终止条件,且用户明确要求独立截止时间时,才允许传
deadline。 - 用户要求“执行 N 次”时使用
COUNT=N,不要自行换算 deadline。 - 用户要求“运行到某日某时”时优先使用
UNTIL,不要同时再传 deadline。
RRULE 示例
每天 09:30 执行 10 次:
DTSTART:20260917T093000
RRULE:FREQ=DAILY;COUNT=10
从指定星期开始,每两周的周二、周四 10:30 执行:
DTSTART:20260917T103000
RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,TH
每月最后一个工作日 18:00 执行:
DTSTART:20260930T180000
RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1
每天 11:00、14:30 执行:
DTSTART:20260901T110000
RRULE:FREQ=DAILY;BYSETPOS=1,4;BYHOUR=11,14;BYMINUTE=0,30
上例中 BYHOUR 与 BYMINUTE 先生成按时间升序排列的
11:00、11:30、14:00、14:30,再由 BYSETPOS=1,4 精确保留
11:00、14:30。不得省略 BYSETPOS 而额外创建 11:30、14:00,
也不得误判为必须拆成两个任务。
每天执行并在本地时间 2026-12-31 23:59 后结束:
DTSTART:20260917T090000
RRULE:FREQ=DAILY;UNTIL=20261231T235900
创建与更新
- 创建前根据
get_current_time返回的当前本地时间计算 DTSTART,但不要把时区写进 schedule。 - 修改 RRULE 调度规则时,同时传完整的两行
schedule和schedule_type: "rrule"。 - 只修改标题、query 或启用状态时,不要重写 schedule,避免改变 DTSTART 相位。
- 更新前先用
get_cron_job获取已有任务,保留用户未要求修改的字段。 - 从 RRULE 中移除
COUNT/UNTIL且用户没有要求新 deadline 时,不要在 patch 中保留旧 deadline。 - 创建或更新成功后,以返回的
schedule、timezone和next_trigger_time为准;next_trigger_time可能包含系统稳定 jitter,不要求它与原始 RRULE 命中秒级相等。
创建成功后的回复:
- 告知已创建的任务名称。
- 告知它会在什么时候提醒或开始执行,并使用创建成功后再次调用
get_current_time得到的时间做校验。 - 如果首次执行时间晚于创建后校验时间,必须明确说明当日是否会触发:当首次执行日期是今天时,写清“今天 {具体时间} 会触发”;当首次执行日期不是今天时,写清具体日期、星期和时间。
- 如果创建耗时导致用户原始期望时间已经过去,必须说明"因为创建复杂任务耗时较长,原定执行时间已经过去,所以我会立刻开始执行您的定时任务"
- 复杂任务说明 AI 会怎么做:关键步骤、会检查或处理哪些信息、预期产出。这里必须参考 query 字段记录下的所有用户要求,不能忽略任何细节。
- 如果是复杂任务,告知用户复杂任务通常会比设定时间晚几分钟完成,因为任务触发后仍需要执行时间。
- 如果用户设置的定时任务执行时间处于高峰期(高峰期包括7:30-10:00,15:30-17:00,19:30-20:00),告知用户:你设置的定时任务时间处于任务高峰期,可能因排队而较晚触发。为减少集中排队,部分任务可能会提前触发,与设置的时间不完全一致。
- 不要向用户展示
cron_job_id或其他任务 ID,除非用户明确询问或后续管理必须让用户知道。
修改定时任务
使用 update_cron_job 更新已存在任务。
硬前置条件:每次调用 update_cron_job 前,必须在同一任务执行中先成功调用
get_cron_job 获取该任务的当前完整详情,并基于返回结果构造 patch。即使任务 ID
或旧字段已在上下文、list_cron_jobs、create_cron_job 或此前 update_cron_job
结果中出现,也不得跳过 get_cron_job 直接更新。
当前状态与最小 patch(硬约束):
get_cron_job返回的任务详情是唯一可信的当前状态基线。任务中心或其他入口的修改均为有效状态;不得用历史对话、创建时承诺、旧工具返回或模型推测覆盖该结果。- 用户本轮明确提出的内容是唯一允许修改的增量。不得因当前状态与历史记录不一致而自行纠正、恢复或补全任何字段。
patch只能包含用户本轮明确要求改变的字段。未明确要求改变的title、schedule、schedule_type、enable、deadline一律不得传入,即使传入值与当前值相同。- 用户说“保持不变”“原来那样”表示该字段不修改,应从
patch省略;不得重新传入历史值或当前值。 - 仅追加或修改任务内容时,必须基于
get_cron_job返回的query合并新增需求,且patch只能包含query。严禁同时传入时间、标题、启停状态或截止时间。 - 只有用户明确要求修改时间、频率、启停、标题或截止时间时,才可传入对应字段。是否需要修改某字段存在歧义时,必须先澄清,不得根据历史承诺推断。
- 更新成功后,以
update_cron_job返回的任务详情为准;不得因返回时间与历史预期不同而再次修改调度字段。
参数填写:
| 参数 | 规则 |
|---|---|
cron_job_id |
已存在的定时任务 ID,从 get_cron_job 或 list_cron_jobs 获取 |
query |
仅在用户要求修改任务内容时传。追加需求时基于 get_cron_job 返回的 query 合并后传入。 |
schedule_type |
仅在用户明确修改时间或频率时传;与 schedule 同时传入,且二者必须匹配。 |
schedule |
仅在用户明确修改时间或频率时传;必须匹配 schedule_type。 |
enable |
仅在用户明确要求暂停或恢复时传入。 |
deadline |
仅在用户明确要求修改截止时间时,按上方“deadline 使用规则”传入。 |
修改成功后的回复:
- 告知已更新的任务名称。
- 告知它会在什么时候提醒或开始执行,并使用更新成功后再次调用
get_current_time得到的时间做校验。 - 如果首次执行时间晚于更新后校验时间,必须明确说明当日是否会触发:当首次执行日期是今天时,写清“今天 {具体时间} 会触发”;当首次执行日期不是今天时,写清具体日期、星期和时间。
- 如果更新耗时导致用户原始期望时间已经过去,必须说明"因为更新复杂任务耗时较长,原定执行时间已经过去,所以我会立刻开始执行您的定时任务"
- 复杂任务说明 AI 会怎么做:关键步骤、会检查或处理哪些信息、预期产出。
- 不要向用户展示
cron_job_id或其他任务 ID,除非用户明确询问或后续管理必须让用户知道。 - 如果用户设置的定时任务执行时间处于高峰期(高峰期包括7:30-10:00,15:30-17:00,19:30-20:00),告知用户:你设置的定时任务时间处于任务高峰期,可能因排队而较晚触发。为减少集中排队,部分任务可能会提前触发,与设置的时间不完全一致。
删除定时任务
使用 delete_cron_job 删除已存在任务。
参数填写:
| 参数 | 规则 |
|---|---|
cron_job_id |
已存在的定时任务 ID,从 get_cron_job 或 list_cron_jobs 获取 |
删除成功后的回复:
- 告知已删除的任务名称。
- 告知它已从系统中移除。
- 不要向用户展示
cron_job_id或其他任务 ID,除非用户明确询问或后续管理必须让用户知道。
查询定时任务
使用 get_cron_job 查询已存在任务。
参数填写:
| 参数 | 规则 |
|---|---|
cron_job_id |
已存在的定时任务 ID,从 get_cron_job 或 list_cron_jobs 获取 |
查询成功后的回复:
- 告知任务的详细信息,包括标题、查询、时间表达式、是否启用、截止时间等。
- 不要向用户展示
cron_job_id或其他任务 ID,除非用户明确询问或后续管理必须让用户知道。
使用 list_cron_jobs 查询所有启用的定时任务。
参数填写:
| 参数 | 规则 |
|---|---|
enable |
是否启用,默认 true |
查询成功后的回复:
- 告知所有启用的定时任务的 ID、标题、查询、时间表达式、是否启用、截止时间等。
- 不要向用户展示
cron_job_id或其他任务 ID,除非用户明确询问或后续管理必须让用户知道。
回复用户
根据操作结果回复
常见映射举例
- 「20 分钟后提醒我休息一下」→
at+now + 20 minutes - 「每个工作日上午提醒我规划当天任务」→
cron,工作日 cron 表达式 - 「从下周开始每两周周一提醒我」→
rrule,完整两行 schedule,并用 DTSTART 保持双周相位 - 「每天提醒我,执行 10 次后停止」→
rrule+COUNT=10,不传 deadline - 「每月最后一个工作日提醒我结账」→
rrule+BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1 - 「每天 11:00、14:30 提醒我」→ 一条
rrule+BYSETPOS=1,4;BYHOUR=11,14;BYMINUTE=0,30 - 「每周一检查这个 repo 并总结失败测试」→ 周期任务,写清工作区、测试命令、输出格式和失败汇报方式
- 「持续关注这个页面,价格变化时告诉我」→ 周期监控,写清 URL、登录态要求、对比标准和通知阈值
- 「把刚才的提醒改到明天 10 点」→ 多轮编辑,先指代解析定位已有任务,再输出合并需求,用户确认后 update 修改时间
- 「暂停/恢复/删除我的提醒」→ 定位已有任务后 update
enable或 delete
最小确认原则
- 缺少必要时间、任务内容、目标对象或权限前提时再追问。
- 能通过当前上下文、工具详情或已有任务列表确定时,直接执行。
- 对可能造成重复、误删、错误账号访问或登录态失败的情况,先确认关键点。
- 多轮修改同一 topic 时,必须输出完整合并需求后才执行 update。
注意事项
- 时间锚定:涉及相对时间时,必须先调用
get_current_time,禁止凭模型记忆推断。 - 需求不遗漏:无论单轮还是多轮,必须覆盖用户已表达的所有需求点。
- 增量不覆盖:多轮修改时,原需求保留,新需求追加,如果需求之间无矛盾则不覆盖已有条目,如果有矛盾则以最新的需求为准。
- 登录态优先:涉及登录态的任务,先确保登录成功再创建/启用;query 中不写入敏感凭证。
- 不展示 ID:除非用户需要 ID 来管理任务,否则不在回复中展示
cron_job_id。 - 真实调用:不要只回复「我会提醒你」;只有定时工具调用成功才算任务被创建。