import gradio as gr import openai import pandas as pd from datetime import datetime from weasyprint import HTML from jinja2 import Template import os # Egzersiz veritabanı exercise_db = { "Kardiyovasküler": ["Koşu", "Yürüyüş", "Bisiklet", "Yüzme", "İp atlama"], "Güç Antrenmanı": ["Şınav", "Mekik", "Squat", "Deadlift", "Bench Press"], "Esneklik": ["Yoga", "Pilates", "Germe Egzersizleri"], "HIIT": ["Burpees", "Mountain Climbers", "Jump Squats", "High Knees"] } html_template = """

🏋️‍♂️ Kişisel Fitness Planı

Oluşturulma Tarihi: {{ creation_date }}

👤 Kişisel Bilgiler

{{ name }}

{{ age }} yaşında

Fiziksel Ölçümler

Boy: {{ height }} cm

Kilo: {{ weight }} kg

{{ bmi_result }}

Hedef

{{ goal }}

📋 AI Önerileri

{{ ai_recommendation }}

💪 Önerilen Egzersizler

{% for category, exercises in exercise_list.items() %} {% endfor %}
Kategori Egzersizler
{{ category }} {{ ", ".join(exercises) }}
""" class FitnessPlan: def __init__(self): self.current_plan = None self.chat_history = [] self.api_key = None self.api_configured = False def configure_api(self, api_key): """API yapılandırmasını ayarla""" if api_key and api_key.strip(): self.api_key = api_key openai.api_base = "https://integrate.api.nvidia.com/v1" openai.api_key = api_key self.api_configured = True return "✅ API yapılandırması başarıyla tamamlandı!" return "❌ Lütfen geçerli bir API anahtarı girin!" def store_plan(self, plan): self.current_plan = plan def get_motivation(self): """Rastgele motivasyon sözü ve şarkı seç""" quote = random.choice(motivation_quotes) song = random.choice(motivation_songs) return quote, song def generate_pdf(self): """Fitness planını PDF olarak oluştur""" if not self.current_plan: return None quote, song = self.get_motivation() template = Template(html_template) html_content = template.render( creation_date=datetime.now().strftime("%d/%m/%Y"), name=self.current_plan["user_info"]["name"], age=self.current_plan["user_info"]["age"], height=self.current_plan["user_info"]["height"], weight=self.current_plan["user_info"]["weight"], goal=self.current_plan["user_info"]["goal"], bmi_result=self.current_plan["bmi_result"], ai_recommendation=self.current_plan["ai_recommendation"], exercise_list=exercise_db, motivation_quote=quote, motivation_song=song ) pdf_path = f"fitness_plan_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf" # HTML içeriği alıp PDF'ye dönüştür HTML(string=html_content).write_pdf(pdf_path) return pdf_path fitness_plan = FitnessPlan() def get_ai_recommendation(user_info): """AI'dan kişiselleştirilmiş fitness tavsiyesi al""" if not fitness_plan.api_configured: return "Lütfen önce API anahtarınızı yapılandırın!" prompt = f""" Aşağıdaki bilgilere sahip kullanıcı için detaylı bir fitness planı oluştur: Yaş: {user_info['age']} Kilo: {user_info['weight']} kg Boy: {user_info['height']} cm Hedef: {user_info['goal']} Fitness Seviyesi: {user_info['fitness_level']} Sağlık Durumu: {user_info['health_conditions']} Lütfen şunları içeren bir plan oluştur: 1. Haftalık egzersiz programı 2. Beslenme önerileri 3. Hedeflerine ulaşması için özel tavsiyeler 4. İlerleme takibi için öneriler Lütfen yanıtını HTML formatında, düzenli başlıklar ve listeler kullanarak oluştur. """ try: response = openai.ChatCompletion.create( model="nvidia/llama-3.1-nemotron-70b-instruct", messages=[{"role": "user", "content": prompt}], temperature=0.7, max_tokens=1024 ) return response.choices[0].message['content'] except Exception as e: return f"AI tavsiyesi alınırken bir hata oluştu: {str(e)}" def calculate_bmi(weight, height): """BMI hesaplama""" height_m = height / 100 bmi = weight / (height_m ** 2) if bmi < 18.5: category = "Zayıf" elif 18.5 <= bmi < 25: category = "Normal" elif 25 <= bmi < 30: category = "Fazla Kilolu" else: category = "Obez" return f"BMI: {bmi:.1f} - Kategori: {category}" # create_workout_plan fonksiyonunu güncelliyorum def create_workout_plan(name, age, weight, height, goal, fitness_level, health_conditions): if not fitness_plan.api_configured: return "⚠️ Lütfen önce API anahtarınızı yapılandırın!" user_info = { "name": name, "age": age, "weight": weight, "height": height, "goal": goal, "fitness_level": fitness_level, "health_conditions": health_conditions } bmi_result = calculate_bmi(weight, height) ai_recommendation = get_ai_recommendation(user_info) quote, song = fitness_plan.get_motivation() # Planı sakla fitness_plan.store_plan({ "user_info": user_info, "bmi_result": bmi_result, "ai_recommendation": ai_recommendation }) response = f""" ## 👤 Kişisel Bilgiler - İsim: {name} - Yaş: {age} - Kilo: {weight} kg - Boy: {height} cm - Hedef: {goal} - Fitness Seviyesi: {fitness_level} ## 📊 Fiziksel Değerlendirme {bmi_result} ## 🎯 Günün Motivasyon Sözü "{quote}" ## 🎵 Size Özel Motivasyon Şarkısı {song} ## 🤖 AI Önerileri {ai_recommendation} ## 💪 Önerilen Egzersiz Kategorileri """ for category, exercises in exercise_db.items(): response += f"\n### {category}\n" response += "\n".join([f"- {exercise}" for exercise in exercises]) response += "\n" return response def download_plan(): """Planı PDF olarak indir""" if not fitness_plan.current_plan: return None return fitness_plan.generate_pdf() def chat_with_ai(api_key, message, history): """AI ile sohbet et""" if not fitness_plan.api_configured: return history + [[message, "⚠️ Lütfen önce API anahtarınızı yapılandırın!"]] if fitness_plan.current_plan is None: return history + [[message, "Lütfen önce bir fitness planı oluşturun."]] # Mevcut planı string olarak format current_plan_str = f""" Kişisel Bilgiler: İsim: {fitness_plan.current_plan['user_info']['name']} Yaş: {fitness_plan.current_plan['user_info']['age']} Boy: {fitness_plan.current_plan['user_info']['height']} cm Kilo: {fitness_plan.current_plan['user_info']['weight']} kg Hedef: {fitness_plan.current_plan['user_info']['goal']} BMI Sonucu: {fitness_plan.current_plan['bmi_result']} """ prompt = f""" Mevcut fitness planı: {current_plan_str} AI Önerileri: {fitness_plan.current_plan['ai_recommendation']} Kullanıcı sorusu: {message} Lütfen kullanıcının sorusunu yukarıdaki fitness planı bağlamında yanıtla. """ try: response = openai.ChatCompletion.create( model="nvidia/llama-3.1-nemotron-70b-instruct", messages=[{"role": "user", "content": prompt}], temperature=0.7, max_tokens=1024 ) ai_response = response.choices[0].message['content'] except Exception as e: ai_response = f"Yanıt alınırken bir hata oluştu: {str(e)}" return history + [[message, ai_response]] # Gradio arayüzü with gr.Blocks(title="AI Fitness Asistanı", theme=gr.themes.Soft()) as demo: gr.Markdown(""" # 🏋️‍♂️ AI Destekli Fitness Asistanı---Deployed by Eray Coşkun Kişiselleştirilmiş fitness planınızı oluşturun ve AI ile planınız hakkında sohbet edin! """) with gr.Tab("API Yapılandırması"): gr.Markdown(""" ### 🔑 API Yapılandırması Uygulamayı kullanmadan önce NVIDIA API anahtarınızı yapılandırmalısınız. """) api_key_input = gr.Textbox( label="API Anahtarınızı Giriniz (API anahtarınız yoksa [buradan](https://build.nvidia.com/nvidia/llama-3_1-nemotron-70b-instruct) alın)", type="password" ) api_status = gr.Markdown() api_submit = gr.Button("API'yi Yapılandır", variant="primary") with gr.Tab("Plan Oluştur"): with gr.Row(): with gr.Column(): name_input = gr.Textbox(label="Adınız") age_input = gr.Number(label="Yaşınız", minimum=15, maximum=100) weight_input = gr.Number(label="Kilonuz (kg)", minimum=30, maximum=200) height_input = gr.Number(label="Boyunuz (cm)", minimum=120, maximum=220) with gr.Column(): goal_input = gr.Dropdown( label="Fitness Hedefiniz", choices=["Kilo Vermek", "Kas Kazanmak", "Genel Sağlık", "Güç Artırmak"] ) fitness_level_input = gr.Radio( label="Fitness Seviyeniz", choices=["Başlangıç", "Orta", "İleri"] ) health_input = gr.Textbox( label="Sağlık Durumunuz (varsa)", placeholder="Örn: Diyabet, Tansiyon, vs. yoksa 'yok' yazın" ) with gr.Row(): submit_btn = gr.Button("Plan Oluştur", variant="primary") download_btn = gr.Button("PDF Olarak İndir", variant="secondary") output = gr.Markdown() pdf_output = gr.File(label="İndirilebilir PDF") with gr.Tab("AI ile Sohbet"): gr.Markdown(""" ### 💬 Planınız Hakkında Sohbet Edin Oluşturulan plan hakkında sorularınızı sorun ve AI'dan kişiselleştirilmiş yanıtlar alın. """) chatbot = gr.Chatbot(height=400) msg = gr.Textbox(label="Planınız hakkında soru sorun", placeholder="Örn: Bu plan ile hedefime ne kadar sürede ulaşabilirim?") with gr.Row(): clear = gr.Button("Sohbeti Temizle") submit_msg = gr.Button("Gönder", variant="primary") # Event handlers api_submit.click( fitness_plan.configure_api, inputs=[api_key_input], outputs=[api_status] ) submit_btn.click( create_workout_plan, inputs=[name_input, age_input, weight_input, height_input, goal_input, fitness_level_input, health_input], outputs=output ) download_btn.click( download_plan, inputs=[], outputs=pdf_output ) # Sohbet kutusundaki mesajı gönderme ve temizleme işlevleri msg.submit(chat_with_ai, [api_key_input, msg, chatbot], chatbot) submit_msg.click(chat_with_ai, [api_key_input, msg, chatbot], chatbot) clear.click(lambda: None, None, chatbot, queue=False) # Uygulamayı başlat if __name__ == "__main__": demo.launch()