FitPlan / src /streamlit_app.py
Sreehitha-V's picture
Create src/streamlit_app.py
176b1d7 verified
import streamlit as st
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
import torch
# 1. Page Configuration
st.set_page_config(page_title="PERSONALIZED FITPLAN", layout="centered")
def load_model():
tokenizer = AutoTokenizer.from_pretrained("google/flan-t5-base")
model = AutoModelForSeq2SeqLM.from_pretrained("google/flan-t5-base")
return tokenizer, model
tokenizer, model = load_model()
def bmi_category(bmi):
if bmi < 18.5:
return "Underweight"
elif 18.5 <= bmi < 24.9:
return "Normal"
elif 25 <= bmi < 29.9:
return "Overweight"
else:
return "Obese"
# 2. Clean Styling
st.markdown("""
<style>
.stApp {
background: linear-gradient(rgba(0,0,0,0.85), rgba(0,0,0,0.85)),
url("https://images.unsplash.com/photo-1534438327276-14e5300c3a48?q=80&w=2070");
background-size: cover;
}
h1, h2, h3, label, p, span, .stMarkdown {
color: #FFFFFF !important;
font-weight: 900 !important;
}
</style>
""", unsafe_allow_html=True)
# 3. Header
st.title("πŸ‹οΈ PERSONALIZED FITPLAN")
st.markdown("---")
# 4. Athlete Profile Form
st.header("Athlete Profile")
col1, col2 = st.columns(2)
with col1:
name = st.text_input("NAME (Required)")
gender = st.selectbox("GENDER", ["Male", "Female", "Other"])
height_cm = st.number_input("HEIGHT (CM) (Required)", min_value=0.0, step=0.1)
with col2:
weight_kg = st.number_input("WEIGHT (KG) (Required)", min_value=0.0, step=0.1)
goal = st.selectbox("FITNESS GOAL", ["Build Muscle", "Weight Loss", "Strength Gain", "Abs Building", "Flexible"])
level = st.selectbox("FITNESS LEVEL", ["Beginner", "Intermediate", "Advanced"])
equipment_options = [
"Dumbbells", "Barbell", "Kettlebells", "Weight Plates",
"Resistance Band", "Yoga Mat", "Pull-up Bar", "Bench Press", "No Equipment"
]
equipment = st.multiselect("AVAILABLE EQUIPMENT", equipment_options)
st.markdown("---")
# 5. Logic and Results
if st.button(" Submit Profile"):
if not name:
st.error("Please enter your name.")
# πŸ”§ FIXED VARIABLES
elif height_cm <= 0 or weight_kg <= 0:
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 CALCULATION (missing earlier)
height_m = height_cm / 100
bmi = weight_kg / (height_m ** 2)
bmi_status = bmi_category(bmi)
equipment_list = ", ".join(equipment)
prompt = f"""
You are a certified professional gym trainer.
Generate a COMPLETE 5-day workout schedule.
FORMAT:
Day 1:
Warm-up:
-
Workout:
-
Rest:
Day 2:
Warm-up:
-
Workout:
-
Rest:
Day 3:
Warm-up:
-
Workout:
-
Rest:
Day 4:
Warm-up:
-
Workout:
-
Rest:
Day 5:
Warm-up:
-
Workout:
-
Rest:
User Details:
Gender: {gender}
BMI: {bmi:.2f} ({bmi_status})
Goal: {goal}
Fitness Level: {level}
Available Equipment: {equipment_list}
Generate the full 5-day workout plan.
"""
with st.spinner("Generating your AI workout plan..."):
inputs = tokenizer(prompt, return_tensors="pt", truncation=True)
outputs = model.generate(
**inputs,
max_new_tokens=600,
temperature=0.3,
do_sample=False
)
result = tokenizer.decode(outputs[0], skip_special_tokens=True).strip()
st.subheader(" Your Personalized Workout Plan")
st.write(result)
# Validation block (unchanged)
if not name or height_cm <= 0 or weight_kg <= 0:
st.error("🚨 VALIDATION FAILED: PLEASE PROVIDE NAME, HEIGHT, AND WEIGHT.")
else:
height_m = height_cm / 100
bmi_val = round(weight_kg / (height_m ** 2), 2)
if bmi_val < 18.5: category = "Underweight"
elif 18.5 <= bmi_val < 24.9: category = "Normal"
elif 25 <= bmi_val < 29.9: category = "Overweight"
else: category = "Obese"
st.success(f"PROFILE SUBMITTED SUCCESSFULLY! HELLO {name.upper()}")
st.markdown(f"### BMI: {bmi_val} | CATEGORY: {category.upper()}")
athlete_data = {
"Name": name,
"Gender": gender,
"BMI": bmi_val,
"Goal": goal,
"Fitness Level": level,
"Equipment": equipment
}
st.json(athlete_data)