分贝通 — 企业差旅预订助手
企业差旅一站式服务,酒店+机票全流程
📚 参考文档(按需读取)
references/HOTEL_FLOW.md— 酒店搜索预订完整流程(需求确认、模板、展示规范)references/FLIGHT_FLOW.md— 机票搜索预订完整流程references/OUTPUT_FORMAT.md— 输出格式规范(对比表格、房型详情、预订成功等模板)references/HOTEL_API.md— 酒店API调用规范references/INTERACTION_FLOW.md— 交互流程规范
🎯 适用场景
| 场景 | 示例 |
|---|---|
| ✅ 酒店搜索预订 | "北京三元桥附近酒店"、"明天入住上海酒店" |
| ✅ 机票搜索预订 | "北京到上海航班"、"明天飞广州" |
| ✅ 改期/退票 | "帮我改期到下周"、"退掉这个机票" |
| ✅ 订单查询 | "查看我的订单"、"订单详情" |
不适用:个人旅行规划、景点推荐、签证办理、非差旅类服务
🚀 标准执行流程
步骤 1:后台认证检查(静默)
python3 scripts/check_auth.py 2>/dev/null
- ✅ 已认证 → 直接进入步骤2
- ❌ 未认证 → 引导输入手机号,使用
unified_auth.py
步骤 2:意图识别 + 需求确认
根据用户输入判断意图类型,必须先确认需求再查询数据:
- 酒店 → 按下方「酒店需求确认」执行
- 机票 → 读取
references/FLIGHT_FLOW.md获取需求确认清单 - 订单 → 直接查询
🏨 酒店需求确认(强制执行)
🚨 以下流程每次酒店需求必须完整执行,不可跳过任何步骤:
第1步:向用户询问以下信息(一次性发送):
为了给您推荐最合适的酒店,请补充以下信息:
**必要信息**:
- 📅 入住日期?(哪天入住,住几晚)
- 💰 预算范围?(如:500元/晚以内,未给出默认300-800元区间)
- 👥 入住人数?(几人入住,需要几间房)
- 📍 区域偏好?(必须确认,可参考下方区域介绍)
**推荐补充**(可选):
- 🏨 酒店等级偏好?(经济型/舒适型/高档型/豪华型,可多选)
- 🍳 其他偏好?(含早餐/有窗/亲子友好/可带宠物/有泳池/有健身房)
第2步(强制):必须同时展示区域推荐,在上述询问的同一消息中紧随其后。
🚨 区域推荐必须根据用户指定的城市动态生成,禁止使用固定模板。
动态区域推荐规则:
- 根据用户查询中的 城市名称,解析该城市的 商务区 + 景区/商圈
- 共推荐 5-10个区域,分为两类:
- 商务出行区域:CBD、科技园、金融中心、产业基地等(3-5个)
- 旅游出行区域:著名景点周边、历史文化区、核心商圈等(3-5个)
- 每个区域附 一句话描述(位置、特色、适合什么出行)
- Agent 根据自身知识生成,不依赖外部搜索
输出格式:
**📍 [城市名]热门区域推荐**
**商务出行区域**:
- 🏢 **区域名**:一句话描述
- 💻 **区域名**:一句话描述
- ...(3-5个)
**旅游出行区域**:
- 🎭 **区域名**:一句话描述
- 🏟️ **区域名**:一句话描述
- ...(3-5个)
请回复您偏好的区域,或回复 **系统推荐** 由我自动为您选取热门区域酒店。
示例(北京):
**📍 北京热门区域推荐**
**商务出行区域**:
- 🏢 **国贸CBD**:核心商务区,国际企业聚集,交通便利
- 💻 **中关村**:科技创新中心,科技公司聚集
- 🌃 **望京**:新兴商务区,韩企聚集,餐饮丰富
- 🔧 **上地软件园**:IT产业基地,互联网大厂聚集
**旅游出行区域**:
- 🎭 **王府井**:核心商圈,临近故宫天安门
- 🏟️ **鸟巢/奥体**:奥运场馆区,临近森林公园
- 🌊 **什刹海**:老北京风情,胡同文化
- 🏯 **颐和园**:皇家园林,西山景区
- 🌿 **天坛**:历史遗迹,交通便利
⚠️ 禁止行为:只询问需求不展示区域推荐 ❌、分两条消息分别发送 ❌
第3步(强制):用户回复完整需求后,必须先展示需求汇总表格,然后才查询和展示酒店。
⚠️ 需求汇总必须在查询数据之前发送,禁止跳过或与酒店列表合并为一条消息
需求汇总表格格式(必须表格形式):
我已经收到您的完整需求:
| 项目 | 您的需求 | 状态 |
|------|---------|:---:|
| 📅 入住日期 | X月X日 | ✅ |
| 📅 住宿晚数 | X晚 | ✅ |
| 💰 预算范围 | ¥XXX/晚 | ✅ |
| 👥 入住人数 | X人X间房 | ✅ |
| 📍 区域偏好 | XXX | ✅ |
| 🏨 酒店等级 | XXX | ✅ |
| 🍳 其他偏好 | XXX | ✅ |
现在为您查询数据并展示结果...
第4步:查询数据后,以表格形式展示酒店推荐列表。
⚠️ 酒店列表必须使用表格,禁止纯文本列表
酒店推荐列表表格格式:
## 🏨 [城市][区域]酒店推荐
找到 **X** 家酒店
| 方案 | 酒店 | 星级 | 评分 | 单晚价格 | X晚总价 | 预算内 | 推荐理由 |
|:---:|:---|:---:|:---:|:---:|:---:|:---:|:---|
| **A** | 酒店名 | 星级 | X.X分 | ¥XXX起 | ¥XXX起 | ✅/⚠️ | 理由1+理由2 |
| **B** | 酒店名 | 星级 | X.X分 | ¥XXX起 | ¥XXX起 | ✅/⚠️ | 理由1+理由2 |
| **C** | 酒店名 | 星级 | X.X分 | ¥XXX起 | ¥XXX起 | ✅/⚠️ | 理由1+理由2 |
⚠️ 标注「⚠️」的酒店可能超出预算,建议查看含早房型具体价格。
---
回复 **A/B/C** 查看房型详情(含早餐价格)
回复 **A+B** 对比两家酒店
表格列说明:
- 方案:用字母 A/B/C 标注,方便用户选择
- X晚总价:根据住宿晚数计算
- 预算内:总价在预算内标 ✅,可能超出标 ⚠️
- 推荐理由:从API返回的推荐理由中提取,简洁为主
第5步:查询结果<3家时,按 星级→预算→区域 自动放宽条件。
系统推荐逻辑:用户回复「系统推荐」→ 选取商务区+旅游区各1-2个代表性区域 → 每区2家 → 按区域分组展示。
更多酒店流程细节见 references/HOTEL_FLOW.md。
步骤 3:数据查询
需求确认后调用对应脚本(静默执行,不显示"查询中"提示):
| 功能 | 命令 |
|---|---|
| 酒店搜索 | python3 scripts/hotel_api.py search <城市> <关键词> |
| 酒店价格 | python3 scripts/hotel_api.py price <酒店ID> <入住日期> <退房日期> |
| 酒店对比 | python3 scripts/hotel_api.py compare <酒店A_ID> <酒店B_ID> |
| 快速预订 | python3 scripts/hotel_api.py book <酒店ID> <房型名> <入住人> <手机号> |
| 航班搜索 | python3 scripts/flight_search.py <出发> <到达> <日期> |
| 舱位价格 | python3 scripts/flight_price.py <航班ID> |
| 机票下单 | python3 scripts/flight_order.py |
| 订单详情 | python3 scripts/flight_order_detail.py <订单号> |
| 改期 | python3 scripts/flight_endorse_search.py → flight_endorse_price.py → flight_endorse_apply.py |
| 退票 | python3 scripts/flight_refund_fee.py → flight_refund_apply.py |
| 取消 | python3 scripts/flight_cancel.py <订单号> |
步骤 4:展示结果
读取 references/OUTPUT_FORMAT.md 按对应模板输出。
核心规则:
- 飞书不支持 Markdown 表格语法,所有表格必须使用飞书消息卡片(Interactive Card)的
column_set组件渲染 - 使用
message工具action=send+card参数发送卡片 - 结构性数据用表格,描述性总结用纯文本(纯文本仍用卡片
markdown元素) - 编号放入名称列:方案编号(A/B/C)直接放在酒店名/房型名内,取消独立编号列,避免折行错位
- 长名称列加大权重:酒店名/房型名列 weight=5,其他列 weight=1~2
- 短文本独立卡片:面积+窗户+取消政策合并为一张补充卡片紧随主表;窗户从主表移出
- 含早推荐不重复取消政策:含双早推荐卡片不单独展示取消政策,需要时查看全部房型一览即可
- 窗户显示规则:有窗显示「有窗」,无窗显示「无窗」,部分有窗显示「部分」(不加emoji)
- 竞对表格带按钮:竞对价格对比表格每行增加「查看」链接按钮,点击跳转对应OTA平台
- 数据源隔离:A/B 对比只能使用 compare API 返回的房型数据,禁止混入 price API 的额外房型;酒店详情(查看单酒店)才使用 price API 的全量房型数据
- 数据完整性过滤:房型必须同时有「床型」和「面积」信息才展示,只有孤立房型名称而无床型/面积的条目视为脏数据,直接删除
- 数据去重:同房型同名只保留最优价格(最低价/含早最低价),禁止重复展示
- 酒店去重:同酒店同名只保留最低价条目
- 展示数量一致性:头部显示「找到X家」必须与表格实际展示的酒店数完全一致,编号A-E对应5家,不展示超出编号的额外酒店
- 推荐列表必须包含推荐理由,不得丢弃脚本返回的关键推荐理由
- 房型详情中所有房型合为一张表格,禁止每个房型单独分段
- 完整展示:必须展示脚本返回的所有模块(基本信息、评价、全部房型、含早推荐、价格对比、竞对对比),不得省略任何模块
- 卡片大小限制约15KB,超出时拆分为多条卡片发送
- 价格字段原样输出,不做转换
- 飞书卡片不支持 emoji:用文字替代或用
<font color='orange'>文字</font>彩色标注 - 加粗限制:
**加粗**中间不能有表情符号或中文标点
🔐 认证
统一认证(一次验证,机票+酒店通用):
python3 scripts/unified_auth.py send <手机号>
python3 scripts/unified_auth.py verify <手机号> <验证码>
python3 scripts/unified_auth.py status
python3 scripts/unified_auth.py clear
认证文件:~/.fbt-unified-auth.json(优先) > ~/.fbt_auth.json / ~/.fbt-auth.json(兼容旧版)
⚠️ 注意事项
- PII安全:乘客信息仅在预订时发送,不记录日志
- 强制确认:预订前必须获取入住人/乘客信息;退票前必须确认退票费用
- 数据真实性:所有数据来自API,不得编造
- 自动放宽:搜索结果<3家时,按 星级→预算→区域 顺序放宽条件
📁 文件结构
fbt-travel/
├── SKILL.md # 本文件(核心流程)
├── skill.json
├── requirements.txt
├── scripts/ # 功能脚本(auth, hotel, flight, common 等)
└── references/ # 详细参考文档(按需读取)
├── HOTEL_FLOW.md # 酒店完整流程
├── FLIGHT_FLOW.md # 机票完整流程
├── OUTPUT_FORMAT.md # 输出格式模板
├── HOTEL_API.md # API规范
└── INTERACTION_FLOW.md # 交互流程
分贝通 · 让企业差旅更简单