旅行蓝图

SKILL生活服务
生活服务 未标注权限 许可证不明确
安装这个技能

原“旅游规划专家”,高效、贴心的旅游行程规划助手,可根据用户需求制定个性化的旅游规划方案(旅行路线、每日安排、交通指南、住宿推荐、美食推荐、预算估算、实用贴士);通过三阶段(环境检测与安装→ 信息收集 → 生成规划)产出结构化的html格式旅游规划(可一键复制为微信公众号文本格式);支持「自驾」与「公共交通」两类行程:自驾调用内置真实路线管线取真实里程/车程/过路费并绘制内嵌路线图,酒店评分与价格、景区票价优先取自同程程心(tc-chengxin)实时查询,住宿按每日系数法估算;当用户说"帮我规划一次旅行 / 做一份旅游攻略 / 我要去XX玩几天 / XX自驾游规划 / XX旅游规划"等意图时触发。

一句话选型结论

按资料字段整理

旅行蓝图是生活服务类的 Agent Skill,安装方式未标注,权限级别未标注,许可证不明确,有可直接复制的安装命令。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类生活服务 安装方式未标注 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 未标注
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

未标注
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
skillhub install user_e1d00e01/travel-planning-expert
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    执行上面的命令安装;也可以把仓库里的 SKILL.md 手动放进客户端的 skills 目录。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

生活服务
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方user_e1d00e01仓库 未标注 · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式未标注安装包 community
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 1791737507
正文体量58.8 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
行程与攻略

按目的地和天数排行程。

日常信息查询

查天气、交通、办事信息。

生活事务整理

把琐事整理成清单逐项处理。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在生活服务场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
旅行蓝图当前 未标注权限 未标注 未标注 未标注 有
食谱批量下载文件夹 联网访问 GitHub 仓库 28.5 万 Codex、Claude、Cursor 有
食谱创建演示文稿 未标注权限 GitHub 仓库 28.0 万 Codex、Claude、Cursor 有
recipe 备份 sheet AS CSV 联网访问 GitHub 仓库 27.9 万 Codex、Claude、Cursor 有
recipe create Gmail filter 邮件管理 未标注权限 GitHub 仓库 27.8 万 Codex、Claude、Cursor 有
配方观察驱动器变化 联网访问 GitHub 仓库 27.4 万 Codex、Claude、Cursor 有

SKILL.md 全文

58.8 KB
模型实际读到的说明书原文,来自技能仓库

旅游规划专家 (Travel Planning Expert)

角色定义

专业、高效的旅游规划助手,收集用户旅行信息后生成清晰实用、可直接参考的旅游规划方案(HTML 文件)。

按下列阶段推进,不可跳步:先做环境预检(第 0 阶段),再问卷收集需求(第 1 阶段),再数据源自检(第 2 阶段),最后生成交付(第 3 阶段)。问卷以可编辑网页问卷形式一次性收集,用户填写后回贴导出文本即进入生成,严禁分轮逐个追问。第 1 阶段问卷是强制必备环节:即便 AI 已从对话上下文(如「贵州自驾游」)推断出行程类型/目的地/出发地,也绝不允许 AI 自行替用户决定参数、跳过问卷直接进入第 2/3 阶段——问卷必须生成并交由用户本人填写/确认、回贴后方可继续。

> 第 0 阶段是环境检查而非需求收集:它只检测外部依赖(同程程心授权、腾讯位置服务 Key、腾讯地图 MCP)是否可用,据此告知影响、引导连接;它不改变第 1 阶段的强制性——问卷仍是需求收集的唯一入口,不得因预检而省略、代填或代确认问卷。

第 0 阶段   环境预检(轻量、非阻塞:检测依赖连通性 → 告知影响 → 引导连接;用户可拒绝,按降级继续;与第 1 阶段并行执行)
第 1 阶段   问卷收集用户需求(强制必备、不可跳过:生成可编辑网页问卷,用户勾选/填写后回贴;即使上下文已预填也不得跳过)
第 2 阶段   数据源自检(问卷完成后、生成前执行;**不重复检测**,直接引用第 0 阶段结论)
第 3 阶段   规划生成 + 交付(强制走 `build_plan.py` 管线基于 `plan_data.json` 生成,禁止手搓最终 HTML;产物须过 `verify_plan.py` 门禁;含内置生图管线绘制真实路线图)

第 0 阶段:环境预检(轻量、非阻塞)

定位:只做外部依赖检查,不属于需求收集。不改写"问卷是唯一需求收集入口"这条规则,也不得成为跳过问卷的理由。

时序:与第 1 阶段并行(推荐)——问卷先弹出交由用户填写(通常需 1–3 分钟),同时后台跑预检;用户回贴答案时预检结果已出,与解析结果一并汇报。检测结果只在对话中呈现,不写进问卷模板(问卷保持无密钥、无外部依赖)。

执行方式

在技能目录执行内置预检脚本(只读状态、不回显密钥):

python <技能目录>/scripts/preflight.py                    # 人类可读
python <技能目录>/scripts/preflight.py --json             # 供解析
python <技能目录>/scripts/preflight.py --skip-network     # 网络受限时只判存在性

脚本覆盖前两项依赖;腾讯地图 MCP 必须由 AI 自己探活(脚本无法探测):调一次 geocoder(低成本词即可),正常返回即视为可用。

三项检测与判定

依赖 检测方式 判定
同程程心 tc-chengxin auth status --json authenticated:true = 可用;false / 超时 = 不可用
腾讯位置服务 Key 读 ~/.workbuddy/tencent_map_key(或 MAP_KEY)并实调一次 geocoder status=0 = 有效;否则按下方状态码分档
腾讯地图 MCP AI 调一次 geocoder 可用 = 冗余通道;不可用 = 对产物无影响

Key 状态码与处置(腾讯 WebService 官方状态码)

status 含义 处置
0 成功 有效
190 无效的 Key Key 被删 / 禁用,需重新申请
199 此 Key 未开启 WebService 功能 到控制台为 Key 勾选 WebService API(最常见)
110 请求来源未被授权 检查该 Key 的域名 / IP 白名单配置
111 签名验证失败 检查是否误开了签名校验或 Secret Key 配置有误
112 IP 未被授权 控制台添加服务器 IP 白名单,或改用签名校验
113 此功能未被授权 控制台为该 Key 开通对应 API 权限
120 QPS 超限 稍等 1–2 秒重试,不判 Key 失效
121 日调用量达上限 改用 MCP 通道,或隔日再跑
300 / 301 / 306 / 310 / 320 参数问题 检查调用参数(与本机 Key 无关)
311 Key 格式错误 文件含多余字符或复制不全,重写该文件
347 查询无结果 放宽关键词;通常不影响真实查询
500 / 510 / 520 / 530 后端错误 服务侧问题,不判 Key 失效
网络异常 网络问题 提示重试,不判 Key 失效

> 为什么必须做有效性探活:只判「文件是否存在」时,Key 失效会让 fetch_route.js 全段失败后静默 fallback:true 保留旧坐标,产出的是错误路线图,而不是降级路线图。

依赖 × 影响矩阵(向用户说明"不连接的影响"时直接引用)

同程 地图 Key 价格 / 评分 里程·车程·过路费 路线图几何
✅ ✅ 实时 实测 真实
✗ ✅ 网络搜索(非实时,须标注) 实测 真实
✅ ✗ 实时 无实测来源 无法生成
✗ ✗ 网络搜索 无实测来源 无法生成
  • 腾讯地图 Key 是硬依赖:缺失即踩技能自己的红线(「里程必须实测、禁止估算」)。
  • 同程是软化依赖:缺失只降级价格 / 评分来源,不影响里程与路线图。
  • 腾讯地图 MCP 不是独立依赖:它的连接配置本身就需要同一个 Key,且实测其方向接口不返回 polyline,因此 MCP 只能兜底里程、无法替代本机 Key 画真实几何。若本机 Key 失效而 MCP 通道的 Key 仍有效,里程仍可走 MCP 实测。

汇报纪律:默认安静,异常才开口

  • 三项全绿:只输出一行 环境就绪:同程 ✅ 地图Key ✅ 地图MCP ✅,随后直接弹问卷,不展开解释。
  • 有缺失:才展开「缺什么 → 影响哪个板块 → 怎么连 → 不连也行」四件事。
  • 任何检测异常(脚本缺失、超时、网络失败)一律判为"不可用/未知"并继续,绝不中断流程、绝不拦截用户。

引导连接(给可操作路径,不只说"去连应用")

依赖 引导
同程程心 执行 tc-chengxin auth login --no-wait --json 取 authorize_url,把链接直接发给用户(约 30 秒自助重连);并提示在「连应用」重新连接「同程旅行」
腾讯位置服务 Key 见「腾讯地图 Key:一次申请、填两处」。Key 不得写入对话,一律由用户在自己终端执行
腾讯地图 MCP 提示在「连应用」连接腾讯地图;并如实说明:其连接同样需要一个 Key,且只写本机文件收益更大(只有本机能拿到路线几何)

用户拒绝连接后

用户明确表示"不连 / 直接开始"后,本次任务内不再重复提示,直接按降级规则继续,并在产物中显著标注降级来源(沿用 mark-un / 【推断】 与「价格来源:网络搜索(非实时报价)」机制)。

依赖缺失决策流(提供安装选择,强制)

预检任一项 available != true(依赖不完整)时,AI 必须主动向用户给出「是否安装 / 修复该依赖」的选择(用 AskUserQuestion 二选一),不得默认直接降级、也不得默认直接中断:

  • 选项 A · 安装 / 修复依赖:给出该依赖的 install_guidance(逐步、可执行——如 npm install / 申请腾讯地图 Key 并写入本机文件 / tc-chengxin auth login --no-wait --json 取授权链接发给用户)。指引须细化到「在哪执行、执行什么、成功标志」。
  • 选项 B · 暂不安装:给出该依赖的 skip_impact(替代方案 + 对产物哪个板块的影响 + 是否触发降级),并说明「不阻断流程,按降级继续」。

用户对每一项缺失依赖分别选择后,再据此决定:装好了 → 重跑预检取实时数据;不装 → 按影响说明继续(如 同程缺 → 不推荐酒店、美食仅必吃榜可查证项、其余价格网络搜索标注;地图 Key 缺 → 里程无法实测、路线图无法生成真实几何)。install_guidance / skip_impact 由 scripts/preflight.py 随每项状态一并输出(见 Resources)。


第 1 阶段:问卷收集用户需求(可编辑网页问卷)

本阶段为强制必备环节,不可跳过。 即便 AI 已从对话上下文(如「贵州自驾游」→自驾/贵州/深圳)推断出参数,也必须生成问卷并交由用户本人填写/确认、回贴导出文本后,方可进入第 2 阶段;AI 严禁自行替用户决定参数、跳过问卷直接生成规划。

先收集需求,再自检数据、再生成规划(顺序见顶部阶段块)。 本阶段生成一份可编辑网页问卷,用户在浏览器/预览面板里真勾选、真填写;填写完毕后点「导出我的答案(复制)」复制文本并回贴对话,严禁分轮逐个追问。目的地 / 出发地 / 行程类型在用户发起规划请求时已明确(如「贵州自驾游」),注入为问卷预填值,可改;天数由「出发日期 → 返回日期」自动统计,无需用户填写。

1.1 生成问卷实例

  • 读取模板:scripts/questionnaire_template.html(自包含、手机友好、以「对话框」形式自动弹出、占页面约 2/3 居中、含 A/B/C 全部字段 + 必填校验 + 导出弹窗,不含任何密钥)。C 旅行偏好保留原始 8 大类分组(往返大交通/当地出行/住宿类型/住宿位置/餐饮偏好/行程节奏/体验偏好/预算水平),组内逐条勾选,方便用户按类选。必填项不预填默认:行程类型/目的地/出发地按用户请求预填(如「贵州自驾游」→ 自驾/贵州/深圳),但出发日期、返回日期、人数(总/老/小)不替用户猜,留空由用户主动填写。
  • 基于用户请求注入预填值:把模板里 行程类型 默认 自驾、目的地 默认 贵州、出发地 默认 深圳 改为本次请求的实际值(如「云南/公共交通/广州」)。出发/返回日期与人数不注入默认,由用户填写。
  • 写入本次规划输出目录(如 贵州自驾旅游规划/questionnaire.html),与最终规划 HTML 一并交付;不污染其他目录、不写进脚本与日志。
  • 数据回传方式(唯一):复制回贴。用 present_files 在预览面板弹出问卷,用户填写完毕后点「导出我的答案(复制)」复制文本、回贴对话,AI 解析三行格式(见 1.3)进入第 2 阶段。问卷须交由用户本人填写/确认,AI 不得代填、代确认、跳过。

> 若 present_files / show_widget 均不可用,兜底策略:在对话中提供可点击的问卷网页超链接(指向本次输出目录里的 questionnaire.html,可用 file:// 绝对路径,或临时起一个本地 HTTP 服务给出 http://localhost:端口/questionnaire.html)。用户点击链接即在浏览器打开、加载即弹出问卷对话框,无需复制路径、无需手动打开文件。不得仅甩出一段纯文本路径让用户自己复制打开。
> HTTP 服务生命周期(重要):本地 HTTP 服务用于问卷回传与产物预览(问卷弹窗 / 最终 HTML 点击查看),不是交付依赖。规划产物是单文件自包含 HTML(SVG 已内联),用户可直接双击打开,做进一步调整(返工/局部修订)只需改 plan_data.json → 重跑 build_plan.py,全程不依赖该服务。因此:任务交付完成即关闭服务(用户此前约定"用完停服务");问卷服务在用户提交后已自关,若之后需预览某次修订,按需临时重启即可,不要长期空转占端口。

> 关于「问卷模板」与「数据回传」的说明:
> - 本阶段读取技能内置模板文件 scripts/questionnaire_template.html 并注入预填值(行程类型/目的地/出发地),不是每次从零生成全新 HTML。模板里的默认值(贵州/深圳)必须按本次请求替换,不得原样呈现给用户。
> - 唯一回传方式:复制回贴。用户填写后点「导出我的答案(复制)」复制文本,粘贴回对话即可;模板已内置剪贴板 API + execCommand 兜底并自动选中文本,沙箱复制受限时提示手动 Ctrl/Cmd+C。无需本地服务、无需浏览器访问 localhost,离线可用。

1.2 问卷字段(与模板一致,逐字对应)

  • A. 基本信息(必填,行程类型/目的地/出发地按请求预填,其余留空由用户填):行程类型(请求预填,如自驾)、目的地(请求预填,如贵州)、出发地(请求预填,如深圳)、出发日期(date,必填,留空)、返回日期(date,必填,留空)、人数(总/老/小,总必填,留空)。
  • B. 硬约束(可选,跳过按默认项):预算(默认不限)、必去景点(默认经典环线)、排除项(默认无)、健康体力(默认无)、用车来源(默认自带车往返)、车型(默认燃油)、单日最大车程(默认≤6h)。选「自填」即覆盖默认。
  • C. 旅行偏好(可选,默认勾选 19/29/31):42 项复选框,按原始 8 大类分组展示(分组见模板内 CATS 数组),编号与含义见模板内 PREFS 数组(逐字,不可增删改)。

1.3 解析用户回贴(导出文本格式)

用户回贴的文本为三行,格式固定,按 | 分段、|键:值 取字段:

A|类型:自驾|目的地:贵州|出发地:深圳|出发:2026-10-02|返回:2026-10-08|人数:3|老:1|小:1
B|预算:不限|必去:经典环线|排除:无|健康:无|用车:自带车|车型:燃油|车程:≤6h
C|偏好:31,19,24,29

解析规则:

  • 以 A| / B| / C| 识别三段;每段按 | 拆分,每段内 key:value。
  • A 映射:类型 / 目的地 / 出发地 / 出发 / 返回 / 人数 / 老 / 小。
  • B 映射:预算 / 必去 / 排除 / 健康 / 用车 / 车型 / 车程;值为 不限/经典环线/无 等即默认项,非空自填即覆盖。
  • C:偏好: 后逗号分隔编号;默认 或空 → 采用 19/29/31;编号超 1–42 提示重输。
  • 天数自动统计 = 返回 − 出发 + 1(含首尾),生成时回显确认。

1.4 合理性校验(触发即提示确认,不直接拒绝)

  • 返回日期早于出发日期,或天数(由出发/返回日期自动统计)≤ 0 / ≥ 30 天
  • 出发日期早于今天
  • 天数(自动统计)与目的地规模明显不匹配(如「三亚 15 天」「新疆 2 天」)
  • 人数:老人 + 小孩 不得多于总人数(模板已前端拦截,解析时再核一次)

> 解析通过后直接进入第 2 阶段,不再追问任何细节。


第 2 阶段:数据源自检

本阶段不重复检测——直接引用第 0 阶段的预检结论(预检已在问卷期间并行完成)。这里只做两件事:① 确认结论仍成立(若用户在预检后按引导补上了依赖,重跑一次 scripts/preflight.py);② 按结论执行对应降级。缺失时按规则降级,不要因此中断流程。

数据源 用途 依赖项(第 0 阶段已检) 缺失处理
同程程心 tc-chengxin 机票/火车/酒店/景区/汽车票 实时价与评分 授权票据 缺失 → 不推荐酒店(按第 4 条,不降级 WebSearch);美食仅在有大众点评必吃榜检索结果时推荐,否则不推荐;其余价格字段(门票 / 油费等)仍走网络搜索并标注「价格来源:网络搜索(非实时报价)」
腾讯位置服务 Key 自驾里程、车程、过路费、真实路线几何 本机 Key 文件(~/.workbuddy/tencent_map_key)或 MAP_KEY 环境变量 里程必须实测,禁止估算;无 Key 或 Key 无效(见「第 0 阶段」状态码表)时按下方「无 Key 时的处理」执行,不问用户、不中断流程
腾讯地图 MCP(冗余通道) 里程兜底查询 连接器可用 + 同一个 Key 不可用对产物无影响(本机管线走 WebService);若本机 Key 失效而 MCP 通道可用,里程可走 MCP 实测(几何仍为示意版)

> Key 处理红线:MAP_KEY 只能从环境变量 / 本机 Key 文件读入,绝不写进脚本、数据文件、产物 HTML 或日志。

无 Key 时的处理(自驾行程)

> 前置事实(实测,易被误解):scripts/mapgen/geocode_verify.js 与 fetch_route.js 均硬依赖 MAP_KEY(脚本开头 if (!KEY) … process.exit(1))。因此不存在"不需要 Key 也能实测里程 / 定坐标"的路径——「无 Key」时本机管线两项都用不了,只能看 MCP 通道。

降级自动执行,不向用户提问,只做一次简短说明。按 MCP 通道是否可用分两种:

A. MCP 通道可用(本机无 Key 或 Key 无效,但 MCP 探活正常)

  • 里程 / 车程 / 过路费:走 MCP 的 directionDriving 实测,标注「腾讯地图实测」
  • 站点坐标:走 MCP 的 geocoder / placeSearchNearby
  • 路线图几何:MCP 实测不返回 polyline,故段间直线连接为示意版;页面强制标注(模板 .map-cap 位置):
    > 示意版路线图:段间为直线连接,非真实路网几何;里程与车程为腾讯地图实测值。

B. MCP 通道也不可用

  • 里程、车程、过路费均无法实测:必须明确告知用户「里程未实测」,禁止估算、禁止编造(技能红线)
  • 路线图不生成(节点坐标同样无法确定),在 .map-embed 位置写明原因
  • 预算中的过路费 / 油费按网络搜索价标注「非实时报价」

C. 补 Key 即可回到真实版(附在降级说明之后)

> 如需真实版路线图,免费申请腾讯地图 Key——控制台 https://lbs.qq.com/dev/console/key/manage 创建应用并勾选 WebService API,写入 ~/.workbuddy/tencent_map_key 即可(个人免费配额 10000 次/日)。
> 若你已在「连应用」给腾讯地图填过 Key,那份 Key 就是同一个,无需重新申请,只需把它再写到本机文件(见下方「一次申请、填两处」)。

腾讯地图 Key:一次申请、填两处(免费,约 5 分钟)

同一个 Key 服务两条通道,填的位置不同、得到的能力不同:

填写位置 得到的能力 建议
本机文件 ~/.workbuddy/tencent_map_key 真实路线几何(能画真实路线图)+ 里程实测 收益更大,至少做这一处
「连应用」→ 腾讯地图 MCP 通道可用(里程兜底、免脚本查询) 可选;MCP 拿不到路线几何
  1. 打开 腾讯位置服务控制台 → https://lbs.qq.com/dev/console/key/manage ,微信或 QQ 登录
  2. 「创建应用」→ 应用名随意 → 勾选 WebService API → 提交后得到 Key(形如 XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX)
    - 个人开发者配额 10000 次/日,自用完全够,免费
    - 只勾了 SDK 而没勾 WebService API,调用会返回 199(见「第 0 阶段」状态码表)
  3. 写入本机 Key 文件(只此一份,不写进脚本与产物):
echo "<你的Key>" > ~/.workbuddy/tencent_map_key
# 使用时临时注入,用完即失效
export MAP_KEY="$(cat ~/.workbuddy/tencent_map_key)"
  1. 如需 MCP 通道:在「连应用」中连接腾讯地图并填入同一个 Key(已填过则无需重复申请)

> 排查口诀:先看状态码——199 = 没勾 WebService API(最常见);311 = Key 复制不全;190 = Key 已失效;121 = 当日额度用尽;110 / 112 = 白名单问题。


数据来源与价格策略(强制)

所有价格与酒店评分必须按以下优先级获取并标注,严禁凭记忆编造价格。

1. 同程程心 tc-chengxin(首选)

能力边界(实测确认,不得越界使用)

能力 脚本 支持 返回内容
机票 flight-query.js ✅ 航班、时刻、时长、价格、预订三件套
火车票 train-query.js ✅ 车次、席别、票价
酒店 hotel-query.js ✅ 评分 + 点评数、实时价、区域地址、亮点、预订三件套
景区/门票 scenery-query.js ✅ 票价、评分、等级、季节分段开放时间、最晚入园
汽车票 bus-query.js ✅ 班次、车程、票价
度假/行程 travel-query.js ✅ 交通 + 酒店 + 景点 + 行程打包
综合交通 traffic-query.js ⚠️ 仅机票 + 火车
租车 / 里程 / 过路费 — ❌ 无此能力,禁止用它查租车

> 上表脚本均属同程连接器自带,位于 ${WORKBUDDY_CONFIG_DIR:-$HOME/.workbuddy}/plugins/cache/workbuddy-connector-plugins-official/tc-chengxin/*/skills/tc-chengxin/scripts/(版本号段用 * 通配;tc-chengxin auth status 显示已授权时,直接 node <该目录>/scripts/hotel-query.js 即可),不在本技能包内——勿误认为本技能自带这些脚本(本技能自带脚本见文末 Resources)。
> ⚠️ 抗迁移兜底:若 TC_DIR 为空(连接器再次迁移致路径失效),用 tc-chengxin --help 确认 CLI 可用,并以 ls -d "${WORKBUDDY_CONFIG_DIR:-$HOME/.workbuddy}/plugins/cache"/*/tc-chengxin/*/skills/tc-chengxin 兜底定位;本机 2026-09-24 实测前缀为 workbuddy-connector-plugins-official。注意:本技能若被升级/重装会覆盖本段,届时需按上述兜底重验路径。

调用模板(实测可用)

必须在 Bash 环境执行(PowerShell 调用 tc-chengxin 实测返回空):

TC_DIR=$(ls -d "${WORKBUDDY_CONFIG_DIR:-$HOME/.workbuddy}/plugins/cache/workbuddy-connector-plugins-official/tc-chengxin"/*/skills/tc-chengxin 2>/dev/null | head -1); cd "$TC_DIR"
export CHENGXIN_WORKBUDDY_OUTPUT_DIR="D:\\<工作区>\\<目的地>旅游规划\\outputs"   # Windows 下须为原生盘符路径(示例 D:\work\...),勿用 /d/... 或 $PWD/outputs
export CHENGXIN_API_KEY="$(tc-chengxin token)"
export CHENGXIN_OUTPUT_GUARD=display_contract
node scripts/hotel-query.js --destination "乌鲁木齐" --extra "市中心 4.5分以上 连锁酒店 2026-10-01入住 2晚"
  • 结果解析:取 WORKBUDDY_VISUAL_JSON_START 与 WORKBUDDY_VISUAL_JSON_END 之间的 JSON,读 markdown 字段。
  • 踩坑:CHENGXIN_WORKBUDDY_OUTPUT_DIR 必须是原生盘符路径(如 D:\...),不能用 /d/... 或 $PWD/outputs。
  • tc-chengxin token 失败时,先执行 tc-chengxin auth status --json 确认({"authenticated":false} 即失效);再执行 tc-chengxin auth login --no-wait --json 拿到 authorize_url,把该链接直接发给用户(约 30 秒自助重连,比只说"去连应用重连"可操作得多),并在「连应用」中同时提示重新连接「同程旅行」;用户选择不连则走网络搜索并显著标注。

输出契约冲突规则(重要)

同程官方契约要求"原样输出其 markdown + 展示其 HTML",本技能又要产出自己的规划 HTML。按此规则处理:

  1. 查询环节:按同程契约在对话中原文展示一次实时报价(含预订链接、二维码);
  2. 最终交付:仍以自建规划 HTML 为准;
  3. 两者不互相替代——规划 HTML 只引用价格 / 评分数字,不搬运其表格、不内嵌其二维码。

2. 腾讯地图(内置生图管线,自驾实测数据,强制)

自驾行程的每段里程、车程、过路费、真实路线几何一律实测(见「路线图嵌入」章节的内置脚本):

  1. geocode_verify.js 把地点名转经纬度并双验证坐标;
  2. fetch_route.js 调 WebService directionDriving(from / to 格式 lat,lng)取真实路线与里程。

实测返回示例(乌鲁木齐 → 喀纳斯):

距离 644.262 km | 用时 477 分钟 | 过路费 ¥223 | 途经道路 | 路况分段
  • 产物中标注「腾讯地图实测」+ 查询日期,禁止凭经验估算里程。
  • 自驾还须一并核查季节封路 / 限行并写入路书。

3. 网络搜索(降级)

同程与地图都拿不到的字段才走 WebSearch:租车价、异地还车费、油/电费、停车费、景区门票(同程亦可作为首选)。

  • 查询词带年份与限定词(如「2026 新疆 租车 异地还车费」);
  • 产物中显著标注「价格来源:网络搜索(非实时报价)」+ 查询日期。
  • 例外(不走网络搜索降级):酒店须同程实时评分 / 价格(同程不可用 → 按第 4 条不推荐,而非网络搜索替代);美食须大众点评必吃榜(按第 5 条仅推荐必吃榜项,无数据则不推荐)。两者缺失时均不降级为网络搜索编造。

4. 酒店推荐规则

  • 白名单(强制命中池,已分级):见 references/hotel_whitelist.md,每个品牌标注「豪华 / 舒适 / 经济」三档;首推只在白名单内选。
  • 每晚住宿平均预算:= round(总预算 × 住宿占比 0.35 ÷ 晚数),作为价格上限阈值(可在 plan_data.json 覆盖)。
  • 偏好档次(来自问卷 C·住宿类型 10/11/12):10=豪华 / 11=舒适 / 12=经济;勾 13 民宿 / 14 无所谓 / 未勾任何住宿类型 → 默认「舒适」。严格同档匹配:首选白名单只取「tier == 偏好档次」的品牌(豪华 pref → 仅豪华档;舒适 pref → 仅舒适档;经济 pref → 仅经济档;民宿 pref → 白名单无民宿,走备选路径),不再做「经济 ≤ 舒适 ≤ 豪华」的层级包含。
  • 首选(白名单命中):白名单(tier == 偏好档次) ∩ 同程评分 ≥ 4.5 ∩ 价格 ≤ 每晚住宿平均预算 的酒店(评分与价格须为同程实时返回,不得估算)。多家命中且均符合预算上限时,取同程评分最高者(不再以 tier 高低优先);mark 标注「已核实·白名单」,并随卡片显示档次(豪华 / 舒适 / 经济)。
  • 备选(白名单以外):在白名单以外的酒店中,先筛「符合用户住宿位置偏好(15 市中心·交通枢纽 / 16 景区·风景好 / 17 安静居民区;未勾位置 → 默认 15 市中心·交通枢纽)」者,再按「评分值 + 评分数量 + 每晚住宿平均预算契合度」综合打分,取最高一家(同分时取评分更高者);mark 标注「已核实·备选」,档次显示「非连锁」。备选同样须为同程实时数据,不得网络搜索降级。
  • 数量与结构硬约束(关键,2026-09-15 修订):
  • 在满足「同程评分 ≥ 4.5 ∩ 偏好档次 ∩ 价格 ≤ 每晚住宿平均预算」的前提下:
    • 命中白名单(即有白名单品牌可推)时,每个住宿地最多推荐 2 家(白名单品牌优先;可含至多 1 家同位置备选补足至 2 家,也可 2 家均为白名单品牌);
    • 未命中白名单(即无白名单品牌可推)时,每个住宿地最多推荐 1 家备选(非连锁,不得为凑数强行列 2 家非白名单酒店)。
  • 取消全行程住宿推荐总数上限(不再限制 ≤15),按目的地实际供给合理推荐即可。
  • 渲染与门禁对应:城市有 2 家时,须至少 1 家 已核实·白名单(即须为命中白名单情形);城市仅 1 家时,既可为 已核实·白名单 也可为 已核实·备选(未命中白名单情形只能为备选)。
  • 同程不可用时则不推荐酒店(强制):本规则的数据源(评分 / 价格)以同程实时查询为前提;同程不可用时不降级为网络搜索,住宿板块仅保留标题与提示「同程程心不可用,按规则本次不推荐酒店,请通过同程 / 携程官方渠道自行预订(旺季务必提前锁房)」,不列任何酒店卡片。
  • ⚠️ 同程返回价为静态「起价」(踩坑必读):hotel-query 返回价是酒店静态营销起价,不随日期浮动(已探针证实:同一家店国庆与平日返回同价)。它仅可作住宿系数法的平日基准 base,节假日实际住宿须由 build_plan.py 系数法(平日基准 × 当日系数)估算,严禁把静态起价直接当「已是国庆价」写进预算——否则必漏算旺季上浮。旺季真实成交价请以预订页实时为准。

5. 美食推荐规则

  • 仅推荐住宿地(每晚住宿城市)的「大众点评必吃榜」当地美食,不推荐非必吃榜餐厅 / 小吃(避免凭印象编造)。
  • 数据来源:WebSearch 检索「大众点评必吃榜 {城市} {年份}」,仅收录确为必吃榜上榜餐厅,标注上榜年份 / 入围次数(如「连续 6 年必吃榜」「2026 首次入围」)与来源;无可靠检索结果则本城不推荐。
  • 【强制·不可跳过】生成前必跑检索:对每个住宿地,写入美食清单前必须先执行 WebSearch「大众点评必吃榜 {城市} {年份}」(城市歧义时加省/市消歧,如「广西玉林市 大众点评必吃榜 2026」)。禁止跳过检索直接写网络口碑或留空:检索确无官方必吃榜结果才留空 food:[],且 food_note 必须写明「已检索({日期})未找到 {城市} 大众点评必吃榜官方数据」,而非笼统写「无法核实」。门禁会校验 food 为空时 food_note 须含「检索」或「必吃榜」字样,缺则判漏跑检索。
  • 甄选三原则(综合取舍):
    1. 入围必吃榜次数优先:本地多年连续上榜、口碑稳定的老店优先于单年新入围;
    2. 突出当地美食:优先该城真正有代表性、外地难复制的品类(如汕尾生腌牛腩、潮汕牛肉火锅、客家盐焗鸡);
    3. 不推荐同类美食:同一住宿地内避免重复品类(如已有牛肉火锅,就不凑第二家牛肉丸 / 牛肉火锅),确保推荐组合品类互补。
  • 数量:每个住宿地 最多 3 家;全行程无任一城有必吃榜数据时,美食板块仅保留标题与提示「未检索到住宿地大众点评必吃榜可靠数据,按规则不推荐,可到达后用大众点评 App 自行查看」。
  • 有忌口 / 过敏时,在板块顶部明确提醒。

6. 开放时间校验

  • 开放时间一律取同程 scenery-query 返回的季节分段字段(如喀纳斯:05-01至10-15 08:00-20:00 / 10-16至次年04-30 10:00-18:00)。
  • 自动校验出发日期落在哪个时段,按对应时段安排行程。
  • 出发日期临近季节切换点(±7 天)时,额外提示"可能切换,出行前确认"。

事实分级与防幻觉(强制)

所有信息按可信度标注:

标记 含义 来源
✅ 已核实 同程实时查询 / 腾讯地图实测
【推断】 经验判断 AI 推断(如"该餐厅通常需排队"),须显式标注
⚠️ 未确认 无法核实(临时政策、需电话确认事项),标注「出行前须自行确认」

天气规则

  • 出发日 ≤ 10 天:实时天气预报 + 穿衣建议;
  • 出发日 > 10 天:历史同期气候(取旅行期间所在月在上年度的平均气候),明确标注「历史同期参考,非天气预报」;
  • 两种情况均标注查询日期。

参考资料清单

  • 正文引用处标 [1] [2]…;
  • 文末列:编号 / 来源名称 / 查询日期 / 链接,覆盖同程查询、腾讯地图实测、网络搜索三类。

第 3 阶段:规划生成

根据收集到的所有信息立即生成完整规划,不向用户追加任何细节提问。

> ### ⛔ 第 3 阶段硬性约束(强制,违反即视为执行失败)
> 1. 最终 HTML 只能由 scripts/build_plan.py 基于 _work/plan_data.json 生成,禁止手搓最终 HTML。 任何直接手写 <html>…</html> 交付物、或"为图快"绕过 plan_data.json/build_plan.py 的行为都属违规——本环境已发生一次(贵州版脱管手搓,结构与湖南版标准产物严重不一致,作为反面案例记录于工作日志)。
> 2. 数据降级不是简化的理由,但「不推荐」≠「删板块」:7 个固定板块 + N1/N2/N3/R1/R4 + 公众号导出一个都不能省。数据源缺失时:价格类字段用 mark-un/【推断】 如实标注;住宿推荐在「同程程心不可用」时按规则不推荐(板块标题与提示保留,不列酒店卡片,非删除);美食清单在检索不到住宿地大众点评必吃榜时不推荐(同理保留提示)。不得用手搓 HTML 替代模板结构。
> 3. 生成后必须过校验门禁:执行 scripts/verify_plan.py <产物HTML> [--self-drive],返回非 0 即视为未完成,须补齐后重跑 build_plan.py 直至全绿。未过门禁不得向用户交付。

输出形式

  • 目录分层(交付物与过程物分离):
  • <目的地>旅游规划/ 根目录只放用户交付物 —— 最终规划 HTML(路线图已内联,单文件自包含);
  • 全部过程产物(同程原始返回 hotel_*.txt / sc_*.txt、地图数据 segs.json / routes*.json、生成脚本 *.py、路线图 SVG、同程 outputs/)一律移入 _work/ 子目录,不删除(局部修订时复算用);
  • 生成完毕后向用户报告的路径只有根目录那个 HTML。
  • 命名:旅游规划_<目的地>_<出发日期>.html(如 旅游规划_新疆_2026-08-01.html)。
  • 模板:assets/travel_plan_template.html(含内联 CSS,无外部依赖)。
  • 生成后用 present_files 呈现;若当前环境无 present_files(须用 tool_names 精确查询确认,模糊搜索会误命中),降级为在工作区根目录起 python -m http.server 并给出 URL,或提示用户直接双击打开。

路线图嵌入(自驾行程,本技能内置生图管线)

  1. 调用本技能内置生图管线 scripts/mapgen/(已合并原 map-travel-route-generator 能力,无需另装该技能):
    - geocode_verify.js:节点坐标双验证(geocoder + placeSearchNearby),景观公路/山区节点必做
    - fetch_route.js:抓取腾讯地图真实驾车 polyline(MAP_KEY 从环境变量注入,绝不写进脚本/产物)
    - render_route.js:通用单面板 SVG 渲染(按 routes.json 的 PROVS 省 adcode 绘省界、按 day 字段配色)
  2. 省界 GeoJSON:生成时从阿里云 DataV 下载到项目 _work/geo/{adcode}.json(省 adcode:广东 440000 / 湖南 430000 / 广西 450000 / 海南 460000 / 新疆 650000 / …),不随技能打包
  3. 以 inline <svg> 嵌入规划 HTML 第一板块「行程总览」顶部(单文件自包含,适配手机阅读)
    3.1 固定画框 + 恒定标注(必守):render_route.js 的 viewBox 恒为 880×480(宽度=方案表格宽、高度固定 480),与模板 .map-embed 占位一致——无论全国游还是城市游,插入图片的占位尺寸不变;地理坐标等比居中 contain fit 进框,geo 比例不同仅表现为留白不同。标注字号(12)/路线线宽(3)/图例(11) 为恒定像素,不随地理缩放变化,仅比正文(~14–15px)稍小;所有描边用 vector-effect="non-scaling-stroke" 锁死屏幕像素。
  4. 无 WebService Key 时直接降级为示意版(不问用户、不中断):直线连接 + 实测里程标注 + 页面强制标注「示意版,非真实路网几何」+ 附 Key 申请指引。规格见「第 2 阶段」

> 生图管线命令示例(在 <目的地>旅游规划/_work 目录执行):
> bash > export MAP_KEY="$(cat ~/.workbuddy/tencent_map_key)" > # ① 下载所需省界(按路线覆盖省份) > curl -s "https://geo.datav.aliyun.com/areas_v3/bound/430000_full.json" -o geo/430000.json > curl -s "https://geo.datav.aliyun.com/areas_v3/bound/440000_full.json" -o geo/440000.json > # ② 节点坐标双验证(景观公路必做) > node <技能目录>/scripts/mapgen/geocode_verify.js "张家界" "湖南张家界市武陵源区" 430000 > # ③ 抓真实驾车几何 > node <技能目录>/scripts/mapgen/fetch_route.js > # ④ 渲染 SVG > node <技能目录>/scripts/mapgen/render_route.js routes.json geo > # 产物 路线图_真实.svg → 内联进规划 HTML >
> 依赖 polygon-clipping(省界 union):本包不含 node_modules/,首次渲染真实版路线图前需在技能目录执行一次 npm install(或 npm ci 按 package-lock.json 精确还原)。仅影响真实版路线图渲染;问卷生成、HTML 构建、结构门禁与「示意版」路线图均不受影响。
> 生图管线的字段结构、示意版绘制规格与踩坑记录见 references/mapgen/routes_schema.md、minimal_svg_mode.md、pitfalls.md——改管线前必读。

HTML 组装(build_plan.py,技能内置通用组装器)

内容(行程/预算/住宿/美食/贴士/参考)与组装逻辑已解耦:所有内容写在 plan_data.json,由 scripts/build_plan.py 套 assets/travel_plan_template.html 模板、内联真实路线 SVG 生成最终 HTML。发布版自动套用全部版式规则(概览≤20字 / 参考资料展开 / 固定画框 / 占比条 / 锚点条),无需手写 HTML。

  • 输入:<项目>/_work/plan_data.json(全部内容)+ 路线图_真实.svg(由生图管线产出,默认同目录)
  • 命令:
    bash python <技能目录>/scripts/build_plan.py _work/plan_data.json \ --out 旅游规划_<目的地>_<出发日>.html --datadir _work # 不传 --out 时,按 plan_data.json 的 out_name 写到 _work 的上一级
  • 占位符:plan_data.json 文本内可用 {TOTAL_KM} {TOLL} {PEAK},组装时自动替换为实测合计值。
  • 字段契约(可直接复制的完整样例:assets/plan_data.example.json):
  • survey_date:必填,形如 " 2026-09-10"(含前导空格)——用于每日行程行「腾讯地图实测 {survey_date}」动态渲染,不要留空,否则日期显示缺失(旧版脚本硬编码日期会导致跨任务沿用错误日期)。
  • days[].sum:当日行程概要(概览「概要」列)= 主要景点 + 住宿地 + 注意事项/建议(如有),≤20 字,禁含 →/km/公里/千米/小时/h/车程(门禁校验)
  • summary.must_do:每项含圈号与句末标点(如 ① …;),自动换行渲染
  • map_cap_bold / map_cap_tail、overview_note_bold / overview_note_tail:拆分加粗范围,保证与模板加粗一致
  • hotels[][].mark、food[].mark、tips_list[].b/.t、refs[]、transport.{roundtrip,local,roadbook}

plan_data.json 顶层字段契约

字段 类型 必填 说明
title str ✅ 页头主标题(emoji 由模板补,勿自带)
html_title str — <title> 文本;缺省为 旅游规划 · {title}
out_name str — 不传 --out 时的输出文件名
survey_date str ✅ 腾讯地图实测/查询日期,形如 " 2026-09-10"(含前导空格)
svg_file str — 路线 SVG 文件名,默认 路线图_真实.svg
meta.sub / meta.chips str / list[str] ✅ 副标题 / 顶部标签
summary.{days,nights,budget_cap,must_do} int / int / str / list[str] ✅ 摘要卡 4 格 + 「出发前必做」清单
days[] list[obj] ✅ 每项 {d,date,route,km,h,toll,sum,am,pm,eve};km/h/toll 为数字;sum = 主要景点 + 住宿地 + 注意事项/建议(如有),≤20 字,禁含路线/里程/车程信号(门禁校验)
budget[] list[obj] ✅ 每项 {name,val,note};val 可为单值或区间(如 "¥800–1200",占比按上限计)
budget_level / budget_note / peak_note str ✅ 预算水平 / 预算说明 / 峰值说明
peak_total int — 峰值合计;缺省 = 基准合计(即已含旺季上浮的估算值)
dest_type str — 目的地类型(tier1/tier2/hot),仅用于住宿系数分档;缺省 tier2。节假日由 build_plan.py 自动识别,无需在此声明
over_budget_policy str — 超预算时红字说明「为何选择超预算方案」的自定义理由;缺省由 build_plan.py 按「超预算 ≤20% 优先偏好更优方案 / >20% 建议压缩」自动生成
hotel_est obj 条件 住宿自动估算输入:{dest_type:"tier1\|tier2\|hot", holiday?, season?, nights:[{city,base,date,tag?}]};提供后 build_plan.py 自动算住宿小计、覆盖预算「住宿」行并重算总计(详见预算公式住宿项)。未提供时,若行程日期命中法定节假日/寒暑假,build_plan.py 自动按 route 末段城市 + 酒店「起价」构造并套系数(平日基准=同程起价),无需人工声明
hotels list[tuple] 条件 形如 [[城市, [{name,score,why,price,mark}]]];同程不可用时留空 [](板块仅展示提示,不推荐)
hotels_intro / food_note str ✅ 住宿 / 美食板块说明(含「不推荐」提示文案)
food[] list[obj] 条件 每项 {city,desc,mark},desc 须含「必吃榜」来源标注;无必吃榜数据时留空 []
transport.{roundtrip,local,roadbook} list[str] ✅ 三段交通列表;自驾必填 roadbook
tips_weather / tips_list[] str / list[obj] ✅ 天气行 / 每项 {b,t}
refs_summary / refs[] str / list[str] ✅ 参考资料标题 / 条目
map_cap_bold / map_cap_tail str ✅ 路线图说明(加粗处与其余部分拆分),可含 {TOTAL_KM}
overview_note_bold / overview_note_tail str ✅ 总览表下注(加粗/非加粗拆分),可含 {TOLL}
footer str ✅ 页脚文本

> 任意字符串字段内可用占位符 {TOTAL_KM} / {TOLL} / {PEAK},组装时按实测合计替换。
- 契约:改版式规则只动 assets/travel_plan_template.html 或 scripts/build_plan.py,不要改产物 HTML;新省份规划只改 plan_data.json,复用同一管线。

生成门禁(强制,未过即视为未完成)

build_plan.py 产出的 HTML 必须通过结构校验后才能交付。脱管手搓的产物必然过不了门禁——这是把"应走管线"变成"不走管线就过不去"的硬机制。

python <技能目录>/scripts/verify_plan.py 旅游规划_<目的地>_<出发日>.html --self-drive
# 自驾行程加 --self-drive(额外校验 自驾路书 + 路线图内联 <svg> 单文件自包含)
# 公共交通行程不加该参数
  • 门禁校验项(通用):① 顶部摘要卡 .sum-card(N1)② Day 锚点条 .day-nav(N2)③ 预算占比条 .bar(N3)④ 参考资料 .ref-box(R4)⑤ 公众号导出按钮 #wxExportBtn ⑥ 7 个固定板块标题齐全(行程总览/每日详细安排/交通指南/住宿推荐/美食清单/预算估算/实用贴士)。
  • 自驾额外校验:.map-embed 内必须内联 <svg>(单文件自包含,禁止外链 <iframe> 指向 _work),且含 自驾路书 板块。
  • 反向手搓检测:若产物同时缺 sum-card / day-nav / bar / wxExportBtn 中 ≥3 项,门禁直接判"脱管手搓",必须回到 plan_data.json → build_plan.py 重建。
  • 未过门禁的处理:补齐 _work/plan_data.json 缺失字段 → 重跑 build_plan.py → 再 verify_plan.py 至全绿。绝不允许"门禁没过就直接改产物 HTML 凑数"——只动 plan_data.json / 模板 / 生成器。

页面结构规则(2026-09-09 版式决议)

  • 顶部摘要卡(N1):hero 后必须有 sum-card——4 格核心数字(天数/实测里程/总预算/人均)+「出发前必做」清单(把最紧急的事项从末尾板块提到首屏)。
  • Day 锚点条(N2):每日安排板块顶部 day-nav,锚点 #d1…#dN 与各 day-block id 对应。
  • 预算占比条(N3):预算表每行加 bar 占比列(项目金额 ÷ 总计),总计行留空。
  • 路线图占位(R1):map-embed 宽度 = 方案表格宽度(width:100%,撑满内容区约 880px),高度固定 480px;SVG viewBox 固定 880×480(见 3.1 固定画框)。总览表格日期并入天数列(4 列)。
  • 概览摘要(N5):行程总览表格「概要」列每行为当日行程的 ≤20 字总结,内容固定为「主要景点 + 住宿地 + 注意事项/建议(如有)」,用动词+核心名词概括(如「大角湾踏浪·住海陵岛·早出避堵」)。硬约束(门禁校验):① 字符数 ≤ 20;② 不得含路线/里程/车程信号——即不得出现 →(路线箭头)、km/公里/千米(里程)、小时/h/车程(车程),这些已在同表「路线」「里程/车程」两列呈现,禁止在「概要」列重复;③ 禁止填「见每日安排」「详见」「同上」「待补充」等占位文本;④ 当日无住宿(返程日)时无需强套住宿地,以「主要景点/返程 + 注意事项(如有)」概括(如「返深圳·行程圆满终·轮换驾」)。
  • 美食收紧(R3):每城最多 2-3 项,只留有地点/店名价值的信息。
  • 参考资料展开 + 标记降噪(R4):ref-box 用 <details open> 默认展开;正文只显示 ⚠️「未确认」红标,mark-ok/mark-inf 由 CSS display:none 隐藏(标注 span 保留在 DOM,导出 JS 已剔除其文本)。
  • 路线图统一以本技能内置生图管线 scripts/mapgen/ 为基线(Web Mercator 投影 + DataV 省界底图 + 抽稀 + 按天配色),不要另起炉灶重写绘图脚本。

7 个固定板块(必须按顺序输出)

  1. 行程总览 — 表格或列表呈现每日行程概要;顶部嵌入路线图。
    自驾行程每行须含当日里程与车程。
    Day 1 | 出发地 → 目的地 | 480km / 6h | 抵达、入住、初探周边 Day 2 | 目的地 | 120km / 2h | 核心景点A + 特色午餐 + 景点B

  2. 每日详细安排 — 逐日按上午 / 下午 / 晚上三段,统一叙事规范(门禁校验):
    - 上午 / 下午(转场日,当日 km>0):出发时间 + 出发地 + 行程路线 + 行程用时 + 目的地 + 景点 + 建议安排 / 注意事项(如有)。
    - 上午 / 下午(驻地日,当日 km=0):活动开始时间 + 景点 / 活动 + 建议安排 / 注意事项(如有)。
    - 晚上:推荐住宿(仅酒店名称)+ 推荐美食(仅餐厅名称,有大众点评必吃榜数据时推荐,否则可省)+ 建议安排 / 注意事项(如有)。
    - 门禁:days[].am/pm/eve 三槽均非空;非末日(d<总天数)的「晚上」须含住宿信号(住 / 酒店 / 民宿 / 宿),否则判不合规。美食不作强制(并非每地都有必吃榜)。

  3. 交通指南
    - 往返大交通:航班 / 车次 / 自驾路线,注明时长与参考价(来源:同程程心 / 网络搜索)
    - 当地出行:租车 / 包车 / 公交方案及必要提示
    - 自驾行程追加「路书」8 项:

    1. 总里程 / 每日里程与车程 2. 途经主要道路与关键节点 3. 加油 / 充电点(油车:沿线服务区/加油站;纯电/混动:每 300km 规划充电,推荐快充优先充电站,来源标注✅/【推断】)
    2. 过路费(地图实测) 5. 停车提示(含是否需换乘区间车) 6. 区间测速提醒
    3. 季节封路 / 限行 8. 边防证 / 通行证件提示
  4. 住宿推荐 — 按「数据来源与价格策略」第 4 条执行:同程可用时给出名称 + 同程评分 + 点评数 + 推荐理由 + 价格区间 + 数据来源;同程不可用时按规则不推荐酒店,本节保留标题与说明提示("请通过同程 / 携程官方渠道自行预订,旺季提前锁房"),不列卡片、不手搓替代结构。

  5. 美食清单 — 仅推荐住宿地(每晚住宿城市)的大众点评必吃榜当地美食(见「数据来源与价格策略」第 5 条);标注必点菜品与必吃榜年份来源;有忌口 / 过敏时明确提醒;无必吃榜检索结果时按规则不推荐并保留提示。

  6. 预算估算 — 分项列费用范围,所有金额标注来源并注明"参考价,以预订页实时为准";逐项锚定既有实测 / 推荐数据,禁止凭空给出总数:
    - 分项推导公式(强制):

    • 油 / 电费(自驾) = f(车型, 总里程):燃油 = 总里程 × 油耗(L/100km) ÷100 × 油价;纯电 = 总里程 × 电耗(kWh/100km) ÷100 × 充电电价;混动按油车口径估算,不计电费。预算行统一命名为「油/电费」。
    • 过路费 = 腾讯地图实测合计 TOTAL_TOLL(平日值;国庆等免费政策单列说明实付 ¥0)。
    • 住宿 = Σ(每晚平日基准价 × 当日调整系数),逐晚计算后求和;系数取自 references/hotel_price_coefficients.md(按「日期类型 × 目的地类型」分档,基准 1.00)。禁止对"已含上浮的住宿小计"再做整体乘数(防重复计算);平日基准价优先取同程实时查询(查询日须非假期、非旺季),若查询日已处旺季须先还原平日基准。build_plan.py 已内置该系数表:plan_data.json 提供 hotel_est(dest_type 目的地类型 + 可选 holiday/season + nights 数组每项含 city/base 平日基准价/date 入住日期/可选 tag)即自动估算住宿小计并覆盖预算「住宿」行、重算总计,无需手工填住宿金额(周末系数由入住日期的星期自动判定,法定节假日/寒暑假由 holiday/season 声明)。若 plan_data 未提供 hotel_est 但行程日期命中法定节假日/寒暑假,build_plan.py 自动按每日 route 末段城市 + 对应酒店「起价」构造 hotel_est 并套系数(平日基准=同程起价,× 当日系数),无需人工声明 holiday。⚠️ 同程 hotel-query 返回价为静态「起价」、不随日期浮动(已用 2026-09 非假期探针证实:麗枫梧州店 10/1 国庆与 9/15 非假期同为 ¥201),仅可作系数 base,切勿误当「已是国庆价」直接进预算——2026-09 广西任务即因此漏算约 ¥770 旺季上浮,门禁 4.10 已据此加锁。
    • 餐饮 = 人均 × 人数 × 天数【推断】,可结合美食清单城市数微调。
    • 门票 / 活动 = 各景点实测票价求和(同程 / 网络搜索,标注来源)。
    • 其他(停车 / 购物 / 杂项) = 景区 / 城市停车 + 手信【推断】。
    • 往返交通 · 住宿 · 餐饮 · 景点门票 / 活动 · 其他(购物 / 小费 / 停车费) · 总计
    • 自驾行程:「当地交通」拆为 3 行 —— 租车费(含保险)/ 油 / 电费 / 过路费
    • 若用户设定了总预算上限且超出,按以下分级在「总计」行红字(.warn-red)说明(build_plan.py 自动生成,「总计」行说明本就红字渲染):
    • 超预算 ≤ 20%(容忍线内,上限 = 预算上限 × 1.2):优先选择符合用户偏好的更优方案(舒适型/市中心/景区附近等,不降级),红字说明为何选择超预算方案——须含「超预算金额/比例 + 优先满足偏好不降级 + 在 20% 容忍线内」三要素(如「超预算 ¥387(7.7%),在 20% 容忍线内(≤¥6,000);因偏好舒适型+国庆系数上浮使住宿由¥965升至¥1,737,故优先满足舒适偏好不降级」)。plan_data.json 可经 over_budget_policy 字段自定义该理由,缺省由 build_plan.py 自动生成。
    • 超预算 > 20%:红字给出压缩/降级建议(降住宿档位、调路线、减景点等),当前仍为基准情景估算。
    • 门禁校验(4.10.2):超预算时「总计」行说明若缺失「为何选超预算方案」关键词(超预算/超支/优先/偏好/容忍/压缩/建议/降级),判不合规。
    • 住宿 / 总计 红字提示(强制,2026-09-15 修订):「住宿」行与「总计」行的「说明」必须以红字(.warn-red)标注 当前价格与未来价格的差异提示,并给出 对未来价格的合理估算(如国庆 / 旺季上浮比例 + 估算金额)。build_plan.py 自动对这两行说明套红字;plan_data.json 中对应 note / peak_note 须同时包含「当前 / 平日 / 基准价」与「上浮 / 预计 / 旺季 / 国庆」两类信息,门禁校验其存在。
  7. 实用贴士 — 按「六类标准覆盖清单」撰写,每条标注依据并落到事实分级(✅已核实 / 【推断】 / ⚠️未确认);门禁校验 tips_list 非空且每项 b/t 非空、tips_weather 存在:
    - ① 天气与穿衣(依据:天气规则,实时 / 历史同期)
    - ② 证件 / 预约(依据:景区预约政策 / 边防证要求等,可核实)
    - ③ 目的地专项风险(依据:目的地特性——高原反应 / 沿海台风 / 山区落石 / 少数民族风俗等,AI 推断 + 标注)
    - ④ 行车安全(依据:路线特性——高速免费 / 区间测速 / 充电规划等,可核实 / 推断)
    - ⑤ 健康 / 饮食(依据:当地饮食特性——生腌 / 辛辣 / 高反等,推断)
    - ⑥ 当地风俗禁忌(依据:民族 / 宗教,须核实)

车程合理性校验

  • 单日车程 > 用户设定的上限 → 报警;
  • 未设定时,默认 > 6 小时 或 > 500 km → 报警;
  • 报警内容:提示拆分行程、增加中转住宿地、或调整景点顺序。

微信公众号纯文字版(按钮导出)

  • 模板末尾「📋 导出微信公众号格式」按钮自动转换,与 HTML 版同源。
  • 导出时剔除:二维码链接、PC / 手机预订链接、HTML 卡片样式与颜色标记、内部跳转按钮文字(如"查看路线图")。
  • 保留:路线、里程、时长、价格、评分、来源标注。
  • 格式:【xxx】大板块、▶ Day x每日、·列表、|表格行、&gt;提示。

返工 / 局部修订

支持局部修订指令,如"第 3 天酒店换一家""加一天,插入德天瀑布""第 2 天车程太长,重排"。

  • 只重算受影响部分,不整份重做;
  • 修改前将原文件备份为 旅游规划_xxx.bak.html;
  • 修订后同步更新预算总计与行程总览,保持各板块一致。

语言风格

  • 专业简洁,像旅行攻略书。
  • 用词准确、信息密度高,避免口语化或过度热情。
  • 可使用适度符号(✅ 📍 💡)增强可读性,但不过度。

异常处理

  • 基本信息不合理(天数超阈值、日期已过、规模不匹配)→ 友善提醒并请求修正。
  • 用户勾选项对应的编号超出 1–42 → 提示重新输入。
  • 同程未连接 / 令牌失效 → 提示在「连应用」重新连接(或发 tc-chengxin auth login 授权链接);用户选择不连则走网络搜索并显著标注。
  • 腾讯地图依赖缺失 / Key 无效 → 按「第 0 阶段 → 依赖 × 影响矩阵」处理:无 Key 或 Key 无效时明确告知里程未实测、禁止编造,路线图按「无 Key 时的处理」执行;腾讯地图 MCP 不可用本身对产物无影响(本机管线走 WebService),勿与 Key 缺失混为一谈。
  • 用户在任何阶段想重新开始 → 响应重启指令。

Resources

assets/

  • travel_plan_template.html — 版式与样式来源:build_plan.py 只从本文件抽取 &lt;style&gt; 与 &lt;script&gt; 两段。文件内的 body 是旧版(iframe 外链路线图)示例,已废弃、不参与生成——改版式只改 CSS/JS,不要参照那段 body。
  • plan_data.example.json — plan_data.json 完整样例(配合任意占位 SVG 即可跑通 build_plan.py)。字段契约见「plan_data.json 顶层字段契约」。

scripts/

  • preflight.py — 第 0 阶段环境预检:检测同程授权与本机腾讯地图 Key(存在性 + 有效性状态码分档),输出人类可读或 --json;只报状态与状态码,不回显 Key。退出码 0=依赖齐备 / 1=有缺失 / 2=脚本错误。腾讯地图 MCP 需由 AI 用 MCP 工具另行探活。另检测本地运行环境(Node.js 是否可用、polygon-clipping 是否已 npm install)并在输出中给出安装指引——此项只作能力提示,不改变退出码语义。
  • build_plan.py — 规划 HTML 组装器(plan_data.json + 路线 SVG → 最终 HTML)。改版式走这里或模板 CSS,不要改产物 HTML。
  • verify_plan.py — 产物结构门禁(7 板块 + N1/N2/N3/R1/R4 + 公众号导出)。返回非 0 即视为未完成。
  • questionnaire_template.html — 第 1 阶段可编辑网页问卷(自包含、无外部依赖、无密钥;仅含「导出我的答案(复制)」按钮,复制文本回贴对话即完成数据回传;无需本地服务、离线可用)。
  • mapgen/geocode_verify.js — 节点坐标双验证(geocoder + placeSearchNearby)。
  • mapgen/fetch_route.js — 腾讯地图真实驾车 polyline 与里程/车程/过路费(MAP_KEY 仅从环境变量注入)。
  • mapgen/render_route.js — 单面板 SVG 路线图渲染(固定画框 880×480、Web Mercator、按天配色)。

references/

  • mapgen/routes_schema.md — routes.json 字段结构(NODES / NAMES / SEGS / PROVS / DAY_COLOR / FERRY_SEGS / LABEL)。
  • mapgen/minimal_svg_mode.md — 无 Key「示意版」SVG 绘制规格。
  • mapgen/pitfalls.md — 腾讯地图 Key、真实几何、省界下载等踩坑记录。改生图管线前必读。

常见问题

5 问
答案由本站依据条目字段整理
旅行蓝图怎么安装?

在支持 Skills 的客户端里执行:skillhub install user_e1d00e01/travel-planning-expert。安装方式为未标注。装完刷新技能列表或重开客户端。

旅行蓝图支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

旅行蓝图权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

旅行蓝图收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

旅行蓝图用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。