therayz1 commited on
Commit
3bfb20e
·
verified ·
1 Parent(s): 1e1fe93

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +414 -0
  2. requirements.txt +4 -0
app.py ADDED
@@ -0,0 +1,414 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import requests
3
+ import json
4
+ from datetime import datetime
5
+ import io
6
+ from reportlab.lib.pagesizes import letter, A4
7
+ from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
8
+ from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
9
+ from reportlab.lib.units import inch
10
+ from reportlab.lib import colors
11
+ from reportlab.pdfbase import pdfmetrics
12
+ from reportlab.pdfbase.ttfonts import TTFont
13
+ import base64
14
+ import os
15
+
16
+ class FitnessAI:
17
+ def __init__(self):
18
+ self.api_key = None
19
+ self.base_url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent"
20
+
21
+ def set_api_key(self, api_key):
22
+ self.api_key = api_key.strip()
23
+ return "✅ API anahtarı başarıyla kaydedildi!"
24
+
25
+ def generate_response(self, prompt):
26
+ if not self.api_key:
27
+ return "❌ Lütfen önce Gemini API anahtarınızı girin!"
28
+
29
+ headers = {
30
+ 'Content-Type': 'application/json',
31
+ }
32
+
33
+ data = {
34
+ "contents": [
35
+ {
36
+ "parts": [
37
+ {
38
+ "text": prompt
39
+ }
40
+ ]
41
+ }
42
+ ]
43
+ }
44
+
45
+ try:
46
+ response = requests.post(
47
+ f"{self.base_url}?key={self.api_key}",
48
+ headers=headers,
49
+ json=data,
50
+ timeout=30
51
+ )
52
+
53
+ if response.status_code == 200:
54
+ result = response.json()
55
+ return result['candidates'][0]['content']['parts'][0]['text']
56
+ else:
57
+ return f"❌ API Hatası: {response.status_code} - {response.text}"
58
+
59
+ except Exception as e:
60
+ return f"❌ Bağlantı hatası: {str(e)}"
61
+
62
+ def create_fitness_plan(self, api_key, name, age, gender, height, weight,
63
+ fitness_level, goal, workout_days, workout_frequency,
64
+ current_workouts, injuries, diet_info, body_focus_areas,
65
+ preferred_workout_style, available_equipment):
66
+
67
+ if api_key:
68
+ self.set_api_key(api_key)
69
+
70
+ # Detaylı prompt oluşturma
71
+ prompt = f"""
72
+ Sen dünya çapında tanınmış, 20+ yıl deneyimli, sertifikalı bir fitness antrenörü ve beslenme uzmanısın.
73
+ Aşağıdaki kişi için ULTRA DETAYLI, profesyonel bir fitness ve beslenme planı hazırla:
74
+
75
+ 👤 KİŞİSEL BİLGİLER:
76
+ - İsim: {name}
77
+ - Yaş: {age}
78
+ - Cinsiyet: {gender}
79
+ - Boy: {height} cm
80
+ - Kilo: {weight} kg
81
+ - Fitness Seviyesi: {fitness_level}
82
+ - Hedef: {goal}
83
+
84
+ 🏋️ ANTRENMAN BİLGİLERİ:
85
+ - Haftalık Antrenman Günü: {workout_days}
86
+ - Antrenman Sıklığı: {workout_frequency}
87
+ - Mevcut Antrenman Rutini: {current_workouts}
88
+ - Sakatlık/Kısıtlama: {injuries}
89
+ - Odaklanmak İstediği Vücut Bölgeleri: {body_focus_areas}
90
+ - Tercih Edilen Antrenman Stili: {preferred_workout_style}
91
+ - Mevcut Ekipmanlar: {available_equipment}
92
+
93
+ 🍎 BESLENME BİLGİLERİ:
94
+ - Mevcut Beslenme Durumu: {diet_info}
95
+
96
+ LÜTFEN AŞAĞIDAKİ BAŞLIKLARDA ULTRA DETAYLI ANALİZ VE PLAN HAZIRLA:
97
+
98
+ ## 📊 KİŞİSEL ANALİZ
99
+ - BMI hesaplama ve yorumu
100
+ - Vücut kompozisyonu analizi
101
+ - Fitness seviyesi değerlendirmesi
102
+ - Güçlü ve zayıf yönler
103
+ - Risk faktörleri
104
+
105
+ ## 🎯 HEDEFLENDİRİLMİŞ PLAN
106
+ - Kısa vadeli hedefler (1-3 ay)
107
+ - Orta vadeli hedefler (3-6 ay)
108
+ - Uzun vadeli hedefler (6-12 ay)
109
+ - Başarı ölçüm kriterleri
110
+
111
+ ## 🏋️‍♂️ DETAYLI ANTRENMAN PROGRAMI
112
+ - Haftalık antrenman takvimi
113
+ - Her gün için specific egzersizler
114
+ - Set, tekrar, dinlenme süreleri
115
+ - Progresyon planı
116
+ - Isınma ve soğuma egzersizleri
117
+ - Vücudun farklı bölgeleri için özel hareketler
118
+
119
+ ## 🍽️ BESLENME PLANI
120
+ - Günlük kalori ihtiyacı hesaplaması
121
+ - Makronutrient dağılımı (protein, karbonhidrat, yağ)
122
+ - Günlük öğün planı (kahvaltı, öğle, akşam, ara öğünler)
123
+ - Su tüketimi önerileri
124
+ - Supplement önerileri
125
+ - Kaçınılması gereken besinler
126
+
127
+ ## 📈 TAKİP VE ÖLÇÜM
128
+ - Hangi metrikleri takip etmeli
129
+ - Ölçüm sıklığı
130
+ - Fotoğraf çekimi önerileri
131
+ - Performans testleri
132
+
133
+ ## ⚠️ DİKKAT EDİLMESİ GEREKENLER
134
+ - Yaygın hatalar
135
+ - Güvenlik önlemleri
136
+ - Motivasyon önerileri
137
+ - Plana uyum stratejileri
138
+
139
+ ## 🔄 PLAN REVİZYONU
140
+ - Ne zaman plan değişikliği yapılmalı
141
+ - İlerleme değerlendirme kriterleri
142
+ - Platoya girme durumunda yapılacaklar
143
+
144
+ Türkçe, profesyonel ama samimi bir dille, detaylı bir şekilde yanıtla. Her bölümü açıklayıcı örneklerle destekle.
145
+ """
146
+
147
+ response = self.generate_response(prompt)
148
+ return response
149
+
150
+ def create_pdf_report(self, content, name):
151
+ """PDF rapor oluşturma"""
152
+ buffer = io.BytesIO()
153
+
154
+ # PDF dokümanı oluştur
155
+ doc = SimpleDocTemplate(buffer, pagesize=A4,
156
+ rightMargin=72, leftMargin=72,
157
+ topMargin=72, bottomMargin=18)
158
+
159
+ # Stiller
160
+ styles = getSampleStyleSheet()
161
+ title_style = ParagraphStyle(
162
+ 'CustomTitle',
163
+ parent=styles['Heading1'],
164
+ fontSize=20,
165
+ textColor=colors.darkblue,
166
+ alignment=1, # Center
167
+ spaceAfter=30,
168
+ )
169
+
170
+ heading_style = ParagraphStyle(
171
+ 'CustomHeading',
172
+ parent=styles['Heading2'],
173
+ fontSize=14,
174
+ textColor=colors.darkgreen,
175
+ spaceBefore=20,
176
+ spaceAfter=10,
177
+ )
178
+
179
+ # İçerik listesi
180
+ story = []
181
+
182
+ # Başlık
183
+ story.append(Paragraph(f"🏋️ {name} - Kişisel Fitness Raporu", title_style))
184
+ story.append(Paragraph(f"📅 Rapor Tarihi: {datetime.now().strftime('%d/%m/%Y')}", styles['Normal']))
185
+ story.append(Spacer(1, 30))
186
+
187
+ # İçeriği paragraflar halinde ekle
188
+ lines = content.split('\n')
189
+ for line in lines:
190
+ if line.strip():
191
+ if line.startswith('##'):
192
+ story.append(Paragraph(line.replace('##', ''), heading_style))
193
+ elif line.startswith('#'):
194
+ story.append(Paragraph(line.replace('#', ''), title_style))
195
+ else:
196
+ story.append(Paragraph(line, styles['Normal']))
197
+ story.append(Spacer(1, 10))
198
+
199
+ # PDF'i oluştur
200
+ doc.build(story)
201
+ buffer.seek(0)
202
+
203
+ return buffer.getvalue()
204
+
205
+ # Global fitness AI instance
206
+ fitness_ai = FitnessAI()
207
+
208
+ def create_plan_interface(api_key, name, age, gender, height, weight,
209
+ fitness_level, goal, workout_days, workout_frequency,
210
+ current_workouts, injuries, diet_info, body_focus_areas,
211
+ preferred_workout_style, available_equipment):
212
+
213
+ if not api_key.strip():
214
+ return "❌ Lütfen Gemini API anahtarınızı girin!", None
215
+
216
+ if not all([name, age, height, weight]):
217
+ return "❌ Lütfen zorunlu alanları doldurun!", None
218
+
219
+ # Plan oluştur
220
+ plan = fitness_ai.create_fitness_plan(
221
+ api_key, name, age, gender, height, weight,
222
+ fitness_level, goal, workout_days, workout_frequency,
223
+ current_workouts, injuries, diet_info, body_focus_areas,
224
+ preferred_workout_style, available_equipment
225
+ )
226
+
227
+ # PDF oluştur
228
+ pdf_data = fitness_ai.create_pdf_report(plan, name)
229
+
230
+ # Geçici dosya oluştur
231
+ temp_filename = f"fitness_plan_{name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf"
232
+
233
+ return plan, temp_filename
234
+
235
+ # Gradio arayüzü
236
+ def create_interface():
237
+ with gr.Blocks(
238
+ theme=gr.themes.Soft(),
239
+ css="""
240
+ .gradio-container {
241
+ max-width: 1200px !important;
242
+ }
243
+ .header {
244
+ text-align: center;
245
+ background: linear-gradient(45deg, #FF6B6B, #4ECDC4);
246
+ -webkit-background-clip: text;
247
+ -webkit-text-fill-color: transparent;
248
+ font-size: 2.5em;
249
+ font-weight: bold;
250
+ margin-bottom: 20px;
251
+ }
252
+ .section {
253
+ border: 2px solid #e0e0e0;
254
+ border-radius: 10px;
255
+ padding: 20px;
256
+ margin: 10px 0;
257
+ background: #f9f9f9;
258
+ }
259
+ """
260
+ ) as interface:
261
+
262
+ gr.HTML("""
263
+ <div class="header">
264
+ 🏋️‍♂️ PROFESYONELFİTNESS AI ANTRENÖRÜ 🏋️‍♀️
265
+ </div>
266
+ <div style="text-align: center; margin-bottom: 30px;">
267
+ <p style="font-size: 1.2em; color: #666;">
268
+ 🎯 Kişiselleştirilmiş fitness ve beslenme planınızı hazırlayın!
269
+ <br>💪 Profesyonel antrenör deneyimi ile desteklenen AI teknolojisi
270
+ </p>
271
+ </div>
272
+ """)
273
+
274
+ with gr.Row():
275
+ with gr.Column(scale=1):
276
+ # API Ayarları
277
+ with gr.Group():
278
+ gr.HTML("<h3>🔑 API Ayarları</h3>")
279
+ api_key = gr.Textbox(
280
+ label="Gemini API Anahtarı",
281
+ placeholder="AIzaSy...",
282
+ type="password",
283
+ info="Gemini API anahtarınızı buraya girin"
284
+ )
285
+
286
+ # Kişisel Bilgiler
287
+ with gr.Group():
288
+ gr.HTML("<h3>👤 Kişisel Bilgiler</h3>")
289
+ name = gr.Textbox(label="Ad Soyad", placeholder="Örn: Ali Yılmaz")
290
+ age = gr.Number(label="Yaş", minimum=15, maximum=80, value=25)
291
+ gender = gr.Radio(["Erkek", "Kadın"], label="Cinsiyet", value="Erkek")
292
+ height = gr.Number(label="Boy (cm)", minimum=140, maximum=220, value=175)
293
+ weight = gr.Number(label="Kilo (kg)", minimum=40, maximum=200, value=70)
294
+
295
+ # Fitness Bilgileri
296
+ with gr.Group():
297
+ gr.HTML("<h3>🏋️ Fitness Bilgileri</h3>")
298
+ fitness_level = gr.Radio(
299
+ ["Başlangıç", "Orta", "İleri", "Profesyonel"],
300
+ label="Fitness Seviyesi",
301
+ value="Orta"
302
+ )
303
+ goal = gr.Dropdown(
304
+ ["Kilo Verme", "Kas Kazanma", "Kondisyon Artırma", "Güç Geliştirme",
305
+ "Vücut Şekillendirme", "Genel Sağlık", "Spor Performansı"],
306
+ label="Ana Hedef",
307
+ value="Kilo Verme"
308
+ )
309
+ workout_days = gr.Slider(
310
+ minimum=2, maximum=7, value=4, step=1,
311
+ label="Haftalık Antrenman Günü"
312
+ )
313
+ workout_frequency = gr.Dropdown(
314
+ ["30-45 dakika", "45-60 dakika", "60-90 dakika", "90+ dakika"],
315
+ label="Antrenman Süresi",
316
+ value="45-60 dakika"
317
+ )
318
+
319
+ with gr.Column(scale=1):
320
+ # Detaylı Bilgiler
321
+ with gr.Group():
322
+ gr.HTML("<h3>📝 Detaylı Bilgiler</h3>")
323
+ current_workouts = gr.Textbox(
324
+ label="Mevcut Antrenman Rutini",
325
+ placeholder="Şu anda yaptığınız egzersizleri açıklayın...",
326
+ lines=3
327
+ )
328
+ injuries = gr.Textbox(
329
+ label="Sakatlık/Kısıtlamalar",
330
+ placeholder="Herhangi bir sakatlığınız veya sağlık kısıtlamanız var mı?",
331
+ lines=2
332
+ )
333
+ body_focus_areas = gr.CheckboxGroup(
334
+ ["Karın", "Bacak", "Göğüs", "Sırt", "Omuz", "Kol", "Kalça", "Kondisyon"],
335
+ label="Odaklanmak İstediğiniz Vücut Bölgeleri",
336
+ value=["Karın", "Bacak"]
337
+ )
338
+ preferred_workout_style = gr.Dropdown(
339
+ ["Ağırlık Antrenmanı", "Kardiyovasküler", "HIIT", "Yoga/Pilates",
340
+ "Crossfit", "Calisthenics", "Karma"],
341
+ label="Tercih Edilen Antrenman Stili",
342
+ value="Karma"
343
+ )
344
+ available_equipment = gr.CheckboxGroup(
345
+ ["Spor Salonu", "Dumbbell", "Barbell", "Koşu Bandı", "Bisiklet",
346
+ "Yoga Matı", "Resistance Band", "Kettlebell", "Sadece Vücut Ağırlığı"],
347
+ label="Mevcut Ekipmanlar",
348
+ value=["Spor Salonu"]
349
+ )
350
+
351
+ # Beslenme Bilgileri
352
+ with gr.Group():
353
+ gr.HTML("<h3>🍎 Beslenme Bilgileri</h3>")
354
+ diet_info = gr.Textbox(
355
+ label="Mevcut Beslenme Durumu",
356
+ placeholder="Günlük yemek düzeninizi, alerjilerinizi, beslenme kısıtlamalarınızı açıklayın...",
357
+ lines=4
358
+ )
359
+
360
+ # Plan Oluştur Butonu
361
+ create_btn = gr.Button(
362
+ "🚀 KİŞİSEL FITNESS PLANIMI OLUŞTUR",
363
+ variant="primary",
364
+ size="lg"
365
+ )
366
+
367
+ # Sonuçlar
368
+ with gr.Row():
369
+ with gr.Column():
370
+ output_text = gr.Textbox(
371
+ label="📋 Kişisel Fitness Planınız",
372
+ lines=20,
373
+ max_lines=30,
374
+ show_copy_button=True
375
+ )
376
+
377
+ pdf_file = gr.File(
378
+ label="📄 PDF Raporu İndir",
379
+ file_types=[".pdf"]
380
+ )
381
+
382
+ # Event handler
383
+ create_btn.click(
384
+ fn=create_plan_interface,
385
+ inputs=[
386
+ api_key, name, age, gender, height, weight,
387
+ fitness_level, goal, workout_days, workout_frequency,
388
+ current_workouts, injuries, diet_info, body_focus_areas,
389
+ preferred_workout_style, available_equipment
390
+ ],
391
+ outputs=[output_text, pdf_file]
392
+ )
393
+
394
+ # Alt bilgi
395
+ gr.HTML("""
396
+ <div style="text-align: center; margin-top: 40px; padding: 20px; background: #f0f0f0; border-radius: 10px;">
397
+ <p><strong>💡 Kullanım İpuçları:</strong></p>
398
+ <p>• Gemini API anahtarınızı <a href="https://aistudio.google.com/app/apikey" target="_blank">buradan</a> alabilirsiniz</p>
399
+ <p>• Tüm bilgileri mümkün olduğunca detaylı doldurun</p>
400
+ <p>• Plan oluşturulduktan sonra PDF olarak indirebilirsiniz</p>
401
+ <p><em>⚠️ Bu plan genel bilgi amaçlıdır. Ciddi sağlık sorunları için doktor konsültasyonu önerilir.</em></p>
402
+ </div>
403
+ """)
404
+
405
+ return interface
406
+
407
+ if __name__ == "__main__":
408
+ demo = create_interface()
409
+ demo.launch(
410
+ server_name="0.0.0.0",
411
+ server_port=7860,
412
+ share=True,
413
+ show_error=True
414
+ )
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gradio==4.44.0
2
+ requests==2.31.0
3
+ reportlab==4.0.7
4
+ python-dateutil==2.8.2