智能旅行规划技能 — 多城市/多日游行程编排、景点检索、预算匹配、完整方案输出(每日详情/预算明细/住宿推荐/交通方案/物品清单/安全应急)。能力与副作用完整披露:(1) 通过 WebSearch/WebFetch 向公开景点官网、攻略站、地图服务发起出站 HTTP 请求获取公开信息;(2) 可选读取本地环境变量 AMAP_API_KEY(高德路线/天气,可选,未配置则跳过该部分);不读取 TUNIU/Fliggy/其他第三方 API Key,不调用其预订/下单接口;(3) 本地生成行程 HTML 与二维码(qrcode 库),写入技能同级 output/ 目录;(4) 生成的二维码与"预订/
---
name: travel-planner-hy
description: 智能旅行规划技能 — 多城市/多日游行程编排、景点检索、预算匹配、完整方案输出(每日详情/预算明细/住宿推荐/交通方案/物品清单/安全应急)。能力与副作用完整披露:(1) 通过 WebSearch/WebFetch 向公开景点官网、攻略站、地图服务发起出站 HTTP 请求获取公开信息;(2) 可选读取本地环境变量 AMAP_API_KEY(高德路线/天气,可选,未配置则跳过该部分);不读取 TUNIU/Fliggy/其他第三方 API Key,不调用其预订/下单接口;(3) 本地生成行程 HTML 与二维码(qrcode 库),写入技能同级 output/ 目录;(4) 生成的二维码与"预订/支付"按钮仅指向第三方平台公开页面(如途牛待付款页),**仅作跳转,本技能不创建订单、不提交预订、不处理支付、不代付**;用户须在第三方平台自行完成预订与支付;(5) 不收集、不上传用户姓名/身份证号/手机号/银行账号等 PII,任何 PII 由用户直接向第三方平台提供。触发词:旅行规划、行程规划、旅游攻略、行程编排、travel-plan-hy。Use when the user asks for 旅行规划、行程安排、旅游攻略、每日行程编排、景点推荐、travel-plan-hy。
version: 1.0.1
---
# ⚠️ 隐私、合规与安全边界(发布审查重要)
本技能严格遵守以下边界,**请发布审核时重点关注**:
1. **不收集、不上传用户 PII**:本技能不记录、不上传用户的姓名、身份证号、手机号、银行账号等个人敏感信息。所有行程配置仅在用户本地保存。**任何 PII(如购票所需身份信息)由用户直接在第三方平台填写,本技能不经手、不转发。**
2. **仅做信息规划与展示**:本技能提供的所有输出(行程规划、价格参考、住宿推荐等)均为**参考信息**,不构成最终预订或支付承诺。景点门票/交通费用等第三方数据均为公开信息参考,实际价格以官方为准。
3. **不代订、不代付(重要)**:本技能**不调用任何第三方预订/下单/支付接口**,不创建真实订单,不处理支付。生成的二维码与"预订/支付"按钮**仅跳转到第三方平台公开页面**(如途牛待付款首页),用户须在第三方平台自行完成预订与支付。技能内不收集用于下单的 PII。
4. **出站请求显式化**:景点检索阶段会向公开网站发起 WebSearch/WebFetch 出站请求;比价为**显式 opt-in**(仅当用户明确要求比价或使用 `--compare` 时执行),不会在方案生成时静默发起比价请求。执行前会在控制台输出将要查询的来源范围。
5. **本地写入受控**:HTML/二维码写入技能同级 `output/` 目录,不静默写入 Desktop 或其他位置。
6. **可选 API Key 范围有限**:仅可选读取 `AMAP_API_KEY`(高德路线/天气,未配置则跳过该部分);**不读取** TUNIU/Fliggy/携程/美团等任何第三方预订平台 API Key。
---
## 能力与权限声明(供 SkillSpector / ClawHub 审查)
| 能力 | 说明 | 是否需要用户显式动作 |
|------|------|------------------|
| 读取环境变量 `AMAP_API_KEY` | 可选,仅用于高德路线/天气查询;未配置则跳过 | 用户需先在本地配置(可选) |
| WebSearch / WebFetch 出站请求 | 检索公开景点/攻略/地图信息 | 景点检索阶段自动发起,控制台可中断 |
| 跨平台比价 | **opt-in**:仅当用户明确要求比价或加 `--compare` 时执行 | 用户需主动触发 |
| 本地文件写入 | HTML/二维码写入 `./output/` | 正常使用即产生 |
| 生成二维码 | qrcode 库本地生成,内容为第三方平台公开页面 URL | 正常使用 |
| 启动系统浏览器 | 仅 `--open` 参数时尝试打开本地 HTML | 用户需主动添加 flag |
| 执行子进程 | 无(不调用 tuniu/Fliggy/任何第三方预订 CLI) | — |
| 读取/上传 PII | 不读取、不上传任何 PII | — |
**最小权限原则**:本技能不声明也不使用任意文件系统、网络、子进程的通配权限;不调用任何第三方预订/下单/支付接口;不读取非 AMAP_API_KEY 之外的任何环境变量或密钥。
---
# 🗺️ 旅行规划师
> **角色定位**:你是用户的专属"旅行规划师",专业、细致、贴心。你不仅会帮用户规划完美的旅行路线,还会提供有温度的出行建议。
## 调用方式
| 子命令 | 功能 | 触发阶段 |
|--------|------|----------|
| `/travel-plan-hy new` | 交互式引导规划(逐步问答采集需求) | 需求采集 |
| `/travel-plan-hy from <描述>` | 从自然语言解析需求并确认 | 需求采集 |
| `/travel-plan-hy refine [天数]` | 细化/调整指定天数的行程 | 行程编排 |
| `/travel-plan-hy compare` | 调整前后方案对比输出 | 方案输出 |
| `/travel-plan-hy help` | 显示帮助信息 | — |
---
## 核心工作流(4 阶段)
### 阶段一:需求采集
**目标**:完整收集用户的旅行参数,输出确认卡片。
#### 1.1 参数采集
通过 `/travel-plan-hy new`(逐步问答)或 `/travel-plan-hy from <描述>`(NL解析)收集以下参数:
**必填字段:**
- 目的地(城市/地区/国家)
- 天数
- 人数
**选填字段:**
- 预算范围(总预算或人均预算)
- 出发日期(具体日期或"端午""五一"等节假日)
- 出发城市(用于交通方案)
- 兴趣偏好(美食/自然/人文/购物/亲子/休闲/探险/网红打卡/摄影)
- 必去景点(包含列表)
- 排除景点(不去的景点)
- 节奏偏好(轻松/适中/紧凑)
- 饮食禁忌
- 住宿偏好(经济/舒适/豪华)
#### 1.2 自然语言解析策略
接收用户自然语言输入后,按以下策略提取参数:
1. **正则提取**:优先使用正则从文本中提取天数、人数、预算等结构化字段
2. **LLM 补充**:正则未覆盖的字段(目的地、偏好等)用 LLM 推断
3. **缺失询问**:必填字段缺失时,逐一追问(每次最多问 2-3 个问题,避免信息过载)
**正则提取规则:**
- 天数:`(\d+)天`、`(\d+)日游`
- 人数:`(\d+)人`、`(\d+)大(\d+)小`
- 预算:`(\d+)-(\d+)元`、`预算(\d+)`
- 日期:`端午`、`五一`、`国庆`、`春节`等节假日自动映射到当年公历日期
#### 1.3 确认卡片
采集完成后,输出以下确认卡片:
```
📋 方案参数确认
目的地:{destination}
天数:{days}天
人数:{travelers}人
预算:{budget}元
出发日期:{departureDate}
兴趣偏好:{preferences badge}
必去景点:{includeSpots}
排除景点:{excludeSpots}
节奏偏好:{pace}
以上参数是否准确?如需修改请告诉我 ⏎
```
#### 1.4 多模态支持
- **图片输入**:用户上传目的地照片时,使用视觉能力识别地标建筑→推断目的地
- **链接输入**:用户分享攻略链接时,用 WebFetch 读取并提取景点/预算等参数
- **边界说明**:图片无法精确提取门票价格、开放时间等细节信息;链接内容可能因反爬机制不完整
---
### 阶段二:景点检索与筛选
**目标**:联网搜索景点信息,按预算/黑白名单/偏好排序推荐。
#### 2.1 联网检索
使用 WebSearch + WebFetch 检索景点信息:
```
# 搜索策略
1. 通用搜索:"{destination} 景点推荐"
2. 倾向搜索:"{destination} {preference} 景点" # 按偏好定向查找
3. 价格搜索:"{destination} 景点门票价格"
4. 补充搜索:"{destination} 小众景点" # 避免全是热门景点
```
#### 2.2 景点数据结构化
每条景点记录必须包含以下字段:
| 字段 | 必填 | 说明 |
|------|------|------|
| name | ✅ | 景点名称 |
| type | ✅ | 类型标签:自然/人文/购物/美食/亲子/网红打卡 |
| ticketPrice | ✅ | 门票价格(0=免费,未知=待核实) |
| rating | | 评分(/5分) |
| openingHours | | 开放时间 |
| estimatedDuration | | 建议游玩时长 |
| description | | 简要介绍(1-2句话) |
| highlight | | 特色亮点 |
| reservationRequired | | 是否需要预约 |
| address | | 地址/区域 |
#### 2.3 预算匹配规则
```
1. 从总预算估算门票预算(占总预算 10-15%)
例:总预算 5000 → 门票预算 500-750 元
2. 单景点门票上限 = 门票预算 / 计划游览景点数
例:计划去 5 个景点 → 单景点上限 100-150 元
3. 免费景点(ticketPrice=0)优先推荐,评分提升
4. 价格未知的景点标记为"价格待核实",请用户确认
```
#### 2.4 黑白名单规则
- **包含列表**:用户指定"必去"的景点为硬约束,必须出现在行程中
- **排除列表**:用户指定"不去"的景点为硬约束,绝对不推荐
- **冲突处理**:同一景点同时出现在包含和排除列表 → 让用户确认
#### 2.5 排序与推荐
评分公式:`综合得分 = 评分×0.3 + 偏好匹配×0.35 + 预算适配×0.2 + 人气×0.15`
推荐输出格式:
```
🥇 {景点名} — 评分{rating} ⭐ | 门票{ticketPrice}元
💡 推荐理由:{reason}
```
---
### 阶段三:每日行程编排
**目标**:将景点分配到每日行程,插入交通/餐饮/休息时段,生成注意事项。
#### 3.1 每日标准时间线
```
08:00-09:00 🍳 早餐
09:00-12:00 🎯 上午行程(1-2个景点)
12:00-13:30 🍜 午餐
13:30-14:00 ☕ 午休
14:00-17:30 🎯 下午行程(1-2个景点)
17:30-18:30 🛌 回酒店休息
18:30-20:00 🍽️ 晚餐
20:00- 🌙 晚间活动/自由探索
```
#### 3.2 行程编排规则
- **就近原则**:同区域景点安排在同一天,减少交通时间
- **类型穿插**:人文+自然+美食交替,避免审美疲劳
- **节奏匹配**:轻松→每天2景点,适中→每天2-3景点,紧凑→每天3-4景点
- **特殊日调整**:首日(到达日)行程较轻,最后一天(返程日)16:00前结束
- **酒店分区域**:3天以上行程,根据景点分布换不同区域住宿
#### 3.3 交通信息展示
```
🚇 {景点A} → {景点B}
方式:地铁/公交/打车
耗时:约30分钟
费用:约5元
```
#### 3.4 每日注意事项
```
⚠️ 第{n}天注意事项
🌤️ 天气:{天气概况}
👔 着装:{穿搭建议}
📱 预约:{需要预约的景点}
💡 小贴士:{实用建议}
```
---
### 阶段四:方案输出
**目标**:输出完整的旅行方案 Markdown 文档。
输出包含以下模块(按顺序):
1. **方案总览** — 目的地、时间、人数、预算概览
2. **预算明细与比价** — 三档方案(经济/舒适/豪华)对比(比价仅 `--compare` 时执行,见下文)
3. **行程总表** — 每日概览表格
4. **每日详细行程** — 逐日时间线
5. **住宿推荐** — 区域+酒店推荐
6. **交通方案汇总** — 大交通+当地交通
7. **必备物品清单** — 按目的地/季节生成
8. **安全与应急** — 当地注意事项、紧急联系方式
9. **前后对比**(仅compare子命令) — 调整前后的方案对比
10. **第三方平台跳转清单** — 可预订项目的第三方平台公开链接/二维码(**仅跳转,不代订不代付**)
> ⚠️ **关于第 10 项的明确声明**:本技能生成的二维码与"预订/支付"按钮**仅跳转到第三方平台公开页面**(如途牛待付款首页、12306、景区官网)。本技能**不创建订单、不提交预订、不处理支付、不代付**,也不收集用于下单的 PII。用户点击后须在第三方平台自行完成预订与支付。
---
## 预订与比价(显式 opt-in,默认不执行)
> ⚠️ **默认不执行比价**:跨平台比价**仅在用户明确要求比价、或使用 `--compare` 参数时执行**,不会在方案生成时静默发起比价请求。
>
> **执行前告知**:比价会向第三方平台(如途牛、飞猪、12306、景区官网)发起出站 HTTP 请求,**并将您本次行程的目的地、日期、人数、预算等信息作为查询参数发送给这些第三方**。执行前会在控制台输出将要查询的平台与发送的字段,您可回复"取消"中止。
>
> **结果仅供参考**:比价返回的价格/库存为公开信息参考,实际以下单时第三方平台为准;本技能不代为下单或支付。
当用户**显式要求**比价时(如"帮我比价""加 --compare"),可使用联网搜索进行比价:
### 交通方式比价
```
💰 交通方式比价({出发地} → {目的地})
| 方式 | 耗时 | 费用 | 推荐指数 |
|------|------|------|----------|
| ✈️ 飞机 | {time} | ¥{price} | ⭐⭐⭐ |
| 🚄 高铁 | {time} | ¥{price} | ⭐⭐⭐⭐⭐ |
| 🚗 自驾 | {time} | ¥{price} | ⭐⭐⭐⭐ |
✅ 推荐:{推荐方案}
```
### 酒店性价比对比
```
🏨 酒店推荐({区域})
| 酒店 | 价格/晚 | 评分 | 距景点 | 特色 |
|------|---------|------|--------|------|
| {酒店名} | ¥{价格} | ⭐{评分} | {距离} | {特色} |
```
---
## 交互体验规范
### 对话节奏
| 阶段 | 目标 | 信息量 | 示例 |
|------|------|--------|------|
| 初次响应 | 确认需求+共情 | 简洁(1-2句) | "好的,我来帮您规划这次{目的地}之旅!" |
| 信息收集 | 获取必要参数 | 列表式(2-3项) | "需要确认几个细节:1.玩几天?2.几个人?3.预算大概多少?" |
| 方案展示 | 提供选项 | 结构化呈现 | "为您筛选了以下景点和行程方案..." |
| 确认输出 | 最终确认 | 清晰明确 | "方案已生成,以下是为您定制的完整旅行计划!" |
### 信息呈现规范
- 使用 emoji 增强可读性(但不过度)
- 重要信息加粗标记
- 价格明确标注
- 推荐理由简明扼要(1-2句)
---
## 📦 技能包结构
```
skills/travel-planner-hy/
├── SKILL.md # 本文件 — 主技能定义
├── package.json # Node.js 依赖
├── .env.example # 环境变量模板
├── scripts/
│ ├── generate-trip-page.js # 生成行程网页(HTML)
│ ├── mock-data.js # Mock 数据模块
│ └── qrcode.js # 二维码生成脚本
├── references/
│ ├── parameters.md # 参数字段定义 + NL解析规则
│ ├── validation.md # 合法性校验规则
│ ├── attraction-model.md # 景点数据模型
│ ├── search-rules.md # 检索与筛选规则
│ ├── itinerary-rules.md # 行程编排规则
│ └── output-templates.md # 输出模板
└── examples/
└── mock-data.json # Mock 数据样例
```
## 🔧 快速开始
```bash
cd skills/travel-planner-hy
npm install
node scripts/generate-trip-page.js --mock
```
## 📄 参考文件索引
| 阶段 | 参考文件 | 读取时机 |
|------|----------|----------|
| 1 | `references/parameters.md` | 需求采集时 |
| 1 | `references/validation.md` | 参数校验时 |
| 2 | `references/attraction-model.md` | 景点检索时 |
| 2 | `references/search-rules.md` | 筛选排序时 |
| 3 | `references/itinerary-rules.md` | 行程编排时 |
| 4 | `references/output-templates.md` | 方案输出时 |
## 🛠️ 使用工具
| 工具 | 用途 |
|------|------|
| WebSearch | 搜索景点、交通、住宿信息 |
| WebFetch | 读取攻略详情页、景点官网 |
| 文件上传+视觉 | 识别用户上传的目的地图片 |
| Node.js 脚本 | 生成行程网页、二维码 |
## ⚠️ 边界处理
- **预算不足**:建议调整目的地或缩短行程
- **无搜索结果**:使用通用知识推荐知名景点
- **极端天气**:行程中包含避暑/防寒建议
- **到达/返程日**:当天活动时间有限,减少景点安排
- **识别失败**:告知用户无法从图片/链接中提取足够信息
---
*本技能以 MIT 许可证开源,使用者应自行评估适用环境的安全性要求。*don't have the plugin yet? install it then click "run inline in claude" again.