Added Sarita_B contributions to community-contributions
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
|
||||
# app.py
|
||||
import json
|
||||
import streamlit as st
|
||||
from agent import FitnessPlannerAgent, UserProfile, WeekPlan
|
||||
|
||||
st.set_page_config(page_title="Fitness & Nutrition Planner Agent", layout="wide")
|
||||
|
||||
st.title("🏋️ Fitness & Nutrition Planner Agent")
|
||||
|
||||
with st.sidebar:
|
||||
st.header("Your Profile")
|
||||
sex = st.selectbox("Sex", ["female","male"])
|
||||
age = st.number_input("Age", 18, 90, 45)
|
||||
height_cm = st.number_input("Height (cm)", 120, 220, 152)
|
||||
weight_kg = st.number_input("Weight (kg)", 35.0, 200.0, 62.0)
|
||||
activity_level = st.selectbox("Activity Level", ["sedentary","light","moderate","active","very_active"], index=1)
|
||||
goal = st.selectbox("Goal", ["lose","maintain","gain"], index=1)
|
||||
dietary_pattern = st.selectbox("Dietary Pattern", ["none","vegetarian","vegan","halal","kosher"], index=1)
|
||||
if dietary_pattern == "none": dietary_pattern = None
|
||||
allergies = st.text_input("Allergies (comma-separated)", "")
|
||||
dislikes = st.text_input("Dislikes (comma-separated)", "")
|
||||
daily_meals = st.slider("Meals per day", 2, 5, 3)
|
||||
time_per_meal_minutes = st.slider("Time per meal (min)", 5, 90, 25)
|
||||
budget_level = st.selectbox("Budget", ["medium","low","high"], index=0)
|
||||
cuisine_prefs = st.text_input("Cuisine prefs (comma-separated)", "mediterranean")
|
||||
|
||||
build_btn = st.button("Generate 7-Day Plan")
|
||||
|
||||
agent = FitnessPlannerAgent()
|
||||
|
||||
if build_btn:
|
||||
profile = UserProfile(
|
||||
sex=sex, age=int(age), height_cm=float(height_cm), weight_kg=float(weight_kg),
|
||||
activity_level=activity_level, goal=goal, dietary_pattern=dietary_pattern,
|
||||
allergies=[a.strip() for a in allergies.split(",") if a.strip()],
|
||||
dislikes=[d.strip() for d in dislikes.split(",") if d.strip()],
|
||||
daily_meals=int(daily_meals), cuisine_prefs=[c.strip() for c in cuisine_prefs.split(",") if c.strip()],
|
||||
time_per_meal_minutes=int(time_per_meal_minutes), budget_level=budget_level
|
||||
)
|
||||
st.session_state["profile_json"] = profile.model_dump_json()
|
||||
with st.spinner("Planning your week..."):
|
||||
result = agent.chat("Create my 7-day plan and grocery list.", profile)
|
||||
st.session_state["last_response"] = result
|
||||
|
||||
if "last_response" in st.session_state:
|
||||
st.subheader("Plan & Groceries")
|
||||
st.markdown(st.session_state["last_response"])
|
||||
|
||||
st.divider()
|
||||
st.subheader("Tweaks")
|
||||
col1, col2, col3 = st.columns(3)
|
||||
with col1:
|
||||
day = st.selectbox("Day to change", ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"])
|
||||
with col2:
|
||||
meal_index = st.selectbox("Meal slot", ["Breakfast (0)","Lunch (1)","Dinner (2)"])
|
||||
meal_index = int(meal_index[-2]) # 0/1/2
|
||||
with col3:
|
||||
swap_btn = st.button("Swap Meal")
|
||||
|
||||
if swap_btn and agent.plan_cache:
|
||||
profile_json = st.session_state.get("profile_json")
|
||||
if not profile_json:
|
||||
st.warning("Please generate a plan first.")
|
||||
else:
|
||||
new_plan_json = agent._call_tool("swap_meal", {
|
||||
"plan": agent.plan_cache.model_dump(),
|
||||
"day": day,
|
||||
"meal_index": meal_index,
|
||||
"profile": json.loads(profile_json)
|
||||
})
|
||||
agent.plan_cache = WeekPlan(**json.loads(new_plan_json))
|
||||
summary = agent.chat(f"Update summary for {day}: show the swapped meal and new day totals.")
|
||||
st.session_state["last_response"] = summary
|
||||
st.markdown(summary)
|
||||
Reference in New Issue
Block a user