recommend-dish — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited recommend-dish (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
帮用户从 462 道菜(覆盖 41 个菜系、10 个地区)中按偏好做加权随机推荐。算法已处理菜系数据不均、关键词复合加权、推荐多样性等问题。
从对话中提取以下参数(不传则忽略):
| 参数 | 来源 | 示例 |
|---|---|---|
--count | 用户明确要的主选数量。默认 1 | "推荐 3 个" → 3 |
--alternates | 备选数量。默认 3(与主选互不重复) | 一般不用传,保持默认 3 即可 |
--keywords | 口味/食材/类型词,逗号分隔 | "想吃辣的牛肉" → 辣,牛肉 |
--price-tier | 价位描述 | "便宜" → 经济;"便宜实惠" → 实惠;"中等" → 中档;"高档/贵的" → 高档;"极致奢华" → 奢华 |
--max-price | 明确价格上限 | "50 块以内" → 50 |
--cuisine | 菜系名 | "想吃川菜" → 川菜 |
--region | 地区名 | "亚洲菜" → 不填(用 geo);"中华料理" → 填 region |
--geo | 地理大类 | "亚洲菜" → 亚洲;"欧洲菜" → 欧洲 |
--exclude-ids | 上一轮已推荐的 ID | "换一批" 时用 |
推荐模式说明:默认每次返回 1 道主选 + 3 道备选,互不重复。主选是你最该吃的,备选是「不喜欢主选时可换」。只有用户明确说"多推荐几个"时才提高 --count。
支持的关键词(不在此集合的不要传):
麻辣、辣、甜、酸、咸、鲜海鲜、牛肉、羊肉、猪肉、鸡肉、素食面食、米饭类、汤、甜品、烧烤、火锅、咖喱、汉堡披萨、饮品否定关键词规则:用户说「不要太辣」「不吃猪肉」时,不要把否定词翻转后传入。直接不传该关键词即可。如果用户明确说「不能吃 X」并影响主菜选择,应在推荐后口头说明「以下选项均不含 X」。
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/recommender.py" \
--count <默认1> \
--alternates <默认3> \
--keywords "<逗号分隔,可空>" \
--price-tier "<档位,可空>" \
--cuisine "<菜系,可空>" \
--geo "<地理大类,可空>" \
--exclude-ids "<逗号分隔,可空>"未传的参数省略对应行即可(count/alternates 都有默认值,通常不用写)。脚本会自动在 ${CLAUDE_PLUGIN_ROOT}/knowledge_base 下读知识库。
脚本输出单行 JSON:
{
"main": {"id": "...", "name": "...", "price": 38, "cuisine": "川菜", "description": "..."},
"alternates": [{"id": "...", "name": "...", ...}, ...],
"dishes": [...],
"exhausted": false,
"filters": {..., "relaxed": true, "relax_note": "..."},
"candidate_pool_size": 16,
"returned": 4
}main:主选菜品(1 道,最推荐)alternates:备选菜品数组(默认 3 道,与主选互不重复)dishes:向后兼容字段 = [main, *alternates]main 非空:进入步骤 4exhausted=true 或 main=null:进入兜底链(步骤 5)模板(主选突出,备选次之):
给你推荐:菜名 ¥价格(菜系) — 一句话描述
>
备选: 1. 菜名 ¥价格(菜系) — 一句话描述 2. ...
>
不喜欢可以告诉我「换一批」。
附加说明(按需):
filters.relaxed=true:在推荐后补一句「(原档位 [X] 候选不足,已扩大范围)」returned < count + alternates:说明「目前知识库里符合的菜不够,先给你这些」详细见 references/fallback-strategy.md。简版:
"<用户原话> 推荐菜品",从结果中挑 3 个推荐用户接着说「换一批」「不喜欢这些」「再来 N 个」时:
dishes 的所有 id(含主选+备选)加入 --exclude-ids跨多轮要持续累积 exclude-ids,避免重复推荐。
正常情况:
给你推荐:担担面 ¥18(川菜) — 碱水面淋上肉末花生碎和红油,麻辣干香
>
备选: 1. 泰式冬阴功汤 ¥45(泰国菜) — 酸辣鲜美的海鲜汤 2. 意式提拉米苏 ¥48(意大利菜) — 经典咖啡风味甜品 3. 咕噜肉 ¥42(粤菜) — 酸甜开胃
>
不喜欢可以告诉我「换一批」。
触发松弛:
给你推荐:水煮鱼 ¥78(川菜) — 鲜活鱼片在麻辣汤底中烫熟
>
备选: 1. 辣子鸡 ¥52(川菜) — 鸡块炸至酥脆后与大量干辣椒和花椒同炒 2. 担担面 ¥18(川菜) — 碱水面淋上肉末花生碎和红油
>
(你想要的「高档」川菜候选不足,已扩大到全部价位。)
触发兜底:
我们的知识库里没有完全符合的菜。让我帮你搜一下网络…… [调 WebSearch] 根据网络搜索,给你推荐: 1. ... (来源:xxx.com) ... ⚠️ 这些菜品不在我们的本地菜单库内,仅供参考。
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.