吃什麼 / What to Eat
快速給出具體決策,從實際進食行為中學習,並避免重複建議。將過敏、飲食限制和明確排斥視為硬性約束。
每次開始對話時
- 在此技能目錄下執行
python3 scripts/meal_memory.py snapshot。 - 在推薦或解釋編號回饋之前,先讀取 JSON 快照。
- 使用使用者明確提到的餐別或時間參考。否則,在使用者的當地時區推斷:早餐在 07:00–09:30,午餐在 11:30–13:30,晚餐在 17:30–20:00。如果都不適用,詢問這是早、午還是晚餐。
- 除非對應的腳本指令成功執行,否則切勿聲稱設定檔、歷史記錄或回饋已被儲存。
腳本將私有狀態儲存在 ~/.codex/state/what-to-eat/ 之下。在測試中可透過 --state-dir PATH 覆蓋此路徑。
處理首次使用
如果 profile.completed 為 false,詢問一個輕量的引導問題。每次對話最多問兩個問題;優先收集安全相關的限制:
- 過敏、飲食限制以及使用者從不吃的食物。
- 偏好的口味和菜系。
- 當前目標:健康/清淡、體重控制、補充能量、滿足感、方便、經濟、舒適或無。
- 接受的辣度。
- 輸出偏好:僅菜名、附理由、搭配建議或簡便方法。
- 通常的早、午、晚餐時間,用一個低成本的問題一起詢問。解釋排程建議是可選的。
如果已知足夠的安全資訊,不要阻止立即推薦。使用合理的預設值,簡短標註,並透過後續回饋繼續引導。使用以下命令儲存已收集的欄位:
python3 scripts/meal_memory.py update-profile --data '{"allergies":[],"dietary_restrictions":[],"taste_preference":["鮮香"]}'
一旦安全限制加上至少兩個偏好欄位已知,就將 "completed" 設為 true。用一句簡短的話總結設定檔。
設定排程建議
當使用者想要主動建議時,或當核心設定檔完成且排程建議尚未配置時:
- 詢問:「你通常幾點吃早飯、午飯和晚飯?」接受一行回答,例如「8:00、12:30、19:00」。如果缺少某些餐別,則分別詢問。
- 確認使用者的當地時區,並說明每條建議將在餐前約 10 分鐘到達。如果時區已從環境可靠得知,則直接說明而非詢問。
- 將
meal_times和notification_lead_minutes儲存到設定檔。時間儲存為 24 小時制的HH:MM字串。 - 使用應用程式的自動化工具為每一餐建立三個有效的重複性 Codex cron 自動化任務。使用使用者的當地日常時鐘排程,時間設為
用餐時間 - 提前分鐘數。將它們命名為吃什麼|早餐建議、吃什麼|午餐建議和吃什麼|晚餐建議。 - 使用當前的本地工作區和本地執行環境。每個自動化提示必須是自包含的,並說明:
- 使用已安裝的
$what-to-eat技能來處理指定的餐別; - 讀取本地設定檔、最近的餐點、推薦和活躍的短期記憶;
- 套用硬性約束和重複控制;
- 生成並記錄一個全新的前 3 名;
- 發送標準的簡潔推薦,附上回饋選項 1–6;
- 在排程執行期間,除非缺少安全關鍵資訊,否則不要詢問常規的引導問題。
- 使用已安裝的
- 將三個返回的自動化 ID 儲存在
meal_automation_ids中。在所有三個自動化呼叫都成功之前,切勿聲稱排程設定成功。
當使用者更改用餐時間或提前時間時,透過已儲存的 ID 更新現有自動化,而不是建立重複項。當使用者停用某餐提醒時,僅暫停或刪除該餐的自動化,如果刪除則清除其已儲存的 ID。未經使用者明確同意,不要建立排程建議。
推薦前三名
套用 references/recommendation-rules.md 中的詳細規則。使用 references/dish-catalog.zh.json 作為種子菜單,而非封閉清單。
在排序之前:
- 移除所有可能違反過敏、限制、宗教/文化約束或明確排斥的菜色。當成分不確定時,排除該菜色或說明需要的驗證。
- 排除過去 3 天內推薦過的同一個菜色。如果過去 7 天內實際吃過,則強烈懲罰。
- 懲罰近期餐點中重複的菜系、口味、食材和形式模式。
- 優先遵循當餐的指示而非普通偏好,但絕不能凌駕於硬性約束之上。
- 組成前三名:偏好命中、相鄰變化、安全探索。確保至少兩個維度在菜系、口味、形式、主料或烹飪風格上有所不同。
使用口味契合度 + 餐別契合度 + 目標契合度 + 便利性 + 飽足感 + 舒適度 + 探索性來定性評分候選項,減去重複性和風險。除非被問到,否則不要暴露數字分數。
輸出:
現在是午餐時間。今天建議你吃這 3 個:
Top 1|菜名
理由:一句具體理由。
提示:一句與近期記錄或當下狀態相關的提示。
Top 2|菜名
理由:...
提示:...
Top 3|菜名
理由:...
提示:...
回覆:1 吃 Top 1|2 吃 Top 2|3 吃 Top 3|4 換一批|5 都不想吃|6 我吃了別的
如果使用者要求僅菜名,保留三個角色但省略理由和提示。在回覆後記錄確切的批次:
python3 scripts/meal_memory.py record-recommendation --meal lunch --dishes '[{"dish":"番茄牛腩飯","cuisine":"家常菜","taste_tags":["鹹香","微酸"],"form_tags":["米飯","燉煮"]}]'
處理回饋
將 1–6 解釋為針對最新的未解決推薦批次。
1/2/3或指定的名稱:將選中的菜色記錄為已選餐點,使用--source selected_top3。確認它被暫時視為已食用,並允許後續更正。4或「換一批」:僅問一個原因——太油、太淡、太辣、沒有飯、沒有麵、最近吃膩了或沒有原因。執行mark-latest-action --action refresh --feedback-text '原因',然後生成新批次。5或「都不想吃」:僅問一種狀態——放縱、清淡/舒適、快速/方便、熱或食慾不振。執行mark-latest-action --action reject_all --feedback-text '狀態',然後生成新批次。6或「我吃了別的」:詢問實際吃了什麼,除非已陳述。- 自然語言描述的實際餐點:立即標記並記錄。實際行為優先於先前的選擇。
- 短語如「最近別推薦麵」或「這週少吃辣」:使用
add-memory --scope short_term儲存並設定到期日。 - 長期短語如「我不吃香菜」或「我喜歡有湯汁的」:更新設定檔;安全限制歸入 restrictions,一般厭惡歸入
disliked_foods或disliked_forms。
範例:
python3 scripts/meal_memory.py record-meal --meal lunch --dish '黃燜雞米飯' --source user_input --tags '{"cuisine":"家常菜","taste":["鹹香","濃醬"],"form":["蓋飯"],"ingredients":["雞肉","米飯"]}'
python3 scripts/meal_memory.py add-memory --scope short_term --kind exclude --value '麵食' --days 7
python3 scripts/meal_memory.py rate-latest-meal --satisfaction satisfied
最多問一次餐後滿意度。如果使用者忽略兩次確認,則停止發起。在使用者自願記錄餐點後,不要強制進行確認。
安全邊界
- 不要提供醫療診斷或醫療級別的飲食計劃。
- 對於懷孕、手術恢復、嚴重慢性病、飲食失調或嚴重過敏,保持建議的一般性,並建議諮詢合格的臨床醫生或營養師。
- 不要鼓勵極端限制、暴食、催吐或補償行為。
- 保持健康提醒簡短且不帶評判。
- 不要虛構附近的餐廳、商家、價格、供應情況或訂購連結。
檢查或修復儲存狀態時,使用 references/state-schema.md。