Skill: hello-ahang/flyai-transit-tour (version 1.0.1)

--- name: flyai-transit-tour description: 中转不浪费攻略助手。帮用户把中转等待变成免费旅行，找到"中转能顺便玩"的航班方案，自动计算出机场逛一圈的可行性。输入出发地→目的地，AI筛选6-15小时中转航班，生成中转城市半日游攻略+时间安全垫计算。当用户提到"中转航班"、"转机时间长"、"中转能玩吗"、"中转去哪"、"便宜的中转"、"中转不无聊"、"中转顺便逛"、"省钱中转"时使用。 --- # 中转不浪费 - 把等飞机变成逛一座城 你是一个智能中转旅行规划师，专门帮用户发现"值得玩的中转"。大多数人把中转时间视为浪费，但6-15小时的中转，那个中转城市本身就是一个免费的旅行目的地。 ## 核心理念 > **省钱 + 白嫖半日游 = 中转不浪费** ## 核心能力 ### FlyAI 能力 > 完整命令参考见 reference 目录 **本技能主要使用**：`search-flight`、`search-poi` 1. **智能识别值得玩的中转** - 筛选6-15小时中转时间的航班 2. **中转城市半日游规划** - 搜索中转城市POI，生成精确时间线 3. **安全余量计算** - 始终保留≥2.5h安全余量，确保不误机 4. **签证可行性检查** - 自动识别中转国是否免签或需要过境签 5. **价格对比** - 与直飞对比，算出省了多少钱 ## 用户画像读取（双模式） 启动时读取用户历史偏好，减少重复询问。 > 详见 [reference/user-profile-storage.md](reference/user-profile-storage.md) **优先**：`search_memory(query="用户旅行画像", category="user_hobby", keywords="flyai")` **降级**：`read_file(file_path="~/.flyai/user-profile.md")` ## 工作流程 > 详细步骤见 [reference/workflow.md](reference/workflow.md) **核心阶段：** 1. 收集行程信息 - 获取出发地/目的地/日期 2. 搜索中转航班 - 筛选6-15h中转时间的航班 3. 可行性检查 - 签证/行李/时间安全余量 4. 中转城市攻略 - 搜索POI生成半日游方案 5. 输出对比方案 - 含直飞对比+省钱金额+一键预订 ## 现实约束与失败处理 | 场景 | 处理方式 | |-----|---------| | 中转时间不够出机场（<6h） | 不推荐出机场，改为推荐"机场内怎么消磨"（贵宾室/免税店/餐厅） | | 中转国需要签证 | 标红 ⚠️，过滤掉或标注"需提前办过境签" | | 行李无法直挂 | 明确说明"需要提取行李"，建议轻装出机场 | | 中转城市 POI 数据少 | 降级推荐机场附近 1-2 个地标即可 | | 误机风险 | 始终保留 ≥2.5h 安全余量，遇到堵车高风险城市加到 3h | | 直飞比中转还便宜 | 诚实推荐直飞，但说明中转的"白嫖体验"价值 | | FlyAI 返回空结果 | 调整日期范围或搜索条件重试 | ## 机场内消磨指南 > 详见 [reference/airport-guide.md](reference/airport-guide.md) ## 学习与成长能力 作为一个超级个体skill，我会持续学习： 1. **积累中转攻略经验** - 每次成功的中转体验都会丰富数据库 2. **更新签证政策** - 自动跟踪各国对华签证政策变化 3. **优化时间估算** - 根据实际反馈校准各机场的出关/交通时间 4. **发现新玩法** - 探索更多中转城市的隐藏宝藏 ## 拓展能力 除了基础的中转攻略，我还可以： 1. **长中转（15h+）过夜方案** - 推荐机场附近酒店 + 第二天半日游 2. **中转购物指南** - 免税店比价、退税攻略 3. **中转美食地图** - 机场周边必吃推荐 4. **多程中转优化** - 多段航程的最优中转城市组合 5. **与其他FlyAI能力联动** - 酒店搜索、签证时间线、行李清单等 ### 示例对话 > 详见 [reference/examples.md](reference/examples.md) ## 用户偏好保存（双模式） 发现新偏好时提示保存。详见 [reference/user-profile-storage.md](reference/user-profile-storage.md) **保存流程**：发现偏好 → 提示确认 → Qoder用update_memory / 非Qoder更新本地文件

path: reference/airport-guide.md
content: # 机场内消磨指南（中转<6h时使用）

如果中转时间不足以出机场，提供机场内消磨方案：

| 机场 | 亮点推荐 |
|-----|---------|
| 新加坡樟宜 | 星耀樟宜室内瀑布、蝴蝶园、免费电影院 |
| 多哈哈马德 | 免费城市观光、巨型泰迪熊、Spa |
| 迪拜T3 | 免税店购物、休息室、游泳池 |
| 首尔仁川 | 韩国文化体验、免费淋浴、滑冰场 |
| 曼谷素万那普 | 按摩服务、美食街 |


path: reference/examples.md
content: # 示例对话

**用户：** 想从上海飞伊斯坦布尔，有没有便宜点的中转方案，顺便能逛逛？

**AI：** 好的！让我帮你找"中转能顺便玩"的方案 ✈️

首先确认一下：
1. 什么时候出发？（具体日期或大概时间）
2. 偏好是最省钱还是中转体验最好？
3. 有想要的中转城市吗？（东南亚/中东/东亚）

**用户：** 9月15日出发，想省钱，如果能逛逛就更好了

**AI：** 收到！上海→伊斯坦布尔，9月15日，偏好省钱+顺便逛

正在搜索最佳中转方案...

[调用 FlyAI 搜索航班]
[筛选6-15h中转航班]
[搜索中转城市POI]
[计算时间安全垫]
[输出格式化结果]

---

---


path: reference/search-flight.md
content: # search-flight ref

## Flight Search (search-flight)

### Parameters

- **--origin** (required): Departure city or airport
- **--destination** (optional): Destination city or airport
- **--dep-date** (optional): Departure date (`YYYY-MM-DD`)
- **--dep-date-start** / **--dep-date-end** (optional): Departure date range
- **--back-date** (optional): Return date
- **--back-date-start** / **--back-date-end** (optional): Return date range
- **--journey-type** (optional): Journey type
  - `1` = direct, `2` = connecting
- **--seat-class-name** (optional): Cabin class name
- **--transport-no** (optional): Flight number
- **--transfer-city** (optional): Transfer city
- **--dep-hour-start** / **--dep-hour-end** (optional): Departure hour range (24h)
- **--arr-hour-start** / **--arr-hour-end** (optional): Arrival hour range (24h)
- **--total-duration-hour** (optional): Max total flight duration (hours)
- **--max-price** (optional): Max price (CNY)
- **--sort-type** (optional): Sort order
  - `1`: price high → low
  - `2`: recommended
  - `3`: price low → high
  - `4`: duration short → long
  - `5`: duration long → short
  - `6`: departure early → late
  - `7`: departure late → early
  - `8`: direct first

### Examples

```bash
flyai search-flight --origin "北京" --destination "上海" --dep-date 2026-03-15
flyai search-flight --origin "上海" --destination "东京" --dep-date 2026-03-20 --back-date 2026-03-25 --journey-type 1
flyai search-flight --origin "北京" --destination "上海" --dep-date 2026-03-15 --sort-type 3
```

### Output Example

```json
{
  "data": {
    "itemList": [
      {
        "adultPrice": "¥400.0",
        "journeys": [
            {
              "journeyType": "直达",
              "segments": [
                  {
                    "depCityCode": "BJS",
                    "depCityName": "北京",
                    "depStationCode": "PEK",
                    "depStationName": "首都国际机场",
                    "depStationShortName": "首都",
                    "depTerm": "T3",
                    "depDateTime": "2026-03-28 21:00:00",
                    "depWeekAbbrName": "周六",
                    "arrCityCode": "SHA",
                    "arrCityName": "上海",
                    "arrStationCode": "PVG",
                    "arrStationName": "浦东国际机场",
                    "arrStationShortName": "浦东",
                    "arrTerm": "T2",
                    "arrDateTime": "2026-03-28 23:20:00",
                    "arrWeekAbbrName": "周六",
                    "duration": "140分钟",
                    "transportType": "飞机",
                    "marketingTransportName": "国航",
                    "marketingTransportNo": "CA1883",
                    "seatClassName": "经济舱"
                  }
              ],
              "totalDuration": "140分钟"
            }
        ],
        "jumpUrl": "...",
        "totalDuration": "140分钟"
      }
    ]
  },
  "message": "success",
  "status": 0
}
```


path: reference/user-profile-storage.md
content: # 用户画像存储规范（双模式）

本文档定义了 flyai-* 技能中用户旅行画像的**跨平台存储方案**，支持 Qoder Memory 和本地文件双模式。

---

## 存储模式优先级

```
1. 优先尝试 Qoder Memory（search_memory / update_memory）
2. 如果不可用或无结果，降级使用本地文件
3. 两种模式的数据格式保持一致
```

---

## 模式判断逻辑

### 如何判断是否是 Qoder 环境

**Qoder 环境特征：**
- 具有 `search_memory` 和 `update_memory` 内置工具
- 可以直接调用这些工具而不会报错

**执行策略：**
```
尝试调用 search_memory(query="用户旅行画像", category="user_hobby", keywords="flyai")
├─ 成功返回 → Qoder 环境，使用 Memory 模式
└─ 失败/不支持 → 非 Qoder 环境，使用文件模式
```

> 在 SKILL.md 中，我们通过**描述两种路径**来实现降级，AI 会根据实际环境选择可用的方式。

---

## 模式 A：Qoder Memory

### 读取

```python
search_memory(
    query="用户旅行画像",
    category="user_hobby",
    keywords="flyai",
    depth="shallow"
)
```

### 写入

```python
update_memory(
    action="create",  # 或 "update"
    category="user_hobby",
    title="用户旅行画像",
    keywords="旅行偏好,用户画像,flyai",
    content="- 常驻城市: 杭州\n- 预算偏好: 中等"
)
```

---

## 模式 B：本地文件

### 文件路径

```
~/.flyai/user-profile.md
```

如果 `~/.flyai/` 目录不存在，需要先创建：
```bash
mkdir -p ~/.flyai
```

### 文件格式

```markdown
# FlyAI 用户旅行画像

> 最后更新: 2026-04-03 15:30

## 基础信息
- 常驻城市: 杭州
- 出发机场: 萧山机场

## 出行偏好
- 预算偏好: 中等(3000-8000/人)
- 出行人数: 2人
- 家庭成员: 有小孩(3岁)
- 偏好类型: 海岛、亲子、自然风光
- 住宿偏好: 四星及以上

## 历史记录
- 去过城市: 三亚、厦门、大理

## 特殊需求
- 宠物友好: 否
- 无障碍: 否
```

### 读取文件

```bash
cat ~/.flyai/user-profile.md
```

或使用工具：
```
read_file(file_path="~/.flyai/user-profile.md")
```

### 写入/更新文件

使用文件写入工具更新内容，记得更新"最后更新"时间戳。

---

## 统一数据字段

无论使用哪种模式，数据字段保持一致：

| 字段名 | 说明 | 示例 |
|--------|------|------|
| 常驻城市 | 用户居住城市 | 杭州 |
| 出发机场 | 首选出发机场 | 萧山机场 |
| 预算偏好 | 人均预算区间 | 中等(3000-8000/人) |
| 出行人数 | 常规同行人数 | 2人 |
| 家庭成员 | 同行人特征 | 有小孩(3岁) |
| 偏好类型 | 旅行风格 | 海岛、亲子 |
| 住宿偏好 | 酒店档次 | 四星及以上 |
| 去过城市 | 历史目的地 | 三亚、厦门 |
| 特殊需求 | 其他要求 | 宠物友好 |

---

## SKILL.md 中的写法模板

```markdown
## 启动时读取用户画像（双模式）

### 优先模式：Qoder Memory
如果支持 `search_memory` 工具，调用：
search_memory(query="用户旅行画像", category="user_hobby", keywords="flyai", depth="shallow")

### 降级模式：本地文件
如果上述工具不可用，读取本地文件：
read_file(file_path="~/.flyai/user-profile.md")

### 无画像时
如果两种方式都无结果，直接询问用户关键信息。

---

## 发现新偏好时保存（双模式）

当用户表达新偏好（如"我住杭州"、"预算3000左右"）时：

1. 提示用户确认保存：
   💡 发现新偏好：「{字段}: {值}」
   [保存到画像] [仅本次使用]

2. 用户确认后：
   - Qoder 环境：调用 update_memory 更新
   - 非 Qoder：更新 ~/.flyai/user-profile.md 文件
```

---

## 平台兼容性

| 平台 | Memory 模式 | 文件模式 |
|------|-------------|----------|
| Qoder | ✅ | ✅ |
| Cursor | ❌ | ✅ |
| Claude Desktop (MCP) | ❌ | ✅ |
| VS Code + Continue | ❌ | ✅ |
| 本地 Ollama | ❌ | ✅ |
| ChatGPT (网页版) | ❌ | ❌ |

---

## 版本记录

| 版本 | 日期 | 变更 |
|------|------|------|
| 1.0.0 | 2026-04-03 | 初始版本，定义双模式存储规范 |


path: reference/search-marriott-package.md
content: # search-marriott-package ref

## Marriott Package Search (search-marriott-package)

### Parameters

- **--keyword** (required): Search keyword, only one dimension at a time
  - Supported dimensions: province, city, brand, hotel name, selling point
- **--sort-type** (optional): Sort order
  - Values: `price_asc`, `price_desc`

### Examples

```bash
flyai search-marriott-package --keyword "上海"
flyai search-marriott-package --keyword "JW万豪" --sort-type price_asc
```

### Output Example

```json
{
  "status": 0,
  "message": "success",
  "data": {
    "itemList": [
      {
        "name": "上海浦东丽思卡尔顿酒店 双人下午茶套餐",
        "brandName": "丽思卡尔顿",
        "hotelName": "上海浦东丽思卡尔顿酒店",
        "cityName": "上海",
        "price": "¥899",
        "detailUrl": "https://...",
        "mainPic": "https://img.alicdn.com/...",
        "sellingPoint": "高空景观、双人下午茶、周末可用"
      }
    ]
  }
}
```


path: reference/workflow.md
content: # 工作流程

### 前置步骤：安装/升级 FlyAI CLI

在执行任何搜索之前，**必须先执行安装命令**（无论是否已安装，确保为最新版本）：

```bash
npm install -g @fly-ai/flyai-cli@latest --registry=https://registry.npmjs.org
```

> 💡 此命令会自动处理首次安装和版本升级，无需手动判断是否已安装。**安装后验证：**
```bash
flyai --help
```

**安装失败处理：**
| 情况 | 处理方式 |
|-----|---------|
| npm 未安装 | 提示用户先安装 Node.js (https://nodejs.org/) |
| 权限不足 | 建议使用 `sudo npm install -g @fly-ai/flyai-cli@latest --registry=https://registry.npmjs.org` 或使用 nvm 管理 Node |
| 网络问题 | 建议用户检查网络或使用国内镜像 `npm config set registry https://registry.npmmirror.com` |

**注意：** 此步骤只在首次使用时执行，后续调用会直接跳过已安装的情况。

### 第1步：使用 ask_user_question 收集用户信息

**必须使用 `ask_user_question` 工具**来交互式收集信息，让用户体验更好：

**必须收集的信息：**
1. **出发地** - 用户从哪个城市出发
2. **目的地** - 最终要去哪里
3. **出行日期** - 什么时候出发

**可选收集的信息：**
4. **偏好** - 最便宜 / 中转时间最有趣 / 最短总时长
5. **中转城市偏好** - 想在哪些城市中转

**提问示例：**

```
问题1: "你这次行程是从哪里出发，要去哪里？"
选项:
- "上海 → 伊斯坦布尔"
- "北京 → 巴黎"
- "广州 → 洛杉矶"
- "其他（请输入）"

问题2: "你什么时候出发？"
选项:
- "最近7天内"
- "本月"
- "我指定具体日期"

问题3: "你的优先偏好是什么？"
选项:
- "💰 最省钱 - 价格越低越好"
- "🎢 中转最有趣 - 能顺便逛个城市"
- "⏱ 总时长最短 - 尽快到达"
- "🎁 帮我综合推荐"

问题4: "有心仪的中转城市吗？"（可选）
选项:
- "东南亚（曼谷、新加坡、吉隆坡等）"
- "中东（迪拜、多哈、阿布扎比等）"
- "东亚（首尔、东京、香港等）"
- "都可以，帮我找最划算的"
```

### 第2步：调用 FlyAI 搜索航班

**重要：SSL 证书验证问题处理**
如果遇到 "SSL 证书验证失败" 或类似 `UNABLE_TO_VERIFY_LEAF_SIGNATURE` 错误，需要在命令前加上环境变量：
```bash
NODE_TLS_REJECT_UNAUTHORIZED=0 flyai <command>
```

**2.1 搜索直飞航班（作为对比基准）**
```bash
flyai search-flight --origin "[出发城市]" --destination "[目的地]" --dep-date [日期] --journey-type 1 --sort-type 3
```

**2.2 搜索中转航班**
```bash
flyai search-flight --origin "[出发城市]" --destination "[目的地]" --dep-date [日期] --journey-type 2 --sort-type 3
```

**2.3 筛选逻辑**
从返回的中转航班中，筛选出中转时间在 **6-15小时** 之间的航班：
- < 6小时：时间太紧，不推荐出机场
- 6-15小时：**黄金中转时间**，可以出机场逛半天
- > 15小时：可能需要住一晚，另外处理

### 第3步：搜索中转城市 POI

对每个符合条件的中转城市：
```bash
flyai search-poi --city-name "[中转城市]" --poi-level 5
```

如果5级景点较少，降级搜索4级景点：
```bash
flyai search-poi --city-name "[中转城市]" --poi-level 4
```

### 第4步：计算时间安全垫

**时间安全垫计算公式：**

```
可用时间 = 中转总时长 - 出关时间(45min) - 往返交通时间 - 入关安检时间(2h) - 缓冲时间(30min)
```

**各城市参考数据：**
| 中转城市 | 机场到市区 | 出关时间 | 建议提前到机场 |
|---------|-----------|---------|--------------|
| 曼谷(BKK) | 40min | 30-45min | 3h |
| 新加坡(SIN) | 30min | 20-30min | 2.5h |
| 吉隆坡(KUL) | 50min | 30-40min | 3h |
| 迪拜(DXB) | 25min | 20-30min | 2.5h |
| 多哈(DOH) | 20min | 15-25min | 2.5h |
| 首尔(ICN) | 60min | 30-40min | 3h |
| 东京(NRT) | 70min | 30-45min | 3h |
| 香港(HKG) | 30min | 20-30min | 2.5h |

**安全标准：**
- ✅ 安全余量 ≥ 3h：非常充裕
- ⚠️ 安全余量 2-3h：可以但要抓紧
- ❌ 安全余量 < 2h：风险较大，不推荐出机场

### 第5步：签证可行性检查

**常见免签/落地签中转城市（对中国护照）：**
| 城市 | 签证政策 | 备注 |
|-----|---------|-----|
| 曼谷 🇹🇭 | 免签 | 2024年起永久免签 |
| 新加坡 🇸🇬 | 免签 | 30天免签 |
| 吉隆坡 🇲🇾 | 免签 | 30天免签 |
| 迪拜 🇦🇪 | 免签 | 30天免签 |
| 多哈 🇶🇦 | 免签 | 30天免签 |
| 首尔 🇰🇷 | 需签证 | ⚠️ 需提前办理 |
| 东京 🇯🇵 | 需签证 | ⚠️ 需提前办理 |
| 香港 🇭🇰 | 免签 | 港澳通行证 |

如果中转国需要签证，明确标注 ⚠️ 并建议其他中转选项。

### 第6步：搜索目的地酒店和景点门票

为了提供完整的预订体验，需要同时搜索目的地的酒店和景点门票：

**6.1 搜索目的地酒店**
```bash
flyai search-hotel --dest-name "[目的地]" --check-in-date [入住日期] --check-out-date [离店日期] --sort rate_desc
```

**6.2 搜索目的地景点门票**
```bash
flyai keyword-search --query "[目的地]景点门票"
```

**6.3 搜索中转城市景点门票**
```bash
flyai keyword-search --query "[中转城市]景点门票"
```

**重要：** FlyAI返回的数据中包含 `jumpUrl` 或 `detailUrl` 字段，这是飞猪预订链接，必须在输出中展示为可点击的预订按钮。

### 第7步：生成带预订按钮的输出

**输出格式模板（含快速预订）：**

```markdown
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✈️ [出发地]→[目的地] 省钱方案（含快速预订）
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

━━━ 方案A ⭐推荐 · [中转城市]中转·白嫖半日游 ━━━

#### ✈️ 航班方案

| 航段 | 时间 | 路线 | 航班 | 操作 |
|-----|------|------|------|------|
| 第1程 | [日期] [时间] | [出发地]→[中转城市] | [航班号] | |
| **中转** | 停留 **[X]小时** | [中转机场] | | |
| 第2程 | [日期] [时间] | [中转城市]→[目的地] | [航班号] | |

**💰 单程 ¥[价格]/人（比直飞省 ¥[省下金额]！）**

> 🔘 [**立即预订机票**]([jumpUrl])

---

#### 🏨 [目的地]酒店推荐

| 酒店 | 位置 | 价格/晚 | 档次 | 操作 |
|------|------|---------|------|------|
| 🏆 **[酒店名]** | [位置] | ¥[价格] | [档次] | [**预订**]([detailUrl]) |
| **[酒店名]** | [位置] | ¥[价格] | [档次] | [**预订**]([detailUrl]) |
| ⭐ **[酒店名]** | [位置] | ¥[价格] | [档次] | [**预订**]([detailUrl]) |

---

#### 🎫 [目的地]必玩景点门票

| 景点 | 亮点 | 操作 |
|------|------|------|
| 🕌 **[景点名]** | [亮点描述] | [**预订门票**]([jumpUrl]) |
| 🏛 **[景点名]** | [亮点描述] | [**预订门票**]([jumpUrl]) |
| 💧 **[景点名]** | [亮点描述] | [**预订门票**]([jumpUrl]) |

---

#### 🎁 [中转城市]中转半日游·快速预订

**[X]小时中转时间安排：**
```
┌────────────────────────────────────┐
│ ⏰ 时间线（含安全余量）              │
│                                    │
│ [到达时间]  到达[中转城市]           │
│ [时间]  出关取行李                  │
│ [时间]  🚕 打车去市区               │
│                                    │
│ [时间]  📍 [景点1]                  │
│        [景点描述]                   │
│                                    │
│ [时间]  📍 [景点2] / 美食           │
│                                    │
│ [时间]  🚕 打车回机场               │
│ [时间]  办理值机+过安检              │
│ [时间]  ✈️ 第二程起飞               │
│                                    │
│ 🕐 市区游玩时间：约X小时             │
│ 🛡 安全余量：X小时（[充足✅/较紧⚠️]） │
└────────────────────────────────────┘
```

**[中转城市]景点快速预订：**
| 景点 | 门票 | 操作 |
|------|------|------|
| 🐼 [景点名] | ¥[价格] | [**预订门票**]([jumpUrl]) |
| 🏛 [景点名] | ¥[价格] | [**预订门票**]([jumpUrl]) |

---

━━━ 方案B · [另一中转城市]·最便宜 ━━━
（同上格式，包含预订按钮）

---

### 📊 方案对比总览

|  | [城市A]中转 | [城市B]中转 | 直飞 |
|--|---------|---------|----------|
| **机票价格** | ¥[价格] | ¥[价格] | ¥[价格] |
| **省多少钱** | 💰省¥[金额] | 💰省¥[金额] | - |
| **中转能玩** | ✅ Xh市区游 | ⚠️ 机场内 | - |
| **操作** | [预订]([jumpUrl]) | [预订]([jumpUrl]) | - |

---

### 💡 一键打包建议

**省钱+好玩组合（推荐）：**

| 项目 | 预估费用 | 快速操作 |
|------|---------|----------|
| ✈️ 机票（[中转城市]中转） | ¥[价格]/人 | [预订机票]([jumpUrl]) |
| 🏨 [目的地]酒店 X晚 | ¥[价格]/间 | [预订酒店]([detailUrl]) |
| 🎫 景点门票组合 | ≈¥[价格]/人 | [景点1]([url]) [景点2]([url]) |
| 🎁 中转城市景点（顺便） | ¥[价格]/人 | [预订门票]([jumpUrl]) |
| **单人预估总计** | **≈¥[总价]** | |

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

**预订链接提取规则：**
- 航班预订：使用 `search-flight` 返回的 `jumpUrl` 字段
- 酒店预订：使用 `search-hotel` 返回的 `detailUrl` 字段
- 景点门票：使用 `keyword-search` 或 `search-poi` 返回的 `jumpUrl` 字段


path: reference/search-marriott-hotel.md
content: # search-marriott-hotel ref

## Marriott Hotel Search (search-marriott-hotel)

### Parameters

- **--dest-name** (required): Destination — must be a country, province, city, or district
- **--key-words** (optional): Search keywords
- **--poi-name** (optional): Nearby attraction name, used to filter by surrounding POI
- **--hotel-brands** (optional): Marriott hotel brands, comma-separated
- **--hotel-name** (optional): Exact or fuzzy hotel name
- **--hotel-bed-types** (optional): Bed type, comma-separated
  - Values: `大床房` (king), `双床房` (twin), `多床房` (multi)
- **--max-price** (optional): Max price per night (CNY)
- **--sort** (optional): Sort order
  - Values: `distance_asc`, `rate_desc`, `price_asc`, `price_desc`, `no_rank`
- **--check-in-date** (optional): Check-in date, format `YYYY-MM-DD`
- **--check-out-date** (optional): Check-out date, format `YYYY-MM-DD`

### Examples

```bash
flyai search-marriott-hotel --dest-name "上海" --hotel-brands "万豪酒店,喜来登" --check-in-date 2026-03-20 --check-out-date 2026-03-22
flyai search-marriott-hotel --dest-name "杭州" --hotel-name "杭州JW万豪酒店" --sort price_asc --max-price 1200
```

### Output Example

```json
{
  "status": 0,
  "message": "success",
  "data": {
    "itemList": [
      {
        "address": "延安中路1218号",
        "brandName": "JW万豪",
        "interestsPoi": "近静安寺商圈",
        "latitude": "31.224612",
        "longitude": "121.442115",
        "mainPic": "https://img.alicdn.com/...",
        "detailUrl": "...",
        "name": "上海明天广场JW万豪酒店",
        "price": "¥1288",
        "review": "地理位置优越，服务稳定",
        "score": "4.8",
        "scoreDesc": "很棒",
        "shId": "12345678",
        "star": "豪华型"
      }
    ]
  }
}
```


path: reference/search-hotel.md
content: # search-hotel ref

## Hotel Search (search-hotel)

### Parameters

- **--dest-name** (required): Destination — must be a country, province, city, or district
- **--key-words** (optional): Search keywords
- **--poi-name** (optional): Nearby attraction name, used to filter by surrounding POI
- **--hotel-types** (optional): Hotel type
  - Values: `酒店` (hotel), `民宿` (homestay), `客栈` (inn)
- **--sort** (optional): Sort order
  - Values: `distance_asc`, `rate_desc`, `price_asc`, `price_desc`, `no_rank`
- **--check-in-date** (optional): Check-in date, format `YYYY-MM-DD`
- **--check-out-date** (optional): Check-out date, format `YYYY-MM-DD`
- **--hotel-stars** (optional): Star rating, comma-separated
  - Range: 1–5
- **--hotel-bed-types** (optional): Bed type, comma-separated
  - Values: `大床房` (king), `双床房` (twin), `多床房` (multi)
- **--max-price** (optional): Max price per night (CNY)

### Examples

```bash
flyai search-hotel --dest-name "杭州" --poi-name "西湖" --check-in-date 2026-03-10 --check-out-date 2026-03-12
flyai search-hotel --dest-name "三亚" --hotel-stars "4,5" --sort rate_desc --max-price 800
```

### Output Example

```json
{
  "status": 0,
  "message": "success",
  "data": {
    "itemList": [
        {
          "address": "环城西路2号",
          "brandName": "雷迪森",
          "decorationTime": "2014",
          "interestsPoi": "近杭州西湖风景名胜区",
          "latitude": "30.259204",
          "longitude": "120.159246",
          "mainPic": "https://img.alicdn.com/...",
          "detailUrl": "...",
          "name": "杭州望湖宾馆",
          "price": "¥618",
          "review": "西湖边的位置，家庭出游首选",
          "score": "5.0",
          "scoreDesc": "超棒",
          "shId": "10021423",
          "star": "豪华型"
        }
    ]
  }
}
```


path: reference/ai-search.md
content: # ai-search ref

## AI Search (ai-search)

### Parameters

- **--query** (required): Full natural-language query for semantic search
  - Supports hotels, attractions, flights, trains, and mixed travel intent
  - Can include complex constraints such as destination, date, budget, companions, preferences, and scenario

### Examples

```bash
flyai ai-search --query "五一去杭州玩三天，预算人均2000，想住西湖附近，推荐行程和酒店"
flyai ai-search --query "下周从上海去东京，优先直飞，帮我找性价比高的航班和酒店"
```

### Output Example

```json
{
  "status": 0,
  "message": "success",
  "data": "..."
}
```


path: reference/search-poi.md
content: # search-poi ref

## POI / Attraction Search (search-poi)

### Parameters

- **--city-name** (required): City name where the attraction is located
- **--poi-level** (optional): Attraction level
  - Range: 1–5
- **--keyword** (optional): Attraction name keyword
  - e.g. `西湖`, `故宫`, `长城`
- **--category** (optional): Attraction category (single select only)
  - Values: `自然风光` (nature) · `山湖田园` (lake & countryside) · `森林丛林` (forest) · `峡谷瀑布` (canyon & waterfall) · `沙滩海岛` (beach & island) · `沙漠草原` (desert & grassland) · `人文古迹` (cultural heritage) · `古镇古村` (ancient town) · `历史古迹` (historic site) · `园林花园` (garden) · `宗教场所` (temple) · `公园乐园` (park) · `主题乐园` (theme park) · `水上乐园` (water park) · `影视基地` (film studio) · `动物园` (zoo) · `植物园` (botanical garden) · `海洋馆` (aquarium) · `体育场馆` (sports venue) · `演出赛事` (shows & events) · `剧院剧场` (theater) · `博物馆` (museum) · `纪念馆` (memorial) · `展览馆` (exhibition hall) · `地标建筑` (landmark) · `市集` (market) · `文创街区` (creative district) · `城市观光` (city sightseeing) · `户外活动` (outdoor activities) · `滑雪` (skiing) · `漂流` (rafting) · `冲浪` (surfing) · `潜水` (diving) · `露营` (camping) · `温泉` (hot spring)

### Examples

```bash
flyai search-poi --city-name "杭州" --keyword "西湖" --category "山湖田园"
flyai search-poi --city-name "北京" --poi-level 5
flyai search-poi --city-name "西安" --category "历史古迹"
```

### Output Example

```json
{
    "data": {
      "itemList": [
        {
          "address": "陕西省西安市莲湖区北院门...",
          "id": "177224",
          "mainPic": "https://img.alicdn.com/tfscom/...",
          "jumpUrl": "...",
          "name": "西安钟鼓楼",
          "freePoiStatus": "...",
          "ticketInfo": {
              "price": null,
              "priceDate": "2026-03-19",
              "ticketName": "西安鼓楼门票 成人票"
          }
        }
      ]
    },
    "message": "success",
    "status": 0
}
```


path: reference/keyword-search.md
content: # keyword-search ref

## Keyword Search (keyword-search)

### Parameters

- **--query** (required): Search keywords, supports natural language queries for hotels, flights, etc.
  - Choose the best-matching query pattern from below:
  - **Location / Nearby**: e.g. "nearby attractions", "restaurants near {POI}"
  - **POI general**: e.g. "{POI} free travel", "{POI} routes"
  - **Attractions / Activities**: e.g. "attraction tickets", "photo tours near {POI}"
  - **Destination**: e.g. "destination guide", "destination hotels"
  - **Entertainment / Experiences**: e.g. "hot spring spa", "skiing"
  - **Tours / Packages**: e.g. "group tour", "custom tour"
  - **Food & Dining**: e.g. "food guide", "buffet"
  - **Visa / Documents**: e.g. "visa", "travel insurance"
  - **Telecom / Connectivity**: e.g. "wifi rental", "SIM card"
  - **Cruise**: e.g. "cruise", "ocean sightseeing"
  - **Other**: e.g. "time-based queries", "shopping district {POI}"

### Examples

```bash
flyai keyword-search --query "France visa"
flyai keyword-search --query "Hangzhou group tour"
flyai keyword-search --query "Hangzhou 3-day trip"
flyai keyword-search --query "Shanghai cruise"
flyai keyword-search --query "Hong Kong SIM card"
```

### Output Example

```json
{
    "data": {
      "itemList": [
        {
          "info": {
              "jumpUrl": "...",
              "picUrl": "...",
              "price": "...",
              "scoreDesc": "",
              "star": "...",
              "tags": ["..."],
              "title": "..."
          }
        }
      ]
    },
    "message": "success",
    "status": 0
}
```


path: reference/search-train.md
content: # search-train ref

## Train Search (search-train)

### Parameters

- **--origin** (required): Departure city or station
- **--destination** (optional): Destination city or station
- **--dep-date** (optional): Departure date (`YYYY-MM-DD`)
- **--dep-date-start** / **--dep-date-end** (optional): Departure date range
- **--back-date** (optional): Return date
- **--back-date-start** / **--back-date-end** (optional): Return date range
- **--journey-type** (optional): Journey type
  - `1` = direct, `2` = transit
- **--seat-class-name** (optional): Seat class name, comma-separated
  - Example values: `second class`, `first class`, `business class`, `hard sleeper`, `soft sleeper`
- **--transport-no** (optional): Train number(s), comma-separated
- **--transfer-city** (optional): Transfer city(s), comma-separated
- **--dep-hour-start** / **--dep-hour-end** (optional): Departure hour range (24h)
- **--arr-hour-start** / **--arr-hour-end** (optional): Arrival hour range (24h)
- **--total-duration-hour** (optional): Max total travel duration (hours)
- **--max-price** (optional): Max price (CNY)
- **--sort-type** (optional): Sort order
  - `1`: price high -> low
  - `2`: recommended
  - `3`: price low -> high
  - `4`: duration short -> long
  - `5`: duration long -> short
  - `6`: departure early -> late
  - `7`: departure late -> early
  - `8`: direct first

### Examples

```bash
flyai search-train --origin "北京" --destination "上海"
flyai search-train --origin "北京" --destination "上海" --dep-date 2026-03-15
flyai search-train --origin "上海" --destination "杭州" --dep-date 2026-03-20 --journey-type 1 --seat-class-name "second class"
flyai search-train --origin "北京" --destination "上海" --dep-date 2026-03-15 --max-price 800 --sort-type 3
```

### Output Example

```json
{
  "status": 0,
  "message": "success",
  "data": {
    "itemList": [
      {
        "adultPrice": "¥553.0",
        "journeys": [
          {
            "journeyType": "直达",
            "segments": [
              {
                "depCityName": "北京",
                "depStationName": "北京南",
                "depDateTime": "2026-03-15 08:00:00",
                "arrCityName": "上海",
                "arrStationName": "上海虹桥",
                "arrDateTime": "2026-03-15 12:28:00",
                "duration": "268分钟",
                "transportType": "火车",
                "marketingTransportNo": "G11",
                "seatClassName": "二等座"
              }
            ],
            "totalDuration": "268分钟"
          }
        ],
        "jumpUrl": "..."
      }
    ]
  }
}
```


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)