← Back to skills
extension
Category: Productivity & OfficeAPI key requirement unconfirmed

旅途美食推荐助手

给一个城市,返回一日三餐:早、午、晚各推荐 2~3 道具体菜品,每道菜说明为什么吃、去哪类店吃、配什么,并附小红书/抖音/高德地图的检索入口。 【使用示例】 输入:「重庆待一天,人均 60」 输出: 早餐 重庆小面 · 午餐 粉蒸肉 · 晚餐 毛血旺 每道菜带一句判断标准(如「回锅肉要看是否卷成灯盏窝」)、店型建议与三个搜索入口 输入:「西安早上去,只吃一顿」 输出:自动识别为早餐时段,给甑糕、肉夹馍、油泼面,不推晚饭的泡馍 【特点】 · 一日三餐自动排布,跨餐段去重,不会早晚饭推同一道菜 · 支持忌口(不吃辣/不吃内脏/素食)、预算、人数、交通方式 · 菜品库 97 道覆盖全国 20 个菜系;成都/重庆/西安/长沙/广州另有街区与老字号深度数据 · 零依赖:无 API Key、无网络、无 Python 三种情况下都能用(有 Python 时结果可复现) · 不抓取任何平台数据,检索入口只是搜索链接,不引用平台评分与评论

personAuthor: qianlv123hubModelScope

旅行途中美食推荐

给一个城市 + 一顿饭的时间,返回 2~3 个具体菜名:为什么吃它、去哪类店吃、怎么继续查。

不是「附近餐厅列表」,而是「这地方这时候该吃什么」。菜名是稳定的,店会换、评分会变,所以我们只推荐菜 + 店型 + 街区。

输出长这样

# 重庆|一日三餐

## 今日安排

| 餐段 | 时间 | 主推 |
|---|---|---|
| 早餐 | 06:00–09:30 | 重庆小面 |
| 午餐 | 11:00–14:00 | 粉蒸肉 |
| 晚餐 | 17:00–20:30 | 重庆老火锅 |

## 早餐 06:00–09:30

1. **重庆小面**(川菜 · 麻辣 / 佐料足 · 人均约 12 元)
   十几味佐料打底,点单说二两或三两;清汤版叫清汤小面,也能要不辣
   - 为什么推它:是当地特色
   - 在哪吃:面馆 / 街边
   - 搭配:煎蛋
   - 不适合:不吃辣
   - 🔍 继续看:[小红书](…) · [抖音](…) · [高德地图](…)

## 去哪吃
- **解放碑 · 八一路好吃街** —— 小吃最密集(适合:晚餐/夜宵,人均 20-60)

完整样例见 examples/ 三个文件(真实运行输出)。

何时使用

  • 用户要出行(自驾 / 高铁 / 飞机 / 步行),路上或到了要吃一顿
  • 问「到 X 吃什么」「X 有什么特色」「路上想吃点好的」
  • 有约束:预算、忌口、带孩子、时间紧、不吃辣、想吃面
  • 已经知道城市,只需要「吃什么」的决策

何时不要用

  • 用户问某一家店好不好 → 我们没有店铺数据,只给检索入口
  • 要评分、排名、评论原文 → 本技能不抓取任何平台内容
  • 外卖点单、订座、排队取号 → 超出能力边界
  • 需要实时营业状态 → 只能给「出发前请复核」的提示

覆盖范围(别把话说满,也别把话说少)

  • 菜品层覆盖全国:assets/dishes.json 有 90+ 道菜,按菜系与地域标注,任意城市都能给出推荐。
  • 城市层只有 5 城:成都、重庆、西安、长沙、广州整理了街区、老字号与本地规律;其余城市缺的是深度,不是覆盖。

未收录城市不要回答"没有数据",也不要编造街区与店名——给菜品 + 检索入口,并注明深度数据缺失即可。

执行流程

Step 0 · 探测环境(必做,只做一次)

python --version

能跑就走 Mode B(脚本,结果可复现);不能跑就走 Mode A(读 references/ 手算)。两条路输出格式相同。

Step 1 · 解析需求:城市(必需)、到达时刻、人数、预算、忌口、想吃什么、交通方式。 只有「城市」缺失才追问;其余用缺省值(2 人 / 人均 80 元 / 自驾),并在输出里声明假设。

Step 2 · 定餐段:默认输出一日三餐(早/午/晚),因为"在某城待一天"是最常见场景。给了到达时刻(--time)说明是路过、只吃一顿,就只出那一顿;也可用 --slots lunch,dinner 指定。

Step 3 · 召回:

  • Mode B:python scripts/plan_meals.py --city 重庆 --time 12:00 --budget 60 --avoid 不吃辣
  • Mode A:读 references/dish-library.md 按菜系/口味/价位筛,再读 references/city-notes.md 取该城招牌菜与街区

Step 4 · 过滤:忌口、辣度、预算、餐段。见 references/taste-taxonomy.md 的口径。

Step 5 · 排序与理由:本地特色 > 口味契合 > 餐段契合 > 预算。理由只写真实命中的维度,不写「价位合适」这种用户没提的。

Step 6 · 检索入口:每条推荐 1~3 个平台链接,检索词用 {菜名} {城市}。

Step 7 ·(可选)联网发散:仅当用户明确要「小众/没听过的」,或该城库内命中 < 3 道时。规则见下方「发散纪律」。

Step 8 · 输出:按 references/output-format.md 的结构。

按需加载

| 什么时候 | 读哪个文件 | |---|---| | 无 Python,需要手动查菜 | references/dish-library.md | | 需要城市招牌菜 / 街区 / 老字号 | references/city-notes.md | | 时间紧、赶车、带孩子等场景判断 | references/route-food-wisdom.md | | 用户忌口说不清、辣度拿不准 | references/taste-taxonomy.md | | 准备输出、不确定排版 | references/output-format.md | | 要改平台或加平台 | assets/platforms.json |

硬规则(违反即算错误)

  1. 不编造平台指标:绝不写「点评 4.8 分」「小红书 1.2 万篇笔记」——我们没抓这些数据。
  2. 链接必须 percent-encode:中文与空格都要编码,否则 Markdown 会截断。
  3. 只问一个问题:城市缺失时才追问,其余用缺省值 + 声明假设。
  4. 降级必须标注:无城市包、无联网、数据为静态样例,都要在输出里写清楚。
  5. 发散内容不进库:联网发现的新菜只存在于本次回答,不写回 assets/dishes.json。

发散纪律(可选能力)

  • 触发:用户要「小众」,或该城命中 < 3 道;其他情况不发散
  • 上限:2 道,放在独立标题「还可以试试(联网发现,未经核实)」下
  • 只写「为什么提到它」,不写推荐理由、不给评分
  • 联网失败就整段省略,不要输出「暂时无法联网」

降级

| 情况 | 行为 | 输出标注 | |---|---|---| | 无 Python | 走 Mode A,读 references/ | 无需特别标注 | | 城市未收录 | 用全国菜品库给通用推荐 | 「还没有专门的本地数据包」+ confidence: low | | 无联网 | 跳过 Step 7 | 不输出发散区 | | 忌口过滤后为空 | 放宽最不关键的一条并说明 | 写明放宽了什么 |

边界与免责

  • 营业时间、价格均为静态整理数据,不是实时信息;出行前请复核。
  • 只推荐菜品与店型,不推荐具体门店的好坏;references/city-notes.md 里的老字号仅供参考。
  • 不存储、不分发任何第三方平台内容;检索入口只是搜索链接,不是平台推荐背书。
  • 不处理个人隐私信息(不做位置追踪、不记录用户身份)。

扩展数据(可选,按需选一种)

不需要把数据做全——缺城市只影响"去哪条街",不影响"吃什么"。

| 你想做的事 | 做法 | 成本 | |---|---|---| | 补一两道菜 | 往 assets/dishes.json 加一条 → 跑 build_refs.py | 30 秒 | | 加一个城市 | 复制 city-packs/_template.json 填空 → CITY_FILES 加一行 | 约 5 分钟 | | 不想改数据 | 走 Step 7 联网发散,结果不写回库 | 0 |

加城市的完整步骤(_template.json 每个字段都有注释):

  1. 复制 assets/city-packs/_template.json → <拼音>.json,按注释填空。 signature 只能填 dishes.json 里已有的 id,缺菜先加菜。
  2. 在 scripts/plan_meals.py 的 CITY_FILES 里登记一行(城市名 → 文件名)。
  3. 重跑三件套:
python scripts/build_refs.py      # 重新生成 references/
python scripts/self_test.py       # 自检
python scripts/package.py         # 校验 + 打 zip

references/ 是生成的,不要手改,否则下次生成会被覆盖。

自检

改动数据或脚本后跑一次:

python scripts/self_test.py

自检覆盖:数据完整性、城市包结构、忌口过滤、餐段推断、跨餐段去重、超预算标注、理由不编造、版本一致、链接编码、合规红线。全绿再打包。

脚本默认不读 stdin——沙箱里 stdin 常是永不关闭的管道,读了会挂死。需要 JSON 输入时显式加 --stdin:

echo '{"city":"重庆"}' | python scripts/plan_meals.py --stdin