Module_2 / src /streamlit_app.py
Harry2406's picture
Update src/streamlit_app.py
b748302 verified
import streamlit as st
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
import torch
# =========================
# Page Configuration
# =========================
st.set_page_config(
page_title="Fitness Profile",
page_icon="🏋️",
layout="centered"
)
# =========================
# Load Model (Cached)
# =========================
@st.cache_resource
def load_model():
tokenizer = AutoTokenizer.from_pretrained("google/flan-t5-large")
model = AutoModelForSeq2SeqLM.from_pretrained("google/flan-t5-large")
return tokenizer, model
tokenizer, model = load_model()
# =========================
# BMI Functions
# =========================
def calculate_bmi(height_cm, weight_kg):
if height_cm > 0 and weight_kg > 0:
height_m = height_cm / 100
return weight_kg / (height_m ** 2)
return None
def bmi_category(bmi):
if bmi < 18.5:
return "Underweight"
elif bmi < 25:
return "Normal weight"
elif bmi < 30:
return "Overweight"
else:
return "Obese"
# =========================
# 1️⃣ Personal Information
# =========================
st.header("1. Personal Information")
name = st.text_input("Name *")
gender = st.selectbox(
"Gender *",
["Male", "Female"]
)
height_cm = st.number_input(
"Height (in centimeters) *",
min_value=0.0,
format="%.2f"
)
weight_kg = st.number_input(
"Weight (in kilograms) *",
min_value=0.0,
format="%.2f"
)
# =========================
# BMI Display
# =========================
bmi = None
if height_cm > 0 and weight_kg > 0:
bmi = calculate_bmi(height_cm, weight_kg)
st.info(f"Your BMI is: {bmi:.2f} ({bmi_category(bmi)})")
# =========================
# 2️⃣ Fitness Details
# =========================
st.header("2. Fitness Details")
fitness_goal = st.selectbox(
"Fitness Goal",
["Build Muscle", "Weight Loss", "Strength Gain", "Abs Building", "Flexible"]
)
equipment = st.multiselect(
"Available Equipment (Multiple selection allowed)",
["Dumbbells", "Resistance Band", "Yoga Mat", "No Equipment"]
)
fitness_level = st.radio(
"Fitness Level",
["Beginner", "Intermediate", "Advanced"],
horizontal=True
)
st.markdown("---")
# =========================
# Submit Button
# =========================
if st.button("Submit Profile"):
if not name:
st.error("Please enter your name.")
elif bmi is None:
st.error("Please enter valid height and weight.")
elif not equipment:
st.error("Please select at least one equipment option.")
else:
st.success("Profile Submitted Successfully!")
bmi_status = bmi_category(bmi)
equipment_list = ", ".join(equipment)
prompt = f"""
You are a certified fitness trainer.
Create a STRICTLY formatted 5-day workout plan.
User Details:
- Gender: {gender}
- BMI: {bmi:.2f} ({bmi_status})
- Fitness Goal: {fitness_goal}
- Fitness Level: {fitness_level}
- Equipment Available: {equipment_list}
IMPORTANT RULES:
1. Output ONLY the workout plan.
2. Divide into Day 1, Day 2, Day 3, Day 4, Day 5.
3. Each day must contain EXACTLY 5 exercises.
4. For each exercise include:
Exercise:
Sets:
Reps:
Rest:
5. Do NOT add explanations or extra text.
FORMAT:
Day 1: [Workout Focus]
1. Exercise: Push-Ups
Sets: 3
Reps: 12
Rest: 60 sec
"""
with st.spinner("Generating your AI workout plan..."):
inputs = tokenizer(prompt, return_tensors="pt", truncation=True)
outputs = model.generate(
**inputs,
max_new_tokens=700,
temperature=0.3,
do_sample=True
)
result = tokenizer.decode(
outputs[0],
skip_special_tokens=True
).strip()
st.subheader("Your Personalized Workout Plan")
st.write(result)