import gradio as gr
from llm_inference import LLMInferenceNode
import random
from PIL import Image
import io
from themes import IndonesiaTheme # Pastikan tema ini telah dibuat atau diimpor dengan benar
# Judul aplikasi dalam bentuk HTML
title = """
💡 Smart Idea Generator 💡
[X gokaygokay]
[Github gokayfem]
Generate random prompts using powerful LLMs from Hugging Face, Groq, and SambaNova.
"""
# Judul aplikasi dalam bentuk HTML
Footer = """
[X gokaygokay]
[Github gokayfem]
"""
# Fungsi utama untuk membuat antarmuka Gradio
def create_interface():
llm_node = LLMInferenceNode() # Node untuk inferensi LLM
# CSS untuk styling antarmuka
css = """
#col-left, #col-mid {
margin: 20px auto; /* Margin lebih besar untuk pemisahan */
max-width: 400px;
padding: 20px; /* Padding lebih besar */
border-radius: 15px;
background-color: #ffffff; /* Background blok putih untuk kontras */
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1); /* Bayangan lembut */
transition: transform 0.2s ease-in-out; /* Animasi saat hover */
}
#col-left:hover, #col-mid:hover {
transform: translateY(-5px); /* Efek naik saat dihover */
}
#col-right {
margin: 20px auto; /* Margin lebih besar untuk pemisahan */
max-width: 400px;
padding: 20px; /* Padding lebih besar */
border-radius: 15px;
background: linear-gradient(180deg, #0077b6, #0096c7); /* Gradasi biru cerah */
color: white; /* Teks putih untuk kontras */
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);
transition: transform 0.2s ease-in-out;
}
#col-right:hover {
transform: translateY(-5px);
}
#col-bott {
margin: 20px auto; /* Margin lebih besar */
padding: 20px; /* Padding lebih besar */
border-radius: 15px;
background-color: rgba(255, 255, 255, 0.85); /* Warna blok transparan */
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);
}
#banner {
width: 100%;
text-align: center;
margin-bottom: 20px;
font-weight: 600; /* Lebih tebal */
color: #0077b6; /* Biru sesuai tema */
}
#run-button, #generate-image-button {
font-weight: bold;
padding: 15px 30px; /* Padding lebih besar */
border-radius: 15px;
cursor: pointer;
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2); /* Bayangan lebih besar */
transition: all 0.4s ease-in-out; /* Menambahkan animasi untuk semua properti */
}
#run-button {
background-color: #0096c7;
color: white;
}
#run-button:hover {
background-color: #00b4d8; /* Lebih terang saat hover */
transform: translateY(-5px); /* Tombol sedikit naik saat hover */
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3); /* Bayangan lebih besar saat hover */
}
#generate-image-button {
background-color: #ff69b4; /* Warna pink */
color: white; /* Teks putih */
}
#generate-image-button:hover {
background-color: #ff85c8; /* Pink lebih terang saat hover */
transform: translateY(-5px) scale(1.05); /* Membuat tombol sedikit lebih besar dan naik saat hover */
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.3); /* Bayangan lebih besar saat hover */
}
#footer {
text-align: center;
margin-top: 20px;
color: #000; /* Warna netral abu-abu */
font-style: italic;
}
#markdown-silver {
color: #7a7a7a; /* Mengatur warna font Markdown ke abu-abu netral */
}
/* Efek untuk elemen saat difokuskan */
#col-left:focus, #col-mid:focus, #col-right:focus, #run-button:focus, #generate-image-button:focus {
outline: 2px solid #0096c7; /* Border biru muda saat fokus */
outline-offset: 3px;
}
/* Responsif untuk perangkat mobile */
@media (max-width: 768px) {
#col-left, #col-mid, #col-right {
max-width: 100%; /* Membuat kolom memenuhi lebar layar */
}
#run-button, #generate-image-button {
width: 100%; /* Tombol menjadi lebar penuh */
margin-top: 10px; /* Menambahkan margin atas */
}
}
"""
# Membuat antarmuka Gradio dengan tema IndonesiaTheme dan CSS
with gr.Blocks(theme=IndonesiaTheme(), css=css) as RandomPromptApp:
gr.HTML(title) # Tampilkan judul aplikasi
# Baris pertama: Input prompt dan tipe prompt
with gr.Row():
with gr.Column(scale=2):
# Textbox untuk input custom prompt dengan placeholder
custom = gr.Textbox(
label="➡️ Custom Input Prompt (optional)",
lines=3,
placeholder="Tulis prompt Anda di sini atau biarkan kosong untuk prompt acak."
)
# Dropdown untuk memilih tipe prompt
prompt_types = ["Random", "Long", "Short", "Medium", "OnlyObjects", "NoFigure", "Landscape", "Fantasy"]
prompt_type = gr.Dropdown(
choices=prompt_types,
label="Prompt Type",
value="Random",
interactive=True
)
# Menyimpan tipe prompt yang dipilih dalam sebuah State
prompt_type_state = gr.State("Random")
# Fungsi untuk mengupdate tipe prompt ketika "Random" dipilih
def update_prompt_type(value, state):
if value == "Random":
new_value = random.choice([t for t in prompt_types if t != "Random"])
print(f"[-] Random prompt type selected: {new_value}")
return value, new_value
print(f"[-] Updated prompt type: {value}")
return value, value
# Menghubungkan dropdown tipe prompt dengan fungsi update
prompt_type.change(update_prompt_type, inputs=[prompt_type, prompt_type_state], outputs=[prompt_type, prompt_type_state])
with gr.Column(scale=2):
# Accordion untuk parameter terkait generasi prompt LLM
with gr.Accordion("➡️ LLM Prompt Generation", open=False):
long_talk = gr.Checkbox(label="Long Talk", value=True)
compress = gr.Checkbox(label="Compress", value=True)
compression_level = gr.Dropdown(
choices=["soft", "medium", "hard"],
label="Compression Level",
value="hard"
)
custom_base_prompt = gr.Textbox(label="➡️ Custom Base Prompt", lines=5)
# Dropdown untuk memilih provider LLM
llm_provider = gr.Dropdown(
choices=["Hugging Face", "Groq", "SambaNova"],
label="LLM Provider",
value="Groq"
)
# Textbox untuk API key (disembunyikan)
api_key = gr.Textbox(label="API Key", type="password", visible=False)
# Dropdown untuk memilih model LLM
model = gr.Dropdown(label="Model", choices=["llama-3.1-70b-versatile", "mixtral-8x7b-32768", "llama-3.2-90b-text-preview"], value="llama-3.2-90b-text-preview")
with gr.Row():
# Tombol untuk mengenerate prompt dan teks
generate_button = gr.Button("✅ Generate Prompt", elem_id="run-button")
with gr.Row():
# Output teks hasil generasi LLM dan gambar yang dihasilkan
text_output = gr.Textbox(label="➡️ LLM Generated Text", lines=10, show_copy_button=True)
image_output = gr.Image(label="➡️ Generated Image", type="filepath")
with gr.Row():
# Tambahkan footer di bagian bawah
gr.HTML("""
""")
# Fungsi untuk mengupdate model LLM berdasarkan provider yang dipilih
def update_model_choices(provider):
provider_models = {
"Hugging Face": [
"Qwen/Qwen2.5-72B-Instruct",
"meta-llama/Meta-Llama-3.1-70B-Instruct",
"mistralai/Mixtral-8x7B-Instruct-v0.1",
"mistralai/Mistral-7B-Instruct-v0.3"
],
"Groq": [
"llama-3.1-70b-versatile",
"mixtral-8x7b-32768",
"llama-3.2-90b-text-preview"
],
"SambaNova": [
"Meta-Llama-3.1-70B-Instruct",
"Meta-Llama-3.1-405B-Instruct",
"Meta-Llama-3.1-8B-Instruct"
],
}
models = provider_models.get(provider, [])
return gr.Dropdown(choices=models, value=models[0] if models else "")
# Fungsi untuk menyembunyikan textbox API key jika tidak dibutuhkan
def update_api_key_visibility(provider):
return gr.update(visible=False) # API key tidak dibutuhkan untuk provider yang dipilih
# Menghubungkan perubahan provider LLM dengan fungsi untuk mengupdate model dan visibilitas API key
llm_provider.change(
update_model_choices,
inputs=[llm_provider],
outputs=[model]
)
llm_provider.change(
update_api_key_visibility,
inputs=[llm_provider],
outputs=[api_key]
)
# Fungsi untuk mengenerate prompt dan teks dengan LLM
def generate_random_prompt_with_llm(custom_input, prompt_type, long_talk, compress, compression_level, custom_base_prompt, provider, api_key, model_selected, prompt_type_state):
try:
# Langkah 1: Mengenerate prompt
dynamic_seed = random.randint(0, 1000000)
# Jika prompt_type adalah "Random", pilih tipe prompt acak
if prompt_type == "Random":
prompt_type = random.choice([t for t in prompt_types if t != "Random"])
print(f"[-] Random prompt type selected: {prompt_type}")
# Jika ada custom input, gunakan sebagai prompt
if custom_input and custom_input.strip():
prompt = llm_node.generate_prompt(dynamic_seed, prompt_type, custom_input)
print(f"[-] Using Custom Input Prompt.")
else:
prompt = llm_node.generate_prompt(dynamic_seed, prompt_type, f"Create a random prompt based on the '{prompt_type}' type.")
print(f"[-] No Custom Input Prompt provided. Generated prompt based on prompt_type: {prompt_type}")
print(f"[-] Generated Prompt: {prompt}")
# Langkah 2: Mengenerate teks dengan LLM
poster = False # Nilai default
result = llm_node.generate(
input_text=prompt,
long_talk=long_talk,
compress=compress,
compression_level=compression_level,
poster=poster,
prompt_type=prompt_type,
custom_base_prompt=custom_base_prompt,
provider=provider,
api_key=api_key,
model=model_selected
)
print(f"Generated Text: {result}")
return result
except Exception as e:
print(f"[-] An error occurred: {e}")
return f"[-] Error occurred while processing the request: {str(e)}"
# Menghubungkan tombol generate dengan fungsi untuk mengenerate prompt dan teks
generate_button.click(
generate_random_prompt_with_llm,
inputs=[custom, prompt_type, long_talk, compress, compression_level, custom_base_prompt, llm_provider, api_key, model, prompt_type_state],
outputs=[text_output],
api_name="generate_random_prompt_with_llm"
)
# Tambahkan tombol untuk mengenerate gambar
generate_image_button = gr.Button("🔥 Generate Image", elem_id="generate-image-button")
# Fungsi untuk mengenerate gambar
def generate_image(text):
try:
seed = random.randint(0, 1000000)
image_path = llm_node.generate_image(text, seed=seed)
print(f"[-] Image generated: {image_path}")
return image_path
except Exception as e:
print(f"[-] An error occurred while generating the image: {e}")
return None
# Menghubungkan tombol generate gambar dengan fungsi untuk mengenerate gambar
generate_image_button.click(
generate_image,
inputs=[text_output],
outputs=[image_output]
)
return RandomPromptApp
# Meluncurkan aplikasi Gradio
if __name__ == "__main__":
RandomPromptApp = create_interface()
RandomPromptApp.launch()