body-goals / app.py
damelia's picture
Update app.py
40abf42 verified
# 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()