lokeshloki143's picture
Update app.py
a71a948 verified
import gradio as gr
import requests
import json
from transformers import pipeline
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime, timedelta
import logging
# Set up logging for debugging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
try:
# Initialize Hugging Face model for diet plan generation
logger.info("Loading distilgpt2 model...")
generator = pipeline('text-generation', model='distilgpt2')
except Exception as e:
logger.error(f"Failed to load model: {str(e)}")
raise
# Mock Salesforce API endpoints (replace with actual endpoints after Phase 1)
SALESFORCE_BASE_URL = "https://your-org.my.salesforce.com/services/apexrest"
SALESFORCE_TOKEN = "YOUR_SALESFORCE_ACCESS_TOKEN" # Obtain via OAuth in Phase 1
# Mock food database (to be replaced with Salesforce Food_Item__c data)
FOOD_DATABASE = [
{"name": "Chicken Breast", "calories": 165, "protein": 31, "carbs": 0, "fat": 3.6, "benefits": "High protein for muscle repair"},
{"name": "Broccoli", "calories": 55, "protein": 3.7, "carbs": 11, "fat": 0.6, "benefits": "Rich in fiber and vitamins"},
{"name": "Quinoa", "calories": 120, "protein": 4.4, "carbs": 21, "fat": 1.9, "benefits": "Complete protein, gluten-free"}
]
# Function to fetch workout plan from Salesforce
def fetch_workout_plan(user_id):
try:
url = f"{SALESFORCE_BASE_URL}/WorkoutPlan/{user_id}"
headers = {
'Authorization': f'Bearer {SALESFORCE_TOKEN}',
'Content-Type': 'application/json'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
plans = response.json()
return "\n".join([f"Plan: {plan['Plan_Name__c']}, Exercises: {plan['Exercises__c']}, Duration: {plan['Duration__c']} min" for plan in plans])
return f"Error fetching workout plan: {response.status_code}"
except Exception as e:
logger.error(f"Error fetching workout plan: {str(e)}")
return f"Error: {str(e)}"
# Function to generate diet plan using Hugging Face AI
def generate_diet_plan(height, weight, goal):
try:
prompt = f"Generate a daily diet plan for a person with height {height} cm, weight {weight} kg, and goal {goal}. Include food items, portion sizes, and nutritional benefits."
diet_plan = generator(prompt, max_length=200, num_return_sequences=1)[0]['generated_text']
return diet_plan
except Exception as e:
logger.error(f"Error generating diet plan: {str(e)}")
return f"Error generating diet plan: {str(e)}"
# Function to search food database
def search_food(query):
try:
results = [food for food in FOOD_DATABASE if query.lower() in food['name'].lower()]
if not results:
return "No foods found."
return "\n".join([f"{food['name']}: {food['calories']} kcal, Protein: {food['protein']}g, Carbs: {food['carbs']}g, Fat: {food['fat']}g, Benefits: {food['benefits']}" for food in results])
except Exception as e:
logger.error(f"Error searching food: {str(e)}")
return f"Error: {str(e)}"
# Function to save height/weight to Salesforce
def save_metrics(user_id, height, weight):
try:
url = f"{SALESFORCE_BASE_URL}/UserMetrics"
headers = {
'Authorization': f'Bearer {SALESFORCE_TOKEN}',
'Content-Type': 'application/json'
}
data = {
"User__c": user_id,
"Height__c": height,
"Weight__c": weight,
"Date__c": datetime.now().strftime("%Y-%m-%d")
}
response = requests.post(url, headers=headers, json=data)
return "Metrics saved successfully" if response.status_code == 201 else f"Error saving metrics: {response.status_code}"
except Exception as e:
logger.error(f"Error saving metrics: {str(e)}")
return f"Error: {str(e)}"
# Function to fetch and plot height/weight progress
def plot_progress(user_id):
try:
# Mock data (replace with Salesforce User_Metrics__c query)
metrics = [
{"Date__c": "2025-05-01", "Height__c": 180, "Weight__c": 80},
{"Date__c": "2025-05-08", "Height__c": 180, "Weight__c": 79},
{"Date__c": "2025-05-15", "Height__c": 180, "Weight__c": 78}
]
dates = [m["Date__c"] for m in metrics]
weights = [m["Weight__c"] for m in metrics]
plt.figure(figsize=(8, 4))
plt.plot(dates, weights, 'b-', label='Weight (kg)')
plt.title('Weight Progress')
plt.xlabel('Date')
plt.ylabel('Weight (kg)')
plt.grid(True)
plt.legend()
plt.savefig('progress.png')
plt.close()
return 'progress.png'
except Exception as e:
logger.error(f"Error plotting progress: {str(e)}")
return None
# Function to generate a simple calendar
def generate_calendar():
try:
today = datetime.now()
calendar = []
for i in range(7):
day = today + timedelta(days=i)
calendar.append(f"{day.strftime('%Y-%m-%d')}: Schedule workout/meal")
return "\n".join(calendar)
except Exception as e:
logger.error(f"Error generating calendar: {str(e)}")
return f"Error: {str(e)}"
# Main Gradio interface
def gym_work_updates_app(user_id, height, weight, goal, food_query):
try:
# Fetch workout plan
workout_plan = fetch_workout_plan(user_id)
# Generate diet plan
diet_plan = generate_diet_plan(height, weight, goal)
# Search food
food_results = search_food(food_query)
# Save metrics
metrics_result = save_metrics(user_id, height, weight)
# Generate calendar
calendar = generate_calendar()
# Plot progress
progress_chart = plot_progress(user_id)
return (
f"**Workout Plan**\n{workout_plan}\n\n"
f"**Diet Plan**\n{diet_plan}\n\n"
f"**Food Search Results**\n{food_results}\n\n"
f"**Metrics Status**\n{metrics_result}\n\n"
f"**Weekly Calendar**\n{calendar}",
progress_chart
)
except Exception as e:
logger.error(f"Error in app: {str(e)}")
return f"Error: {str(e)}", None
# Create Gradio UI
with gr.Blocks(css="body {font-family: Arial; max-width: 800px; margin: auto; padding: 20px;}") as iface:
gr.Markdown("# Gym Work Updates")
user_id = gr.Textbox(label="User ID")
height = gr.Number(label="Height (cm)")
weight = gr.Number(label="Weight (kg)")
goal = gr.Dropdown(label="Goal", choices=["Weight Loss", "Muscle Gain", "Maintenance"])
food_query = gr.Textbox(label="Search Food")
submit = gr.Button("Get Plans and Metrics")
output_text = gr.Textbox(label="Results")
output_chart = gr.Image(label="Progress Chart")
submit.click(
fn=gym_work_updates_app,
inputs=[user_id, height, weight, goal, food_query],
outputs=[output_text, output_chart]
)
# Launch the app
if __name__ == "__main__":
logger.info("Launching Gradio app...")
iface.launch()