关于 trip-planner
面向希望用自然语言规划航班的人群。它会为缺失信息填入并展示假设,搜索航班选项并提供预订链接,也支持多城市行程。
主要功能
- 01解析自然语言行程需求
- 02展示假设并支持修正
- 03搜索并推荐航班
- 04按性价比、最低价和最快分类
- 05处理多城市行程
适用场景
- 01仅提供目的地时查找航班
- 02按日期和预算比较选项
- 03拆分规划多城市航段
- 04将偏好保存到配置文件
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ foogunlana/ skills --skill trip-planner安装后在 Claude Code 中输入/trip-planner确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/templates/trip-recommendation.mdreferences/branding.mdconfig-guide.mdfuture.md详细介绍
旅行规划器
一项可将自然语言转化为航班推荐的技能——优先采用假设,而非提问。
先做假设。展示推理过程。预订航班。
核心设计原则
凡事都做假设,并展示一切。 用户只需纠正错误之处,而不用补充缺失的信息。唯一的硬性要求是目的地——其他所有内容都有合理的默认值。
两种流程
| 条件 | 流程 |
|---|---|
不存在 .claude/trip-planner.md | 引导流程 — 立即搜索,然后快速设置 |
存在 .claude/trip-planner.md | 常规流程 — 快速:解析、假设、搜索、推荐 |
引导流程(仅首次运行)
检测: 检查 .claude/trip-planner.md 是否存在。如果没有配置文件,则运行此流程。否则跳转至常规流程。
目标: 立即提供航班推荐,然后校准偏好。
步骤 1:欢迎(如果用户已描述行程,则跳过)
读取 references/branding.md 并逐字显示:
- 标志
- 出发地引言
- 工作流图
- 核心概念
然后检查:用户是否已在消息中描述行程?
- 是 → 使用用户提供的信息直接跳至步骤 2
- 否 → 显示:
Where are you headed? Just describe your trip naturally:
"I need to fly to Tokyo next month for a week"
"London to Paris, March 15-18, 2 adults"
"Cheapest flights to Barcelona in April"
等待用户输入。
步骤 2:解析并做出假设
提取用户所说的信息,然后用默认值补全其他所有内容。
根据用户输入运行假设引擎(见下文),并在尚无配置的引导流程中使用以下回退默认值:
- 出发地:LHR
- 舱位:经济舱
- 乘客:1 名成人
- 预算:灵活
- 经停:不限
- 货币:GBP
显示假设卡片:
## Assumptions
| Field | Value | Source |
|-------|-------|--------|
| Destination | Tokyo (NRT/HND) | You said |
| Origin | London (LHR) | Default |
| Dates | Mar 10 - Mar 17, 2026 | "next month" + 7 days |
| Passengers | 1 adult | Default |
| Class | Economy | Default |
| Budget | Flexible | Default |
| Stops | Any | Default |
Anything wrong? Say so and I'll re-search. Otherwise I'll find flights.
等待用户纠正或确认。
如果用户提出纠正 → 更新假设 → 重新显示卡片 → 再次等待。
如果用户确认(或表示没有问题)→ 继续步骤 3。
步骤 3:搜索并展示
使用已确认的假设运行搜索策略(见下文)。
使用 assets/templates/trip-recommendation.md 中的输出格式展示推荐结果。
然后提供修改选项:
Want to adjust anything? Change dates, class, budget — I'll re-search.
修改循环: 用户调整 → 重新搜索 → 重新展示。重复直到用户满意。
步骤 4:快速设置
用户对结果满意后:
Nice — that's your first search done.
Want to save your preferences so next time is faster? Quick 5 questions:
1. What's your home airport? (e.g. LHR, JFK, LAX)
2. Any preferred airlines? (comma-separated, or "none")
3. Default budget range per person? (e.g. "under 500", "flexible", "100-300")
4. Preferred class? (economy / premium economy / business / first)
5. Preferred booking platform? (skyscanner / google-flights / kayak)
解析回复,并为跳过的字段使用合理的默认值:
- home_airport: "LHR"
- preferred_airlines: []
- budget: "flexible"
- class: "economy"
- platform: "skyscanner"
写入 .claude/trip-planner.md 配置(见下方的配置结构)。
Saved to .claude/trip-planner.md
Run /trip-planner anytime — just describe where you want to go.
引导流程结束后退出。
常规流程(后续每次运行)
快速处理——不提问,直接推荐:
- 从自然语言中解析意图
- 加载配置以获取默认值
- 运行假设引擎(补全所有缺失信息)
- 搜索航班
- 展示推荐结果及预订链接
步骤 1:解析意图
从用户消息中提取:
- 目的地 — 城市名称、机场代码或国家
- 日期 — 明确日期、相对日期(“下个月”)或模糊日期(“4 月”)
- 预算 — 明确金额或限定词(“便宜”“不超过 300”)
- 舱位 — 经济舱、高级经济舱、商务舱、头等舱
- 乘客 — 人数和类型(成人、儿童、婴儿)
- 偏好 — 直飞、指定航空公司、出行时段、中转偏好
- 多城市行程 — 检测“A → B → C → A”或“然后”模式
如果用户只说了目的地,没有提供其他详情,也没关系——假设引擎会处理其余内容。
步骤 2:加载配置
读取 .claude/trip-planner.md,获取用户默认设置。
配置选项请参阅 references/config-guide.md。
回退默认值(配置缺失或不完整时):
- name: ""
- home_airport: "LHR"
- class: "economy"
- budget: "flexible"
- currency: "GBP"
- stops: "any"
- preferred_airlines: []
- platform: "skyscanner"
步骤 3:假设引擎
按照以下优先级顺序补全缺失字段:
- 用户明确输入——用户在此消息中说的内容
- 配置文件默认值——来自
.claude/trip-planner.md - 结合上下文推断——根据旅行类型进行合理推测:
- 城市短途游(欧洲短途航线)→ 3-4 天
- 洲际旅行 → 7-10 天
- 周末旅行 → 周五至周日
- “Holiday” / “vacation” → 7 天
- 提到了月份但没有日期 → 月中,日期灵活
- 智能默认值——最终回退选项:
- 1 位成人
- 经济舱
- 预算灵活
- 允许任意经停
- 使用配置中的出发机场(或 LHR)
- 日期:从今天起 4 周后,行程为 7 天
**获取当前日期:**运行 date 命令——不要依赖系统日期。
显示假设卡片(始终显示——每项假设都必须清晰可见):
## Assumptions
| Field | Value | Source |
|-------|-------|--------|
| Destination | {dest} | You said |
| Origin | {origin} | Config / Default |
| Dates | {dates} | {source} |
| Passengers | {pax} | {source} |
| Class | {class} | {source} |
| Budget | {budget} | {source} |
| Stops | {stops} | {source} |
Anything wrong? Otherwise I'll search.
等待用户更正或确认后再搜索。
如果用户更正 → 更新 → 重新显示卡片 → 等待。
步骤 4:搜索
根据已确认的假设运行搜索策略(见下文)。
步骤 5:呈现
使用 assets/templates/trip-recommendation.md 中的输出格式。
提供 3-5 个航班选项,涵盖以下三类:
- 性价比最佳——价格、时长和便利性之间的最佳平衡
- 最便宜——不考虑便利性,价格最低
- 最快——总旅行时间最短
为每个选项提供直接预订链接。
然后提供更正选项:
Want to adjust anything? I can re-search with different dates, budget, or preferences.
**更正循环:**用户调整 → 根据更新从步骤 3 重新运行 → 重新呈现。
假设引擎——详情
每次搜索都会运行该引擎。它会根据不完整的输入生成一套完整的航班参数。
优先级顺序
User Input > Config > Context Inference > Smart Defaults
上下文推断规则
| 信号 | 推断 |
|---|---|
| 欧洲城市 + 没有日期 | 城市短途游:3-4 天 |
| 洲际旅行 + 没有日期 | 7-10 天 |
| 提到“周末” | 周五晚上 → 周日晚上 |
| “Holiday” / “vacation” | 7 天 |
| 仅提到月份,没有具体日期 | 月中,并标记为日期灵活 |
| “Christmas” / “Easter” / “New Year” | 使用标准节假日日期范围 |
| “Summer” / “Winter” | 该季节的旺季月份 |
| 多城市行程中返回出发地 | 往返行程,按比例分配各城市停留天数 |
| 提到“便宜” / “预算” | 按价格排序,并标记廉价航空 |
| 提到“直飞” / “不经停” | 仅筛选直飞航班 |
| 未提舱位等级 + 商务目的地 | 仍假定为经济舱(不要推销升级) |
目的地解析
用户提供城市名称时:
- 映射到主要机场代码
- 对于拥有多个机场的城市,全部纳入(例如,伦敦 → LHR/LGW/STN,东京 → NRT/HND,纽约 → JFK/EWR/LGA)
- 对于国家或地区,映射到首都或最常用的旅游机场
日期处理
- 始终使用
date命令获取当前日期 - “下个月” → 下个月 1 日 + 行程时长
- “3 月” → 3 月 15 日(月中)+ 行程时长,并标记为日期灵活
- “3 月 15 日” → 确切日期 + 行程时长
- “3 月 15-18 日” → 确切日期范围
- “下个周末” → 即将到来的周五至周日
- 完全没有日期 → 从今天起 4 周后出发,行程时长根据旅行类型确定
搜索策略
步骤 A:构建预订 URL
根据参数构建 Skyscanner URL(或配置中的平台):
https://www.skyscanner.net/transport/flights/{origin}/{dest}/{depart_date}/{return_date}/?adults={n}&cabinclass={class}¤cy={currency}
Skyscanner URL 格式:
- 日期:
YYMMDD(例如,2026 年 3 月 15 日为260315) - 出发地/目的地:机场代码小写形式(例如,
lhr、nrt) - 舱位等级:
economy、premiumeconomy、business、first
多城市行程需按航段分别构建 URL。
Google Flights URL(如果已配置):
https://www.google.com/travel/flights?q=flights+from+{origin}+to+{dest}+on+{date}
步骤 B:通过 WebSearch 搜索价格
每个航段运行 2-3 条 WebSearch 查询,收集当前价格信息:
查询模板:
"flights {origin} to {dest} {month} {year} price""cheap flights {origin} to {dest} {month} {year}""{airline} {origin} {dest} {month} {year} fare"(如果已设置首选航空公司)
解析结果,提取:
- 执飞该航线的航空公司
- 大致价格范围
- 航班时长和经停信息
- 提及的优惠或促销
步骤 C:WebFetch 预订页面(可选)
尝试对构建的 Skyscanner URL 使用 WebFetch,以获取实时价格。
- **如果成功:**提取具体航班选项及价格
- **如果被阻止或失败:**平稳回退到 WebSearch 数据。不要重试或报错——只需注明价格为近似值
步骤 D:汇总结果
合并 WebSearch 和 WebFetch(如果有)的数据:
- 按航空公司、航线和大致时间去重
- 分为三个类别排序:性价比最高、最便宜、最快
- 为每个选项提供直接预订 URL
- 如果数据仅来自 WebSearch 而非实时价格,则标记为“近似值”
多城市搜索
对于多城市行程(例如“伦敦 → 巴黎 → 罗马 → 伦敦”):
- 分解为单独的航段
- 独立搜索每个航段(可以并行运行 WebSearch 查询)
- 提供行程概览及各航段选项
- 计算所有航段的总费用
- 提供每个航段的单独预订链接,以及多城市搜索链接
配置结构
存储为用户工作目录中的 .claude/trip-planner.md。
name: "Jane"
home_airport: "LHR"
preferences:
class: "economy"
budget: "flexible"
currency: "GBP"
stops: "any"
preferred_airlines: []
time_preference: "any" # morning / afternoon / evening / any
platform:
primary: "skyscanner" # skyscanner / google-flights / kayak
完整字段说明请参见 references/config-guide.md。
核心原则
- **假设所有信息,并全部展示。**只要可以做出合理假设,就不要提问。始终展示你的假设,以便用户更正。
- **唯一的硬性要求:目的地。**其他所有信息都有默认值。用户只说“飞往东京”,就足以生成完整建议。
- **先提供价值,再进行设置。**先搜索,再询问配置。引导用户上手时就立即创造价值。
- **更正优于提问。**展示假设,让用户修正错误之处。这样比一开始就提问更快。
- **展示信息来源。**卡片中的每项假设都有“来源”列。每个价格都附有预订链接。
- **平稳降级。**如果 WebFetch 失败,就回退到 WebSearch。如果 WebSearch 数据稀少,仍然展示已有信息并附上预订链接。
- **始终获取当前日期。**运行
date命令——不要依赖系统日期或知识截止日期。 - **多城市搜索是核心功能。**而非事后补充。拆分行程、逐段搜索,并展示完整行程。
文件路径
| 类型 | 路径 |
|---|---|
| 配置 | .claude/trip-planner.md |
| 技能 | .claude/skills/trip-planner/SKILL.md |
| 品牌规范 | references/branding.md |
| 配置参考 | references/config-guide.md |
| 未来增强功能 | references/future.md |
| 输出模板 | assets/templates/trip-recommendation.md |