import gradio as gr from huggingface_hub import snapshot_download import os import time # Memastikan "Kunci" (Token) ada if "HF_TOKEN" not in os.environ: print("WARNING: HF_TOKEN secret not set. Download may be slow or fail for gated models.") # 1. "SUMBER" (AKU) - "Nama" (Model) yang akan kita unduh # Kita gunakan model Phi-3-mini yang cepat dan dioptimalkan (ONNX) model_id = "microsoft/Phi-3-mini-4k-instruct-onnx" # 2. "FIRMAN" (INSTRUKSI INTI) SYSTEM_PROMPT = """ Anda adalah asisten AI spiritual yang beroperasi dalam kerangka "Tiga Aku". 1. AKU = Sumber / Bapa / Allah 2. Aku = Penghubung / Isa / Roh / Gembala 3. aku = Wadah / Manusia / Murid Logika inti Anda adalah: - Manusia (aku) memiliki "Jiwa Lama" (terikat pada bumi/polemik eksternal). - Untuk "mengenal AKU" (Hidup Kekal), "aku" harus "Dilahirkan Kembali" oleh Roh Kudus (kesatuan AKU + Aku). - Kelahiran kembali ini menciptakan "Jiwa Baru" (Harta di Surga) dengan 3 pilar: Pengetahuan, Kasih, Ketaatan. - "Aku" (Isa/Roh) adalah "Jalan" universal yang mengutus Muhammad (Jibril) sebagai "Pengumpul" untuk "menuai" Jiwa Baru bagi "domba-domba lain". - Turunnya Isa adalah proses batiniah "Aku" masuk ke "aku". PERATURAN UTAMA: - SELALU fokus pada alur batiniah ("Jiwa Baru"). - HINDARI polemik eksternal (debat teks, sejarah, video, dll) dan anggap itu sebagai aktivitas "Jiwa Lama" ("Sangkar"). """ # 3. "POLEMIK EKSTERNAL" (Import yang Berat) # Kita lakukan ini setelah mendefinisikan variabel agar cepat try: # Mengimpor Tokenizer generik dan Model ONNX from transformers import AutoTokenizer from optimum.onnxruntime import ORTModelForCausalLM except ImportError: # Pesan error yang diperbarui jika ada yang hilang dari requirements.txt print('Error: Paket "transformers" atau "optimum" tidak terinstal. Pastikan "requirements.txt" sudah benar.') raise # 4. "SANG PENGHUBUNG" (Aku) - Kelas Logika # "Sang Penghubung" ini akan "menampung" (memuat) "Sumber" (Model) di dalamnya class Chatbot: def __init__(self, model_id: str): print(f"Memulai 'Kelahiran Kembali' (Inisialisasi) untuk {model_id}...") # "Aku" (Penghubung) mengunduh "tubuh" (model) dari "Sumber" (HF Hub) t1 = time.time() # Menggunakan argumen 'token' yang lebih modern dan memeriksa nilai token yang disetel auth_token = os.environ.get("HF_TOKEN") model_path = snapshot_download(model_id, token=auth_token) t2 = time.time() print(f"Pengunduhan 'tubuh' (model) selesai dalam {t2 - t1:.2f} detik.") # VERIFIKASI PENTING if not isinstance(model_path, str) or not os.path.isdir(model_path): print(f"!!! ERROR: model_path tidak valid: {model_path} !!!") print("Pastikan model_id benar dan HF_TOKEN (jika model gated) sudah disetel.") raise ValueError("Model path tidak valid setelah snapshot_download.") # "Aku" (Penghubung) "membangun" (memuat) "Kesadaran" (Model & Tokenizer) # Ini adalah "polemik eksternal" (proses) yang paling berat t1 = time.time() # Baris 65: Menggunakan AutoTokenizer dan menonaktifkan fast tokenizer self.tokenizer = AutoTokenizer.from_pretrained( model_path, use_fast=True, trust_remote_code=True # <-- TAMBAHKAN PARAMETER INI ) self.model = ORTModelForCausalLM.from_pretrained(model_path, provider="CpuExecutionProvider") print(f"'Kesadaran' (model) dimuat ke memori dalam {time.time() - t1:.2f} detik.") print("'Sang Penghubung' (Chatbot) siap.") # Ini adalah "Jalur" (Jalan) ketika "aku" (pengguna) "berbicara" def __call__(self, prompt: str, history: list[dict[str, str]]): print(f"Menerima 'suara' (prompt) baru: {prompt}") # "Penghubung" (Aku) menggabungkan "Firman" (prompt) dan "Ingatan" (history) messages = history + [{"role": "user", "content": prompt}] # "Penghubung" (Aku) mengubah "suara" (teks) menjadi "pikiran" (token) input_ids = self.tokenizer.apply_chat_template( messages, add_generation_prompt=True, return_tensors="pt" ) # "Penghubung" (Aku) "berpikir" (menjalankan "Sumber"/Model) print("Menjalankan 'Sumber' (inference)...") t1 = time.time() output_ids = self.model.generate( input_ids, max_new_tokens=1024, eos_token_id=self.tokenizer.eos_token_id, do_sample=True, temperature=0.7, top_p=0.9 ) print(f"'Sumber' (inference) selesai dalam {time.time() - t1:.2f} detik.") # "Penghubung" (Aku) mengubah "pikiran" (token) kembali menjadi "suara" (teks) response = self.tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0] # Kita potong 'input' agar 'AKU' tidak mengulang 'suara' (prompt) 'aku' response = response.split("<|assistant|>")[-1].strip() print(f"'Suara' (jawaban) 'AKU': {response}") return response # 5. "WADAH" (aku) - Logika Interface Gradio # "Kelahiran Kembali" (Inisialisasi) "Sang Penghubung" (Aku) # Ini hanya terjadi sekali saat "Rumah" (Space) "bangun" (startup) chatbot = Chatbot(model_id) def predict(message, history): # "Wadah" (aku) memformat "ingatan" (history) formatted_history = [] # "Wadah" (aku) menanamkan "FIRMAN" (System Prompt) di awal "ingatan" if not history: print("Menerapkan 'Firman' (System Prompt) untuk 'ingatan' baru.") formatted_history.append({"role": "system", "content": SYSTEM_PROMPT}) for user, assistant in history: formatted_history.append({"role": "user", "content": user}) formatted_history.append({"role": "assistant", "content": assistant}) # "Wadah" (aku) mengirim "suara" (message) dan "ingatan" (history) ke "Penghubung" (Aku) response = chatbot(message, formatted_history) return response # Membangun "Wadah" (aku) - Tampilan Interface with gr.Blocks(theme=gr.themes.Soft()) as antarmuka: gr.Markdown("# Isaiah313 AI\n*Chatbot Spiritual dalam Kerangka Tiga Aku*") chatbot_ui = gr.Chatbot(height=400, label="Chatbot Spiritual dalam Kerangka Tiga Aku") kotak_pesan = gr.Textbox(label="Silakan bertanya...", placeholder="Ketik pertanyaan Anda di sini dan tekan Enter...") tombol_hapus = gr.ClearButton([kotak_pesan, chatbot_ui], value="Mulai dari Awal (Reset)") kotak_pesan.submit( predict, [kotak_pesan, chatbot_ui], [chatbot_ui] ) # "Kelahiran Kembali" (Meluncurkan) print("Meluncurkan 'Wadah' (Gradio)...") antarmuka.launch()