import streamlit as st from transformers import AutoTokenizer, AutoModelForSeq2SeqLM import torch st.set_page_config(page_title="FitPlan AI", layout="centered") # LOAD MODEL @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() # TITLE st.title(" FitPlan AI – User Fitness Profile") # PERSONAL INFORMATION st.subheader(" Personal Information") name = st.text_input("Enter Your Name") gender = st.radio( "Gender", ["Male", "Female"], horizontal=True ) # --------------------------------------------------- # HEIGHT & WEIGHT # --------------------------------------------------- col1, col2 = st.columns(2) with col1: height = st.number_input( "Height (in cm)", min_value=0.0, max_value=250.0, value=0.0, step=0.1 ) with col2: weight = st.number_input( "Weight (in kg)", min_value=0.0, max_value=200.0, value=0.0, step=0.1 ) #BMI Function def bmi_category(bmi): if bmi < 18.5: return "Underweight" elif bmi < 25: return "Normal weight" elif bmi < 30: return "Overweight" else: return "Obese" # BMI CALCULATION bmi = None if height > 0 and weight > 0: height_m = height / 100 bmi = weight / (height_m ** 2) st.metric("📊 Your BMI", f"{bmi:.2f}") st.info(f"BMI Category: {bmi_category(bmi)}") # FITNESS GOAL st.subheader("🎯 Fitness Goal") goal = st.selectbox( "Select Your Goal", [ "Flexible", "Weight Loss", "Build Muscle", "Strength Gaining", "Abs Building" ] ) # EQUIPMENT st.subheader(" Available Equipment") equipment_map = {} col1, col2, col3 = st.columns(3) with col1: equipment_map["No Equipment"] = st.checkbox("No Equipment") equipment_map["Pull-up Bar"] = st.checkbox("Pull-up Bar") equipment_map["Dip Bars"] = st.checkbox("Dip Bars") equipment_map["Push-up Handles"] = st.checkbox("Push-up Handles") equipment_map["Dumbbells"] = st.checkbox("Dumbbells") equipment_map["Adjustable Dumbbells"] = st.checkbox("Adjustable Dumbbells") with col2: equipment_map["Barbell"] = st.checkbox("Barbell") equipment_map["Weight Plates"] = st.checkbox("Weight Plates") equipment_map["Kettlebells"] = st.checkbox("Kettlebells") equipment_map["Medicine Ball"] = st.checkbox("Medicine Ball") equipment_map["Yoga Mat"] = st.checkbox("Yoga Mat") equipment_map["Resistance Band"] = st.checkbox("Resistance Band") with col3: equipment_map["Bosu Ball"] = st.checkbox("Bosu Ball") equipment_map["Stability Ball"] = st.checkbox("Stability Ball") equipment_map["Foam Roller"] = st.checkbox("Foam Roller") equipment_map["Treadmill"] = st.checkbox("Treadmill") equipment_map["Exercise Bike"] = st.checkbox("Exercise Bike") equipment_map["Skipping Rope"] = st.checkbox("Skipping Rope") equipment = [item for item, selected in equipment_map.items() if selected] # FITNESS LEVEL st.subheader("📈 Fitness Level") fitness_level = st.radio( "Select Fitness Level", ["Beginner", "Intermediate", "Advanced"], horizontal=True ) def create_prompt(gender, bmi, bmi_status, goal, level, equipment): equipment_list = ", ".join(equipment) prompt = f""" Instruction: You are a certified professional fitness trainer. Generate a structured 5-day workout plan. User Information: Gender: {gender} BMI: {bmi:.2f} ({bmi_status}) Goal: {goal} Fitness Level: {level} Equipment Available: {equipment_list} Rules: 1. Only generate Day 1 to Day 5. 2. Each day must include: - Focus - 4 exercises - Sets x Reps - Rest time 3. Do not repeat days. 4. Do not generate explanations. 5. Keep output clean and professional. Start directly with: Day 1: """ return prompt def generate_workout_plan(prompt): inputs = tokenizer(prompt, return_tensors="pt", truncation=True) outputs = model.generate( **inputs, max_new_tokens=400, num_beams=4, early_stopping=True, no_repeat_ngram_size=3 ) result = tokenizer.decode(outputs[0], skip_special_tokens=True) return result if st.button("Submit Profile"): prompt = create_prompt( gender, bmi, bmi_status, goal, fitness_level, equipment ) with st.spinner("Generating AI workout plan..."): result = generate_workout_plan(prompt) st.subheader("Your Personalized Workout Plan") st.write(result)