Trip Planner Skill
行程规划助手,支持往返行程(当天/隔天/多天)和单程行程规划。
前置条件
本技能使用DuMate自带的携程connector查询交通信息,无需额外安装依赖。
可选配置:
BMAP_WEBAPI_AK - 百度地图API密钥,用于驾车时间查询(如未配置将使用估算值)
可用工具
| 工具 | 功能 | 数据源 |
|---|
| ------ | ------ | -------- |
___query_flight | 查询航班 | 携程 |
___query_train | 查询高铁/火车 | 携程 |
___query_hotel | 查询酒店 | 携程 |
___query_ticket | 查询景点门票 | 携程 |
触发场景
用户需要规划行程,涉及飞机、高铁、驾车等交通方式的选择和组合。
行程类型
- 往返:可能是当天往返,也可能是隔天或多天
- 单程:按"可以出发的时间"或"需要到达的时间"推算
核心规则
一、硬性约束(必须满足)
- 明确了出发时间 → 不能比那个时间更早出发
- 明确了到达时间 → 不能比那个时间更晚到达
- 停留时间 → 必须满足
- 说了"当天往返" → 必须找当天往返的方案(定义:早上6:30可以从出发地出发,晚上23:00前回到出发地)
二、软性约束(尽量满足)
- 用户说"早去早回" → 在满足硬性约束下尽量早出发、早返回
三、时间预留
- 国内航班:提前1小时到机场
- 高铁:提前30分钟到站
- 中转:预留足够时间(建议30分钟以上)
四、交通方式选择
- 优先直达
- 无直达时,考虑出发地或目的地周边城市的机场/火车站
- 选择标准:总时长最短(从最初出发地到最终目的地)
五、驾车限制
- 驾车时间不超过2.5小时
- 例外情况:没有其他交通方式可选,或替代方案(飞机/高铁)比驾车多出1小时以上
六、不考虑价格因素
时间最关键,不因价格差异改变推荐方案。
航班查询规则(携程)
1. 打开页面
- 访问携程航班搜索页面
- 等待页面加载完成(sleep 3-5秒)
2. 按时间排序
3. 滚动加载完整数据(关键!)
携程等网站使用懒加载,必须滚动到底部才能获取所有航班。
操作步骤:
- 获取初始快照
- 滚动页面:
playwright-cli mousewheel 0 500 - 等待2秒让数据加载
- 获取新快照
- 重复步骤2-4,直到页面不再加载新内容
判断是否加载完成:
- 快照中的航班数量不再增加
- 页面底部出现"没有更多"提示
- 滚动后快照内容与上次相同
常见错误:
- 只获取第一屏数据就停止 → 遗漏后面的航班
- 假设数据已完整 → 实际还有更多航班未加载
实际案例:
- 查询烟台→北京返程航班时,第一屏只显示到14:00的航班
- 继续滚动后,发现19:30起飞的航班(这才是当天往返的关键)
4. 数据提取
- 提取所有直飞航班
- 区分虹桥机场(SHA)和浦东机场(PVG)
- 区分直飞、经停、中转
- 标注次日到达(+1)
携程connector数据解析规则:
使用 ___query_flight 工具时,返回的 routeList 中每个 route 包含 flights 数组:
- 直飞:
flights 数组长度为1,且 aport.name 为目标机场 - 经停:
flights 数组长度为1,但 stops 不为空 - 中转:
flights 数组长度大于1
筛选直飞航班时,必须同时满足:
len(flights) == 1flights[0].aport.name == 目标机场名称
错误示例:只按 len(flights) == 1 筛选,未检查到达机场,导致遗漏部分直飞航班
5. 数据完整性验证
- 提取后,对比"应该有多少航班"vs"实际提取了多少"
- 关键决策前,抽查几个航班确认数据准确
- 验证方法:用户提及某个航班时,立即在原始数据中搜索确认是否存在
6. 出发机场优先
- 优先选择离用户出发地最近的机场
- 例如:用户在浦东,优先选浦东机场出发的航班
高铁查询规则(12306)
1. 查询实时数据
2. 未开售处理
- 如目标日期未开售,查询历史同期/相近日期的时刻表作为参考
- 标注"参考历史时刻表,实际以开售后为准"
穷尽周边机场
触发条件
- 目的地城市进出港航班较少(如小城市、县城)
- 目的地没有机场或机场航班选择有限
操作方法
- 确定目的地具体位置
- 在地图上搜索周边200-300km范围内的所有机场
- 不能凭印象列举,要系统性地排查
- 逐一查询每个机场的航班
优先级
示例
- 郎酒庄园(古蔺县二郎镇)→ 周边机场:泸州、遵义、重庆、贵阳、宜宾、昭通
- 龙口(山东烟台下辖县级市)→ 周边机场:烟台、青岛、潍坊
综合排序
- 不是按价格排序,而是按"总耗时"排序
- 总耗时 = 出发地到机场/车站时间 + 候机/候车时间 + 航班/高铁时间 + 机场/车站到目的地时间
- 输出时只输出筛选后的方案,不输出完整列表
驾车时间查询
- 使用百度地图 webapi(需配置
BMAP_WEBAPI_AK 环境变量) - 如未配置,可使用估算值并标注
工作流程
1. 明确需求
- 出发地、目的地
- 出发日期
- 行程类型(往返/单程)
- 时间约束(出发时间/到达时间/停留时间)
- 其他偏好(如"早去早回")
2. 确定目的地位置
- 查询目的地具体位置
- 搜索周边机场(200-300km范围)
3. 调研交通方式
- 查询各机场航班时刻表
- 查询高铁时刻表
- 查询驾车时间(如适用)
- 查询目的地到机场/车站的交通时间
4. 生成方案
- 根据约束条件筛选可行方案
- 计算每个方案的总耗时
- 按总耗时排序
5. 呈现方案
输出格式
方案对比表
| 方案 | 出发时间 | 到达时间 | 总耗时 | 交通方式 | 备注 |
|---|
| ------ | ---------- | ---------- | -------- | ---------- | ------ |
| 方案A | XX:XX | XX:XX | X小时 | XX→XX→XX | 简要说明 |
| 方案B | XX:XX | XX:XX | X小时 | XX→XX→XX | 简要说明 |
最优方案详细时间线
06:30-08:10 北京首都机场 值机、安检、候机
08:10-09:35 北京首都机场 → 烟台蓬莱机场 乘坐SC5069航班
09:35-10:30 烟台机场 → 龙口 打车
...
注意事项
- 航班号、航站楼信息
- 中转交通建议
- 到达时间较晚时的提醒
输出前自洽性检查(必须!)
时间线输出前,逐行检查:
1. 时间段长度与耗时说明一致
- 例:写"05:50-06:08"则时长为18分钟,不能写"地铁30分钟"
- 例:写"地铁30分钟"则时间段必须跨越30分钟
2. 每个交通节点预留候车/候机时间
- 高铁发车前必须预留30分钟到站检票
- 航班起飞前必须预留1小时到机场值机
- 例:高铁14:09发车 → 最晚13:39到站 → 出发时间往前推
- 错误示例:写"12:30-14:09 打车到威海站"然后"14:09高铁发车"——没有预留候车时间
常见错误
- 只查去程不查返程:导致返程时间不合适
- 忽略机场/车站到目的地的交通时间:导致实际停留时间不足
- 不考虑值机时间:导致赶不上航班
- 不区分机场/车站:导致用户跑错地方
- 违反硬性约束:推荐了不满足用户时间要求的方案
- 航班数据提取不完整:只获取了部分航班,遗漏更优方案
- 凭印象列举周边机场:遗漏更近的机场
- 只按价格排序:忽略了出发机场、总耗时等因素
- 时间线自相矛盾:时间段长度与耗时说明不一致(如写"05:50-06:08"但说明"地铁30分钟")
- 数据解析错误:携程connector返回了完整数据,但解析时筛选条件不正确,遗漏了部分航班(如只按
len(flights)==1 筛选,未检查到达机场是否为目标机场)
示例
用户需求:4月25日从上海浦东去泸州郎酒庄园,9:30后出发
目的地位置分析:
- 郎酒庄园位于泸州市古蔺县二郎镇,地处川黔交界
- 周边机场:泸州云龙(100km)、遵义新舟(150km)、重庆江北(200km)、贵阳龙洞堡(280km)
调研结果:
- 上海→泸州:仅1班直飞(MF8857,16:25-19:30,虹桥T1)
- 上海→重庆:多班航班,CA4576(12:05-14:55,浦东T2)较优
- 上海→遵义:需查询
- 上海→贵阳:多班航班
方案对比:
| 方案 | 出发时间 | 到达庄园时间 | 总耗时 | 航班价格 | 驾车距离 |
|---|
| ------ | ---------- | ------------- | -------- | --------- | --------- |
| A(泸州直飞) | 14:25 | 21:30 | 约7小时 | ¥740 | 100km |
| B(重庆转车) | 10:00 | 18:30 | 约7小时 | ¥900 | 200km |
推荐:方案B,从浦东出发更方便,到达时间更早。