Download src/streamlit_app.py from Harry2406/Module_2: direct link, hf CLI and curl.
- Browser
- Download file 3.89 kB
-
https://huggingface.co/spaces/Harry2406/Module_2/resolve/main/src/streamlit_app.py
- Command line
-
hf download hf://spaces/Harry2406/Module_2/src/streamlit_app.py
-
curl -L -o streamlit_app.py https://huggingface.co/spaces/Harry2406/Module_2/resolve/main/src/streamlit_app.py
3.89 kB
| 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) | |
| # ========================= | |
| 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) |