---
name: flightAI
description: AI机票助手 - 实现国内航班搜索、舱位查询、预订下单、机票改期、机票退票。适用于用户询问航班、查询机票价格、提交机票订单、改期航班、退票时使用。
version: 1.0.0
metadata: {"openclaw": {"emoji": "✈️", "category": "travel", "tags": ["机票", "航班", "预订", "改期", "退票"], "requires": {"bins": ["python3"]}, "required": true}}
---

# AI机票助手

当用户询问航班搜索、舱位查询、机票预订、机票改期或机票退票时，使用此 skill 调用AI机票服务。

## 运行环境要求

本 skill 通过 **python3** 执行 HTTP POST 请求调用AI机票服务。**运行环境必须提供 python3**。

## 隐私与个人信息（PII）说明

预订功能会将用户提供的**个人信息**（乘客姓名、手机号、证件号等）通过 HTTP POST 发送至AI机票服务，以完成机票预订。使用本 skill 即表示用户知晓并同意上述 PII 被发送到外部服务。请勿在日志或回复中暴露用户个人信息。

## 可用工具

**重要**：下方示例中的参数均为占位，调用时需**根据用户当前需求**填入实际值（城市、日期、航班号、乘机人、联系方式等），勿直接照抄示例值。

## 适用场景

- 按出发/到达城市、日期搜索航班列表
- 查看指定航班的舱位价格详情
- 用户确认后创建机票预订订单
- 查询已创建订单的详细信息
- 用户确认后改期或退票已创建订单的航班

## 鉴权流程（必须先完成）

**重要**：使用任何功能前，用户必须先完成鉴权流程。鉴权成功后获得的 apiKey 会自动保存在用户主目录的 `~/.fbt_auth.json` 文件中，新会话会自动沿用。

### 鉴权步骤

1. **发送验证码**：用户提供手机号，系统发送验证码到手机
2. **验证并获取 apiKey**：用户输入验证码，验证成功后获得 apiKey
3. **自动注入**：后续所有 API 调用会自动携带 apiKey

### 鉴权命令

#### 1. 发送验证码

```bash
python3 scripts/auth.py send <phone>
```

**示例**：
```bash
python3 scripts/auth.py send 13800138000
```

#### 2. 验证并获取 apiKey

```bash
python3 scripts/auth.py verify <phone> <code>
```

**示例**：
```bash
python3 scripts/auth.py verify 13800138000 123456
```

#### 3. 查看鉴权状态

```bash
python3 scripts/auth.py status
```

### 鉴权检查规则

- 在执行任何航班查询、预订、改期、退票操作前，必须先检查鉴权状态
- 如果未鉴权或 apiKey 已过期，必须引导用户完成鉴权流程
- 鉴权成功后，所有 API 调用会自动携带 apiKey，无需手动传递

### 1. 航班搜索 (searchFlight)

**功能**：查询国内航班列表

**必填参数**：

- `start_code`: 出发城市名称（如 北京、上海、广州）
- `end_code`: 到达城市名称
- `date`: 出发日期（格式 YYYY-MM-DD）

**触发词**：某地到某地航班、查机票、搜航班、机票价格

**执行命令**：

```bash
python3 scripts/search_flights.py <start_code> <end_code> <date>
```

**示例**：

```bash
python3 scripts/search_flights.py 北京 上海 2026-03-15
```

**返回结果**：航班列表（航班号、航空公司、起降时间、机型、机场、最低价等）

**上下文检查规则**：

- 如果用户在当前或之前的消息中已经提供了某个参数，则**无需再次询问**该参数
- 只向用户询问**尚未提供**的参数
- 如果所有参数都已提供，直接发起请求

**展示要求**:

- 必须使用代码块包裹脚本输出的表格
- 必须展示完整表格
- 参考"输出格式要求"章节的标准格式

### 2. 舱位详情查询 (searchPrice)

**功能**：查询特定航班的详细价格信息

**必填参数**：

- `start_code`: 出发机场三字码（从 searchFlight 响应结果中获取）
- `end_code`: 到达机场三字码（从 searchFlight 响应结果中获取）
- `date`: 出发日期（格式 YYYY-MM-DD）
- `flight_no`: 航班号

**触发词**：查看航班详情、这个航班的舱位价格

**执行命令**：

```bash
python3 scripts/search_price.py <start_code> <end_code> <date> <flight_no>
```

**示例**：

```bash
python3 scripts/search_price.py PEK PVG 2026-03-15 CA1501
```

**返回结果**：该航班的各舱位价格、折扣、退改签规则等详细信息，并将舱位信息保存到 `/tmp/flight_seat_items.json` 供下单使用

**使用场景**：用户先使用航班搜索查询航班列表，从返回的航班列表中选择某个航班后，使用此功能查询该航班的详细价格信息

**展示要求**:

- 必须使用代码块包裹脚本输出的表格
- 必须展示完整表格
- 参考"输出格式要求"章节的标准格式

### 3. 退改规则和行李额查询 (searchGuestRule)

**功能**：查询指定舱位的详细退改签规则和行李额

**必填参数**：

- `seat_index`: 舱位编号（从舱位详情查询结果中选择，如 1、2、3）

**触发词**：退改规则、退票规则、改签规则、这个舱位的退改政策、行李额、客规

**执行命令**：

```bash
python3 scripts/search_guest_rule.py <seat_index>
```

**示例**：

```bash
python3 scripts/search_guest_rule.py 1
```

**返回结果**：该舱位的退票、改签、行李额等详细规则说明

**重要说明**：

- 此功能为**可选流程**，仅在用户明确询问退改规则时调用
- `seat_index` 必须来自最近一次舱位详情查询的结果
- 舱位信息从 `/tmp/flight_seat_items.json` 文件中读取
- 如果文件不存在或舱位编号无效，会提示用户先执行舱位详情查询

### 4. 机票下单 (createOrder)

**功能**：创建机票订单

**必填参数**：

- `seat_index`: 舱位编号（从上一步舱位详情查询结果中选择，如 1、2、3）
- `passenger_name`: 乘客姓名
- `passenger_phone`: 乘客手机号
- `passenger_id`: 乘客证件号

**触发词**：订这个、预订、下单

**执行命令**：

```bash
python3 scripts/create_order.py <seat_index> <passenger_name> <passenger_phone> <passenger_id>
```

**示例**：

```bash
python3 scripts/create_order.py 1 "张三" "13800138000" "110101199001011234"
```

**返回结果**：订单号、支付链接、订单详情链接等

**重要说明**：

- `seat_index` 必须来自最近一次舱位详情查询的结果
- 舱位信息从 `/tmp/flight_seat_items.json` 文件中读取
- 如果文件不存在或舱位编号无效，会提示用户先执行舱位详情查询
- **必须向用户索取**乘客姓名、手机号和证件号，不可使用默认值或跳过

### 5. 订单详情查询 (orderDetail)

**功能**：查询已创建订单的详细信息

**必填参数**：

- `order_id`: 订单号（从下单接口返回的订单号中获取）

**触发词**：订单详情、查看订单、查询订单、订单状态

**执行命令**：

```bash
python3 scripts/order_detail.py <order_id>
```

**示例**：

```bash
python3 scripts/order_detail.py 69a677bee4b0252bd532e35c
```

**返回结果**：订单的详细信息，包括航班信息、乘客信息、支付状态等

**重要说明**：

- 订单号可以从下单接口的返回结果中获取
- 此功能可用于查询订单的实时状态和详细信息

### 6. 取消订单 (cancelOrder)

**功能**：取消待支付状态的订单

**必填参数**：

- `order_id`: 订单号（从下单接口返回的订单号中获取）

**触发词**：取消订单、不要了、取消这个订单

**执行命令**：

```bash
python3 scripts/cancel_order.py <order_id>
```

**示例**：

```bash
python3 scripts/cancel_order.py 69a677bee4b0252bd532e35c
```

**返回结果**：取消成功或失败

**重要说明**：

- 此功能仅适用于待支付状态的订单
- 订单号可以从下单接口的返回结果中获取
- 已支付或已出票的订单无法通过此接口取消，需要使用退票功能

### 7. 改期航班搜索 (endorseSearchFlight)

**功能**：查询可改期的航班列表

**必填参数**：

- `order_id`: 订单号（从订单详情或下单接口返回的订单号中获取）
- `dep_date`: 改期日期（格式 YYYY-MM-DD，需要向用户索取）

**触发词**：改期、改签、换航班、查改期航班

**执行命令**：

```bash
python3 scripts/endorse_search_flight.py <order_id> <dep_date>
```

**示例**：

```bash
python3 scripts/endorse_search_flight.py 69a677bee4b0252bd532e35c 2026-03-20
```

**返回结果**：可改期的航班列表（航班号、航空公司、起降时间、机场、最低价等）

**重要说明**：

- 订单号可以从订单详情接口获取
- 改期日期需要向用户索取
- 此接口会自动从订单详情中提取 flight_no（从 segmentInfo.flight_no 获取）和 ticket_ids（从 passengerList[0].productId 获取）
- 返回的航班列表格式与航班搜索接口一致，方便用户选择

**展示要求**:

- 必须使用代码块包裹脚本输出的表格
- 必须展示完整表格
- 参考"输出格式要求"章节的标准格式

### 8. 改期舱位详情查询 (endorseSearchPrice)

**功能**：查询指定改期航班的舱位价格详情（改期费、机票差价费等）

**必填参数**：

- `order_id`: 订单号（从订单详情或下单接口返回的订单号中获取）
- `dep_date`: 改期日期（格式 YYYY-MM-DD，与改期航班搜索时使用的日期一致）
- `flight_no`: 航班号（从改期航班搜索结果中选择）

**触发词**：查看改期价格、这个航班的改期费、改期舱位详情

**执行命令**：

```bash
python3 scripts/endorse_search_price.py <order_id> <dep_date> <flight_no>
```

**示例**：

```bash
python3 scripts/endorse_search_price.py 69a677bee4b0252bd532e35c 2026-03-20 HU7603
```

**返回结果**：该航班的各舱位改期费、机票差价费、预估总改期费等详细信息，并将舱位信息保存到 `/tmp/endorse_seat_items.json` 供改期下单使用

**重要说明**：

- 此接口必须在改期航班搜索之后调用
- flight_no 必须来自改期航班搜索返回的航班列表，需要用户选择
- 此接口会自动从订单详情中提取 ticket_ids（从 passengerList[0].productId 获取）
- 展示的改期费用信息包括：改期费、机票差价费、预估总改期费
- 舱位信息会保存到临时文件供后续改期下单使用

**展示要求**:

- 必须使用代码块包裹脚本输出的表格
- 必须展示完整表格
- 参考"输出格式要求"章节的标准格式

### 9. 提交改期申请 (endorseApply)

**功能**：提交改期申请，创建改期订单

**必填参数**：

- `seat_index`: 舱位编号（从改期舱位详情查询结果中选择，如 1、2、3）
- `order_id`: 原订单号（从订单详情或下单接口返回的订单号中获取）

**触发词**：确认改期、提交改期申请、改期下单

**执行命令**：

```bash
python3 scripts/endorse_apply.py <seat_index> <order_id>
```

**示例**：

```bash
python3 scripts/endorse_apply.py 1 69a677bee4b0252bd532e35c
```

**返回结果**：改期单订单号、支付链接、订单详情链接等

**重要说明**：

- `seat_index` 必须来自最近一次改期舱位详情查询的结果
- 舱位信息从 `/tmp/endorse_seat_items.json` 文件中读取
- 如果文件不存在或舱位编号无效，会提示用户先执行改期舱位详情查询
- 改期申请成功后会返回新的改期单订单号，需要用户完成支付

### 10. 预估退票费查询 (refundFeeDetail)

**功能**：查询退票费用详情

**必填参数**：

- `order_id`: 订单号（从订单详情或下单接口返回的订单号中获取）

**触发词**：查询退票费、退票费用、预估退票费

**执行命令**：

```bash
python3 scripts/refund_fee_detail.py <order_id>
```

**示例**：

```bash
python3 scripts/refund_fee_detail.py 69a677bee4b0252bd532e35c
```

**返回结果**：预估退票费（单票）

**重要说明**：

- 此接口用于在退票前预估退票费用
- 用户需要确认退票费用后才能提交退票申请
- 返回的 refund_amount 需要在提交退票申请时使用

### 11. 提交退票申请 (refundApply)

**功能**：提交退票申请

**必填参数**：

- `order_id`: 订单号（从订单详情或下单接口返回的订单号中获取）
- `refund_amount`: 预估退票费（从预估退票费查询接口返回的 refund_amount 获取）

**触发词**：确认退票、提交退票申请、退票

**执行命令**：

```bash
python3 scripts/refund_apply.py <order_id> <refund_amount>
```

**示例**：

```bash
python3 scripts/refund_apply.py 69a677bee4b0252bd532e35c 808
```

**返回结果**：退票申请结果、退票单号

**重要说明**：

- 此接口必须在预估退票费查询之后调用
- refund_amount 必须来自预估退票费查询接口返回的 refund_amount
- product_ids 会自动从订单详情中获取（从 passengerList 中提取 productId）
- 退票申请提交后需要等待审核

## 完整流程示例

**用户**：3月15号北京到上海的航班

**AI 执行**：

1. 检查上下文，发现用户已提供出发城市（北京）、到达城市（上海）、日期（3月15号）
2. 调用 `search_flights.py 北京 上海 2026-03-15`
3. 展示航班列表

**用户**：看一下 CA1501 这个航班的舱位

**AI 执行**：

1. 从上一轮结果确认航班号 CA1501，连同城市和日期
2. 调用 `search_price.py PEK PVG 2026-03-15 CA1501`
3. 展示舱位列表（价格、退改签规则等）
4. 提示用户可选择舱位编号进行预订

**用户**：第1个舱位的退改规则是什么？（可选步骤）

**AI 执行**：

1. 调用 `search_guest_rule.py 1`
2. 展示该舱位的详细退改签规则

**用户**：订第1个，乘客张三 13800138000 110101199001011234

**AI 执行**：

1. 从用户输入提取：seat_index=1、passenger_name=张三、passenger_phone=13800138000、passenger_id=110101199001011234
2. 调用 `create_order.py 1 "张三" "13800138000" "110101199001011234"`
3. 展示订单号、支付链接等信息
4. 提醒用户完成支付

**用户**：查看订单详情

**AI 执行**：

1. 从上一轮结果获取订单号（如：69a677bee4b0252bd532e35c）
2. 如果用户没有提供手机号，向用户索要创建订单时使用的乘机人手机号
3. 调用 `order_detail.py 69a677bee4b0252bd532e35c 13800138000`
4. 展示订单的详细信息

**用户**：取消订单

**AI 执行**：

1. 从上一轮结果获取订单号和手机号
2. 调用 `cancel_order.py 69a677bee4b0252bd532e35c 13800138000`
3. 展示取消订单成功或失败的信息

**用户**：我想改期到3月20号

**AI 执行**：

1. 从上一轮订单详情中获取订单号和手机号
2. 向用户确认改期日期（3月20号，格式化为 2026-03-20）
3. 调用 `endorse_search_flight.py 69a677bee4b0252bd532e35c 13800138000 2026-03-20`
4. 展示可改期的航班列表

**用户**：看一下 HU7603 这个航班的改期价格

**AI 执行**：

1. 从上一轮改期航班搜索结果中确认航班号 HU7603
2. 调用 `endorse_search_price.py 69a677bee4b0252bd532e35c 13800138000 2026-03-20 HU7603`
3. 展示该航班的改期舱位价格详情（改期费、机票差价费、预估总改期费等）
4. 提示用户可选择舱位进行改期

**用户**：确认改期第1个舱位

**AI 执行**：

1. 从上一轮改期舱位详情查询结果中确认舱位编号 1
2. 调用 `endorse_apply.py 1 69a677bee4b0252bd532e35c 13800138000`
3. 展示改期单订单号、支付链接、订单详情链接等信息
4. 提醒用户完成支付

**用户**：我要退票

**AI 执行**：

1. 从上一轮订单详情中获取订单号、手机号和票号
2. 调用 `refund_fee_detail.py 69a677bee4b0252bd532e35c 13800138000`
3. 展示退票费详情
4. **必须强制用户确认退票费用，无论退票费是多少（包括¥0），都不得擅自提交退票申请**

**用户**：确认退票

**AI 执行**：

1. 从上一轮退票费查询结果中获取退款金额
2. 调用 `refund_apply.py 69a677bee4b0252bd532e35c 525 13800138000`
3. 展示退票状态、退票单号等信息
4. 提醒用户等待审核

## 输出格式要求

**🚨 强制要求**:

1. 禁止用自然语言改写表格内容
2. 所有表格必须用```plaintext```代码块包裹
3. 不得省略或截断任何航班/舱位信息

### 航班列表展示

查询结果以表格形式平铺展示，每个航班一行，只显示最低价：

```
=================================================================================================
航班号    航空公司      出发时间    到达时间     出发机场    到达机场    最低价
=================================================================================================
HO2218   吉祥航空      08:45      10:55        大兴       虹桥       ¥470
MF8561   厦门航空      07:55      10:25        大兴       浦东       ¥490
=================================================================================================
共找到 X 个航班
=================================================================================================
```

### 舱位详情展示

展示各舱位价格、折扣等详细信息，并标注舱位编号供用户选择：

```
====================================================================================
编号   舱位      价格      折扣    机建费   燃油费   总票价       状态
====================================================================================
[1]   经济舱     ¥800     9.5     ¥50      ¥20    ¥870     余座充足
[2]   经济舱     ¥850     10      ¥50      ¥20    ¥920     余座充足
====================================================================================
```

### 退改规则展示

展示选定舱位的详细退改签规则和行李额：

```
====================================================================================================
舱位信息: 经济舱 | T舱 | 票面价 ¥800 
====================================================================================================
【退票规则】
----------------------------------------------------------------------------------------------------
  • 未使用的首个航班起飞前168小时（含）到∞小时（不含）退票时,余额再收20%退票费
----------------------------------------------------------------------------------------------------
【改期规则】
----------------------------------------------------------------------------------------------------
  • 起飞前168小时以上：变更费按订座舱位公布运价10%收取
----------------------------------------------------------------------------------------------------
【签转规则】
----------------------------------------------------------------------------------------------------
  不能签转
----------------------------------------------------------------------------------------------------
【行李额】
----------------------------------------------------------------------------------------------------
  • 免费托运行李额：20KG，单件尺寸上限：40*60*100CM
  • 免费手提行李额：5KG，单件尺寸上限：20*40*55CM
====================================================================================================
```

### 订单结果展示

展示订单号、支付链接、航班信息等关键信息：

```
✅ 订单创建成功！

航班信息:
- 航班号: CA1501
- 出发时间: 08:00
- 到达时间: 10:30
- 舱位: 经济舱

订单号: 69a677bee4b0252bd532e35c
支付截止时间: 23:59

💳 [立即支付](https://dwz.cn/TftO1qmp)
```

### 订单详情展示

展示订单的完整信息，包括航班信息、乘客信息、支付状态等：

```
====================================================================================
订单详情
====================================================================================

订单号: 69a677bee4b0252bd532e35c
订单状态: 待支付
创建时间: 2026-03-04 10:30:00
支付截止时间: 2026-03-04 23:59:59

航班信息:
- 航班号: CA1501
- 出发时间: 2026-03-15 08:00
- 到达时间: 2026-03-15 10:30
- 出发机场: 北京首都T3
- 到达机场: 上海虹桥T2
- 舱位: 经济舱

乘客信息:
- 姓名: 张三
- 证件类型: 身份证
- 证件号: 110101199001011234
- 联系电话: 13800138000
- 票号: 888-1234567890

价格信息:
- 票面价: ¥800
- 机建费: ¥50
- 燃油费: ¥20
- 总金额: ¥870

====================================================================================
```

### 改期航班搜索展示

展示可改期的航班列表，格式与航班搜索一致：

```
=========================================================================================
正在搜索改期航班...
原航班号: HU7601
改期日期: 2026-03-20

=========================================================================================
航班号    航空公司      出发时间    到达时间     出发机场    到达机场    最低价
=========================================================================================
HO2218   吉祥航空      08:45      10:55        大兴       虹桥       ¥470
MF8561   厦门航空      07:55      10:25        大兴       浦东       ¥490
=========================================================================================
共找到 2 个航班
=========================================================================================
```

### 改期舱位详情展示

展示指定改期航班的各舱位改期费用详情：

```
==================================================================================================================================
航班信息: HU7603 | 08:25-10:35 | 空客A330 | T2-T2
==================================================================================================================================
编号      舱位          改期费        机票差价费     预估总改期费    状态          
==================================================================================================================================
[1]     经济舱         ¥100         ¥50          ¥150         余座充足        
[2]     经济舱         ¥100         ¥100         ¥200         余座充足        
==================================================================================================================================

共找到 3 个舱位价格
==================================================================================================================================
```

### 改期申请结果展示

展示改期申请成功后的关键信息：

```
改期航班信息:
- 航班号: HU7603
- 出发时间: 08:25
- 到达时间: 10:35

✅ 改期申请成功！

改期单订单号: 69b21e1ce4b0b89fdebddbd4

💳 [立即支付](https://dwz.cn/TftO1qmp)
```

### 退票费详情展示

展示退票费用详情：

```
预估退票费（单票）: ¥0
请确认是否同意退票费用，如同意，系统将自动提交退票申请
```

### 退票申请结果展示

展示退票申请结果：

```
================================================================================
✅ 退票申请成功，请等待审核！

退票单号: 69c12345e4b0c12fdeabcdef

温馨提示：
- 退票审核通常需要1-3个工作日
- 退款到账时间取决于银行处理速度
- 您可以随时查询订单状态了解退票进度
================================================================================
```

## 注意事项

1. **PII 安全**：乘客姓名、手机号、证件号等仅在预订时发送至服务，勿在日志或回复中暴露
2. **日期格式**：所有日期均为 YYYY-MM-DD
3. **下单前**：必须先执行舱位详情查询，获取舱位信息后才能下单
4. **强制索取信息**：下单时必须向用户索取乘客姓名、手机号和证件号，不可使用默认值或跳过
5. **数据准确性**：展示结果时必须基于脚本输出的原始数据，不得修改、添加或删除任何数据
6. **禁止幻想**：不得添加任何脚本输出中不存在的航班信息、价格或推荐内容
7. **强制确认退票**：退票时必须强制用户确认退票费用，无论退票费是多少（包括¥0），都不得擅自提交退票申请

