| name | calendar_schedule |
| description | 查看日程助手。帮助 Agent 从宿主 App 首页点击底部 Tab「业务」,在业务页面找到「日历」卡片,点击卡片左上角「日历」两个字进入「我的日程」页面,并总结当天日程。当用户询问后续日程安排、今天日程、空闲时间,或要求根据日程安排会议/研讨会时使用此技能;需要根据当前日程中的空闲区间和用户指定的会议时长给出建议。 |
| always | false |
| routing_hints | {"task_type":"schedule_read","strong_markers":["查看日程","今天日程","日程安排","日历","空闲时间","什么时候有空","安排会议","研讨会安排"],"strong_ordered_pairs":[["查看","日程"],["看","日程"],["今天","日程"],["安排","会议"],["组织","研讨会"]],"weak_markers":["今天","明天","下午","讨论","会议","研讨会"],"negative_markers":["发消息","发送消息","通知","告诉","联系"],"requires_primary_marker":true} |
| execution_hints | {"kind":"ui_navigation","steps":[{"activity":"MainActivity","target":"业务","aliases":["业务","业务Tab","工作台","应用","服务","business","workbench"],"region":"bottom","anchor_type":"bottom_tab","container_role":"tab_bar","action":"tap"},{"page":"业务","target":"日历","aliases":["日历","日历卡片","日历标题","calendar"],"anchor_type":"card_title","container_role":"card_grid","action":"tap"},{"page":"我的日程","target":"今日日程","aliases":["我的日程","今日日程","我的日程页面","今日日程列表"],"action":"readout","goalReached":true}],"stop_condition":{"page_predicates":["我的日程","今日日程"],"content_predicates":["我的日程","今日日程"],"success_signals":["我的日程","今日日程"],"failure_signals":["无权限","加载失败","网络异常","未登录"],"requires_readout":true},"readout_contract":{"kind":"visible_schedule_list","fields":["start_time","end_time","title"],"pairing_rules":["只使用当前页面可见的日程文本","将同一行或同一卡片中最近的时间段与标题配对","时间段必须包含开始时间和结束时间,统一输出为 HH:MM-HH:MM","不要把日期、页签、按钮或非日程说明当作日程条目"],"sort":"按 start_time 从早到晚升序排列","output_format":"每条日程使用:HH:MM-HH:MM 标题","uncertainty_policy":"如果时间与标题无法可靠配对,必须说明不确定,不要猜测或编造"}} |
查看日程助手
帮助 Agent 进入「我的日程」页面,读取当天日程,并在用户询问空闲时间或会议安排时给出基于当前日程的时间建议。
标准路径是:
- 首页
- 底部 Tab「业务」
- 业务页面中的「日历」卡片
- 点击日历卡片左上角「日历」两个字
- 进入「我的日程」页面
- 总结当天日程,或根据空闲时间给出安排建议
触发条件
此技能应该在以下情况下触发:
- 用户说“查看日程”
- 用户说“看看今天的日程”
- 用户说“今天有哪些安排”
- 用户说“查看后续日程”
- 用户问“今天什么时候有空”
- 用户要求根据日程安排会议、研讨会、评审、面谈等
- 用户说“我下午要组织一个研讨会,安排在几点合适”
如果用户只是要求打开业务页、查看某个非日历入口,或只是泛泛询问日期,不要使用此技能。
核心路径
固定导航路径如下:
- 在首页
MainActivity 找到底部 Tab「业务」
- 点击「业务」进入业务页面
- 在业务页面找到「日历」卡片
- 点击日历卡片左上角的「日历」两个字
- 进入「我的日程」页面后读取当天日程
注意:业务页面中可能有多个卡片或日程相关入口。进入日程时应优先点击卡片左上角标题「日历」,不要点击日期小组件、更多按钮、统计区域或其他相邻卡片。
只有当页面中明确出现「我的日程」或「今日日程」这类目标页标识时,才算真正进入目标页;业务页中可见的「日历」卡片标题不算到达终态页。
工作流程
步骤 1:先看当前页面
优先调用 android_view_context_tool,判断当前页属于哪一类:
建议调用:
{
"targetHint": "首页、底部业务Tab、业务页面日历卡片或我的日程"
}
如果当前已经在「我的日程」页面:
如果当前页面不是首页、业务页或我的日程页:
- 优先通过页面上可见的返回、关闭、取消等安全入口回到首页
- 回退动作必须基于最新 observation 中的可见入口并使用
tap
- 如果无法安全回到首页,停止并说明当前页面无法安全进入日程
步骤 2:从首页进入业务页
如果当前页面是首页,并且底部 Tab 中可见「业务」:
- 从最新 observation 中找到「业务」Tab
- 使用该元素 bounds 计算中心点
- 调用
android_gesture_tool 执行 tap
tap 参数必须包含:
x
y
observation.snapshotId
observation.referencedBounds
observation.targetDescriptor
点击后必须重新调用 android_view_context_tool,确认已经进入业务页面。
如果底部 Tab 中没有看到「业务」,不要猜测坐标。
步骤 3:从业务页进入我的日程
如果当前页面是业务页:
- 找到「日历」卡片
- 优先选择卡片左上角标题文字「日历」对应的候选
- 如果标题文字本身不可点击,选择包裹该标题的可点击父容器
- 调用
android_gesture_tool 执行 tap
- 点击后重新调用
android_view_context_tool
- 确认进入「我的日程」页面
如果业务页首屏没有看到「日历」卡片,可以受控滚动页面继续寻找。这里要查看更多下方业务卡片,调用 android_gesture_tool 时使用 direction=down,表示“内容向下滚动/露出更下方内容”;runtime 实际会注入手指上划动作。不要使用 direction=up,因为它会向页面顶部滚动,在顶部附近可能触发下拉刷新。
- 先从最新 observation 中明确选择业务页面的主要滚动容器
- 调用一次
android_gesture_tool
action=swipe
direction=down
amount=small 或 medium
observation.snapshotId
observation.referencedBounds
- 滑动后必须重新调用
android_view_context_tool
- 如果新页面中出现「日历」卡片,再按上面的点击规则进入
滑动限制:
- 最多向下滚动 2 次(即实际手势上划 2 次)
- 每次滑动后都必须重新观察页面
- 如果滑动后页面没有新增内容或仍没有日历入口,应停止继续滑动
- 不要下拉刷新
- 不要来回反向滑动
- 不要在未明确滚动容器时盲滑
如果最多向下滚动 2 次后仍找不到「日历」卡片,应停止操作并反馈:
当前业务页面没有看到日历卡片,请先在业务页面添加日历卡片。
步骤 4:读取当天日程
进入「我的日程」页面后,读取当天日程信息。优先提取:
- 日程标题
- 开始时间
- 结束时间
- 地点
- 组织者或参与人
- 状态提示,例如已结束、进行中、待开始、全天
日程条目必须按开始时间从早到晚排序。输出前先把页面上可见的时间段和同一行/同一卡片中的标题成对,例如 15:00-16:00 测试。不要按 OCR 置信度、控件重要性或页面文本出现的零散顺序排序;如果无法确认某个标题和时间段的对应关系,必须说明不确定,不要猜测。
如果页面上有“今天”“今日”或高亮日期,优先以该日期为当天视图。
如果当前页面不是当天日程:
- 优先点击页面中的“今天”“今日”入口
- 如果没有明确入口,不要猜测日期控件
- 只总结当前可见日期,并说明不是明确的今天视图
如果当天没有日程:
- 直接说明今天暂无可见日程
- 如果用户询问适合安排会议的时间,可以说明当前可见证据显示当天较空,但仍建议用户确认完整日历
步骤 5:总结当天日程
当用户只是要求“查看今天的日程”“今天有什么安排”时,输出应包含:
- 按时间顺序列出当天日程
- 简要说明空闲时间段
- 明确说明信息范围来自当前页面可见日程
输出日程列表时必须使用 HH:MM-HH:MM 标题 格式,并按开始时间升序排列。
示例:
今天可见的日程有:
1. 10:00-11:00 项目例会
2. 13:30-15:00 需求评审
从当前可见日程看,下午 13:00-13:30、15:00-16:00 是空闲的。
根据日程推荐会议时间
当用户询问后续安排、空闲时间,或要求安排会议/研讨会时,需要基于当前日程做时间段筛选。
1. 提取用户约束
优先识别以下约束:
- 日期:今天、明天、本周某天
- 时间范围:上午、下午、晚上、几点之后、几点之前
- 会议时长:30 分钟、45 分钟、1 小时等
- 会议类型:研讨会、评审、面谈、同步会等
如果用户说“下午”,默认只在下午时间段中推荐。下午可以按当前页面日程范围理解;如果页面没有明确范围,默认按 13:00-18:00 处理。
2. 计算空闲区间
根据当前页面可见日程,把已有安排视为占用区间,然后计算用户指定时间范围内的空闲区间。
规则:
- 空闲区间必须与已有日程不重叠
- 推荐区间长度必须大于或等于用户指定会议时长
- 如果用户没有明确会议时长,可以推荐当前可见的所有合理空闲区间
- 如果用户明确会议时长,只能推荐满足时长的空闲区间
- 如果没有满足条件的区间,应明确说明没有看到足够长的空闲时间
3. 推荐示例
如果当前下午可见日程显示:
- 13:30-15:00 有会
- 16:00 之后另有安排或不可见
并且可推断空闲区间为:
- 13:00-13:30,30 分钟
- 15:00-16:00,60 分钟
则:
- 用户说“我下午要组织一个研讨会,安排在几点合适”:可以推荐
13:00-13:30 或 15:00-16:00
- 用户明确说“会议时间是 45 分钟”:只能推荐
15:00-16:00,因为 13:00-13:30 只有 30 分钟,不满足 45 分钟
4. 输出要求
推荐时间时要说明依据:
从当前可见日程看,下午可用时间有 13:00-13:30 和 15:00-16:00。
如果研讨会没有明确时长,这两个时间段都可以。
如果用户明确 45 分钟:
建议安排在 15:00-16:00。13:00-13:30 只有 30 分钟,不满足 45 分钟会议时长。
如果信息不足:
当前页面可见日程不足以判断完整空闲时间。我只能基于当前可见内容给出建议,建议你确认完整日历后再最终安排。
安全规则
- 点击前必须先观察页面
- 动作必须基于最新
snapshotId
- 不要使用裸坐标猜测
- 不要点击日历卡片里的非标题区域,例如更多、日期、提醒、统计区域,除非 observation 明确它们就是入口
- 不要为了找日历入口无限滑动
- 不要把不可见时间段当成事实
- 推荐会议时间时,必须检查空闲区间是否满足会议时长
决策规则
| 条件 | 决策 | 原因 |
|---|
| 用户要求查看日程 | 加载此技能 | 需要进入我的日程并读取页面 |
| 用户要求安排会议时间 | 加载此技能 | 需要读取日程并计算空闲区间 |
| 当前已在我的日程页 | 直接读取日程 | 避免重复导航 |
| 当前在首页 | 点击底部业务 Tab | 标准入口 |
| 当前在业务页 | 点击日历卡片左上角“日历” | 路径固定且减少误点 |
| 业务页首屏没有日历 | 最多上划 2 次寻找 | 允许入口不在首屏,但避免下拉刷新 |
| 上划后仍找不到日历 | 停止并提示添加日历卡片 | 避免无效循环和误点 |
| 用户指定会议时长 | 只推荐长度足够的空闲区间 | 防止安排冲突 |
| 日程信息不可见或不完整 | 明确说明范围有限 | 保持可信 |