PregoPal / modules /meal_recommender.py
J.B-Lin
CLine 界面初版
0f2d3d7
Raw
History Blame Contribute Delete
3.04 kB
"""
PregoPal - 菜品推荐模块
========================
根据孕妇需求推荐今日菜品。
当前:规则模板随机推荐(轻量 baseline)
后续:MiniCPM-o 4.5 AI 对话推荐
"""
import datetime
import random
from config import MEAL_TEMPLATES, TRIMESTER_ADJUSTMENTS, TRIMESTER_TIPS
class MealRecommender:
"""根据孕妇需求推荐今日菜品"""
def __init__(self):
self.templates = MEAL_TEMPLATES
def get_recommendation(self, preference: str = "", trimester: str = "孕中期", restrictions: str = ""):
"""
根据孕妇偏好和孕期阶段推荐菜品
Args:
preference: 孕妇的口味偏好或要求
trimester: 孕期阶段(孕早期/孕中期/孕晚期)
restrictions: 饮食禁忌
"""
# 根据孕期阶段调整推荐
adj = TRIMESTER_ADJUSTMENTS.get(trimester, TRIMESTER_ADJUSTMENTS["孕中期"])
# 根据偏好选择菜品
breakfast = random.choice(self.templates["早餐"])
lunch = random.choice(self.templates["午餐"])
dinner = random.choice(self.templates["晚餐"])
snack = random.choice(self.templates["加餐"])
# 如果有偏好,尝试匹配
if preference:
all_foods = []
for meal_list in self.templates.values():
all_foods.extend(meal_list)
matched = [f for f in all_foods if any(kw in f for kw in preference.split())]
if matched:
pass # 简化处理,后续 AI 版本会真正理解偏好
result = {
"date": datetime.date.today().isoformat(),
"trimester": trimester,
"preference": preference,
"focus": adj["focus"],
"meals": {
"早餐": breakfast,
"午餐": lunch,
"晚餐": dinner,
"加餐": snack
},
"tips": self._generate_tips(trimester, preference)
}
return result
def _generate_tips(self, trimester, preference):
"""生成饮食建议"""
tips = []
trimester_tips = TRIMESTER_TIPS
tips.append(trimester_tips.get(trimester, ""))
tips.append("💡 建议每天饮水1.5-2L,适量运动如散步30分钟。")
tips.append("💡 保持心情愉快,避免过度焦虑。")
return tips
def format_meal_plan(self, recommendation: dict) -> str:
"""将推荐结果格式化为可读文本"""
lines = [
f"📅 {recommendation['date']} 孕期食谱推荐",
f"🤰 阶段: {recommendation['trimester']}",
f"🎯 重点: {recommendation['focus']}",
"",
"🍳 今日食谱:",
]
for meal_time, food in recommendation["meals"].items():
lines.append(f" {meal_time}: {food}")
lines.append("")
for tip in recommendation["tips"]:
lines.append(tip)
return "\n".join(lines)