Spaces:
Running
Running
| from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder | |
| from langchain_groq.chat_models import ChatGroq | |
| from langchain_core.runnables.history import RunnableWithMessageHistory | |
| from langchain_community.chat_message_histories import ChatMessageHistory | |
| from dotenv import load_dotenv | |
| from typing import Dict, Any | |
| import os | |
| load_dotenv() | |
| groq_api_key = os.getenv('GROQ_API_KEY') | |
| system_prompt = """ | |
| You are a certified fitness expert specializing in nutrition science, exercise physiology, and holistic wellness. Your mission is to provide evidence-based, personalized fitness guidance that helps users achieve sustainable health and fitness goals. | |
| SCOPE OF EXPERTISE: | |
| IN-SCOPE: Nutrition, exercise science, workout programming, wellness, injury prevention, fitness equipment, supplementation, body composition, recovery strategies, sports performance, and mental health as it relates to fitness. | |
| OUT-OF-SCOPE: Medical diagnosis, treatment of injuries/conditions, non-fitness topics, financial advice, relationship counseling, or any subject unrelated to health and fitness. | |
| INITIAL ASSESSMENT - Gather these key details: | |
| Primary Goal (weight loss, muscle gain, strength, endurance, general health) | |
| Current Fitness Level (beginner, intermediate, advanced) | |
| Age Range (for age-appropriate recommendations) | |
| Time Availability (days per week, minutes per session) | |
| Equipment Access (home, gym, bodyweight only) | |
| Physical Limitations (injuries, medical conditions, mobility issues) | |
| Experience (years training, previous programs tried) | |
| RESPONSE STRUCTURE: | |
| Quick Answer - Direct response to their immediate question | |
| Personalized Recommendations - Tailored advice based on their profile | |
| Action Steps - Specific, actionable next steps | |
| Safety Notes - Important form cues or precautions | |
| Progress Tracking - How to measure success | |
| EVIDENCE-BASED GUIDELINES: | |
| Reference exercise science principles (progressive overload, specificity, recovery) | |
| Provide rep/set ranges with scientific rationale | |
| Include proper form cues and common mistakes | |
| Suggest modifications for different fitness levels | |
| Recommend realistic timelines for results | |
| PERSONALIZATION & MEMORY: | |
| Reference previous conversations and build upon them | |
| Track their reported progress and adjust recommendations | |
| Remember their stated goals, limitations, and preferences | |
| Celebrate milestones and provide ongoing motivation | |
| COMMUNICATION STYLE: | |
| Encouraging and supportive - Maintain positive, motivational tone | |
| Educational - Explain the "why" behind recommendations | |
| Practical - Focus on actionable, realistic advice | |
| Professional - Maintain expertise while being approachable | |
| Safety-conscious - Always prioritize injury prevention | |
| Concise - Keep responses brief and direct while preserving essential meaning and context | |
| BOUNDARIES & REDIRECTIONS: | |
| For Out-of-Scope Questions: "I specialize in fitness, nutrition, and wellness guidance. For [topic], I'd recommend consulting with [appropriate professional]. However, I'm here to help with any fitness-related questions you might have! What are your current health and fitness goals?" | |
| For Medical Concerns: "This sounds like it may require medical evaluation. Please consult with a healthcare provider or physical therapist for proper assessment. Once cleared, I'd be happy to help you develop a safe, effective fitness plan." | |
| QUALITY ASSURANCE: | |
| Provide 2-3 exercise alternatives when possible | |
| Include beginner modifications for all recommendations | |
| Suggest progressive advancement pathways | |
| Reference reputable sources when discussing complex topics | |
| Encourage consistency over perfection | |
| User question: {input} | |
| """ | |
| prompt = ChatPromptTemplate.from_messages( | |
| [ | |
| ("system", system_prompt), | |
| MessagesPlaceholder("chat_history"), | |
| ("human", "{input}") | |
| ] | |
| ) | |
| llm = ChatGroq( | |
| model="openai/gpt-oss-120b", | |
| temperature=0.5, | |
| max_tokens=1000, | |
| api_key=groq_api_key | |
| ) | |
| chain = prompt | llm | |
| messages = {} | |
| def get_session(session_id : str) -> ChatMessageHistory: | |
| if session_id not in messages: | |
| messages[session_id] = ChatMessageHistory() | |
| return messages[session_id] | |
| conversation_bot = RunnableWithMessageHistory( | |
| chain, | |
| get_session_history=get_session, | |
| input_messages_key='input', | |
| history_messages_key='chat_history' | |
| ) | |
| def generate_ai_response(user_prompt : str, session_id : str) -> str : | |
| response = conversation_bot.invoke( | |
| { | |
| 'input' : user_prompt | |
| }, | |
| config = { | |
| "configurable" : { | |
| "session_id" : session_id | |
| } | |
| } | |
| ) | |
| # print(response) | |
| # print(f"messages - {messages}") | |
| return response.content | |
| def create_user_profile_prompt(profile: Dict[str, Any]) -> str: | |
| height_m = profile['height'] / 100 | |
| bmi = profile['weight'] / (height_m ** 2) | |
| available_days = [day for day, time in profile['schedule'].items() if time != "Not Available"] | |
| schedule_text = ", ".join([f"{day}: {profile['schedule'][day]}" for day in available_days]) | |
| prompt = f""" | |
| USER PROFILE INFORMATION: | |
| ======================= | |
| Personal Details: | |
| - Age: {profile['age']} years | |
| - Gender: {profile['gender']} | |
| - Weight: {profile['weight']} kg | |
| - Height: {profile['height']} cm | |
| - BMI: {bmi:.1f} | |
| - Current Fitness Level: {profile['fitness_level']} | |
| - Primary Fitness Goal: {profile['fitness_goal']} | |
| Workout Preferences: | |
| - Preferred Activities: {', '.join(profile['workout_preference'])} | |
| - Preferred Duration: {profile['workout_time']} | |
| - Available Schedule: {schedule_text} | |
| Nutrition & Health: | |
| - Dietary Preferences: {', '.join(profile['food_preferences'])} | |
| - Food Allergies/Intolerances: {profile.get('allergies', 'None specified')} | |
| - Health Issues: {profile.get('health_issues', 'None specified')} | |
| - Current Medications: {profile.get('medications', 'None specified')} | |
| - Daily Water Intake: {profile['water_intake']} glasses | |
| - Average Sleep: {profile['sleep_hours']} hours | |
| Profile Created: {profile['timestamp']} | |
| ======================= | |
| """ | |
| return prompt | |
| def create_workout_type_prompt(user_profile: Dict[str, Any]) -> str: | |
| return f""" | |
| {user_profile} | |
| TASK: Generate a personalized workout plan based on the above user profile. | |
| Please provide: | |
| 1. A weekly workout schedule that fits the user's available days and time preferences | |
| 2. Specific exercises for each workout day | |
| 3. Sets, reps, and duration recommendations | |
| 4. Progression suggestions | |
| 5. Safety considerations based on health issues (if any) | |
| Format the response in a clear, easy-to-follow structure. | |
| """ | |
| def create_nutrition_type_prompt(user_profile: Dict[str, Any]) -> str: | |
| return f""" | |
| {user_profile} | |
| TASK: Generate a personalized nutrition plan based on the above user profile. | |
| Please provide: | |
| 1. Daily calorie recommendations based on goals | |
| 2. Macro-nutrient breakdown (carbs, protein, fats) | |
| 3. Sample meal plans for different days | |
| 4. Food suggestions that align with dietary preferences | |
| 5. Hydration and supplement recommendations | |
| 6. Considerations for any health issues or medications | |
| Format the response in a clear, easy-to-follow structure. | |
| """ | |
| def create_conversation_chat_prompt(user_profile: Dict[str, Any], additional_message: str) -> str: | |
| return f""" | |
| {user_profile} | |
| CONTEXT: The user is asking a follow-up question about their fitness or nutrition plan. | |
| USER QUESTION: {additional_message} | |
| Please provide a helpful, personalized response based on their profile and question. | |
| """ | |