import streamlit as st import pandas as pd import matplotlib.pyplot as plt from ai71 import AI71 import time AI71_API_KEY = "api71-api-92fc2ef9-9f3c-47e5-a019-18e257b04af2" ai71 = AI71(AI71_API_KEY) def collect_user_data(): st.sidebar.header("Your Information") age = st.sidebar.number_input("Enter your age:", min_value=10, max_value=100, value=25) height = st.sidebar.number_input("Enter your height (in cm):", min_value=100, max_value=250, value=170) weight = st.sidebar.number_input("Enter your weight (in kg):", min_value=30, max_value=200, value=70) gender = st.sidebar.selectbox("Select your gender:", ["Male", "Female", "Other"]) activity_level = st.sidebar.selectbox("Select your activity level:", ["Sedentary", "Lightly Active", "Moderately Active", "Very Active", "Extra Active"]) goal = st.sidebar.selectbox("Select your fitness goal:", ["Weight Loss", "Muscle Gain", "Maintenance", "Improve Stamina"]) # --- Additional Features --- st.sidebar.subheader("Dietary Preferences (Optional)") vegetarian = st.sidebar.checkbox("Vegetarian") vegan = st.sidebar.checkbox("Vegan") allergies = st.sidebar.text_input("Allergies (comma-separated, e.g., peanuts, dairy):") st.sidebar.subheader("Workout Preferences (Optional)") workout_days = st.sidebar.slider("How many days a week do you want to work out?", 1, 7, 4) workout_duration = st.sidebar.slider("Average workout duration (in minutes):", 30, 90, 45) return { "age": age, "height": height, "weight": weight, "gender": gender, "activity_level": activity_level, "goal": goal, "vegetarian": vegetarian, "vegan": vegan, "allergies": allergies, "workout_days": workout_days, "workout_duration": workout_duration } def calculate_bmi(height, weight): bmi = weight / ((height / 100) ** 2) return bmi def calculate_bmr(gender, weight, height, age): if gender == "Male": bmr = (10 * weight) + (6.25 * height) - (5 * age) + 5 elif gender == "Female": bmr = (10 * weight) + (6.25 * height) - (5 * age) - 161 else: bmr = (10 * weight) + (6.25 * height) - (5 * age) # Using male formula as default return bmr def calculate_daily_calorie_needs(bmr, activity_level, goal): activity_multipliers = { "Sedentary": 1.2, "Lightly Active": 1.375, "Moderately Active": 1.55, "Very Active": 1.725, "Extra Active": 1.9 } calorie_needs = bmr * activity_multipliers[activity_level] if goal == "Weight Loss": calorie_needs -= 500 elif goal == "Muscle Gain": calorie_needs += 350 # Average between 250-500 return int(calorie_needs) def generate_meal_plan(calorie_goal, restrictions=""): prompt = f""" Generate a sample 7-day meal plan for a person with a daily calorie goal of {calorie_goal} calories. The meal plan should include breakfast, lunch, dinner, and two snacks per day. Dietary restrictions: {restrictions} Provide the meal plan in a clear and organized format, using bullet points for each day. """ response = ai71.chat.completions.create( model="tiiuae/falcon-180b-chat", messages=[{"role": "user", "content": prompt}], stream=False, ) return response.choices[0].message.content def generate_workout_plan(goal, days, duration, styles=""): prompt = f""" Create a sample weekly workout plan for someone aiming to {goal}, who wants to work out {days} days a week, with each workout lasting around {duration} minutes. Preferred workout styles: {styles} Include a variety of exercises targeting different muscle groups. Provide clear instructions for each exercise and day. """ response = ai71.chat.completions.create( model="tiiuae/falcon-180b-chat", messages=[{"role": "user", "content": prompt}], stream=False, ) return response.choices[0].message.content def get_ai_response(prompt, chat_history): messages = [{"role": "system", "content": "You are a helpful and knowledgeable fitness assistant."}] for turn in chat_history: messages.append({"role": "user", "content": turn[0]}) messages.append({"role": "assistant", "content": turn[1]}) messages.append({"role": "user", "content": prompt}) try: completion = ai71.chat.completions.create( model="tiiuae/falcon-180b-chat", messages=messages, stream=False, ) return completion.choices[0].message.content except Exception as e: return f"An error occurred: {str(e)}" # Streamlit App st.title("FitGen - Your Personalized Fitness Guide") # Initialize chat history if 'chat_history' not in st.session_state: st.session_state.chat_history = [] # Sidebar user_data = collect_user_data() if st.sidebar.button("Generate Plan"): st.session_state.user_data = user_data # Main Content Area user_data = st.session_state.get("user_data", {}) if user_data: bmi = calculate_bmi(user_data["height"], user_data["weight"]) bmr = calculate_bmr(user_data["gender"], user_data["weight"], user_data["height"], user_data["age"]) daily_calories = calculate_daily_calorie_needs(bmr, user_data["activity_level"], user_data["goal"]) st.header("Your Fitness Plan") st.write(f"**BMI:** {bmi:.2f}") st.write(f"**BMR:** {bmr:.2f} calories/day") st.write(f"**Daily Calorie Needs:** {daily_calories} calories/day") dietary_restrictions = "" if user_data["vegetarian"]: dietary_restrictions += "Vegetarian. " if user_data["vegan"]: dietary_restrictions += "Vegan. " if user_data["allergies"]: dietary_restrictions += f"Allergies: {user_data['allergies']}. " st.subheader("Your Meal Plan") with st.spinner("Generating meal plan..."): time.sleep(1) # Simulate delay - remove in production meal_plan = generate_meal_plan(daily_calories, dietary_restrictions) st.write(meal_plan) st.subheader("Your Workout Plan") with st.spinner("Generating workout plan..."): time.sleep(1) # Simulate delay - remove in production workout_plan = generate_workout_plan(user_data["goal"], user_data["workout_days"], user_data["workout_duration"]) st.write(workout_plan) st.subheader("Ask Your Fitness AI") user_question = st.text_input("Enter your fitness-related question:") if user_question: with st.spinner("Generating response..."): response = get_ai_response(user_question, st.session_state.chat_history) st.session_state.chat_history.append((user_question, response)) # Update history st.write(response) # Display chat history st.subheader("Chat History") for i, (user_msg, bot_msg) in enumerate(st.session_state.chat_history): st.write(f"**You:** {user_msg}") st.write(f"**Bot:** {bot_msg}") if i < len(st.session_state.chat_history) - 1: st.markdown("---") else: st.write("Please fill in your information in the sidebar to generate your personalized fitness plan.")