Hacktoberfest 2026:維護者為十月標記出來的 issue,仍然開放、適合新手。 瀏覽 Hacktoberfest issue

【2026飞猪AI旅行创新大赛】-商旅融合行程官(在会议间隙自动塞入最优"微行程"——带薪旅行,不耽误正事)

未關閉
#212 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

評估

難度
5/5
預估耗時
一週以上
新手友好度
20/100
Issue 類型
功能
描述清晰度
描述清楚
活躍度
活躍
技術堆疊
python
領域
ai, full-stack

研究方向

Start with the linked project repository, Geohzy/bleisure-planner, and read its README, then inspect app.py and demo.py to understand the web and command-line entry points. Run the documented demo with API keys configured to see the full planning flow. Done means the described meeting parsing, POI selection, time-constrained itinerary, route display, and one-stop replacement work as shown; this issue provides no specific change request to implement.

由索引模型根據 Issue 內容生成。

描述

2026飞猪AI旅行创新大赛 showcase

商旅融合行程官(Bleisure 助手)

参赛项目名称

商旅融合行程官(Bleisure 助手)

  • 一句话介绍:输入出差城市 + 会议时段,Agent 在会议间隙自动塞入最优"微行程"——带薪旅行,不耽误正事。
  • 赛道:开放命题

团队 / 作者与奖品领取人

  • 团队名称/作者:PinkyPN(个人独立参赛)
  • 主要提交人 GitHub ID(仅 1 位,必填):Geohzy
  • 其他成员(可选,仅用于署名):无

旅行场景与目标用户

面向场景:行程规划(会议间隙的微行程)+ 目的地探索 + 酒店/POI 选点 + 飞猪预订闭环。

打工人的刚需:出差到了一个城市,会议间隙有 2–3 小时空档,想出去转转又怕算不好时间耽误正事。

目标用户:异地出差、展会/会议参会的商旅人群——白天被议程占满,真正能自由支配的往往只有会议之间的两三个小时;后续可复用到企业差旅、会展(如云栖大会)等场景。

我做了什么

「商旅融合行程官」把会议之间的碎片时间当成一个约束求解问题来处理,全链路五步:

  1. 一句话会议解析(百炼):中文口语描述(如"明天下午2点到4点开会,晚上7点半客户晚宴")→ 结构化会议列表;再反推空闲窗口,两端各削 30 分钟作缓冲,短于 45 分钟的碎片不硬塞景点;
  2. 空间感知选点:用 flyai 真实 POI / 酒店数据,按酒店位置做 haversine 距离排序 + 偏好加权;多品类抓取(人文/地标/博物馆/园林/市集/文创)+ 关键词兜底(夜市/美食街/咖啡),按名去重,单路失败不中断整轮;
  3. 交通感知排站:两站之间按距离自动选步行/骑行/地铁公交/打车,并计入等车、进出站等固定耗时;再叠加开放时间约束——到访时段必须完整落在开放窗口内,打烊自动跳过并换同窗口备选,夜景类地点自动排到傍晚;
  4. AI 对比裁决(百炼):为每一站生成"为什么选它、为什么没选它",且提示词硬性约束:所有距离、耗时、时刻只能原样引用后端计算结果,模型只负责解释、不许编造数字;
  5. 输出与闭环:路线示意图 + 时间轴行程卡,每站直达飞猪详情/预订页;不满意可一键换站(只换指定站、路线图与裁决同步重算,不重跑全流程);实在排不下时给出结构化说明(约束 / 现实 / 处理),不硬排一个去不了的地点。

创新性:切入"时间硬约束 × 出行意愿"的联合优化,做时空约束下的微行程规划,人肉算不好;命中官方鼓励的"空间感知"方向,预设命题里无同类。另一个差异点是"数字纪律":距离、时刻全由确定性代码计算,大模型只做解析与解释,从机制上杜绝行程里的数字幻觉。
完整度:全链路真实数据、行程时间可复算;网页版 + 命令行版双入口;单元测试覆盖核心逻辑且全程不触网;无百炼 Key、额度用尽、单路接口失败时全链路降级,主流程不中断。
市场前景:商旅高频刚性需求,可扩展到企业差旅、会展(如云栖大会)等场景。

百炼使用说明(必填)

  • 百炼能力 / 模型:通过百炼 DashScope 接口调用文本模型。模型链定义在 llm.py(默认依次为 qwen3.8-2.4t-a95b、deepseek-v4-pro-0813、qwen3.8-flash、qwen3.8-27b、qwen3.8-max),可用环境变量 QWEN_MODELS(逗号分隔)或 QWEN_MODEL(单个)覆盖;链上前一个模型额度用尽、报错或返回空内容时,自动回退到下一个。
  • 调用方式(百炼 API / DashScope SDK / 百炼 CLI bl / OpenWork):DashScope OpenAI 兼容 REST 接口(https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions),标准库 urllib 直连,无额外 SDK 依赖;Key 只放环境变量 DASHSCOPE_API_KEY,不进代码、不进版本库。调用代码见 llm.py(生成/裁决)与 natural.py(会议解析)。
  • 使用环节与输入输出(三处,均在运行时链路):
    1. 会议解析(natural.py 的 parse_meetings):把一句话口语会议描述解析成结构化会议列表,12 小时制自动转 24 小时制,未写明时长默认 1 小时;
      输入=一句中文会议描述(如"明天下午2点到4点开会,晚上7点半客户晚宴")→ 输出=纯 JSON 数组(含会议标题与起止时刻),不附加解释文字;
    2. 开场白生成(llm.py 的 generate_intro):把排好的微行程(时间、地点、距离)写成 80 字内的行程寄语;
      输入=城市 + 酒店名 + 各站"时刻 / 名称 / 距酒店 km"清单 → 输出=一段 80 字内中文开场白;
    3. AI 对比裁决(llm.py 的 judge_verdict):为每一站生成"选它 / 没选备选"的理由,只能引用后端给定的真实数字;
      输入=选中站的"距酒店 km / 交通方式 / 耗时 / 停留分钟" + 1–2 个同窗口落选备选的同口径数字 → 输出="选它:…;没选《备选》:…"两段中文(temperature=0、max_tokens=200,保证稳定且短)。
    4. 生成阶段对开场白与裁决关闭思考模式(enable_thinking=false),避免 reasoning 占用几十秒;对强制思考、无法关闭的模型自动跳过、换下一个候选。
  • Skill 名称(如有):未在百炼控制台单独登记 Skill;通过 DashScope OpenAI 兼容接口直接调用。
  • 其他工具 / 技术栈:Python 3(标准库为主)|Gradio 6.30(网页版 Demo,暖米白 Editorial 风格)|@fly-ai/flyai-cli(npm,飞猪 POI / 酒店数据)|自实现 haversine 距离与四档交通耗时模型|标准库 unittest 编写、pytest 运行的单测(42 例,全程不触网)|Mermaid(README 工作流图)。
  • 容错与验证:无 Key 时会议解析回退默认会议、文案与裁决走本地模板,流水线仍可完整跑通;配好 Key 后走真实调用。仓库附 bailian_smoke.py,一条命令验证 Key 与模型链是否调通,并打印实际生效的模型名。

flyai 使用说明

  • 使用的 flyai 能力:search-poi(多品类 + keyword 兜底)、search-hotel
  • 调用方式:@fly-ai/flyai-cli(npm 全局安装),flyai_client.py 薄封装
  • 数据说明:POI 名称/地址/经纬度/免费状态/预订链接、酒店名称/地址/经纬度/价格(正式 Key 下价格不脱敏)

效果展示

  • 演示视频(66 秒:一句话输入 → 五步生成 → AI 裁决 → 一键换站 → 飞猪预订页):

https://github.com/user-attachments/assets/7eb5f71f-f140-4a86-9104-cefa148e36da

  • 运行截图:

结果页:路线示意图 + 行程总览

时间轴站点卡:每站含 AI 对比裁决与预订入口

输入页:一句话会议描述

  • 示例输入(即网页版默认值):城市 = 杭州;酒店 = 锦江之星(杭州西湖店);会议描述 = "明天下午2点到4点开会,晚上7点半客户晚宴";偏好 = 人文古迹 / 美食 / 夜景。

项目链接与复现方式

git clone https://github.com/Geohzy/bleisure-planner && cd bleisure-planner
npm i -g @fly-ai/flyai-cli
pip install gradio              # 网页版需要;命令行版可跳过
export FLYAI_API_KEY=你的飞猪Key
export DASHSCOPE_API_KEY=你的百炼Key   # sk- 开头
python3 bailian_smoke.py        # 先验证百炼链路(可选)
python3 app.py                  # 网页版:打开打印出的本地链接
python3 demo.py                 # 命令行版:生成 demo_output.md 行程卡

踩坑记录(可选)

  1. flyai CLI 的 JSON 写在 stderr 里:响应不进 stdout,且夹带 ANSI 色码,直接解析 stdout 会 JSONDecodeError。解法:同时读取 stdout + stderr,正则去掉 \x1b\[…m,再截取最外层 {…} 解析。
  2. flyai 有并发限流:9 路查询串行要 30–60 秒(每次都是 npx 冷启动);一上来开到 6 并发又触发 Rate limit exceeded,9 路丢 5 路、POI 从 56 条掉到 20 条。解法:限并发 3 + 失败按错误类型退避重试(限流 2.5s),稳定在 9–10 秒拿全 56 条,并加 5 分钟内存缓存。
  3. 思考型模型"空回复"与超长延迟:reasoning 会吃掉 340–500 tokens、单次 20–50 秒,max_tokens 小时甚至只返回推理、content 为空。解法:文案与裁决请求关闭思考模式(同一个 prompt 从 20–50 秒降到 1–2 秒),对强制思考的模型识别 400 后自动跳过;空内容模型自动回退下一个。
  4. 大模型的数字幻觉:让模型自己算距离/耗时,结果会与真实路线对不上。解法:距离、耗时、时刻全部由 planner.py / transport.py 算好写进 prompt,模型只做解释;单测校验裁决中的数字与计算结果自洽。
  5. Gradio 两个前端坑:空 label 会被前端回退成组件默认名(如 "Textbox"),需"非空 label + show_label=False + 样式隐藏";带圆角的输入框配 overflow 会把首字裁掉,需把内层 border-radius 显式归零。
  6. 页面宽度被长内容撑开:长地址、长 URL 会把卡片顶宽,导致点击后布局跳动。解法:弹性容器统一 min-width:0,长文本 overflow-wrap:anywhere,页面级 overflow-x:hidden。

**奖品说明:**每个团队最多发放 1 份奖品。同一团队即使提交多个参赛作品,也只登记 1 位奖品领取人;其他团队成员可以共同署名,但不重复发放奖品。

主要語言
HTML
星號
11
分支
3
PR 合併指標
30 天內沒有已合併 PR

環境準備

這個專案沒有提供開發容器、Dockerfile 或貢獻指南,環境需要你自己搭建:先看它的 README,通用步驟見我們的新手貢獻指南。

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

modelstudioai/modelstudioai.github.io 的其他 Issue

查看 modelstudioai/modelstudioai.github.io 的全部 Issue

相似的 Issue

更多 AI Infra & Agents Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。