出行行程规划助手(selfdrive-trip-planner)
把"一次出游"沉淀为可复用模板:填好简报 → 检索 → 一键产出 4 个标准文件(+可选 PPT)。
何时使用
用户表达"去某地玩、帮我排路线/做手册/出对比"类需求时触发。典型输入见 assets/trip_brief_template.md,或直接读取用户提供的出行简报 JSON(schema_version 1.1,含 basic/accommodation/play/tickets/comparison/integrations/deliverables 块)。
标准交付物(4 个文件)
- 自驾地图手册.html — 三栏:左=逐日行程(可点选),中=真实腾讯地图(可缩放/点标/每日路线同色连线),右=景点详情(介绍+🎫门票+是否需预约+提示)。
- 自驾地图使用界面.html — 地图优先界面:全屏腾讯地图 + 顶部搜索框 + 底部逐日 chips(高亮当日路线) + 点击标点弹窗/右侧详情抽屉(门票/预约/提示/坐标),适合手机/车载大屏查阅。
- 门票采购清单.xlsx — 按"必须提前/建议提前/现场可购"三档配色 + 预算汇总 sheet + 采购行动建议。
- 路线对比分析.html — 对照同程/携程/马蜂窝主流路线,给出平台画像/优点/缺点/门票修正/优化建议 5 节。
(可选第 5 个:对比 PPT,assets/generators/gen_ppt_slides.py 一条命令从 COMPARISON 生成 11 页 slide,再 slidep 渲染;背景图用 ImageGen 生成当地风景放入 assets/。)
(可选第 6 个:景点图鉴 PPT —— 见下方「交付物 #6」专节,需用户确认行程 + 对话二次确认后才生成。)
引导填写界面(方式A · 智能体代填的录入端)
assets/trip_wizard.html 是一个自包含、多步骤引导表单(手机/电脑可开,无外部依赖):
- 7 步引导:基本信息 → 住宿 → 玩法 → 门票票务 → 对比 → 预留接口 → 完成。
- 填完产出「出行简报」(可复制文本 / 下载 JSON),交给 WorkBuddy 即可代填配置并生成文件。
- 内嵌明确提示:门票不代购;飞猪链接与订票细化均为预留接口(填了也不触发自动动作)。
- 直接用浏览器打开该 HTML 即可使用,无需服务器。
工作流
- 收简报:读取用户给的出行简报 JSON(或引导界面产出、或口头信息)。解析 5 块:basic(目的地/日期/人员/交通/租车)、accommodation(集团/档次/要求)、play(必去/偏好/节奏)、tickets(不代购+refine)、comparison(平台/关注点)、deliverables(交付物勾选)。
- 判定交通模式:
basic.local_rental=false(如香港高铁+地铁)→ 文案与路线按"公共交通模式"写(POI 含车站/码头/港铁节点,DAY_ROUTES 表示当日移动轨迹);true(自驾)→ 常规自驾文案。 - 检索(每次出行必做,数据会变):
- 酒店:按用户指定集团 × 档次检索真实门店,子品牌对照见下方《酒店检索:集团 × 档次 子品牌速查》表(不限集团时给 2-3 家同档次候选让用户确认)。
- 景点坐标:WebSearch 取 GCJ-02 坐标(或本技能腾讯地图 Key 的poi_search)。
- 门票/预约:检索携程/同程/马蜂窝最新票价与预约规则(象鼻山免费需预约、相公山约¥90、壶口一票通两省、迪士尼日期票 这类易过时项务必核对)。
- 平台路线:WebSearch「同程/携程/马蜂窝 XX 路线」做对照。 - 写配置:复制
assets/trip_config.example.py(或参考assets/examples/的真实范例)→ 工作目录trip_config.py,填入 POIS/ITIN/DAY_ROUTES/TICKETS/COMPARISON。 - 生成:
python assets/generators/build_all.py --config trip_config.py --out output→ 4 个文件。 - (可选)PPT:
python assets/generators/gen_ppt_slides.py --config trip_config.py --out PPT项目目录;ImageGen 生成 hero_bg.png+content_bg.png 放入 assets/;slidep-start+slidep-validate。 - 交付与提示:本地服务器起预览(
python -m http.server 端口 --bind 127.0.0.1,不同行程目录用不同端口 8765/8766/8767…);提醒地图 Key 安全、凌晨入住备注、最长驾驶日/最长通勤日等。
酒店检索:集团 × 档次 子品牌速查
用户选定「集团 + 档次」后,按此表落到具体子品牌再检索门店(直接搜集团名会搜到错误档次,如 洲际+中高端 应找 假日/智选假日,而非 洲际)。
| 集团 | 经济 | 中端 | 中高端 | 高端 |
|---|---|---|---|---|
| 华住会 | 汉庭/海友 | 全季/桔子 | 桔子水晶/美居/漫心 | 禧玥/施柏阁 |
| 锦江荟 | 7天/派 | 维也纳/城市便捷 | 锦江都城/丽枫/喆啡/希岸 | 锦江饭店/J酒店/昆仑 |
| 首旅如家 | 如家/莫泰 | 如家商旅/和颐 | 璞隐 | 建国饭店 |
| 亚朵 | — | 亚朵轻 | 亚朵 | 亚朵S |
| 开元 | — | 开元曼居 | 开元大酒店 | 开元名都 |
| 洲际 IHG | — | 智选假日 HIE | 假日 HI | 皇冠假日/洲际 |
| 万豪 Marriott | — | 万枫 | 万怡/福朋喜来登 | 喜来登/万豪/JW |
| 希尔顿 Hilton | — | — | 希尔顿花园 HGI | 希尔顿/逸林/康莱德 |
| 雅高 Accor | 宜必思 | 美居/诺富特 | 铂尔曼/美憬阁 | 索菲特/费尔蒙 |
| 凯悦 Hyatt | — | — | 嘉轩/嘉寓 | 凯悦/君悦/柏悦 |
| 温德姆 Wyndham | 速8/戴斯 | 华美达/豪生 | 温德姆 | 温德姆至尊 |
| 香格里拉 | — | — | 今旅/盛贸 | 香格里拉 |
⚠️ 中国区易错点(检索前必读):
- 美居 / 宜必思 / 诺富特 / 施柏阁:中国大陆由 华住 主特许经营 → 走「华住会」渠道订更稳;铂尔曼/索菲特/费尔蒙/美憬阁 才走雅高官方。
- 希尔顿欢朋(Hampton):中国由 锦江(铂涛) 运营,会员积分走「锦江荟」,不要归到希尔顿官方体系。
- 县域/景区覆盖:国际集团在三四线及县域(如吉县、五台山县)覆盖率很低 → 优先国内集团(华住/锦江);确实没有时,给同档次本地高端候选并注明「非指定集团」。
- 用户若为某集团会员,优先保证该集团有店的城市住满,无店城市单独说明,不要为守集团硬凑(见简报「是否为守集团改当日往返」字段)。
特殊要求:年龄段 × 同行关系 约束映射
向导第 2 步「特殊要求」已扩为三组:同行人年龄段 / 同行关系(伴侣端)/ 住宿通用要求。勾选后不是记录标签,而是必须落到行程与酒店的硬约束。
A. 同行人年龄段 → 必做动作
| 选项 | 门票与核验 | 行程强度 | 酒店与交通 |
|---|---|---|---|
| 婴幼儿 0-3 | 多按年龄免票,需带户口本/出生证明 | 每 2h 一停;每天必须留午睡回酒店窗口 | 婴儿床、儿童安全座椅(租车必加购)、房间避开临街 |
| 学龄前 4-6 | 身高线为主(多 1.2m 免 / 1.2–1.4m 半票),出行前实测身高 | 单日 1 主景点 + 1 轻量点;避开长台阶/爬山 | 亲子房、浴缸防滑、电梯 |
| 小学生 7-12 | 半票线多 1.2–1.4m;讲解/研学票单独问 | 可 2 主景点;穿插科普/互动类项目 | 双床或加床、早餐口碑 |
| 初高中 13-17 | 多按学生证优惠,非身高;务必带证件 | 可按成人强度;偏好打卡/出片/沉浸式体验 | 双床房、Wi-Fi 稳定性 |
| 长辈 60-69 | 多数国有景区60+ 免票/半票,带身份证 | 减少台阶与爬山;索道/观光车/电梯优先写入行程 | 低楼层或电梯、防滑、安静远离电梯井 |
| 银发 70+ | 70+ 免票覆盖最广,部分景区需家属陪同 | 每天 1–2 个主景点;午后留休整 | 无障碍房、就近医院/药店信息写入手册提示列 |
⚠️ 年龄段硬规则:
- 免票/半票判定口径必须联网核实(年龄制 vs 身高制,同一景区不同项目可能不同),不要凭经验写。门票清单里对涉及人群标注「判定方式 + 需带证件」。
- 涉及儿童的项目(竹筏、漂流、玻璃栈道、高空项目、索道)必须逐项核查年龄/身高红线,有红线的在手册「提示」列明确写出,不可含糊。
- 同时勾选多个年龄段时,取强度交集(最低强度者为准),并在手册里注明"本行程按 XX 人群强度设计"。
B. 同行关系 / 伴侣端 → 酒店与行程取向
| 选项 | 房型与酒店取向 | 行程取向 |
|---|---|---|
| 情侣 / 夫妻 | 大床房(1.8m)、安静高楼层、避开团队房楼层 | 日落/夜景点位、避开赶场 |
| 蜜月 / 纪念日 | 景观房、可加布置、1–2 家升级体验 | 每天留 1 个仪式感点位,减少通勤半径 |
| 闺蜜 / 兄弟团 | 双床/连通房、可拼房控成本 | 出片机位、夜生活/市集、餐饮密度 |
| 带父母同行 | 电梯 + 低楼层、少换酒店、餐饮清淡 | 降低步数、减少台阶、预留休息点 |
| 三代同堂 | 家庭房/套房/连通房 | 强度按长辈与儿童交集取,备用休息点必写 |
| 独自出行 | 安全区位、避免偏僻夜路、单房差提醒 | 夜间活动收早、选择公共交通可达点 |
C. 落地检查(生成交付物前逐项过)
- 勾选的年龄段 → 门票清单是否标了判定口径与证件?儿童红线是否逐项核查?
- 勾选的关系 → 房型建议是否已写进手册的酒店列?
- 年龄段 × 关系冲突时(如「三代同堂 + 婴幼儿」)→ 强度是否按下限取?
- 通用要求(免费停车/含早餐/无障碍等)→ 是否作为筛选条件检索门店,而非事后补一句"建议确认"?
交付物 #6:景点图鉴 PPT(需二次确认 ⚠️ 硬门槛)
把每个已确认景点做成"一页一图"的图文介绍 PPT:真实照片(网页搜索实拍,非 AI 生成)+ 一句话介绍 + 门票/开放/停车/预约。副标题注明"真实照片、到点能玩"。
⚠️ 触发前提(两者都满足才动手,缺一不可)
- 用户已确认行程:trip_config.py / 出行简报已定稿,景点清单锁定(不中途变景点)。
- 对话内二次确认:AI 先明确问"是否生成景点图鉴 PPT?",等用户回复同意后才开始下载照片与生成。
- 禁止在"行程未确认"或"用户没说要"时主动生成——照片下载 + 逐张 AI 核对是重操作,先锁定再投入,避免返工。
完整流程
- 准备配置:复制
assets/generators/sights_config.example.py→ 工作目录sights_config.py,按已确认行程填META与SIGHTS(每个景点:key/name/day/img/intro/ticket/open/park/book;可选 search 覆盖下载词)。 - 下载照片候选:
python assets/generators/dl_sights.py --config sights_config.py --out assets/sights --per 3(360 图片搜索,国内可直连,无需鉴权)。 - 逐张 AI 核对(必须):用 Read 工具打开每张
assets/sights/<key>_N.jpg,确认主体与景点匹配;把匹配的那张重命名为<key>.jpg,删除其余候选。未核对的图严禁进入下一步。 - 生成 slide:
python assets/generators/gen_sights_ppt.py --config sights_config.py --photos assets/sights --out <PPT项目目录>→ 产出slides/*.slide+ STORY.md + DESIGN.md +assets/sights/*.jpg。 - 渲染:
slidep-start --project <PPT项目目录> --filename "景点图鉴.pptx";slidep-validate --all --project <PPT项目目录>全量校验(应 0 报错;中文无渲染字体时仅预览回退,用户本机 PowerPoint 有字正常)。 - 交付:
present_files打开预览;建议同时转 PDF 方便手机/家人。
版式与配色(已验证 13/13 通过)
- 封面(全幅 hero) → 目录 → 景点页(交替「左大图+右文字」「上大图+下卡片」避免单调)→ 结束(全幅 hero)。
- 主色 #0B7A8C(目的地主题绿)、强调 #F08A3C(日标签)、文本 #1F2937、浅底 #F4F8F9;标题华文中宋、正文微软雅黑。
- 价格均为成人参考价;儿童/老人优待已在门票清单和小册子标注,PPT 不展开。
复用要点
- 照片源建议 360 图片搜索(直链稳定);Wikimedia Commons 在国内常被重置,不要用。
- 每次出行景点不同 → 改
sights_config.py即可,生成器与模板无需改。 - 该 PPT 是小册子「景点速查」页的"看图版",二者数据同源(都来自已确认行程)。
腾讯地图 Key(地图手册/使用界面依赖)
> 发布版不内置任何 Key(已解绑作者个人 Key)。使用者需自行获取,二选一:
> ① 官网注册个人 Key:打开 https://lbs.qq.com → 注册/登录 → 控制台创建应用 → 拿到 Key 填到 trip_config.py 的 TMAP_KEY;
> ② 申请官网 AI 场景临时 Key(免费/1年/PV5000,需手机号+短信验证码):流程见 references/SOP.md 的"申请临时 Key"段,申请成功后配置保持 TMAP_KEY="AUTO" 即可自动读取。
- 配置 TMAP_KEY="AUTO" 时自动读取本机 ~/.tencentmap/tempkey.json(无则按上面指引提示);填具体 Key 字符串则直接使用。
- 注意:若在 lbs.qq.com 给 Key 启用了「签名校验」,WebService 接口(poi_search/direction)会被挡,但 JSAPI 底图仍可用——本手册只依赖 JSAPI,所以能用;若想用 poi_search 自动取坐标,则需关闭签名校验或提供 SK。
配置 schema(详见 example 与 examples/)
META / TMAP_KEY / POIS / ITIN / DAY_ROUTES / DAY_COLOR / TICKETS / COMPARISON / TICKET_DETAIL / INTEGRATIONS。
- assets/examples/ 含 3 个真实范例:trip_config.guilin.py(自驾·溶洞替换版)/ trip_config.shanxi.py(自驾·13天长线)/ trip_config.hk.py(公共交通·高铁+地铁),新行程可复制最接近的范例改造。
- POI 坐标为 GCJ-02(腾讯坐标系)。
- COMPARISON.disadvantages 每项可选加 "sev":"高"/"中" 字段,PPT 风险页会显示对应标签。
关键约定
- 坐标一律 GCJ-02;从手机地图复制的坐标通常已是 GCJ-02,可直接用。
book字段:must=需提前预约 / rec=建议提前 / no=无需预约,驱动门票清单配色与提示。- 凌晨抵达:提醒按"首晚日期"订房并备注"超早入住"。
- 地图手册不含导航码/二维码(用户曾要求去掉),如需可改回。
- 非自驾(公共交通)模式:仍可用同一套 POIS/ITIN/DAY_ROUTES 结构,手册文案把"自驾"改为"地铁/渡轮/步行"。
预留升级接口(当前均不启用,仅作为配置字段落库)
配置 trip_config.example.py 末尾已预留两块,供后续升级,当前版本只读不触发任何动作:
- TICKET_DETAIL:purchase_integrated 永远为 False(明确不代购);refine=True 时门票清单加列(推荐平台/参考价/提前天数/预约渠道),但购票仍由用户在飞猪/携程/美团等 App 自行完成。
- INTEGRATIONS.fliggy_transport:记录飞猪行程单链接占位,未来可解析航班/高铁时间并与本地行程对齐。
> 升级原则:凡涉及"交易/下单/自动同步"的能力,一律保持"仅记录、不执行",由用户亲自在外部 App 操作。
发布前检查(SkillHub)
发布命令(CLI 无定价能力,见文末):
cd ~/.workbuddy/skills
bash ~/.local/bin/skillhub --skip-self-upgrade publish ./selfdrive-trip-planner --changelog '本次变更说明'
⚠️ 必须先清掉非源码文件再发布:_collect_skill_files 只排除 .git/.idea/.vscode/node_modules/__pycache__ 与 *.pyc/.DS_Store/Thumbs.db,不排除 *.log 与自定义隐藏目录。平台会直接 400 拒绝:
> 不允许的文件类型: assets/generators/.slidep/slidep.log
- 已知来源:
gen_ppt_slides.py运行后会在assets/generators/.slidep/留下slidep.log→ 发布前mv .slidep <备份目录>(勿删,留作调试)。 - 发布前自检:
find . -type f \( -name "*.log" -o -name "*.tmp" -o -name "*.bak" \)。 - 顺序:
--dry-run预检通过 → 再正式 publish。 - 版本规则:新功能/新字段 → minor(2.2.1 → 2.3.0);修文案/改数据 → patch。
Frontmatter 必填清单(避免"信息缺失"驳回)
CLI 的 parse_skill_md_frontmatter 是手写解析器(非 PyYAML),有这些限制:
| 字段 | 类型 | 必填? | 说明 |
|---|---|---|---|
slug |
string | 是 | kebab-case 2-128 char |
version |
semver | 是 | x.y.z |
displayName |
string | 是 | 审核会卡 |
summary |
string | 强烈建议 | 一句话简介,否则技能页为空 |
description |
string | 强烈建议 | 详细描述 |
tags |
inline 数组 | 强烈建议 | 分类标签 |
license |
string | 强烈建议 | 推荐 MIT |
homepage |
string URL | 可选 | 项目主页或技能页 URL |
pricing |
嵌套 dict | 仅作存档 | CLI 不读嵌套;会被服务端二次解析(用于「按次计费」展示) |
关键陷阱:CLI 只认内联数组语法 tags: [a, b, c],不支持多行块列表 tags:\n - a!
- 多行写法 tags: + - item 在 CLI 里会被解析成空字符串(out["tags"] = ""),上传后平台读到空 → 提示"信息缺失"。
- triggers 同样要写成 triggers: [短语1, 短语2]。
发布前自检命令(打印 8 个上传字段是否非空):
cd ~/.skillhub && python -c "
import importlib.util,json
spec=importlib.util.spec_from_file_location('cli','skills_store_cli.py')
m=importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
from pathlib import Path
md=m._load_skill_metadata(Path('C:/Users/c361024/.workbuddy/skills/selfdrive-trip-planner'),None)
for k in ['slug','version','displayName','summary','description','tags','license','homepage']:
v=md.get(k,''); flag='空' if (v=='' or v==[]) else 'OK'
print(' %-12s %-4s %s'%(k,flag,json.dumps(v,ensure_ascii=False)[:80]))
"
图标(web 表单上传):CLI 不支持传图标,包内也不允许 .png。发布表单「自定义图标」上传 PNG(推荐 512×512,路径自行存放)。
版本记录
- v2.3.3(2026-09-04)
- 补齐发布元数据(此前这 4 项以空字符串提交,是技能页/发布表单提示"信息缺失"的原因):
- 新增
summary:一句话简介。 - 新增
tags:分类标签。注意 CLI 只读取tags,旧的triggers不会上传,两者需并存。 - 新增
license(MIT)、homepage(技能页链接)。
- 新增
- 图标(512×512 PNG)放在
D:\WorkBuddyData\_skill_publish_backup\selfdrive-trip-planner_icon_v1.png,不进发布包(平台拒绝包内 .png);发布表单「自定义图标」上传时手动选择该文件。 - v2.3.2(2026-09-04)
- 新增
README.md:技能页文档(能力说明 / 快速开始 / 地图 Key 准备 / 目录结构 / 计费说明),补齐此前无 README 导致的技能页文档缺失。 - v2.3.1(2026-09-04)
- 商业化:frontmatter 新增
pricing块(model: per_call/amount_fen: 50)→ 按次计费 ¥0.50/次。 - 注意:定价生效还需在 SkillHub 后台完成「入驻 SkillPay + 绑定收款渠道」,并在发布时选择「按调用量计费」;仅有 frontmatter 声明而后台未入驻,技能仍是免费。
- v2.3.0(2026-09-04)
- 住宿集团/联盟选项 5 → 13,按「国内连锁集团 / 国际酒店联盟 / 其他」三段分组,每项带子品牌悬停提示。
- 新增《酒店检索:集团 × 档次 子品牌速查》表(12 集团 × 4 档)+ 中国区易错点(美居/宜必思走华住、希尔顿欢朋走锦江、县域优先国内集团)。
- 「特殊要求」6 → 22 项,拆为「同行人年龄段 / 同行关系(伴侣端)/ 住宿通用要求」三组。
- 新增《特殊要求:年龄段 × 同行关系 约束映射》:年龄段 → 门票判定口径/行程强度/酒店交通;同行关系 → 房型/氛围/节奏;含落地检查 4 条。
- 向导简报 schema 1.1 → 1.2:
accommodation新增age_groups、party_type字段(requirements语义收窄为「住宿通用要求」,向后兼容)。 - v2.2.1(2026-08-31)
- 清理城市推荐数据库中的涉政敏感内容(移除领导人姓名、革命旧址、战役纪念馆、红色标签等),替换为自然/人文/古建景点。
- 修正象鼻山地址表述。