Abs6187 commited on
Commit
3875487
·
verified ·
1 Parent(s): 20b738a

Upload 10 files

Browse files
Files changed (9) hide show
  1. .gitattributes +2 -0
  2. Dockerfile +21 -0
  3. Image-1.jpg +0 -0
  4. Image-2.jpg +3 -0
  5. app.py +194 -261
  6. gitattributes +2 -0
  7. image-3.jpg +3 -0
  8. requirements.txt +1 -0
  9. style.css +228 -314
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ Image-2.jpg filter=lfs diff=lfs merge=lfs -text
37
+ image-3.jpg filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.9-slim
2
+
3
+ WORKDIR /app
4
+
5
+ RUN apt-get update && apt-get install -y \
6
+ build-essential \
7
+ curl \
8
+ software-properties-common \
9
+ git \
10
+ && rm -rf /var/lib/apt/lists/*
11
+
12
+ COPY requirements.txt ./
13
+ COPY src/ ./src/
14
+
15
+ RUN pip3 install -r requirements.txt
16
+
17
+ EXPOSE 8501
18
+
19
+ HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
20
+
21
+ ENTRYPOINT ["streamlit", "run", "src/streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"]
Image-1.jpg ADDED
Image-2.jpg ADDED

Git LFS Details

  • SHA256: c9c48a1b0cc96cad5c46efbe6c42bce41e18e48aaee1e3e5f709afb6527c34e8
  • Pointer size: 131 Bytes
  • Size of remote file: 272 kB
app.py CHANGED
@@ -3,72 +3,30 @@ from dotenv import load_dotenv
3
  from langchain_groq import ChatGroq
4
  import os
5
  import importlib.util
 
 
 
6
 
7
- # Set page configuration
8
- st.set_page_config(
9
- page_title="Wellness Planner",
10
- page_icon="🌿",
11
- layout="wide",
12
- initial_sidebar_state="expanded"
13
- )
14
 
15
- # Custom CSS for better styling
16
- st.markdown("""
17
- <style>
18
- .main {
19
- padding: 2rem;
20
- }
21
- .stApp {
22
- background-color: #f8f9fa;
23
- }
24
- .css-18e3th9 {
25
- padding-top: 2rem;
26
- }
27
- .stTabs [data-baseweb="tab-list"] {
28
- gap: 2px;
29
- }
30
- .stTabs [data-baseweb="tab"] {
31
- height: 50px;
32
- white-space: pre-wrap;
33
- background-color: #f0f2f6;
34
- border-radius: 4px 4px 0 0;
35
- gap: 1px;
36
- padding-top: 10px;
37
- padding-bottom: 10px;
38
- }
39
- .stTabs [aria-selected="true"] {
40
- background-color: #4CAF50 !important;
41
- color: white !important;
42
- }
43
- div.stButton > button:first-child {
44
- background-color: #4CAF50;
45
- color: white;
46
- font-weight: bold;
47
- padding: 0.5rem 1rem;
48
- border-radius: 0.5rem;
49
- border: none;
50
- }
51
- div.stButton > button:hover {
52
- background-color: #45a049;
53
- border: none;
54
- }
55
- .result-container {
56
- background-color: white;
57
- padding: 2rem;
58
- border-radius: 0.5rem;
59
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
60
- }
61
- .info-box {
62
- background-color: #e8f4f8;
63
- padding: 1rem;
64
- border-radius: 0.5rem;
65
- margin-bottom: 1rem;
66
- }
67
- h1, h2, h3 {
68
- color: #2E7D32;
69
- }
70
- </style>
71
- """, unsafe_allow_html=True)
72
 
73
  # Check if team_info module exists and import it
74
  try:
@@ -110,7 +68,7 @@ def format_plan(response):
110
  sections = content.split("\n\n")
111
  formatted = ""
112
  for section in sections:
113
- formatted += f"{section.strip()}\n\n"
114
  return formatted
115
  except Exception as e:
116
  return f"Error formatting plan: {e}"
@@ -201,209 +159,184 @@ Day: {{weekday}}
201
  - Food Delivery: Suggested meal items and delivery options.
202
  """
203
 
204
- # Main App Layout
205
- def main():
206
- # App Header
207
- col1, col2 = st.columns([1, 3])
208
- with col1:
209
- st.image("https://img.icons8.com/color/96/000000/yoga.png", width=80)
210
- with col2:
211
- st.title("AI-Based Wellness Planner")
212
- st.subheader("Personalized Diet & Exercise Plan with Ayurvedic Insights")
213
-
214
- st.markdown("---")
215
-
216
- # Sidebar content
217
- with st.sidebar:
218
- st.image("https://img.icons8.com/color/96/000000/natural-food.png", width=50)
219
- st.header("About this Project")
220
- st.markdown("""
221
- <div class="info-box">
222
- This app creates personalized wellness plans by integrating Ayurveda with modern medical science for comprehensive health insights.
223
- </div>
224
- """, unsafe_allow_html=True)
225
-
226
- if has_team_info:
227
- st.subheader("👥 Team Members")
228
- team_members = [
229
- ("Aditi Soni", "https://www.linkedin.com/in/aditi-soni-259813285/"),
230
- ("Bhumika Patel", "https://www.linkedin.com/in/bhumika-patel-ml/"),
231
- ("Aditi Lakhera", "https://www.linkedin.com/in/aditi-lakhera-b628802bb/"),
232
- ("Anushri Tiwari", "https://www.linkedin.com/in/anushri-tiwari-916494300")
233
- ]
234
-
235
- for name, link in team_members:
236
- st.markdown(f"- [{name}]({link})")
237
-
238
- st.subheader("🔗 Project Links")
239
- st.markdown("[GitHub Repository](https://github.com/Abs6187/AI_Health_v2)")
240
- st.markdown("[Presentation](https://github.com/Abs6187/AI_Health_v2/blob/main/HackGirl_PPT_HackSRIT.pptx)")
241
- st.markdown("[Hackathon](https://unstop.com/hackathons/hacksrit-shri-ram-group-of-institutions-jabalpur-1471613)")
242
-
243
- st.markdown("---")
244
- st.caption("© 2023 Wellness Planner")
245
 
246
- # Main content
247
- tab1, tab2 = st.tabs(["Create Your Plan", "About Ayurveda"])
 
 
 
 
 
 
 
248
 
249
- with tab1:
250
- # Input Form in two columns
251
- st.header("Enter Your Details")
252
-
253
- col1, col2 = st.columns(2)
 
254
 
255
- with col1:
256
- st.subheader("Personal Information")
257
- name = st.text_input("Name", placeholder="Enter your name")
258
- age = st.number_input("Age", min_value=1, max_value=120, value=25)
259
- gender = st.selectbox("Gender", options=["Male", "Female", "Other"])
260
-
261
- st.subheader("Physical Metrics")
262
- weight = st.number_input("Weight (kg)", min_value=1.0, max_value=300.0, value=70.0, format="%.1f")
263
- height = st.number_input("Height (cm)", min_value=1, max_value=250, value=170)
264
-
265
- with col2:
266
- st.subheader("Goals & Preferences")
267
- fitness_goal = st.selectbox("Fitness Goal", options=["Weight Loss", "Weight Gain", "Maintenance"])
268
- dietary_preference = st.selectbox("Dietary Preference",
269
- options=["No Restrictions", "Vegetarian", "Vegan", "Keto", "Paleo", "Halal", "Gluten-Free"])
270
- food_allergies = st.text_input("Food Allergies (if any)", placeholder="e.g., nuts, dairy, shellfish")
271
- local_cuisine = st.text_input("Preferred Local Cuisine", placeholder="e.g., Indian, Italian, Chinese")
272
- month = st.selectbox("Current Month",
273
- options=["January", "February", "March", "April", "May", "June",
274
- "July", "August", "September", "October", "November", "December"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
275
 
276
- include_ayurveda = st.checkbox("Include Ayurvedic wellness insights", value=True)
277
-
278
- # Calculate metrics
279
- bmi = round(weight / (height / 100) ** 2, 2)
280
-
281
- if bmi < 18.5:
282
- health_status = "Underweight"
283
- bmi_color = "orange"
284
- elif bmi <= 24.9:
285
- health_status = "Normal weight"
286
- bmi_color = "green"
287
- elif bmi <= 29.9:
288
- health_status = "Overweight"
289
- bmi_color = "orange"
290
- else:
291
- health_status = "Obese"
292
- bmi_color = "red"
293
 
294
- daily_calories = int(calculate_calorie_requirements(age, gender, weight, height, fitness_goal))
295
-
296
- # Display metrics in a nice formatted box
297
- st.markdown("### Your Health Metrics")
298
- metrics_col1, metrics_col2 = st.columns(2)
299
-
300
- with metrics_col1:
301
- st.markdown(f"""
302
- <div style="background-color: #e8f4f8; padding: 20px; border-radius: 10px; margin-bottom: 20px;">
303
- <h4 style="color: #1E88E5;">BMI Analysis</h4>
304
- <p>Your BMI is <span style="font-weight: bold; color: {bmi_color};">{bmi}</span></p>
305
- <p>Status: <span style="font-weight: bold; color: {bmi_color};">{health_status}</span></p>
306
- </div>
307
- """, unsafe_allow_html=True)
308
 
309
- with metrics_col2:
310
- st.markdown(f"""
311
- <div style="background-color: #e8f4f8; padding: 20px; border-radius: 10px; margin-bottom: 20px;">
312
- <h4 style="color: #1E88E5;">Calorie Requirements</h4>
313
- <p>Daily requirements: <span style="font-weight: bold;">{daily_calories} kcal</span></p>
314
- <p>Goal: <span style="font-weight: bold;">{fitness_goal}</span></p>
315
- </div>
316
- """, unsafe_allow_html=True)
317
-
318
- # User metrics dictionary
319
- metrics = {
320
- "name": name,
321
- "age": age,
322
- "gender": gender,
323
- "bmi": bmi,
324
- "health_status": health_status,
325
- "fitness_goal": fitness_goal,
326
- "dietary_preference": dietary_preference,
327
- "food_allergies": food_allergies,
328
- "daily_calories": daily_calories,
329
- "local_cuisine": local_cuisine,
330
- "weekdays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
331
- "month": month,
332
- }
333
-
334
- # Generate button
335
- st.markdown("---")
336
- generate_col1, generate_col2, generate_col3 = st.columns([1, 2, 1])
337
- with generate_col2:
338
- generate_plan = st.button("Generate Your Personalized Wellness Plan", use_container_width=True)
339
-
340
- # Generate and display plan
341
- if generate_plan:
342
- if not name:
343
- st.error("Please enter your name to generate a plan")
344
- else:
345
- with st.spinner("Crafting your personalized wellness plan..."):
346
- try:
347
- # Choose the appropriate prompt based on the Ayurveda option
348
- selected_prompt = ayurveda_prompt_template if include_ayurveda else regular_prompt_template
349
- plan = generate_plan_with_prompt(metrics, selected_prompt)
350
- formatted_plan = format_plan(plan)
351
-
352
- plan_type = "Integrated Ayurvedic & Modern Wellness Plan" if include_ayurveda else "Modern Wellness Plan"
353
-
354
- st.success(f"Your personalized plan is ready!")
355
-
356
- formatted_plan_html = formatted_plan.replace('\n', '<br>')
357
-
358
- st.markdown(f"""
359
- <div class="result-container">
360
- <h2 style="text-align: center; color: #2E7D32;">{plan_type} for {name}</h2>
361
- <h4 style="text-align: center; color: #666;">Month: {month}</h4>
362
- <hr>
363
- {formatted_plan_html}
364
- </div>
365
- """, unsafe_allow_html=True)
366
-
367
- # Download option
368
- plan_text = f"{plan_type} for {name}\nMonth: {month}\n\n{plan.content}"
369
- st.download_button(
370
- label="Download Your Plan",
371
- data=plan_text,
372
- file_name=f"{name}_wellness_plan.txt",
373
- mime="text/plain"
374
- )
375
-
376
- except Exception as e:
377
- st.error(f"Error generating the plan: {e}")
378
-
379
- with tab2:
380
- st.header("Ayurveda: Ancient Wisdom for Modern Wellness")
381
-
382
- st.markdown("""
383
- <div style="background-color: white; padding: 20px; border-radius: 10px; margin-bottom: 20px;">
384
- <p>Ayurveda is a traditional Indian system of medicine that dates back over 5,000 years. The term Ayurveda is derived from the Sanskrit words "ayur" (life) and "veda" (knowledge).</p>
385
 
386
- <h3>The Three Doshas</h3>
387
- <p>Ayurveda believes that each person has a unique mix of three energies or doshas:</p>
388
- <ul>
389
- <li><strong>Vata</strong> (Air & Space) - Controls movement and is associated with creativity and flexibility</li>
390
- <li><strong>Pitta</strong> (Fire & Water) - Controls metabolism and is associated with intelligence and determination</li>
391
- <li><strong>Kapha</strong> (Earth & Water) - Controls structure and is associated with stability and compassion</li>
392
- </ul>
393
 
394
- <h3>Ayurvedic Approach to Wellness</h3>
395
- <p>Ayurveda takes a holistic approach to health that includes:</p>
396
- <ul>
397
- <li>Personalized nutrition based on your dosha</li>
398
- <li>Lifestyle recommendations aligned with natural cycles</li>
399
- <li>Herbal medicines and therapies</li>
400
- <li>Mental wellness practices</li>
401
- <li>Seasonal adjustments to maintain balance</li>
402
- </ul>
403
 
404
- <p>Our wellness planner integrates these ancient principles with modern health science to provide you with a truly holistic approach to health and wellness.</p>
405
- </div>
406
- """, unsafe_allow_html=True)
 
 
 
 
 
 
 
 
407
 
408
- if __name__ == "__main__":
409
- main()
 
3
  from langchain_groq import ChatGroq
4
  import os
5
  import importlib.util
6
+ import base64
7
+ from PIL import Image
8
+ from datetime import datetime
9
 
10
+ # Load and apply custom CSS
11
+ def load_css():
12
+ with open('style.css') as f:
13
+ st.markdown(f'<style>{f.read()}</style>', unsafe_allow_html=True)
 
 
 
14
 
15
+ # Function to add background image
16
+ def add_bg_from_local(image_file):
17
+ with open(image_file, "rb") as image_file:
18
+ encoded_string = base64.b64encode(image_file.read())
19
+ st.markdown(
20
+ f"""
21
+ <style>
22
+ .stApp {{
23
+ background-image: url(data:image/{"jpg"};base64,{encoded_string.decode()});
24
+ background-size: cover;
25
+ }}
26
+ </style>
27
+ """,
28
+ unsafe_allow_html=True
29
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
  # Check if team_info module exists and import it
32
  try:
 
68
  sections = content.split("\n\n")
69
  formatted = ""
70
  for section in sections:
71
+ formatted += f"**{section.strip()}**\n\n"
72
  return formatted
73
  except Exception as e:
74
  return f"Error formatting plan: {e}"
 
159
  - Food Delivery: Suggested meal items and delivery options.
160
  """
161
 
162
+ # Streamlit app
163
+ st.set_page_config(page_title="AI Health & Wellness Planner", layout="wide")
164
+ load_css()
165
+
166
+ # Add the meditation background image
167
+ add_bg_from_local('image-3.jpg')
168
+
169
+ # Create two columns for the header
170
+ col1, col2 = st.columns([2, 1])
171
+
172
+ with col1:
173
+ st.title("🌿 AI-Based Holistic Health & Wellness Planner")
174
+ st.markdown("""
175
+ <div class='main-content'>
176
+ Integrate modern science with ancient Ayurvedic wisdom for your personalized wellness journey.
177
+ </div>
178
+ """, unsafe_allow_html=True)
179
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
 
181
+ with col2:
182
+ # Display the spices image
183
+ st.image('Image-1.jpg', caption='Natural ingredients for holistic wellness', use_container_width=True)
184
+
185
+ # Add sidebar with team information
186
+ with st.sidebar:
187
+ st.markdown("<div class='sidebar-content'>", unsafe_allow_html=True)
188
+ st.header("✨ About this Project")
189
+ st.write("Integration of Ayurveda and modern medical science for comprehensive wellness insights")
190
 
191
+ if has_team_info:
192
+ st.subheader("👥 Team Members")
193
+ st.markdown("- Aditi Soni [LinkedIn](https://www.linkedin.com/in/aditi-soni-259813285/)")
194
+ st.markdown("- Bhumika Patel [LinkedIn](https://www.linkedin.com/in/bhumika-patel-ml/)")
195
+ st.markdown("- Aditi Lakhera [LinkedIn](https://www.linkedin.com/in/aditi-lakhera-b628802bb/)")
196
+ st.markdown("- Anushri Tiwari [LinkedIn](https://www.linkedin.com/in/anushri-tiwari-916494300 )")
197
 
198
+ st.subheader("🔗 Project Links")
199
+ st.markdown("[GitHub Repository](https://github.com/Abs6187/AI_Health_v2)")
200
+ st.markdown("[Presentation](https://github.com/Abs6187/AI_Health_v2/blob/main/HackGirl_PPT_HackSRIT.pptx)")
201
+ st.markdown("[Hackathon](https://unstop.com/hackathons/hacksrit-shri-ram-group-of-institutions-jabalpur-1471613)")
202
+ st.markdown("</div>", unsafe_allow_html=True)
203
+
204
+ # Main content
205
+ st.markdown("<div class='main-content'>", unsafe_allow_html=True)
206
+
207
+ # Create three columns for input fields
208
+ col1, col2, col3 = st.columns(3)
209
+
210
+ with col1:
211
+ st.subheader("📝 Personal Details")
212
+ name = st.text_input("Name")
213
+ age = st.number_input("Age", min_value=1, value=25)
214
+ gender = st.selectbox("Gender", options=["Male", "Female", "Other"])
215
+
216
+ with col2:
217
+ st.subheader("📊 Physical Metrics")
218
+ weight = st.number_input("Weight (kg)", min_value=1, value=70)
219
+ height = st.number_input("Height (cm)", min_value=1, value=170)
220
+ fitness_goal = st.selectbox("Fitness Goal", options=["Weight Loss", "Weight Gain", "Maintenance"])
221
+
222
+ with col3:
223
+ st.subheader("🍽️ Dietary Preferences")
224
+ dietary_preference = st.selectbox("Dietary Preference", options=["Vegetarian", "Vegan", "Keto", "Halal", "None"])
225
+ food_allergies = st.text_input("Food Allergies (if any)")
226
+ local_cuisine = st.text_input("Preferred Local Cuisine (e.g., Indian, Italian, Chinese)")
227
+
228
+ # Additional preferences
229
+ st.subheader("🌿 Wellness Preferences")
230
+ col1, col2 = st.columns(2)
231
+
232
+ with col1:
233
+ month = st.selectbox("Select Month", options=["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"])
234
+ include_ayurveda = st.checkbox("Include Ayurvedic wellness insights", value=True)
235
+
236
+ # Calculate and display metrics
237
+ bmi = round(weight / (height / 100) ** 2, 2)
238
+ health_status = "Underweight" if bmi < 18.5 else "Normal weight" if bmi <= 24.9 else "Overweight"
239
+ daily_calories = calculate_calorie_requirements(age, gender, weight, height, fitness_goal)
240
+
241
+ # Display metrics in a nice format
242
+ st.markdown("""
243
+ <div class='metric-container'>
244
+ <h3>Your Health Metrics</h3>
245
+ <p>BMI: {:.1f} ({:s})</p>
246
+ <p>Daily Calorie Target: {:,d} kcal</p>
247
+ </div>
248
+ """.format(bmi, health_status, int(daily_calories)), unsafe_allow_html=True)
249
+
250
+ # User metrics
251
+ metrics = {
252
+ "name": name,
253
+ "age": age,
254
+ "gender": gender,
255
+ "bmi": bmi,
256
+ "health_status": health_status,
257
+ "fitness_goal": fitness_goal,
258
+ "dietary_preference": dietary_preference,
259
+ "food_allergies": food_allergies,
260
+ "daily_calories": int(daily_calories),
261
+ "local_cuisine": local_cuisine,
262
+ "weekdays": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
263
+ "month": month,
264
+ }
265
+
266
+ # Generate and display plan
267
+ if st.button("Generate Personalized Plan"):
268
+ with st.spinner("🌟 Creating your personalized wellness journey..."):
269
+ try:
270
+ # Choose the appropriate prompt based on the Ayurveda option
271
+ selected_prompt = ayurveda_prompt_template if include_ayurveda else regular_prompt_template
272
+ plan = generate_plan_with_prompt(metrics, selected_prompt)
273
+ formatted_plan = format_plan(plan)
274
 
275
+ plan_title = "🌺 Integrated Ayurvedic & Modern Wellness Plan" if include_ayurveda else "💪 Personalized Health Plan"
276
+ st.header(f"{plan_title} for {month}")
277
+ st.markdown(formatted_plan)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
 
279
+ # Create download button for the plan
280
+ current_date = datetime.now().strftime("%Y%m%d")
281
+ filename = f"wellness_plan_{name.replace(' ', '_')}_{current_date}.txt"
 
 
 
 
 
 
 
 
 
 
 
282
 
283
+ # Prepare the content for the text file
284
+ plan_content = f"""
285
+ {plan_title} for {month}
286
+ Generated for: {name}
287
+ Date: {datetime.now().strftime('%Y-%m-%d')}
288
+
289
+ Personal Details:
290
+ ---------------
291
+ Age: {age}
292
+ Gender: {gender}
293
+ Weight: {weight} kg
294
+ Height: {height} cm
295
+ BMI: {bmi:.1f} ({health_status})
296
+ Daily Calorie Target: {int(daily_calories)} kcal
297
+
298
+ Preferences:
299
+ -----------
300
+ Fitness Goal: {fitness_goal}
301
+ Dietary Preference: {dietary_preference}
302
+ Food Allergies: {food_allergies if food_allergies else 'None'}
303
+ Local Cuisine: {local_cuisine}
304
+
305
+ {formatted_plan}
306
+
307
+ Generated by AI Health & Wellness Planner
308
+ """
309
+ # Create a download button
310
+ st.download_button(
311
+ label="📥 Download Plan as Text File",
312
+ data=plan_content,
313
+ file_name=filename,
314
+ mime="text/plain",
315
+ help="Click to download your personalized wellness plan",
316
+ key="download_plan"
317
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
318
 
319
+ # Add a divider
320
+ st.markdown("---")
 
 
 
 
 
321
 
322
+ # Add some helpful tips
323
+ st.markdown("""
324
+ ### 📋 Tips for Using Your Plan:
325
+ 1. Save your plan for offline reference
326
+ 2. Print it out and keep it visible
327
+ 3. Track your progress daily
328
+ 4. Adjust the plan as needed based on your progress
329
+ """)
 
330
 
331
+ except Exception as e:
332
+ st.error(f"Error generating the plan: {e}")
333
+
334
+ st.markdown("</div>", unsafe_allow_html=True)
335
+
336
+ # Footer
337
+ st.markdown("""
338
+ <div style='text-align: center; padding: 20px; color: #666;'>
339
+ Made with ❤️ for better health and wellness
340
+ </div>
341
+ """, unsafe_allow_html=True)
342
 
 
 
gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *Image-2.jpg filter=lfs diff=lfs merge=lfs -text
37
+ *image-3.jpg filter=lfs diff=lfs merge=lfs -text
image-3.jpg ADDED

Git LFS Details

  • SHA256: d82ec567a442ab36a9ea07a3c7b6379d77289451539d93a9dd4b1be8fcc3cfc5
  • Pointer size: 132 Bytes
  • Size of remote file: 1.73 MB
requirements.txt CHANGED
@@ -3,4 +3,5 @@ langchain-core
3
  langchain-groq
4
  python-dotenv
5
  torch
 
6
 
 
3
  langchain-groq
4
  python-dotenv
5
  torch
6
+ pillow
7
 
style.css CHANGED
@@ -1,368 +1,282 @@
1
- /* Enhanced Styles for Wellness Planner */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
- /* Reset and Base Styles */
4
- * {
5
- margin: 0;
6
- padding: 0;
7
- box-sizing: border-box;
8
  }
9
 
10
- body {
11
- padding: 2rem;
12
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Arial", sans-serif;
13
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
14
- min-height: 100vh;
15
- line-height: 1.6;
16
- color: #333;
17
  }
18
 
19
- /* Typography */
20
  h1 {
21
- font-size: 2.5rem;
22
- font-weight: 700;
23
- margin-top: 0;
24
- margin-bottom: 1rem;
25
- color: #2d3748;
26
- text-align: center;
27
  }
28
 
29
  h2 {
30
- font-size: 1.875rem;
31
- font-weight: 600;
32
- margin-bottom: 1rem;
33
- color: #2d3748;
 
 
34
  }
35
 
36
  h3 {
37
- font-size: 1.5rem;
38
- font-weight: 600;
39
- margin-bottom: 0.75rem;
40
- color: #4a5568;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  }
42
 
43
- p {
44
- color: rgb(107, 114, 128);
45
- font-size: 1rem;
46
- margin-bottom: 1rem;
47
- margin-top: 0.5rem;
48
  }
49
 
50
- /* Card Component */
51
- .card {
52
- max-width: 800px;
53
- margin: 2rem auto;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  padding: 2rem;
55
- background: rgba(255, 255, 255, 0.95);
56
- backdrop-filter: blur(10px);
57
- border: 1px solid rgba(255, 255, 255, 0.2);
58
- border-radius: 20px;
59
- box-shadow: 0 8px 32px rgba(31, 38, 135, 0.37);
60
- transition: transform 0.3s ease, box-shadow 0.3s ease;
61
- }
62
-
63
- .card:hover {
64
- transform: translateY(-5px);
65
- box-shadow: 0 12px 40px rgba(31, 38, 135, 0.5);
66
- }
67
-
68
- .card p:last-child {
69
- margin-bottom: 0;
70
- }
71
-
72
- /* Form Elements */
73
- .form-group {
74
- margin-bottom: 1.5rem;
75
- }
76
-
77
- label {
78
- display: block;
79
- margin-bottom: 0.5rem;
80
- font-weight: 500;
81
- color: #2d3748;
82
  }
83
 
84
- input, select, textarea {
85
- width: 100%;
86
- padding: 0.75rem 1rem;
87
- border: 2px solid #e2e8f0;
88
- border-radius: 8px;
89
- font-size: 1rem;
90
- transition: border-color 0.3s ease, box-shadow 0.3s ease;
91
- background: white;
92
  }
93
 
94
- input:focus, select:focus, textarea:focus {
95
- outline: none;
96
- border-color: #667eea;
97
- box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
 
98
  }
99
 
100
- /* Buttons */
101
- .btn {
102
- display: inline-block;
103
- padding: 0.75rem 1.5rem;
104
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
105
- color: white;
106
- text-decoration: none;
107
- border: none;
108
- border-radius: 8px;
109
- font-size: 1rem;
110
- font-weight: 600;
111
- cursor: pointer;
112
- transition: transform 0.2s ease, box-shadow 0.2s ease;
113
  }
114
 
115
- .btn:hover {
116
- transform: translateY(-2px);
117
- box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
 
118
  }
119
 
120
- .btn-primary {
121
- background: linear-gradient(135deg, #4CAF50 0%, #45a049 100%);
122
  }
123
 
124
- .btn-secondary {
125
- background: linear-gradient(135deg, #6c757d 0%, #5a6268 100%);
 
 
 
126
  }
127
 
128
- /* Layout Utilities */
129
- .container {
130
- max-width: 1200px;
131
- margin: 0 auto;
132
- padding: 0 1rem;
133
  }
134
 
135
- .grid {
136
- display: grid;
137
- gap: 2rem;
138
  }
139
 
140
- .grid-2 {
141
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
 
142
  }
143
 
144
- .flex {
145
- display: flex;
146
- gap: 1rem;
 
 
147
  }
148
 
149
- .flex-center {
150
- justify-content: center;
151
- align-items: center;
 
152
  }
153
 
154
- .flex-between {
155
- justify-content: space-between;
156
- align-items: center;
 
 
157
  }
158
 
159
- /* Wellness Specific Components */
160
- .wellness-header {
161
- text-align: center;
162
- padding: 3rem 0;
163
- background: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0.05) 100%);
164
- border-radius: 20px;
165
- margin-bottom: 2rem;
166
  }
167
 
168
- .metrics-card {
169
- background: linear-gradient(135deg, #e8f4f8 0%, #f0f8ff 100%);
170
- padding: 1.5rem;
171
- border-radius: 12px;
172
- border: 1px solid rgba(30, 136, 229, 0.2);
173
  margin-bottom: 1rem;
174
  }
175
 
176
- .metrics-card h4 {
177
- color: #1E88E5;
178
- margin-bottom: 0.5rem;
179
- font-size: 1.1rem;
180
- }
181
-
182
- .status-indicator {
183
- display: inline-block;
184
- padding: 0.25rem 0.75rem;
185
- border-radius: 20px;
186
- font-size: 0.875rem;
187
- font-weight: 600;
188
- }
189
-
190
- .status-normal {
191
- background: #d4edda;
192
- color: #155724;
193
- }
194
-
195
- .status-warning {
196
- background: #fff3cd;
197
- color: #856404;
198
- }
199
-
200
- .status-danger {
201
- background: #f8d7da;
202
- color: #721c24;
203
  }
204
 
205
- /* Plan Display */
206
- .plan-container {
207
- background: white;
208
- padding: 2rem;
209
- border-radius: 16px;
210
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
211
- margin: 2rem 0;
212
- }
213
-
214
- .plan-header {
215
- text-align: center;
216
- padding-bottom: 1rem;
217
- border-bottom: 2px solid #e2e8f0;
218
- margin-bottom: 2rem;
219
- }
220
-
221
- .day-section {
222
- margin-bottom: 2rem;
223
- padding: 1.5rem;
224
- background: #f8f9fa;
225
- border-radius: 12px;
226
- border-left: 4px solid #4CAF50;
227
  }
228
 
229
- .day-title {
230
- font-size: 1.25rem;
231
- font-weight: 600;
232
- color: #2E7D32;
233
- margin-bottom: 1rem;
234
  }
235
 
236
- /* Info Boxes */
237
- .info-box {
238
- background: linear-gradient(135deg, #e8f4f8 0%, #f0f8ff 100%);
239
- padding: 1.5rem;
240
- border-radius: 12px;
241
- margin-bottom: 1rem;
242
- border-left: 4px solid #1E88E5;
243
- }
244
-
245
- .success-box {
246
- background: linear-gradient(135deg, #d4edda 0%, #e8f5e8 100%);
247
- border-left-color: #28a745;
248
- }
249
-
250
- .warning-box {
251
- background: linear-gradient(135deg, #fff3cd 0%, #fffbf0 100%);
252
- border-left-color: #ffc107;
253
- }
254
-
255
- /* Responsive Design */
256
- @media (max-width: 768px) {
257
- body {
258
- padding: 1rem;
259
- }
260
-
261
- .card {
262
- margin: 1rem auto;
263
- padding: 1.5rem;
264
- }
265
-
266
- h1 {
267
- font-size: 2rem;
268
- }
269
-
270
- .grid-2 {
271
- grid-template-columns: 1fr;
272
- }
273
-
274
- .wellness-header {
275
- padding: 2rem 0;
276
- }
277
- }
278
-
279
- @media (max-width: 480px) {
280
- body {
281
- padding: 0.5rem;
282
- }
283
-
284
- .card {
285
- padding: 1rem;
286
- border-radius: 12px;
287
- }
288
-
289
- h1 {
290
- font-size: 1.75rem;
291
- }
292
-
293
- .btn {
294
- width: 100%;
295
- text-align: center;
296
- }
297
- }
298
-
299
- /* Animation and Transitions */
300
- @keyframes fadeIn {
301
- from {
302
- opacity: 0;
303
- transform: translateY(20px);
304
- }
305
- to {
306
- opacity: 1;
307
- transform: translateY(0);
308
- }
309
- }
310
-
311
- .fade-in {
312
- animation: fadeIn 0.6s ease-out;
313
- }
314
-
315
- /* Loading States */
316
- .loading {
317
- display: inline-block;
318
- width: 20px;
319
- height: 20px;
320
- border: 3px solid rgba(255,255,255,.3);
321
- border-radius: 50%;
322
- border-top-color: #fff;
323
- animation: spin 1s ease-in-out infinite;
324
- }
325
-
326
- @keyframes spin {
327
- to { transform: rotate(360deg); }
328
- }
329
-
330
- /* Accessibility */
331
- .sr-only {
332
- position: absolute;
333
- width: 1px;
334
- height: 1px;
335
- padding: 0;
336
- margin: -1px;
337
- overflow: hidden;
338
- clip: rect(0, 0, 0, 0);
339
- white-space: nowrap;
340
- border: 0;
341
- }
342
-
343
- /* Focus indicators for better accessibility */
344
- button:focus-visible,
345
- input:focus-visible,
346
- select:focus-visible,
347
- textarea:focus-visible {
348
- outline: 2px solid #667eea;
349
- outline-offset: 2px;
350
- }
351
-
352
- /* Print Styles */
353
- @media print {
354
- body {
355
- background: white;
356
- color: black;
357
- padding: 1rem;
358
- }
359
-
360
- .card {
361
- box-shadow: none;
362
- border: 1px solid #ccc;
363
- }
364
-
365
- .btn {
366
- display: none;
367
- }
368
- }
 
1
+ [data-testid="stAppViewContainer"] {
2
+ background-image: url('Image-2.jpg');
3
+ background-size: cover;
4
+ background-position: center;
5
+ background-repeat: no-repeat;
6
+ position: relative;
7
+ font-size: 18px !important;
8
+ height: 100%;
9
+ overflow-y: auto;
10
+ }
11
+
12
+ [data-testid="stAppViewContainer"]::before {
13
+ content: '';
14
+ position: absolute;
15
+ top: 0;
16
+ left: 0;
17
+ right: 0;
18
+ bottom: 0;
19
+ box-shadow: inset 0 0 100px rgba(0,0,0,0.2);
20
+ pointer-events: none;
21
+ z-index: 1;
22
+ }
23
 
24
+ /* Ensure content appears above the shadow */
25
+ [data-testid="stAppViewContainer"] > * {
26
+ position: relative;
27
+ z-index: 2;
 
28
  }
29
 
30
+ /* Global text styles */
31
+ .stMarkdown, .stText, p, span, label, .stSelectbox, .stNumberInput {
32
+ color: #D32F2F !important; /* Deep red */
33
+ font-weight: 600 !important;
34
+ font-size: 1.1rem !important;
 
 
35
  }
36
 
37
+ /* Make headers extra bold and larger */
38
  h1 {
39
+ color: #B71C1C !important; /* Darker red for headers */
40
+ font-family: 'Helvetica Neue', sans-serif;
41
+ text-shadow: 1px 1px 1px rgba(210, 215, 211, 1);
42
+ font-size: 2.5rem !important;
43
+ font-weight: 800 !important;
 
44
  }
45
 
46
  h2 {
47
+ color: #C62828 !important; /* Slightly lighter red */
48
+ font-family: 'Helvetica Neue', sans-serif;
49
+ text-shadow: 1px 1px 1px rgba(210, 215, 211, 1)
50
+ ;
51
+ font-size: 2rem !important;
52
+ font-weight: 700 !important;
53
  }
54
 
55
  h3 {
56
+ color: #D32F2F !important; /* Standard red */
57
+ font-family: 'Helvetica Neue', sans-serif;
58
+ text-shadow: 1px 1px 1px rgba(210, 215, 211, 1)
59
+ ;
60
+ font-size: 1.5rem !important;
61
+ font-weight: 700 !important;
62
+ }
63
+
64
+ /* Make subheaders and labels bold */
65
+ .stSubheader {
66
+ color: #E53935 !important; /* Bright red */
67
+ font-weight: 700 !important;
68
+ font-size: 1.3rem !important;
69
+ }
70
+
71
+ /* Input labels */
72
+ .stTextInput label, .stNumberInput label, .stSelectbox label {
73
+ color: #D32F2F !important; /* Deep red */
74
+ font-weight: 600 !important;
75
+ font-size: 1.1rem !important;
76
+ }
77
+
78
+ /* Input fields */
79
+ .stTextInput input, .stNumberInput input, .stSelectbox select {
80
+ color: #C62828 !important; /* Slightly darker red */
81
+ background-color: rgba(255, 255, 255, 0.9);
82
+ box-shadow: inset 0 2px 4px rgba(0,0,0,0.05);
83
+ font-size: 1.1rem !important;
84
+ font-weight: 500 !important;
85
+ }
86
+
87
+ /* Sidebar content */
88
+ .sidebar-content {
89
+ background-color: rgba(255, 255, 255, 0.95);
90
+ padding: 1rem;
91
+ border-radius: 5px;
92
+ color: #D32F2F !important; /* Deep red */
93
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
94
+ backdrop-filter: blur(5px);
95
+ font-size: 1.1rem !important;
96
+ font-weight: 600 !important;
97
+ overflow-y: auto;
98
+ max-height: calc(100vh - 2rem);
99
+ }
100
+
101
+ .spices-image {
102
+ border-radius: 10px;
103
+ margin: 1rem 0;
104
+ box-shadow: 0 4px 8px rgba(0,0,0,0.1);
105
+ }
106
+
107
+ /* Links */
108
+ a {
109
+ color: #C62828 !important; /* Darker red for links */
110
+ font-weight: 700 !important;
111
+ font-size: 1.1rem !important;
112
+ text-shadow: 0 0 1px rgba(255,255,255,0.5);
113
+ }
114
+
115
+ /* Button text */
116
+ .stButton > button {
117
+ background-color: #FBBC04; /* Yellow background #FBBC04*/
118
+ color: black !important;
119
+ border: none;
120
+ padding: 0.7rem 2.5rem;
121
+ border-radius: 5px;
122
+ font-weight: 700 !important;
123
+ font-size: 1.2rem !important;
124
+ box-shadow: 0 2px 5px rgba(0,0,0,0.1);
125
+ transition: all 0.3s ease;
126
  }
127
 
128
+ .stButton > button:hover {
129
+ background-color: #FEEFC3 ; /* Lighter yellow on hover #FEEFC3*/
130
+ box-shadow: 0 4px 8px rgba(0,0,0,0.2);
131
+ transform: translateY(-1px);
 
132
  }
133
 
134
+ /* Metrics container */
135
+ .metric-container {
136
+ background-color: rgba(255, 255, 255, 0.95);
137
+ padding: 1.5rem;
138
+ border-radius: 5px;
139
+ margin: 0.5rem 0;
140
+ border-left: 4px solid #B71C1C; /* Dark red border */
141
+ color: #D32F2F !important; /* Deep red text */
142
+ box-shadow: 0 2px 15px rgba(0,0,0,0.1);
143
+ backdrop-filter: blur(5px);
144
+ font-size: 1.2rem !important;
145
+ font-weight: 600 !important;
146
+ overflow-y: auto;
147
+ max-height: 80vh;
148
+ }
149
+
150
+ .metric-container p {
151
+ color: #D32F2F !important; /* Deep red */
152
+ font-size: 1.2rem !important;
153
+ font-weight: 600 !important;
154
+ margin: 0.5rem 0;
155
+ }
156
+
157
+ /* Main content area */
158
+ .main-content {
159
+ background-color: rgba(255, 255, 255, 0.95);
160
  padding: 2rem;
161
+ border-radius: 10px;
162
+ margin: 1rem;
163
+ color: #D32F2F !important; /* Deep red */
164
+ box-shadow: 0 4px 20px rgba(0,0,0,0.1);
165
+ backdrop-filter: blur(5px);
166
+ font-size: 1.1rem !important;
167
+ overflow-y: auto;
168
+ max-height: calc(100vh - 2rem);
169
+ }
170
+
171
+ /* Image captions */
172
+ .stImage caption {
173
+ color: #C62828 !important; /* Darker red */
174
+ font-size: 1.1rem !important;
175
+ font-weight: 600 !important;
176
+ margin-top: 0.5rem;
 
 
 
 
 
 
 
 
 
 
 
177
  }
178
 
179
+ /* Alert messages */
180
+ .stAlert {
181
+ background-color: rgba(255, 255, 255, 0.95);
182
+ border-radius: 5px;
183
+ color: #D32F2F !important; /* Deep red */
184
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
185
+ font-size: 1.1rem !important;
186
+ font-weight: 600 !important;
187
  }
188
 
189
+ /* Ensure all text inputs have consistent styling */
190
+ input[type="text"], input[type="number"], select {
191
+ color: #C62828 !important; /* Slightly darker red */
192
+ font-size: 1.1rem !important;
193
+ font-weight: 500 !important;
194
  }
195
 
196
+ /* Additional text color overrides */
197
+ [data-testid="stHeader"] {
198
+ color: black !important;
 
 
 
 
 
 
 
 
 
 
199
  }
200
 
201
+ .stTextInput input, .stNumberInput input, .stSelectbox select {
202
+ color: black !important;
203
+ background-color: rgba(255, 255, 255, 0.9);
204
+ box-shadow: inset 0 2px 4px rgba(0,0,0,0.05);
205
  }
206
 
207
+ .stSubheader {
208
+ color: black !important;
209
  }
210
 
211
+ /* Make links more visible */
212
+ a {
213
+ color: #2E7D32 !important;
214
+ font-weight: 500;
215
+ text-shadow: 0 0 1px rgba(255,255,255,0.5);
216
  }
217
 
218
+ /* Ensure form labels are black */
219
+ .stTextInput label, .stNumberInput label, .stSelectbox label {
220
+ color: black !important;
 
 
221
  }
222
 
223
+ /* Ensure sidebar text is black */
224
+ .st-emotion-cache-1r6slb0.e1f1d6gn1 {
225
+ color: black !important;
226
  }
227
 
228
+ /* Make all text inputs have black text */
229
+ input[type="text"], input[type="number"], select {
230
+ color: black !important;
231
  }
232
 
233
+ /* Fix main content scrolling */
234
+ [data-testid="stMainContainer"] {
235
+ height: 100%;
236
+ overflow-y: auto;
237
+ padding-bottom: 2rem;
238
  }
239
 
240
+ /* Ensure sidebar scrolls properly */
241
+ [data-testid="stSidebar"] {
242
+ height: 100vh;
243
+ overflow-y: auto;
244
  }
245
 
246
+ /* Ensure generated plan content scrolls properly */
247
+ [data-testid="stMarkdownContainer"] {
248
+ overflow-y: auto;
249
+ max-height: calc(100vh - 4rem);
250
+ padding-right: 1rem;
251
  }
252
 
253
+ /* Fix table scrolling if present */
254
+ .stTable {
255
+ overflow-x: auto;
256
+ max-width: 100%;
 
 
 
257
  }
258
 
259
+ /* Ensure proper spacing for scrollable content */
260
+ .element-container {
 
 
 
261
  margin-bottom: 1rem;
262
  }
263
 
264
+ /* Make scrollbars more visible and styled */
265
+ ::-webkit-scrollbar {
266
+ width: 10px;
267
+ height: 10px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
268
  }
269
 
270
+ ::-webkit-scrollbar-track {
271
+ background: rgba(255, 255, 255, 0.1);
272
+ border-radius: 5px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
273
  }
274
 
275
+ ::-webkit-scrollbar-thumb {
276
+ background: rgba(183, 28, 28, 0.5);
277
+ border-radius: 5px;
 
 
278
  }
279
 
280
+ ::-webkit-scrollbar-thumb:hover {
281
+ background: rgba(183, 28, 28, 0.7);
282
+ }