Spaces:
Runtime error
Runtime error
| 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() | |