A3='FP32 (Lambat, Kualitas Terbaik)'
A2='FP16 (Cepat, Kualitas Baik)'
A1='Semua Waktu'
A0='secondary'
z='3 Bulan Terakhir'
y='2 Minggu Terakhir'
x='1 Minggu Terakhir'
w='%Y-%m-%d %H:%M:%S'
v='caidas/swin2sr-realworld-sr-x4-64-bsrgan-psnr'
u=ImportError
i=1.
h='utf-8'
g=len
f=open
V='primary'
U='cuda'
T=Exception
L='Total Pengunjung'
H='panel'
F='Timestamp'
E=True
D=False
C=print
B=None
import gradio as A,torch as G,numpy as W
from diffusers import DiffusionPipeline as A4
import random as j,time as k,os as M
from datetime import datetime as l,timedelta as X
import csv,pandas as I,threading as A5
from PIL import Image,ImageEnhance as A6
try:import psutil as N,platform as O;from transformers import Swin2SRForImageSuperResolution as Y,Swin2SRImageProcessor as m;C('â Library tambahan (psutil, transformers) berhasil diimpor.')
except u:C("â Peringatan: Library 'psutil' atau 'transformers' tidak ditemukan. Fitur System Monitor & Upscaler tidak akan berfungsi.");N=B;O=B;Y=B;m=B
try:import google.generativeai as P;C("â Library 'google-generativeai' berhasil diimpor.")
except u:C("â Peringatan: Library 'google-generativeai' tidak ditemukan. Fitur Chatbot & Prompt Enhancer tidak akan berfungsi.");P=B
A7='\n
\n \n \n RenXploit\'s Creative AI Suite\n \n \n \n \n \n\n'
J='visitor_log.csv'
Z=A5.Lock()
K=U if G.cuda.is_available()else'cpu'
C(f"âĄī¸ Menggunakan device: {K.upper()}")
def A8():
if not M.path.exists(J):
with Z:
if not M.path.exists(J):
with f(J,mode='w',newline='',encoding=h)as A:B=csv.writer(A);B.writerow([F,'IP Address','User Agent'])
C(f"â File log '{J}' berhasil dibuat.")
A8()
C('âĄī¸ Memuat model SDXL-Turbo...')
n=A4.from_pretrained('stabilityai/sdxl-turbo',torch_dtype=G.float16 if K==U else G.float32,variant='fp16'if K==U else B,use_safetensors=E).to(K)
if G.cuda.is_available():n.enable_xformers_memory_efficient_attention()
C('â Model SDXL-Turbo berhasil dimuat.')
a=B
b=B
if Y:
try:C('âĄī¸ Memuat model AI Upscaler (Swin2SR)...');a=Y.from_pretrained(v).to(K);b=m.from_pretrained(v);C('â Model AI Upscaler berhasil dimuat.')
except T as A9:C(f"â Gagal memuat model Upscaler: {A9}. Fitur upscale akan dinonaktifkan.")
class AA:
def __init__(A):
A.api_keys=[];A.is_configured=D
if not P:return
B=1
while E:
F=M.getenv(f"GEMINI_API_KEY_{B}")
if F:A.api_keys.append(F);B+=1
else:break
if A.api_keys:C(f"â Berhasil memuat {g(A.api_keys)} API Key Gemini. Sistem rotasi aktif.");A.is_configured=E
else:C('â PERINGATAN: Tidak ada API Key Gemini yang ditemukan. Fitur AI Chat & Prompt Enhancer tidak akan berfungsi.')
def chat(A,message,history,system_prompt=B):
D=system_prompt;B=message
if not A.is_configured:return'Maaf, fitur ini tidak terkonfigurasi karena tidak ada API Key.'
try:
F=j.choice(A.api_keys);P.configure(api_key=F);G=P.GenerativeModel('gemini-2.5-flash');E=B
if D:E=f"{D}\n\nUser query: {B}"
H=G.generate_content(E);return H.text
except T as I:C(f"â Terjadi error pada API Key Gemini: {I}");return'Terjadi kesalahan saat menghubungi API AI. Mungkin salah satu API Key tidak valid atau ada masalah jaringan. Silakan coba lagi.'
Q=AA()
def AB(request):
D='N/A';A=request;E=l.now().strftime(w);B=A.client.host if A else D;F=A.headers.get('user-agent','Unknown')if A else D
with Z:
with f(J,mode='a',newline='',encoding=h)as G:H=csv.writer(G);H.writerow([E,B,F])
C(f"â Pengunjung baru tercatat: IP {B}")
def AC(prompt,negative_prompt,steps,seed,num_images):
C=prompt;B=seed
if not C:raise A.Error('Prompt tidak boleh kosong!')
if B==-1:B=j.randint(0,2**32-1)
D=G.manual_seed(B);E=n(prompt=C,negative_prompt=negative_prompt,generator=D,num_inference_steps=steps,guidance_scale=.0,num_images_per_prompt=num_images).images;return E,B
def AD(prompt,negative_prompt,steps,seed,num_images):yield(A.update(visible=D),A.update(visible=E),A.update(interactive=D),A.update(visible=D));B=k.time();C,F=AC(prompt,negative_prompt,steps,int(seed),int(num_images));G=k.time();H=G-B;I=f"Seed yang digunakan: {F}\nTotal waktu generasi: {H:.2f} detik";yield(A.update(value=C,visible=E),A.update(visible=D),A.update(interactive=E),A.update(value=I,visible=E))
def AE(name,email,message):
B=message
if not name or not B:A.Warning('Nama dan Pesan tidak boleh kosong!');return A.update(visible=D)
F=l.now().strftime(w);G=f"""--- Laporan Baru ({F}) ---
Nama: {name}
Email: {email}
Pesan: {B}
"""
with f('reports.log','a',encoding=h)as H:H.write(G)
C('â Laporan baru telah disimpan ke reports.log');return A.update(value='â Terima kasih! Laporan Anda telah kami terima.',visible=E)
def c(time_filter):
K='## đ 0';G=time_filter
try:
with Z:
if not M.path.exists(J)or M.path.getsize(J)<10:return K,I.DataFrame({F:[],L:[]})
A=I.read_csv(J)
if A.empty:return K,I.DataFrame({F:[],L:[]})
A[F]=I.to_datetime(A[F],errors='coerce');A.dropna(subset=[F],inplace=E)
if A.empty:return K,I.DataFrame({F:[],L:[]})
P=g(A);N=f"## đ {P:,}";A[L]=W.arange(1,g(A)+1);H=I.to_datetime('now',utc=E).tz_localize(B);A[F]=A[F].dt.tz_localize(B)
if G==x:D=A[A[F]>=H-X(weeks=1)]
elif G==y:D=A[A[F]>=H-X(weeks=2)]
elif G==z:D=A[A[F]>=H-X(days=90)]
else:D=A
if D.empty:return N,I.DataFrame({F:[],L:[]})
return N,D
except T as Q:O=f"Error saat memperbarui monitor: {Q}";C(f"â {O}");return f"## â ī¸ Error",I.DataFrame({'Error':[O]})
def AF(simple_prompt):
B=simple_prompt
if not B:A.Warning('Tolong masukkan ide Anda terlebih dahulu.');return''
if not Q.is_configured:A.Error('Fitur Prompt Enhancer tidak aktif karena API Key Gemini tidak diatur.');return'Fitur tidak aktif.'
C='Anda adalah seorang ahli prompt engineering untuk model AI text-to-image seperti Stable Diffusion. Tugas Anda adalah mengubah ide sederhana dari pengguna menjadi prompt yang kaya, deskriptif, dan artistik. Fokus pada detail visual: subjek, setting, pencahayaan (cinematic lighting, soft light, dll), gaya seni (photorealistic, anime style, oil painting, dll), komposisi, dan kualitas (hyperdetailed, 4K, masterpiece, trending on artstation). Hasilkan HANYA prompt-nya saja dalam format teks panjang, tanpa penjelasan atau kalimat pembuka/penutup.';yield'đ§ AI sedang meracik prompt ajaib untuk Anda...';D=Q.chat(B,[],system_prompt=C);yield D
def AG(image_to_upscale,clarity_strength):
H=image_to_upscale;F=clarity_strength
if H is B:raise A.Error('Silakan unggah gambar terlebih dahulu.')
if a is B or b is B:raise A.Error('Fitur Upscaler tidak aktif karena model gagal dimuat. Periksa log saat startup.')
yield(B,'đ Memproses peningkatan resolusi 4x oleh AI...')
try:
with G.no_grad():J=b(H,return_tensors='pt').to(K);L=a(**J);E=L.reconstruction.data.squeeze().float().cpu().clamp_(0,1).numpy();E=W.moveaxis(E,source=0,destination=-1);E=(E*255.).round().astype(W.uint8);D=Image.fromarray(E)
if F>i:yield(D,f"⨠Menerapkan peningkatan kejernihan (Strength: {F:.2f})...");M=A6.Sharpness(D);D=M.enhance(F)
yield(D,f"â Gambar berhasil ditingkatkan! Resolusi akhir: {D.width}x{D.height}px.")
except T as I:C(f"â Error saat upscaling: {I}");yield(B,f"â ī¸ Terjadi error saat upscaling: {I}")
def o():
if not N or not O:return'Informasi sistem tidak tersedia (library `psutil` tidak ditemukan).'
D=N.cpu_percent(interval=B);A=N.virtual_memory();C='Tidak terdeteksi (PyTorch tidak menemukan CUDA)'
if G.cuda.is_available():E=G.cuda.get_device_name(0);F=G.cuda.memory_allocated(0)/1024**3;H=G.cuda.get_device_properties(0).total_memory/1024**3;C=f"**GPU:** `{E}`\n**VRAM Terpakai:** `{F:.2f} GB / {H:.2f} GB`"
I=f"**Platform:** `{O.system()} {O.release()}`";return f"**CPU Terpakai:** `{D:.1f}%`\n**RAM Terpakai:** `{A.percent:.1f}% ({A.used/1024**3:.2f} GB / {A.total/1024**3:.2f} GB)`\n{C}\n---\n{I}"
with A.Blocks(theme=A.themes.Base(),head=A7)as R:
A.Markdown("# đ RenXploit's Creative AI Suite đ",elem_id='main-title');A.Markdown('Sebuah platform lengkap untuk kreativitas Anda, ditenagai oleh AI.',elem_id='main-subtitle')
with A.Tabs()as AH:
with A.TabItem('đ¨ Image Generator',id=0):
with A.Row(variant=H,equal_height=D):
with A.Column(scale=1):
A.Markdown('### đ **Masukan Perintah Anda**');p=A.Textbox(label='Prompt',placeholder='Contoh: Cinematic photo, seekor rubah merah...',lines=3,info='Jadilah sangat spesifik! Atau gunakan Prompt Enhancer.');AI=A.Textbox(label='Prompt Negatif',placeholder='Contoh: blurry, low quality, bad hands...',lines=2,info='Hal-hal yang TIDAK Anda inginkan.');AJ=A.Slider(minimum=1,maximum=8,value=2,step=1,label='Jumlah Gambar');q=A.Button('⨠Hasilkan Gambar!',variant=V)
with A.Accordion('âī¸ Opsi Lanjutan',open=D):
AK=A.Slider(minimum=1,maximum=5,value=2,step=1,label='Langkah Iterasi (Kualitas vs Kecepatan)')
with A.Row():r=A.Number(label='Seed',value=-1,precision=0,info='Gunakan -1 untuk acak.');AL=A.Button('đ˛ Acak',variant=A0)
with A.Column(scale=2):A.Markdown('### đŧī¸ **Hasil Generasi**');AM=A.Gallery(label='Hasil Gambar',show_label=D,elem_id='gallery',columns=2,object_fit='contain',height='auto');AN=A.HTML(visible=D);AO=A.Textbox(label='Informasi Generasi',visible=D,interactive=D,lines=2)
with A.TabItem('đŦ Chat with AI',id=1):
with A.Row(variant=H):
with A.Column():
A.Markdown('### đ¤ **Asisten AI Flood**')
if not Q.is_configured:A.Warning('Fitur Chatbot dinonaktifkan. API Key Gemini tidak terkonfigurasi.')
else:A.ChatInterface(Q.chat,chatbot=A.Chatbot(height=500,label='Flood AI',value=[(B,'Halo! Saya adalah asisten AI dari RenXploit. Ada yang bisa saya bantu?')]),title=B,description='Tanyakan apa saja!',examples=['Apa itu SDXL-Turbo?','Buatkan saya puisi tentang AI','Jelaskan konsep lubang hitam dengan sederhana'])
with A.TabItem('⨠Prompt Enhancer',id=2):
with A.Row(variant=H):
with A.Column():
A.Markdown('### đĒ **Ubah Ide Jadi Prompt Ajaib**\nCukup tulis ide sederhana, dan biarkan AI menyempurnakannya menjadi prompt yang detail dan artistik.');AP=A.Textbox(label='Ide Sederhana Anda',placeholder='Contoh: seekor astronot di hutan alien',lines=3);AQ=A.Button('Buat Prompt Ajaib!',variant=V);s=A.Textbox(label='Prompt yang Disempurnakan',lines=5,interactive=E,show_copy_button=E)
with A.Row():AR=A.Button('âĄī¸ Kirim & Pindah ke Generator')
with A.TabItem('đ AI Image Upscaler',id=3):
with A.Row(variant=H,equal_height=D):
with A.Column():A.Markdown('### **Tingkatkan Resolusi Gambar**\nUnggah gambar untuk meningkatkan kualitas dan ukurannya hingga 4x lipat menggunakan AI.');AS=A.Image(type='pil',label='Unggah Gambar Anda di Sini');AT=A.Slider(minimum=i,maximum=3.,value=i,step=.1,label='Tingkat Peningkatan Kejernihan',info='Setelah di-upscale 4x, atur kejernihan gambar di sini. 1.0 = Tanpa efek.');AU=A.Button('Tingkatkan Resolusi!',variant=V)
with A.Column():A.Markdown('### **Hasil Peningkatan Resolusi**');AV=A.Image(label='Gambar Hasil Upscale',interactive=D);AW=A.Markdown('Status: Menunggu gambar...')
with A.TabItem('đ Visitor Monitor',id=4):
with A.Row(variant=H):
with A.Column():
A.Markdown('### đ **Live Visitor Monitor**\nPantau jumlah total pengunjung aplikasi Anda secara real-time.')
with A.Row():
with A.Column(scale=3):d=A.Markdown('## đ Memuat data...')
with A.Column(scale=2):S=A.Radio([A1,x,y,z],label='Tampilkan data untuk',value=A1);AX=A.Button('đ Segarkan Manual',variant=A0)
e=A.LinePlot(x=F,y=L,title='Grafik Pertumbuhan Pengunjung',tooltip=[F,L],height=500,interactive=E)
with A.TabItem('âī¸ System & Settings',id=5):
with A.Row(variant=H):
with A.Column():A.Markdown('### **Live System Monitor**');t=A.Markdown('Memuat info sistem...');AY=A.Button('Trigger System Info',visible=D,elem_id='system-info-trigger-btn')
with A.Column():
A.Markdown('### **Pengaturan Aplikasi**')
with A.Accordion('Kualitas Model',open=E):A.Radio([A2,A3],value=A2 if K==U else A3,label='Presisi Model Generator',interactive=D,info='Terkunci. Pengaturan ini ditentukan saat aplikasi dimulai berdasarkan ketersediaan GPU Anda.')
with A.TabItem('đĄ Panduan Prompting',id=6):
with A.Row(variant=H):A.Markdown('## Cara Menjadi "Art Director" yang Hebat untuk AI...')
with A.TabItem('đ Blog & Updates',id=7):
with A.Row(variant=H):A.Markdown("### Perkembangan Terbaru dari RenXploit's AI Suite\n- **v2.4 (Pembaruan Terkini):** Upscaler di-upgrade dengan kontrol kejernihan, Visitor Monitor diperbaiki, dan UI Settings diperjelas.\n- **v2.3:** Perbaikan bug kritis untuk kompatibilitas dengan berbagai versi Gradio.\n- **v2.2:** Perbaikan bug untuk kompatibilitas Gradio.\n- **v2.1:** Menambahkan **Prompt Enhancer**, **AI Image Upscaler**, dan **Live System Monitor**.\n- **v2.0:** Perombakan Desain Total.\n- **Rencana Berikutnya:** Menjajaki model generator gambar yang berbeda dan fitur Inpainting/Outpainting. Nantikan!")
with A.TabItem('âšī¸ About & Support',id=8):
with A.Row(variant=H):
with A.Column():
A.Markdown('### Tentang Proyek dan Dukungan')
with A.Accordion("Tentang RenXploit's Creative AI Suite",open=E):A.Markdown("**RenXploit's Creative AI Suite** adalah proyek pribadi yang dibuat untuk mengeksplorasi kemampuan AI generatif dalam sebuah antarmuka yang mudah digunakan.\n **Bagian ini belum saya kerjakan dengan selesai** jadi jika anda ingin komplain atau ada hal apapun itu bisa report ke saya lewat website portofolio saya dengan url: https://ngoprek.xyz/contact")
with A.Accordion('Laporkan Masalah atau Beri Masukan'):AZ=A.Textbox(label='Nama Anda');Aa=A.Textbox(label='Email Anda (Opsional)');Ab=A.Textbox(label='Pesan Anda',lines=5,placeholder='Jelaskan masalah yang Anda temui atau ide yang Anda miliki...');Ac=A.Button('Kirim Laporan',variant=V);Ad=A.Markdown(visible=D)
A.Markdown("---\n",elem_classes='footer');AL.click(lambda:-1,outputs=r);q.click(fn=AD,inputs=[p,AI,AK,r,AJ],outputs=[AM,AN,q,AO]);Ac.click(fn=AE,inputs=[AZ,Aa,Ab],outputs=[Ad]);R.load(AB,inputs=B,outputs=B);R.load(fn=c,inputs=[S],outputs=[d,e]);AX.click(fn=c,inputs=[S],outputs=[d,e]);S.change(fn=c,inputs=[S],outputs=[d,e]);AQ.click(fn=AF,inputs=[AP],outputs=[s]);AR.click(fn=lambda prompt:(prompt,A.Tabs(selected=0)),inputs=[s],outputs=[p,AH]);AU.click(fn=AG,inputs=[AS,AT],outputs=[AV,AW]);AY.click(fn=o,inputs=B,outputs=t);R.load(fn=o,inputs=B,outputs=t)
if __name__=='__main__':R.launch(debug=E)