Spaces:
Sleeping
Sleeping
# 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() | |