Ap='FP32 (Lambat, Kualitas Terbaik)'
Ao='FP16 (Cepat, Kualitas Baik)'
An='Semua Waktu'
Am='contain'
Al='http://127.0.0.1:7860/'
Ak='Grayscale'
Aj='### ⓘ Detail Gambar\nKlik pada sebuah gambar untuk melihat detailnya.'
Ai='3 Bulan Terakhir'
Ah='2 Minggu Terakhir'
Ag='1 Minggu Terakhir'
Af='caidas/swin2sr-realworld-sr-x4-64-bsrgan-psnr'
Ae='User Agent'
Ad='IP Address'
Ac=ImportError
AJ='%Y-%m-%d %H:%M:%S'
y='secondary'
x='N/A'
w='Filename'
v='cuda'
m='primary'
l='Steps'
k='NegativePrompt'
j='utf-8'
i=str
h=Exception
g=open
b='Seed'
a='Prompt'
Z=len
T='history'
S=1.
R='Total Pengunjung'
O='title'
N=''
M=int
G='panel'
F='Timestamp'
E=print
D=True
C=False
B=None
import gradio as A,torch as H,numpy as z
from diffusers import DiffusionPipeline as Aq
import random as AK,time as A0,os as K
from datetime import datetime as n,timedelta as A1
import csv as o,pandas as I,threading as Ar
from PIL import Image as AL,ImageEnhance as c
from pathlib import Path
import uuid,urllib.parse
try:import psutil as p,platform as q;from transformers import Swin2SRForImageSuperResolution as A2,Swin2SRImageProcessor as AM;E('✅ Library tambahan (psutil, transformers) berhasil diimpor.')
except Ac:E("❌ Peringatan: Library 'psutil' atau 'transformers' tidak ditemukan. Fitur System Monitor & Upscaler tidak akan berfungsi.");p=B;q=B;A2=B;AM=B
try:import google.generativeai as r;E("✅ Library 'google-generativeai' berhasil diimpor.")
except Ac:E("❌ Peringatan: Library 'google-generativeai' tidak ditemukan. Fitur Chatbot & Prompt Enhancer tidak akan berfungsi.");r=B
As='\n
\n \n \n RenXploit\'s Creative AI Suite\n \n \n \n \n \n\n'
L='visitor_log.csv'
P='generation_log.csv'
U=Path('generated_images')
V=Ar.Lock()
Q=v if H.cuda.is_available()else'cpu'
E(f"➡️ Menggunakan device: {Q.upper()}")
def At():
if not K.path.exists(L):
with V:
if not K.path.exists(L):
with g(L,mode='w',newline=N,encoding=j)as A:B=o.writer(A);B.writerow([F,Ad,Ae])
E(f"✅ File log '{L}' berhasil dibuat.")
U.mkdir(exist_ok=D)
if not K.path.exists(P):
with V:
if not K.path.exists(P):
with g(P,mode='w',newline=N,encoding=j)as A:B=o.writer(A);B.writerow([F,w,a,k,b,l])
E(f"✅ File log riwayat '{P}' dan direktori '{U}' siap.")
At()
E('➡️ Memuat model SDXL-Turbo...')
AN=Aq.from_pretrained('stabilityai/sdxl-turbo',torch_dtype=H.float16 if Q==v else H.float32,variant='fp16'if Q==v else B,use_safetensors=D).to(Q)
if H.cuda.is_available():AN.enable_xformers_memory_efficient_attention()
E('✅ Model SDXL-Turbo berhasil dimuat.')
A3=B
A4=B
if A2:
try:E('➡️ Memuat model AI Upscaler (Swin2SR)...');A3=A2.from_pretrained(Af).to(Q);A4=AM.from_pretrained(Af);E('✅ Model AI Upscaler berhasil dimuat.')
except h as Au:E(f"❌ Gagal memuat model Upscaler: {Au}. Fitur upscale akan dinaktifkan.")
class Av:
def __init__(A):
A.api_keys=[];A.is_configured=C
if not r:return
B=1
while D:
F=K.getenv(f"GEMINI_API_KEY_{B}")
if F:A.api_keys.append(F);B+=1
else:break
if A.api_keys:E(f"✅ Berhasil memuat {Z(A.api_keys)} API Key Gemini. Sistem rotasi aktif.");A.is_configured=D
else:E('❌ PERINGATAN: Tidak ada API Key Gemini yang ditemukan. Fitur AI Chat & Prompt Enhancer tidak akan berfungsi.')
def chat(B,message,history,system_prompt=B):
K='parts';J='role';F=system_prompt;D=history;C=message
if not B.is_configured:return'Maaf, fitur ini tidak terkonfigurasi karena tidak ada API Key.'
try:
L=AK.choice(B.api_keys);r.configure(api_key=L);M=r.GenerativeModel('gemini-2.5-flash');A=[]
for(G,H)in D:
if G:A.append({J:'user',K:[G]})
if H:A.append({J:'model',K:[H]})
N=M.start_chat(history=A);I=C
if F and not D:I=f"{F}\n\nUser query: {C}"
O=N.send_message(I);return O.text
except h as P:E(f"❌ Terjadi error pada API Key Gemini: {P}");return'Terjadi kesalahan saat menghubungi API AI. Mungkin salah satu API Key tidak valid atau ada masalah jaringan. Silakan coba lagi.'
s=Av()
def Aw(request):
A=request;C=n.now().strftime(AJ);B=A.client.host if A else x;D=A.headers.get('user-agent','Unknown')if A else x
with V:
with g(L,mode='a',newline=N,encoding=j)as F:G=o.writer(F);G.writerow([C,B,D])
E(f"✅ Pengunjung baru tercatat: IP {B}")
def Ax(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=AK.randint(0,2**32-1)
D=H.manual_seed(B);E=AN(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 Ay(prompt,negative_prompt,steps,seed,num_images):
G=steps;F=negative_prompt;E=prompt;yield(A.update(visible=C),A.update(visible=D,value="
AI sedang melukis mahakarya Anda...
"),A.update(interactive=C),A.update(visible=C));J=A0.time();H,B=Ax(E,F,M(G),M(seed),M(num_images));K=A0.time();L=n.now().strftime(AJ)
for(O,Q)in enumerate(H):
I=f"{M(A0.time())}_{B}_{O}.png";R=U/I;Q.save(R)
with V:
with g(P,mode='a',newline=N,encoding=j)as S:T=o.writer(S);T.writerow([L,I,E,F,B,M(G)])
W=K-J;X=f"Seed yang digunakan: {B}\nTotal waktu generasi: {W:.2f} detik";yield(A.update(value=H,visible=D),A.update(visible=C),A.update(interactive=D),A.update(value=X,visible=D))
def Az(name,email,message):
B=message
if not name or not B:A.Warning('Nama dan Pesan tidak boleh kosong!');return A.update(visible=C)
F=n.now().strftime(AJ);G=f"""--- Laporan Baru ({F}) ---
Nama: {name}
Email: {email}
Pesan: {B}
"""
with g('reports.log','a',encoding=j)as H:H.write(G)
E('✅ Laporan baru telah disimpan ke reports.log');return A.update(value='✅ Terima kasih! Laporan Anda telah kami terima.',visible=D)
def A5(time_filter):
J='## 📈 0';G=time_filter
try:
with V:
if not K.path.exists(L)or K.path.getsize(L)==0:return J,I.DataFrame({F:[],R:[]})
P=[F,Ad,Ae];A=I.read_csv(L,header=B,names=P)
if not A.empty and A.iloc[0][F]==F:A=A.iloc[1:].reset_index(drop=D)
if A.empty:return J,I.DataFrame({F:[],R:[]})
A[F]=I.to_datetime(A[F],errors='coerce');A.dropna(subset=[F],inplace=D)
if A.empty:return J,I.DataFrame({F:[],R:[]})
Q=Z(A);M=f"## 📈 {Q:,}";A[R]=z.arange(1,Z(A)+1);H=n.now()
if G==Ag:C=A[A[F]>=H-A1(weeks=1)]
elif G==Ah:C=A[A[F]>=H-A1(weeks=2)]
elif G==Ai:C=A[A[F]>=H-A1(days=90)]
else:C=A
if C.empty:return M,I.DataFrame({F:[],R:[]})
return M,C
except h as N:O=f"Error saat memperbarui monitor: {N}";E(f"❌ {O}");return f"## ⚠️ Error: {N}",I.DataFrame({'Error':[O]})
def A_(simple_prompt):
B=simple_prompt
if not B:A.Warning('Tolong masukkan ide Anda terlebih dahulu.');return N
if not s.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, gaya seni, komposisi, dan kualitas. Hasilkan HANYA prompt-nya saja dalam format teks panjang, tanpa penjelasan atau kalimat pembuka/penutup.';yield'🧠 AI sedang meracik prompt ajaib untuk Anda...';D=s.chat(B,[],system_prompt=C);yield D
def B0(image_to_upscale,clarity_strength):
G=image_to_upscale;F=clarity_strength
if G is B:raise A.Error('Silakan unggah gambar terlebih dahulu.')
if A3 is B or A4 is B:raise A.Error('Fitur Upscaler tidak aktif karena model gagal dimuat.')
yield(B,'🚀 Memproses peningkatan resolusi 4x oleh AI...')
try:
with H.no_grad():J=A4(G,return_tensors='pt').to(Q);K=A3(**J);D=K.reconstruction.data.squeeze().float().cpu().clamp_(0,1).numpy();D=z.moveaxis(D,source=0,destination=-1);D=(D*255.).round().astype(z.uint8);C=AL.fromarray(D)
if F>S:yield(C,f"✨ Menerapkan peningkatan kejernihan (Strength: {F:.2f})...");L=c.Sharpness(C);C=L.enhance(F)
yield(C,f"✅ Gambar berhasil ditingkatkan! Resolusi akhir: {C.width}x{C.height}px.")
except h as I:E(f"❌ Error saat upscaling: {I}");yield(B,f"⚠️ Terjadi error saat upscaling: {I}")
def AO():
if not p or not q:return'Informasi sistem tidak tersedia (library psutil tidak ditemukan).'
D=p.cpu_percent(interval=B);A=p.virtual_memory();C='Tidak terdeteksi (PyTorch tidak menemukan CUDA)'
if H.cuda.is_available():E=H.cuda.get_device_name(0);F=H.cuda.memory_allocated(0)/1024**3;G=H.cuda.get_device_properties(0).total_memory/1024**3;C=f"GPU: {E}\nVRAM Terpakai: {F:.2f} GB / {G:.2f} GB"
I=f"**Platform:** `{q.system()} {q.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}"
def AP():
G='### 📂 Riwayat Kosong\nBelum ada gambar yang dihasilkan.'
try:
with V:
if not K.path.exists(P):return[],I.DataFrame(),G
A=I.read_csv(P)
if A.empty:return[],A,G
B=A.sort_values(by=F,ascending=C);H=[i(U/A)for A in B[w]if(U/A).exists()];return H,B,Aj
except h as D:E(f"❌ Error memuat riwayat: {D}");return[],I.DataFrame(),f"### ⚠️ Error\nTidak dapat memuat riwayat: {D}"
def B1(evt,history_df):
G=history_df
if not evt.selected or G.empty:return'### ⓘ Detail Gambar\nKlik gambar untuk melihat detailnya.',A.update(visible=C),A.update(visible=C),B
H=evt.index;E=G.iloc[H];I=f"""
**Prompt:** `{E[a]}`
**Negative Prompt:** `{E.get(k,x)}`
---
**Seed:** `{E[b]}` | **Steps:** `{E[l]}`
**File:** `{E[w]}` | **Dibuat:** `{E[F]}`
""";return I,A.update(visible=D),A.update(visible=C),H
def B2(selected_index,history_df):
E=history_df;D=selected_index
if D is B or E.empty:return A.update(),A.update(),A.update(),A.update(),A.update()
C=E.iloc[D];return C[a],C.get(k,N),C[b],C[l],A.Tabs(selected=0)
def B3(selected_index,history_df):
D=history_df;C=selected_index
if C is B or D.empty:return A.update(),A.update()
E=D.iloc[C];F=i(U/E[w]);return AL.open(F),A.Tabs(selected=5)
def A6(image,brightness,contrast,saturation,sharpness,filter_choice):
H=filter_choice;G=image
if G is B:return
A=G.copy()
if H==Ak:A=A.convert('L').convert('RGB')
elif H=='Sepia':
K=A.load();L,N=A.size
for I in range(N):
for J in range(L):D,E,F=A.getpixel((J,I));O,P,Q=M(.393*D+.769*E+.189*F),M(.349*D+.686*E+.168*F),M(.272*D+.534*E+.131*F);K[J,I]=min(255,O),min(255,P),min(255,Q)
C=c.Brightness(A);A=C.enhance(brightness);C=c.Contrast(A);A=C.enhance(contrast);C=c.Color(A);A=C.enhance(saturation);C=c.Sharpness(A);A=C.enhance(sharpness);return A
def B4(selected_index,history_df,request):
H=history_df;G=selected_index;F=request
if G is B or H.empty:A.Warning('Pilih gambar terlebih dahulu sebelum membagikan.');return A.update(visible=C)
E=H.iloc[G];I=i(F.url).split('?')[0]if F and hasattr(F,'url')else Al;J={'prompt':E[a],'neg':E.get(k,N),'seed':E[b],'steps':E[l]};K=urllib.parse.urlencode(J);L=f"{I}?__theme=dark&{K}";M=f"""
**URL untuk Berbagi & Isi Ulang Generator:**
`{L}`
---
**Detail untuk Disalin:**
- **Prompt:** {E[a]}
- **Negative:** {E.get(k,x)}
- **Seed:** {E[b]}
- **Steps:** {E[l]}
""";return A.update(value=M,visible=D)
def B5(chat_id,all_chats_history,request):
G=request;F=all_chats_history;B=chat_id
if not B or B not in F:return A.update(visible=C)
H=F[B][T]
if not H:return A.update(visible=C)
I=i(G.url).split('?')[0]if G and hasattr(G,'url')else Al;L=F[B][O];M=f"{I}chat/{B}?__theme=dark";E=f"### Riwayat Chat: {L}\n";E+=f"**URL Sesi:** `{I}`\n---\n"
for(J,K)in H:
if J:E+=f"\n**👤 Anda:**\n{J}\n"
if K:E+=f"\n**🤖 AI:**\n{K}\n"
return A.update(value=E,visible=D)
def A7(all_chats_history):C=all_chats_history;D=i(uuid.uuid4());C[D]={O:'Percakapan Baru',T:[(B,'Halo! Saya Flood, asisten AI dari RenXploit. Ada yang bisa saya bantu?')]};E=[A[O]for A in C.values()];return C,D,C[D][T],A.update(choices=E,value=C[D][O])
def AQ(user_message,chat_id,all_chats_history):
H=user_message;G=chat_id;F=all_chats_history
if not G or G not in F:F,G,E,L=A7({})
E=F[G][T]
if Z(E)==1 and E[0][0]is B:E=[]
E.append((H,B));F[G][T]=E
if Z(E)==1:I=H[:30]+'...'if Z(H)>30 else H;F[G][O]=I
J=[A[O]for A in F.values()];yield(F,E,A.update(choices=J,value=F[G][O]),A.update(value=N),A.update(visible=C));K=s.chat(H,[A for A in E if A[0]is not B]);E[-1]=H,K;F[G][T]=E;yield(F,E,A.update(),A.update(),A.update(visible=D))
def B6(selected_title,all_chats_history):
G=all_chats_history;F=selected_title
if not F:return B,[],A.update(visible=C)
E=B
for(H,I)in G.items():
if I[O]==F:E=H;break
if E:return E,G[E][T],A.update(visible=D)
return B,[],A.update(visible=C)
with A.Blocks(theme=A.themes.Base(),head=As)as d:
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');J=A.State({});W=A.State(B);t=A.State(B)
with A.Tabs()as A8:
with A.TabItem('🎨 Image Generator',id=0):
with A.Row(variant=G,equal_height=C):
with A.Column(scale=1):
A.Markdown('### 📝 **Masukan Perintah Anda**');A9=A.Textbox(label=a,placeholder='Contoh: Cinematic photo, seekor rubah merah...',lines=3,info='Jadilah sangat spesifik! Atau gunakan Prompt Enhancer.');AR=A.Textbox(label='Prompt Negatif',placeholder='Contoh: blurry, low quality, bad hands...',lines=2,info='Hal-hal yang TIDAK Anda inginkan.');B7=A.Slider(minimum=1,maximum=8,value=2,step=1,label='Jumlah Gambar');AS=A.Button('✨ Hasilkan Gambar!',variant=m)
with A.Accordion('⚙️ Opsi Lanjutan',open=C):
AT=A.Slider(minimum=1,maximum=5,value=2,step=1,label='Langkah Iterasi (Kualitas vs Kecepatan)')
with A.Row():AA=A.Number(label=b,value=-1,precision=0,info='Gunakan -1 untuk acak.');B8=A.Button('🎲 Acak',variant=y)
with A.Column(scale=2):A.Markdown('### 🖼️ **Hasil Generasi**');B9=A.Gallery(label='Hasil Gambar',show_label=C,elem_id='gallery',columns=2,object_fit=Am,height='auto');BA=A.HTML(visible=C);BB=A.Textbox(label='Informasi Generasi',visible=C,interactive=C,lines=2)
with A.TabItem('💬 Chat with AI',id=1):
with A.Row(variant=G):
with A.Column(scale=1,min_width=250)as Bc:
A.Markdown('### 🗂️ Riwayat Chat');BC=A.Button('➕ Obrolan Baru',variant=m)
with A.Group(elem_id='chat-history-sidebar'):X=A.Radio(label='Pilih Obrolan',choices=[],interactive=D)
with A.Row(visible=C)as AB:BD=A.Button('🔗 Bagikan Chat')
BE=A.Textbox(label='Salin Konten Chat',lines=10,interactive=D,show_copy_button=D,visible=C)
with A.Column(scale=3):
A.Markdown('### 🤖 **Asisten AI Flood**')
if not s.is_configured:A.Warning('Fitur Chatbot dinonaktifkan. API Key Gemini tidak terkonfigurasi.')
else:
with A.Column(elem_id='chatbot-container'):
e=A.Chatbot(elem_id='chatbot-display',label='Flood AI',bubble_full_width=C)
with A.Row():f=A.Textbox(show_label=C,placeholder='Ketik pesan Anda di sini...',scale=5);BF=A.Button('Kirim',variant=y,scale=1)
with A.TabItem('✨ Prompt Enhancer',id=2):
with A.Row(variant=G):
with A.Column():A.Markdown('### 🪄 **Ubah Ide Jadi Prompt Ajaib**\nCukup tulis ide sederhana, dan biarkan AI menyempurnakannya menjadi prompt yang detail dan artistik.');BG=A.Textbox(label='Ide Sederhana Anda',placeholder='Contoh: seekor astronot di hutan alien',lines=3);BH=A.Button('Buat Prompt Ajaib!',variant=m);AU=A.Textbox(label='Prompt yang Disempurnakan',lines=5,interactive=D,show_copy_button=D);BI=A.Button('➡️ Kirim & Pindah ke Generator')
with A.TabItem('🚀 AI Image Upscaler',id=3):
with A.Row(variant=G,equal_height=C):
with A.Column():A.Markdown('### **Tingkatkan Resolusi Gambar**\nUnggah gambar untuk meningkatkan kualitas dan ukurannya hingga 4x lipat menggunakan AI.');BJ=A.Image(type='pil',label='Unggah Gambar Anda di Sini');BK=A.Slider(minimum=S,maximum=3.,value=S,step=.1,label='Tingkat Peningkatan Kejernihan',info='Setelah di-upscale 4x, atur kejernihan gambar di sini. 1.0 = Tanpa efek.');BL=A.Button('Tingkatkan Resolusi!',variant=m)
with A.Column():A.Markdown('### **Hasil Peningkatan Resolusi**');BM=A.Image(label='Gambar Hasil Upscale',interactive=C,show_download_button=D);BN=A.Markdown('Status: Menunggu gambar...')
with A.TabItem('🖼️ Galeri & Riwayat',id=4)as BO:
with A.Row(variant=G):
with A.Column(scale=2):A.Markdown('### **Galeri Hasil Generasi Anda**');AC=A.Gallery(label='Riwayat Gambar',show_label=C,columns=4,object_fit=Am,height='auto',elem_id='history_gallery');Y=A.State()
with A.Column(scale=1):
A.Markdown('### **Detail & Aksi**');AD=A.Markdown(Aj);BP=A.Button('🔄 Segarkan Galeri',variant=y)
with A.Row(visible=C)as BQ:BR=A.Button('Kirim ke Generator');BS=A.Button('Kirim ke Editor');BT=A.Button('🔗 Bagikan Detail')
AV=A.Textbox(label='URL & Detail untuk Dibagikan',lines=8,interactive=D,show_copy_button=D,visible=C)
with A.TabItem('🎨 Image Editor',id=5):
with A.Row(variant=G):
with A.Column(scale=1):
A.Markdown('### **Toolkit Pasca-Produksi**');AE=A.Image(type='pil',label='Unggah Gambar atau Kirim dari Riwayat')
with A.Accordion('Penyesuaian',open=D):AW=A.Slider(minimum=.5,maximum=1.5,value=S,step=.05,label='Kecerahan');AX=A.Slider(minimum=.5,maximum=1.5,value=S,step=.05,label='Kontras');AY=A.Slider(minimum=.0,maximum=2.,value=S,step=.05,label='Saturasi Warna');AZ=A.Slider(minimum=.0,maximum=3.,value=S,step=.1,label='Ketajaman')
with A.Accordion('Filter Cepat',open=D):Aa=A.Radio(['None',Ak,'Sepia'],label='Pilih Filter',value='None')
with A.Column(scale=1):A.Markdown('### **Hasil Editing**');AF=A.Image(label='Hasil Akhir',interactive=C,show_download_button=D)
with A.TabItem('📊 Visitor Monitor',id=6):
with A.Row(variant=G):
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):AG=A.Markdown('## 📈 Memuat data...')
with A.Column(scale=2):u=A.Radio([An,Ag,Ah,Ai],label='Tampilkan data untuk',value=An);BU=A.Button('🔄 Segarkan Manual',variant=y)
AH=A.LinePlot(x=F,y=R,title='Grafik Pertumbuhan Pengunjung',tooltip=[F,R],height=500,interactive=D)
with A.TabItem('⚙️ System & Settings',id=7):
with A.Row(variant=G):
with A.Column():A.Markdown('### **Live System Monitor**');Ab=A.Markdown('Memuat info sistem...');BV=A.Button('Trigger System Info',visible=C,elem_id='system-info-trigger-btn')
with A.Column():
A.Markdown('### **Pengaturan Aplikasi**')
with A.Accordion('Kualitas Model',open=D):A.Radio([Ao,Ap],value=Ao if Q==v else Ap,label='Presisi Model Generator',interactive=C,info='Terkunci. Ditentukan saat aplikasi dimulai.')
with A.TabItem('💡 Panduan Prompting',id=8):
with A.Row(variant=G):A.Markdown('## Cara Menjadi "Art Director" yang Hebat untuk AI...\n (Konten panduan Anda di sini)')
with A.TabItem('📖 Blog & Updates',id=9):
with A.Row(variant=G):A.Markdown("### Perkembangan Terbaru dari RenXploit's AI Suite\nv3.0 (Perbaikan Kritis): Memperbaiki bug pada fitur Share URL dan Share Detail Galeri yang disebabkan oleh perbedaan versi Gradio dan logika event yang salah.\nv2.8: Mengganti komponen `gr.Box` dengan `gr.Group` untuk kompatibilitas.\nv2.7: Perombakan total UI Chatbot dengan fitur riwayat, new chat, dan share.\nRencana Berikutnya: Menjajaki model generator gambar yang berbeda dan fitur Inpainting/Outpainting.")
with A.TabItem('ℹ️ About & Support',id=10):
with A.Row(variant=G):
with A.Column():
A.Markdown('### Tentang Proyek dan Dukungan')
with A.Accordion("Tentang RenXploit's Creative AI Suite",open=D):A.Markdown("\n RenXploit's Creative AI Suite adalah proyek pribadi untuk mengeksplorasi AI generatif.\n Hubungi saya melalui: ngoprek.xyz/contact\n ")
with A.Accordion('Laporkan Masalah atau Beri Masukan'):BW=A.Textbox(label='Nama Anda');BX=A.Textbox(label='Email Anda (Opsional)');BY=A.Textbox(label='Pesan Anda',lines=5,placeholder='Jelaskan masalah atau ide Anda...');BZ=A.Button('Kirim Laporan',variant=m);Ba=A.Markdown(visible=C)
A.Markdown("---\n",elem_classes='footer');d.load(Aw,inputs=B,outputs=B);d.load(fn=A7,inputs=[J],outputs=[J,W,e,X]);B8.click(lambda:-1,outputs=AA);AS.click(fn=Ay,inputs=[A9,AR,AT,AA,B7],outputs=[B9,BA,AS,BB]);BC.click(fn=A7,inputs=[J],outputs=[J,W,e,X]);BF.click(fn=AQ,inputs=[f,W,J],outputs=[J,e,X,f,AB]);f.submit(fn=AQ,inputs=[f,W,J],outputs=[J,e,X,f,AB]);X.change(fn=B6,inputs=[X,J],outputs=[W,e,AB]);BD.click(fn=B5,inputs=[W,J],outputs=[BE]);BH.click(fn=A_,inputs=[BG],outputs=[AU]);BI.click(fn=lambda prompt:(prompt,A.Tabs(selected=0)),inputs=[AU],outputs=[A9,A8]);BL.click(fn=B0,inputs=[BJ,BK],outputs=[BM,BN]);BO.select(fn=AP,inputs=B,outputs=[AC,Y,AD]);BP.click(fn=AP,inputs=B,outputs=[AC,Y,AD]);AC.select(fn=B1,inputs=[Y],outputs=[AD,BQ,AV,t]);BR.click(fn=B2,inputs=[t,Y],outputs=[A9,AR,AA,AT,A8]);BS.click(fn=B3,inputs=[t,Y],outputs=[AE,A8]);BT.click(fn=B4,inputs=[t,Y],outputs=[AV]);AI=[AE,AW,AX,AY,AZ,Aa]
for Bb in[AW,AX,AY,AZ]:Bb.release(fn=A6,inputs=AI,outputs=AF)
Aa.change(fn=A6,inputs=AI,outputs=AF);AE.change(fn=A6,inputs=AI,outputs=AF);d.load(fn=A5,inputs=[u],outputs=[AG,AH]);BU.click(fn=A5,inputs=[u],outputs=[AG,AH]);u.change(fn=A5,inputs=[u],outputs=[AG,AH]);BV.click(fn=AO,inputs=B,outputs=Ab);d.load(fn=AO,inputs=B,outputs=Ab);BZ.click(fn=Az,inputs=[BW,BX,BY],outputs=[Ba])
if __name__=='__main__':d.launch(debug=D)