# 核心工作流

### 前置步骤：确保 FlyAI CLI 为最新版本

在执行任何搜索之前，必须先确保 FlyAI CLI 已安装且为最新版本。

**安装/升级 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 |
| 网络问题 | 建议用户检查网络，确保可以访问 registry.npmjs.org |

### 阶段1: 内容解析 (Parsing)

#### 1.1 解析攻略来源

**方式A：链接解析**

首选使用 `fetch_content` 获取网页内容：
```python
# 使用 fetch_content 获取网页内容
fetch_content(url="[用户提供的链接]", query="行程 景点 酒店 交通")
```

**⚠️ 动态页面备选方案**：当 `fetch_content` 无法获取完整内容时（如携程移动端 m.ctrip.com、部分需要 JS 渲染的页面），使用 **Browser Agent** 作为备选：

```python
# 使用 Browser Agent 打开真实浏览器获取内容
Agent(
  subagent_type="Browser",
  description="获取攻略内容",
  prompt="""
  请打开 [URL] 这个攻略页面。
  页面加载后，向下滚动阅读完整内容，提取出：
  1. 目的地是哪里
  2. 玩几天
  3. 每天的行程安排（Day1、Day2 等详细活动）
  4. 推荐的景点有哪些
  5. 住的酒店信息
  6. 交通方式
  7. 费用预算
  请把所有信息整理成文字返回给我，要完整详细。
  """
)
```

**何时使用 Browser Agent**：
- `fetch_content` 返回导航菜单/版权信息而非实际内容
- 页面返回 404 或重定向
- 移动端页面（m.xxx.com）无法正常解析
- 用户确认链接在浏览器中可以正常打开

**方式B：文字解析**
直接从用户粘贴的文字中提取信息。

**方式C：截图解析**
提示用户发送图片，通过 OCR 识别内容。

**方式D：口述匹配**
用户描述模糊时，用 FlyAI 搜索匹配：
```bash
NODE_TLS_REJECT_UNAUTHORIZED=0 flyai keyword-search --query "[用户口述关键词]"
```

#### 1.2 输出解析结果

```
📖 已解析攻略内容：
━━━━━━━━━━━━━━━━━━━━━━━━━━━
原作者：@[作者名]  发布于[时间]
标题：「[攻略标题]」

提取到的关键信息：
  📍 目的地：[目的地列表]
  📅 原行程：[天数]天[晚数]晚
  🏨 提到的住宿：
     - [酒店1]（[描述]）
     - [酒店2]（[描述]）
  📍 提到的景点/活动：
     - [景点1]
     - [景点2]
     ...
  🍜 提到的餐厅：
     - [餐厅1]
     - [餐厅2]

⚠️ 发现[N]个需要调整的地方：
  ① [调整1]
  ② [调整2]
  ...
━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

### 阶段2: 数据验证 (Validation)

用 FlyAI 验证攻略中的每个信息节点：

#### 2.1 验证航班/交通

```bash
NODE_TLS_REJECT_UNAUTHORIZED=0 flyai search-flight \
  --origin "[用户出发城市]" --destination "[目的地]" \
  --dep-date [用户日期] --back-date [返回日期] --sort-type 3
```

#### 2.2 验证酒店

```bash
NODE_TLS_REJECT_UNAUTHORIZED=0 flyai search-hotel \
  --dest-name "[目的地]" --key-words "[原攻略酒店名]" \
  --check-in-date [入住日期] --check-out-date [退房日期]
```

#### 2.3 验证景点

```bash
NODE_TLS_REJECT_UNAUTHORIZED=0 flyai search-poi --city-name "[目的地]"
```

#### 2.4 验证结果分类

对每个信息节点标注状态：
- ✅ **可用**：找到匹配数据，可直接预订
- ⚠️ **需确认**：信息可能过时，建议自行确认
- ❌ **不可用**：酒店满房/景点关闭等，提供替代方案
- ℹ️ **原文保留**：飞猪暂无数据（如餐厅），保留原推荐

### 阶段3: 路线优化与确认 (Route Optimization)

在生成最终行程前，**必须主动分析原攻略的路线合理性**。

#### 3.1 路线问题检测

解析攻略后，检查以下常见问题：

| 问题类型 | 判断标准 | 示例 |
|---------|---------|------|
| **走回头路** | 同一天景点在地图上东西/南北反复横跳 | 岳麓山(西)→橘子洲(中)→杜甫江阁(东) |
| **区域分散** | 同一天景点分布在相距较远的不同区域 | 上午城北博物馆，下午城南景点 |
| **交通时间过长** | 景点间通勤超过1小时且无顺路性 | 跨江/跨区域频繁切换 |
| **时间冲突** | 夜景景点安排在白天，或反之 | 白天去杜甫江阁（应晚上） |

#### 3.2 路线优化方案生成

发现问题后，基于地理分布重新规划：

**优化原则**：
- 按区域集中游玩（如：河西线、河东线、城北线）
- 按方向顺路推进（如：从北到南、从东到西）
- 减少交通时间，增加游玩时间

#### 3.3 用户确认流程

**必须询问用户选择**，不能直接替用户决定：

```
🔍 路线优化分析
━━━━━━━━━━━━━━━━━━━━━━━━━━━

我分析了原攻略的路线，发现以下可以优化的地方：

【原攻略路线问题】
❌ Day1：岳麓山(西) → 橘子洲(中) → 杜甫江阁(东)
   问题：东西折返，多走约8km回头路

❌ Day2：IFS(中) → 丰盈西里(东) → 黄兴路(中) → 南门口(南)
   问题：反复横跳，交通时间约2.5小时

【优化后路线】
✅ Day1：岳麓山 → 爱晚亭 → 岳麓书院 → 橘子洲（一路向南）
   优势：节省1小时交通时间，少走6km

✅ Day2：天心阁 → 南门口 → IFS → 黄兴路（由南向北）
   优势：顺路不绕，步行+短途地铁即可

━━━━━━━━━━━━━━━━━━━━━━━━━━━

🤔 你希望采用哪个版本？

① 【遵循原文】按原攻略顺序走（适合想打卡同款路线）
② 【智能优化】采用优化后的路线（更省时省力）
```

使用 `ask_user_question` 收集用户选择：

```json
{
  "questions": [
    {
      "question": "路线规划方式",
      "header": "路线选择",
      "multiSelect": false,
      "options": [
        {
          "label": "遵循原攻略",
          "description": "按原作者顺序打卡同款路线"
        },
        {
          "label": "智能优化",
          "description": "AI优化路线，省时省力少走路"
        }
      ]
    }
  ]
}
```

#### 3.4 根据选择生成行程

- **选择「遵循原攻略」**：按原顺序输出，但标注潜在问题提示
- **选择「智能优化」**：按优化后的路线输出，展示优化对比

### 阶段4: 个性适配 (Adaptation)

根据用户情况调整原攻略：

| 差异类型 | 处理方式 |
|---------|---------|
| 天数不同 | 智能压缩/扩展行程，标注删减/增加内容 |
| 出发城市不同 | 替换航班信息，重新计算大交通费用 |
| 日期/季节不同 | 更新价格，提示季节性差异 |
| 预算不同 | 提供平替方案或升级建议 |
| 人数不同 | 调整房型推荐和费用计算 |

### 阶段4: 方案输出 (Delivery)

输出时同时生成两种格式：
1. **文本格式**：直接在对话中展示，方便即时阅读
2. **HTML 文件**：可视化攻略页面，方便保存和分享

#### 4.1 生成 HTML 可视化攻略

在输出文本攻略后，使用 `create_file` 工具生成 HTML 文件：

```python
create_file(
  file_path="[用户工作目录]/[目的地]-攻略-[日期].html",
  file_content="[HTML内容]"
)
```

**HTML 文件命名规则**：`{目的地}-攻略-{出发日期}.html`
- 示例：`普吉岛-攻略-2026-04-04.html`

**HTML 模板**：见 [reference/html-template.md](reference/html-template.md)

**输出提示**：
```
📄 已生成可视化攻略文件：
   👉 [目的地]-攻略-[日期].html
   
   你可以：
   - 在浏览器中打开查看完整攻略
   - 分享给同行人一起查看
   - 打印成PDF随身携带
```

#### 4.2 完整攻略格式（文本版）

```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🌿 你的[目的地]攻略（基于@[原作者] 改编）
   [出发城市]出发 · [日期区间] · [天数]天[晚数]晚 · [人数]人
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

✈️ 大交通方案
┌─────────────────────────────────────────────┐
│ 去程（推荐）：                               │
│ [日期] [航班号] [时间] ¥[价格]/人            │
│ 💡 [推荐理由/省钱提示]                       │
│                                              │
│ 回程：                                       │
│ [日期] [航班号] [时间] ¥[价格]/人            │
│                                              │
│ ✅ 往返合计 ¥[总价]/人                       │
└─────────────────────────────────────────────┘


📅 Day 1 · [日期]（[周几]）— [当日主题]
━━━━━━━━━━━━━━━━━━━━━━━━━━━

  [时间]  ✈️ 到达[机场]
  [时间]  🚗 机场→[目的地]（[交通方式]约[时长]）
  
  [时间]  🏨 入住
  ┌──────────────────────────────────────────┐
  │ 原攻略推荐：[原酒店名]（[原描述]）         │
  │                                           │
  │ 🔍 飞猪搜索结果：                          │
  │ [✅/⚠️/❌] [状态说明]                      │
  │ ⭐ [评分] · [与原攻略对比说明]             │
  │ 👉 [查看详情并预订]                         │
  │                                           │
  │ 💡 同类替代（更便宜/更好）：               │
  │ · [替代酒店1] ¥[价格]/晚 ⭐[评分]          │
  │ · [替代酒店2] ¥[价格]/晚 ⭐[评分]          │
  └──────────────────────────────────────────┘
  
  [时间]  📍 [景点名]
         → search-poi 验证结果：
         [✅/⚠️] [景点名] · [门票] · [开放时间]
         💡 [原攻略提示或建议]
  
  ...

📅 Day 2 · [日期]...
...

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

💰 费用总览（[人数]人合计）
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌─────────────┬──────────┬───────────────────┐
│ 项目         │ 费用     │ 备注               │
├─────────────┼──────────┼───────────────────┤
│ 机票往返×N   │ ¥[金额]  │ [航班说明]         │
│ 住宿[N]晚    │ ¥[金额]  │ [酒店×价格]        │
│ 景点门票×N   │ ¥[金额]  │ [景点列表]         │
│ 城际交通      │ ¥[金额]  │ [说明]             │
│ 当地交通      │ ¥[金额]  │ 打车+租车等        │
│ 餐饮预估      │ ¥[金额]  │ [天数]天           │
├─────────────┼──────────┼───────────────────┤
│ 📊 合计      │ ¥[总额]  │ 人均 ¥[人均]       │
└─────────────┴──────────┴───────────────────┘

[预算对比和调整建议]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

📋 与原攻略的差异说明
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌───┬────────────────┬────────────────────────┐
│ # │ 原攻略          │ 你的版本               │
├───┼────────────────┼────────────────────────┤
│ 1 │ [原内容]        │ [调整说明]             │
│ 2 │ [原内容]        │ [调整说明]             │
│ ...│               │                        │
└───┴────────────────┴────────────────────────┘

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

🔘 一键操作
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  [📋 保存完整攻略到"我的行程"]
  
  [✈️ 预订去程机票 [航班] ¥[价格]×[人数]]
  [✈️ 预订回程机票 [航班] ¥[价格]×[人数]]
  [🏨 预订[酒店名] [日期] [晚数]晚]
  
  [🔄 我想调整某天的行程]
  [💰 帮我切换成省钱版]
  [📤 分享给同行人]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

---
