Diet recording skill. Log meals via text description or food photo upload, auto-recognize food items and estimate nutrition/calories. Activate when user sends a food photo, describes what they ate, asks to log a meal, or queries calorie/nutrition info. Triggers include "记录饮食", "午饭吃了", "帮我记一下", "这个多少卡", "拍了张照片", "今天吃了什么", "log my meal", "what did I eat today".
Record meals via photo or text, auto-recognize food items and calculate nutrition.
All diet records are stored in diet-log.jsonl (same directory as this skill file, one JSON object per line). Create the file if it doesn't exist.
Each record schema:
{
"id": "uuid",
"timestamp": "ISO-8601",
"meal_type": "breakfast|lunch|dinner|snack",
"items": [
{
"name": "食物名称",
"portion_g": 150,
"calories_kcal": 230,
"protein_g": 12,
"fat_g": 8,
"carb_g": 28,
"fiber_g": 2
}
],
"total_calories": 460,
"notes": ""
}
Stored in diet-preferences.json (same directory as this skill file). Create the file if it doesn't exist.
{
"photo_auto_log": null,
"dietary_restrictions": [],
"allergies": [],
"disliked_foods": [],
"favorite_foods": [],
"diet_goal": null,
"daily_calorie_target": null,
"meal_routine": null,
"notes": ""
}
Fields:
photo_auto_log: true = auto-log on photo upload, false = confirm first, null = not yet set.dietary_restrictions: e.g. ["素食", "清真", "无麸质", "低碳水"]allergies: e.g. ["花生", "海鲜", "乳糖不耐"]disliked_foods: foods user explicitly dislikesfavorite_foods: frequently eaten or preferred foodsdiet_goal: e.g. "减脂", "增肌", "维持体重", "均衡饮食"daily_calorie_target: e.g. 1800 (kcal), null if not setmeal_routine: e.g. "一日三餐", "16:8轻断食", "少食多餐"notes: any other dietary habits or notes from userPhoto auto-log preference: On the first food photo upload (or when photo_auto_log is null), recognize items as usual, then ask: "以后发食物照片时,要自动帮你记录饮食吗?还是每次先确认再记录?"
Dietary habits: Whenever user mentions dietary preferences, restrictions, allergies, goals, or habits in conversation, extract and save to the corresponding fields. Examples:
"花生" to allergiesdiet_goal to "减脂""香菜" to disliked_foodsdaily_calorie_target to 1500meal_routine to "16:8轻断食"Preferences are accumulated over time — update individual fields without overwriting unrelated ones. Read preferences before each interaction to provide personalized feedback (e.g. warn if a meal exceeds calorie target, flag allergens in recognized food).
diet-preferences.json to check photo_auto_logphoto_auto_log is null: present result, ask preference (see above), then logphoto_auto_log is true: calculate totals, log directly, respond with summaryphoto_auto_log is false: present recognized items — ask user to confirm or correct, then logdiet-log.jsonlWhen user asks "今天吃了什么" or "daily summary":
python3 -c "
import json, datetime
today = datetime.date.today().isoformat()
with open('diet-log.jsonl') as f:
meals = [json.loads(l) for l in f if today in l]
total = sum(m['total_calories'] for m in meals)
print(f'Today: {len(meals)} meals, {total:.0f} kcal')
for m in meals:
items = ', '.join(i['name'] for i in m['items'])
print(f\" {m['meal_type']}: {m['total_calories']:.0f} kcal — {items}\")
"
Common foods for quick lookup (no API needed):
| Food | kcal | Protein | Fat | Carb |
|---|---|---|---|---|
| 白米饭 | 116 | 2.6 | 0.3 | 25.9 |
| 面条(煮) | 110 | 3.5 | 0.5 | 22 |
| 鸡胸肉 | 133 | 31 | 1.2 | 0 |
| 鸡蛋(煮) | 144 | 13 | 10 | 1.1 |
| 牛肉(瘦) | 125 | 20 | 4.2 | 0.2 |
| 三文鱼 | 208 | 20 | 13 | 0 |
| 豆腐 | 73 | 8.1 | 3.7 | 1.5 |
| 西兰花 | 34 | 2.8 | 0.4 | 5 |
| 番茄 | 18 | 0.9 | 0.2 | 3.9 |
| 苹果 | 52 | 0.3 | 0.2 | 13.8 |
| 香蕉 | 89 | 1.1 | 0.3 | 22.8 |
| 牛奶(全脂) | 61 | 3.2 | 3.3 | 4.8 |
| 酸奶(原味) | 61 | 3.5 | 3.3 | 4.7 |
| 全麦面包 | 247 | 13 | 3.4 | 41 |
| 燕麦片 | 379 | 13 | 6.5 | 67 |
For unlisted foods, estimate based on similar items or ask the user for specifics.