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()