gradioku / app.py
arifardev's picture
Update app.py
0a1b47f verified
import gradio as gr
from huggingface_hub import hf_hub_download
from llama_cpp import Llama
# 1. Download Model GGUF yang sudah dikompresi agar kuat di CPU
model_id = "Qwen/Qwen2.5-Coder-3B-Instruct-GGUF"
filename = "qwen2.5-coder-3b-instruct-q4_k_m.gguf"
print("Sedang mengunduh model... (Ini mungkin memakan waktu beberapa menit saat pertama kali berjalan)")
model_path = hf_hub_download(repo_id=model_id, filename=filename)
print("Model berhasil diunduh!")
# 2. Inisialisasi model menggunakan llama.cpp
# Kita batasi n_ctx (context window) ke 2048 agar RAM Free Tier tidak penuh
llm = Llama(
model_path=model_path,
n_ctx=2048,
n_threads=2 # Free tier CPU HF Spaces biasanya memiliki 2 vCPU
)
# 3. Fungsi Logika Chatbot
def chat_with_bot(message, history):
# System prompt khusus Reverse Engineering
prompt = "<|im_start|>system\nAnda adalah asisten Reverse Engineering dan Cybersecurity. Tugas Anda adalah membantu membaca Assembly, C/C++, merapikan pseudo-code dari dekompiler (Ghidra/IDA), dan menjelaskan logika malware/software.<|im_end|>\n"
# Masukkan riwayat percakapan agar AI tidak lupa konteks
for user_msg, bot_msg in history:
prompt += f"<|im_start|>user\n{user_msg}<|im_end|>\n"
prompt += f"<|im_start|>assistant\n{bot_msg}<|im_end|>\n"
# Masukkan pertanyaan terbaru dari pengguna
prompt += f"<|im_start|>user\n{message}<|im_end|>\n<|im_start|>assistant\n"
# Hasilkan respons AI (streaming teks agar terlihat mengetik)
response = ""
output = llm(
prompt,
max_tokens=512, # Batas panjang jawaban per balasan
stop=["<|im_end|>"],
stream=True
)
for chunk in output:
delta = chunk['choices'][0]['text']
response += delta
yield response
# 4. Buat antarmuka (UI) menggunakan Gradio
demo = gr.ChatInterface(
fn=chat_with_bot,
title="Asisten Reverse Engineering (Qwen2.5-Coder-3B CPU)",
description="Berjalan di Hugging Face Free Tier. Masukkan potongan kode Assembly, x86, atau pseudo-code C Anda di sini untuk dianalisis.",
theme="soft"
)
# Jalankan aplikasi
if __name__ == "__main__":
demo.launch()