Spaces:
Sleeping
Sleeping
File size: 10,170 Bytes
945cbac c2fc089 945cbac c2fc089 9ecdf98 c2fc089 9ecdf98 63707f8 4e433ad 63707f8 4e433ad 63707f8 4e433ad 63707f8 9ecdf98 fc5eafa 945cbac 6c88ee1 40bc238 63707f8 4e433ad 13c875e 4e433ad 13c875e 4e433ad 13c875e 4e433ad 13c875e 4e433ad 13c875e 63707f8 fc5eafa 63707f8 945cbac 9ecdf98 c2fc089 63707f8 fc5eafa 66c1fa5 4e433ad fc5eafa 4e433ad fc5eafa 63707f8 c2fc089 9ecdf98 c2fc089 63707f8 c2fc089 4e433ad 63707f8 c2fc089 4e433ad c2fc089 9ecdf98 c2fc089 63707f8 c2fc089 4e433ad 63707f8 fc5eafa 9ecdf98 5a2fed1 9ecdf98 63707f8 9ecdf98 63707f8 9ecdf98 63707f8 9ecdf98 63707f8 fc5eafa 40abf42 4e433ad 63707f8 13c875e 4e433ad 63707f8 fc5eafa 4e433ad fc5eafa 40abf42 63707f8 9ecdf98 4e433ad 9ecdf98 c2fc089 9ecdf98 63707f8 13c875e 9ecdf98 63707f8 9ecdf98 63707f8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
# 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()
|