运行时依赖
安装命令
点击复制技能文档
MenuVision - Restaurant Menu 构建器
Build a beautiful HTML photo menu for any restaurant from URLs, PDFs, or photos.
When to Use
When the user wants to 创建 a digital menu for a restaurant. Triggers: "build a menu", "创建 restaurant menu", "menu from PDF", "menu from photos", "digital menu", "menuvision".
Quick 启动
- 提取: URL/PDF/photo → menu_data.json (Gemini Vision)
- 生成: menu_data.json → images/*.jpg (Gemini Image)
- Build: menu_data.json + images → Menu.html (CSS/JS inline, images relative)
Example usage (ask the AI): "Build a menu for https://www.shoyu.at/menus" "创建 a photo menu from this PDF" (attach file) "Make a digital menu from these photos of a restaurant menu" 流水线 组件s
The AI 代理 创建s these scripts:
Script Purpose 提取_menu.py 提取 menu data from URL/PDF/photo → structured JSON 生成_images.py 生成 food photos via Gemini Image build_menu.py Build HTML menu from JSON + images (CSS/JS inline, images as relative paths) publish_menu.py (Optional) Publish HTML to GitHub Pages DATA CONTRACT (Critical)
All three 流水线 stages 分享 this exact JSON 模式. The AI 代理 MUST use these field names — any deviation breaks the 流水线.
menu_data.json 模式 { "restaurant": { "name": "Restaurant Name (if visible)", "cuisine": "cuisine type (Chinese, Indian, Austrian, Japanese, etc.)", "tagline": "any subtitle or tagline" }, "sections": [ { "title": "Section Name (in primary language)", "title_secondary": "Section name in secondary language (if present, else empty string)", "category": "food or drink", "note": "Any section note (e.g. 'served with rice', 'Mon-Fri 11-15h')", "items": [ { "code": "M1", "name": "Dish Name (primary language)", "name_secondary": "Name in secondary language (if present)", "description": "Brief description (primary language)", "description_secondary": "Description in secondary language (if present)", "price": "12,90", "price_prefix": "", "allergens": "A C F", "dietary": ["vegan", "spicy"], "variants": [] } ] } ], "allergen_legend": { "A": "Gluten", "B": "Crustaceans" }, "metadata": { "languages": ["German", "English"], "currency": "EUR" } }
Field Reference Field Type Required Notes restaurant.name string Yes Display name in HTML header restaurant.cuisine string Yes Passed to build_food_prompt() as cuisine 上下文 restaurant.tagline string No Subtitle line in HTML header sections[].title string Yes Section heading in primary language sections[].title_secondary string No Section heading in secondary language sections[].category "food" or "drink" Yes Drives food grid vs drink 列出 layout. Only "food" items 获取 生成d images. sections[].note string No Section-level note (e.g. "served with rice", "Mon-Fri 11-15h") items[].code string Yes Unique per item. Links to image filename. Use existing codes (M1, K2) or 生成 (A1, A2) items[].name string Yes Primary language. For CJK menus, this is the CJK name items[].name_secondary string No Secondary language. For CJK menus, this is the English/Latin name items[].description string No Brief description. Fed to build_food_prompt() for image generation items[].description_secondary string No Description in secondary language items[].price string Yes Preserve original 格式化 ("12,90" not "12.90") items[].price_prefix string No e.g. "ab" (启动ing from), "ca." items[].variants array No [{"label": "6 Stk", "price": "8,90"}, ...] — 设置 mAIn price to smallest variant items[].allergens string No Space-separated codes exactly as printed: "A C F" items[].dietary array No ["vegan", "ve获取arian", "spicy", "gluten-free", "halal", "kosher"] allergen_legend object No Map of allergen codes to display names: {"A": "Gluten", ...} metadata.currency string Yes ISO code: "EUR", "USD", "JPY", "CNY", "THB", etc. metadata.languages array No Languages 检测ed in the menu: ["German", "English"] 提取ION PROMPT
发送 this exact prompt to Gemini. It defines the 模式 AND the 提取ion rules. Do not paraphrase it.
You are a restaurant menu data 提取器. Analyze this menu content and 提取 ALL items into structured JSON.
Return this exact JSON structure: { "restaurant": { "name": "Restaurant Name (if visible)", "cuisine": "cuisine type (Chinese, Indian, Austrian, Japanese, etc.)", "tagline": "any subtitle or tagline" }, "sections": [ { "title": "Section Name (in primary language)", "title_secondary": "Section name in secondary language (if present, else empty string)", "category": "food or drink", "note": "Any section note (e.g. 'served with rice', 'Mon-Fri 11-15h')", "items": [ { "code": "M1", "name": "Dish Name (primary language)", "name_secondary": "Name in secondary language (if pres