| import streamlit as st |
| from transformers import AutoTokenizer, AutoModelForSeq2SeqLM |
| import torch |
|
|
| |
| |
| |
| st.set_page_config( |
| page_title="Fitness Profile", |
| page_icon="🏋️", |
| layout="centered" |
| ) |
|
|
| |
| |
| |
| @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() |
|
|
| |
| |
| |
| 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" |
|
|
| |
| |
| |
| 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 = 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)})") |
|
|
| |
| |
| |
| 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("---") |
|
|
| |
| |
| |
| 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) |