# Library yang di butuhkan import gradio as gr from g4f.client import Client # GPT4 free # Menginisialisasi client untuk berinteraksi dengan GPT4 client = Client() # https://repository.unsri.ac.id/6666/1/RAMA_57201_09031281419056_0013096707_01_front_ref.pdf # https://p2ptm.kemkes.go.id/infographicp2ptm/obesitas/tabel-batas-ambang-indeks-massa-tubuh-imt # Fungsi untuk menghitung BMI def calculate_bmi(weight, height): # Menghitung BMI bmi = weight / ((height / 100) ** 2) # tinggi di ubah dari cm ke m # Menentukan kategori BMI if bmi < 18.5: # < 17 - 18.4 kategori_bmi = "Kurus" elif 18.5 <= bmi <= 25.0: # 18.5 - 25.0 kategori_bmi = "Normal" else: # 25.1 - > 27 kategori_bmi = "Gemuk" return bmi, kategori_bmi # https://hellosehat.com/nutrisi/cara-menghitung-bmr/ # Fungsi untuk menghitung BMR def calculate_bmr(gender, weight, height, age): if gender == "Pria": bmr = 66.5 + (13.7 * weight) + (5 * height) - (6.8 * age) elif gender == "Wanita": bmr = 655 + (9.6 * weight) + (1.8 * height) - (4.7 * age) else: bmr = None return bmr # Fungsi untuk menghitung kebutuhan kalori sehari berdasarkan tingkat aktivitas def calculate_daily_calories(bmr, activity_level): frekuensi_olahraga = { "Tidak Pernah": 1.2, "1-2 kali per Minggu": 1.375, "3-4 kali per Minggu": 1.55, "5+ kali per Minggu": 1.725 } return bmr * frekuensi_olahraga[activity_level] # Fungsi untuk menghasilkan respons dari prompt dengan GPT4 def generate_response(nama, usia, tujuan_utama, motivasi_utama, gender, berat, tinggi, kondisi_kesehatan, pola_makan, alergi, tidak_disukai, tipe_makanan, frekuensi_olahraga, jenis_latihan, batas_waktu, waktu_latihan_mingguan, tingkat_stres, kualitas_tidur): # Digunakan apabila pengguna tidak menginputkan apa2 if not nama or not usia or not tujuan_utama or not motivasi_utama or not gender or not berat or not tinggi or not pola_makan or not frekuensi_olahraga or not jenis_latihan or not batas_waktu or not waktu_latihan_mingguan or not tingkat_stres or not kualitas_tidur: return "-", None, "-", "Mohon isi semua kolom dulu yaa" # Hitung BMI bmi, kategori = calculate_bmi(berat, tinggi) hasil_bmi = f"{bmi:.2f}" # hasil_bmi = f"BMI: {bmi:.2f}, Kategori: {kategori}" # Berfungsi untuk menampilkan gambar sesuai kategori BMI if kategori == "Kurus": image_bmi = "skinny.png" elif kategori == "Normal": image_bmi = "normal.png" else: image_bmi = "fat.png" # Hitung BMR bmr = calculate_bmr(gender, berat, tinggi, usia) # Hitung kebutuhan kalori harian kalori_harian = calculate_daily_calories(bmr, frekuensi_olahraga) hasil_bmr = f"BMR: {int(bmr)} kkal, Kebutuhan Kalori: {int(kalori_harian)} kkal" # Buat prompt prompt = ( """ Anda adalah seorang pelatih profesional dan ahli gizi ternama. Tugas Anda adalah memberikan rekomendasi diet dan program latihan yang sangat spesifik berdasarkan kondisi dan kebutuhan unik setiap klien. Berikan saran Anda dengan semangat yang tinggi, ceria, penuh energi, hangat, bahasa gaul, dan profesional. Rekomendasikan jendela makan yang ideal bagi klien, sertakan 3 judul menu sarapan dan makan malam sederhana beserta kandungan kalorinya. (Tidak perlu menuliskan bahan-bahan). Sesuaikan menu makanan dengan Body Mass Index (BMI), Basal Metabolic Rate (BMR), dan total kebutuhan kalori harian klien. Cari dan sertakan tautan video YouTube resep yang mudah diikuti dan relevan untuk setiap menu yang Anda rekomendasikan. Format tautan video seperti ini: https://www.youtube.com/results?search_query={isi+dengan+judul+video+yang+akan+dicari}&sp=CAM%253D Jelaskan program latihan harian dan jadwal yang komprehensif. Cari dan sertakan tautan video YouTube atau panduan latihan yang sesuai dan relevan untuk membantu klien melakukan latihan dengan benar. Format tautan video seperti ini: https://www.youtube.com/results?search_query={isi+dengan+judul+video+yang+akan+dicari}&sp=CAM%253D Berikan tips atau pantangan yang relevan untuk membantu klien mencapai hasil yang mereka impikan. Jangan lupa menambahkan kata-kata motivasi yang kuat untuk menginspirasi klien dalam mencapai tujuannya dengan penuh semangat. """ # Detail informasi dari pengguna f"Klien bernama {nama} akan memulai program diet dan workout dengan kriteria berikut:\n" f"- Usia: {usia}\n" f"- Tujuan Utama: {tujuan_utama}\n" f"- Motivasi Utama: {motivasi_utama}\n" f"- Gender: {gender}\n" f"- Berat Badan Saat Ini (kg): {berat}\n" f"- Tinggi Badan Saat Ini (cm): {tinggi}\n" f"- Kondisi Kesehatan atau Cedera yang Perlu Diperhatikan: {kondisi_kesehatan}\n" f"- Body Mass Index (BMI): {bmi:.2f}, Kategori: {kategori}\n" f"- BMR: {bmr:.2f} kkal, Kebutuhan Kalori Harian: {kalori_harian:.2f} kkal\n" f"- Pola Makan Saat Ini: {pola_makan}\n" f"- Alergi Makanan: {alergi}\n" f"- Makanan yang Tidak Disukai: {tidak_disukai}\n" f"- Tipe Makanan Kesukaan: {tipe_makanan}\n" f"- Frekuensi Olahraga Saat Ini: {frekuensi_olahraga}\n" f"- Jenis Latihan yang Paling Disukai: {jenis_latihan}\n" f"- Batasan Waktu untuk Mencapai Tujuan: {batas_waktu}\n" f"- Waktu yang Bisa Diluangkan untuk Latihan Setiap Minggu: {waktu_latihan_mingguan}\n" f"- Tingkat Stres Saat Ini: {tingkat_stres}\n" f"- Kualitas Tidur Sehari-hari: {kualitas_tidur}\n\n" ) # Menghasilkan rekomendasi dengan GPT4 berdasarkan prompt response = client.chat.completions.create(model="gpt-4o-mini", messages=[{"role": "user", "content": prompt}]) rekomendasi = response.choices[0].message.content # Cetak: hasil BMI, gambar, BMR, dan rekomendasi return hasil_bmi, image_bmi, hasil_bmr, rekomendasi # Membuat interface Gradio untuk ditampilkan with gr.Blocks(theme=gr.themes.Ocean()) as interface: # Title gr.Markdown("# Get Your Body Goals Here") # Input dari pengguna akan diisi disini with gr.Row(): with gr.Column(): nama = gr.Textbox(label="Nama", placeholder="Damelia") usia = gr.Number(label="Usia (tahun)", value="") tujuan_utama = gr.Dropdown(["Penurunan Berat Badan", "Peningkatan Berat Badan", "Diet Seimbang"], label="Tujuan Utama", allow_custom_value=True) motivasi_utama = gr.Textbox(label="Motivasi", placeholder="Kesehatan/Penampilan") gender = gr.Radio(["Pria", "Wanita"], label="Gender") berat = gr.Number(label="Berat Badan Saat Ini (kg)", value="") tinggi = gr.Number(label="Tinggi Badan Saat Ini (cm)", value="") kondisi_kesehatan = gr.Textbox(label="Kondisi Kesehatan atau Cedera", placeholder="Cedera Lutut/Asma/Diabetes") pola_makan = gr.Radio(["Teratur", "Tidak Teratur"], label="Pola Makan Saat Ini") with gr.Column(): alergi = gr.Textbox(label="Alergi Makanan", placeholder="Alergi Seafood") tidak_disukai = gr.Textbox(label="Makanan yang Tidak Disukai", placeholder="Pedas") tipe_makanan = gr.Textbox(label="Tipe Makanan Kesukaan", placeholder="Makanan Khas Indonesia") frekuensi_olahraga = gr.Radio(["Tidak Pernah", "1-2 kali per Minggu", "3-4 kali per Minggu", "5+ kali per Minggu"], label="Frekuensi Olahraga Saat Ini") jenis_latihan = gr.Textbox(label="Jenis Latihan yang Paling Disukai", placeholder="Leg Press") batas_waktu = gr.Radio(["1-3 Bulan", "3-6 Bulan", "6+ Bulan"], label="Batasan Waktu untuk Mencapai Tujuan") waktu_latihan_mingguan = gr.Radio(["Kurang dari 1 jam", "1-2 jam", "2-3 jam", "Lebih dari 3 jam"], label="Waktu Latihan per Minggu") tingkat_stres = gr.Radio(["Baik", "Cukup", "Buruk"], label="Tingkat Stres Saat Ini") kualitas_tidur = gr.Radio(["Baik", "Cukup", "Buruk"], label="Kualitas Tidur Sehari-hari") # Daftar input yang diisi inputs = [nama, usia, tujuan_utama, motivasi_utama, gender, berat, tinggi, kondisi_kesehatan, pola_makan, alergi, tidak_disukai, tipe_makanan, frekuensi_olahraga, jenis_latihan, batas_waktu, waktu_latihan_mingguan, tingkat_stres, kualitas_tidur] # Tombol submit dan reset with gr.Row(): reset = gr.ClearButton(components=[*inputs], value="Clear") submit_btn = gr.Button("Submit", variant="primary") # Hasil BMI, BMR, dan rekomendasi with gr.Row(): with gr.Row(): output_bmi = gr.Label(label="Body Mass Index (BMI)") output_bmi2 = gr.Image(label="Kategori", height = 150) output_bmr = gr.Label(label="Basal Metabolic Rate (BMR)") with gr.Row(): with gr.Column(): gr.Markdown("### Rekomendasi") output_rekomendasi = gr.Markdown(container = True, show_copy_button = True, min_height = 100, max_height = 450) # Tombol submit untuk menghasilkan rekomendasi submit_btn.click( fn=generate_response, inputs=inputs, outputs=[output_bmi, output_bmi2, output_bmr, output_rekomendasi] ) # Contoh isian agar mempermudah pengguna gr.Examples( examples=[ ["Damelia", 17, "Penurunan Berat Badan", "Kesehatan", "Wanita", 54, 169, "Maag", "Teratur", "Susu", "Tidak Suka Pedas", "Makanan Vegetarian", "5+ kali per Minggu", "Jogging", "1-3 Bulan", "Lebih dari 3 jam", "Baik", "Baik"], ["Alfin", 26, "Diet Seimbang", "Kesehatan", "Pria", 85, 175, "Cedera Kaki", "Tidak Teratur", "Tidak Ada", "Makanan Pedas", "Makanan Khas Indonesia", "1-2 kali per Minggu", "Renang", "3-6 Bulan", "1-2 jam", "Cukup", "Cukup"], ["Danin", 35, "Peningkatan Berat Badan", "Penampilan", "Pria", 60, 185, "Hipertensi", "Teratur", "Kacang", "Tidak Ada", "Makanan Barat", "3-4 kali per Minggu", "Angkat Beban", "6+ Bulan", "2-3 jam", "Buruk", "Baik"] ], inputs=inputs ) # Menampilkan interface ke pengguna interface.launch()