isaiah313-ai / app.py
endro2437's picture
TAMBAHKAN PARAMETER code=true
03b1be2 verified
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()