try: import gradio as gr import fitz from llama_cpp import Llama print("✅ Library berhasil di-install dan di-impor!") print(" Sekarang coba jalankan sel-sel berikutnya.") except ImportError as e: print(f"Terjadi error saat impor: {e}") # Path ke file model GGUF yang sudah Anda tambahkan model_path = "/kaggle/input/qwen-3/gguf/4b/1/Qwen3-4B-Q4_K_M.gguf" print("Memulai proses memuat model...") # Konfigurasi dan muat model menggunakan llama-cpp-python llm = Llama( model_path=model_path, n_gpu_layers=-1, # -1 berarti gunakan semua layer GPU yang tersedia, ini kuncinya! n_ctx=40960, # Ukuran konteks, 4096 token sudah cukup untuk banyak PDF verbose=False # Set ke False agar tidak terlalu banyak log ) print("🚀 Model berhasil dimuat!") # ================================================================ # LANGKAH 3 (VERSI DIPERBAIKI): FUNGSI INTI UNTUK MERINGKAS # ================================================================ def summarize_pdf(pdf_file_obj): # Kita ganti nama variabel agar lebih jelas """ Fungsi ini menerima objek file dari Gradio, membaca isinya, dan mengembalikan ringkasan dari model AI. """ if not pdf_file_obj: return "Mohon unggah file PDF terlebih dahulu." try: # --- Bagian 1: Membaca teks dari PDF --- # Perubahan ada di sini! Kita gunakan .name untuk mendapatkan path filenya. pdf_path = pdf_file_obj.name print(f"Membaca file PDF dari path: {pdf_path}") # Buka file menggunakan path-nya, bukan stream doc = fitz.open(pdf_path) full_text = "" for page in doc: full_text += page.get_text() doc.close() print("Teks berhasil diekstrak dari PDF.") # --- Bagian 2: Membuat prompt untuk AI --- # Bagian ini tidak berubah system_prompt = "Anda adalah asisten AI yang ahli dalam meringkas dokumen. Ringkaslah teks berikut dalam beberapa poin utama yang mudah dimengerti." prompt = f""" <|im_start|>system {system_prompt}<|im_end|> <|im_start|>user Teks dokumen: "{full_text}"<|im_end|> <|im_start|>assistant Tentu, ini adalah ringkasan dari dokumen tersebut: """ # --- Bagian 3: Memanggil model AI --- # Bagian ini juga tidak berubah print("Mengirim teks ke model untuk diringkas...") output = llm( prompt, max_tokens=2048, stop=["<|im_end|>"], echo=False, temperature=0.7 ) summary = output['choices'][0]['text'].strip() print("Ringkasan berhasil dibuat.") return summary except Exception as e: return f"Terjadi kesalahan: {e}" # ============================================= # LANGKAH 4: BANGUN ANTARMUKA DENGAN GRADIO # ============================================= with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown( """ # 🤖 AI PDF Summarizer (ditenagai oleh Qwen3-4B) Unggah file PDF Anda di bawah ini, dan AI akan membuatkan ringkasan untuk Anda. """ ) with gr.Row(): pdf_input = gr.File(label="Upload PDF", file_types=[".pdf"]) summary_output = gr.Textbox(label="Ringkasan", lines=15) summarize_button = gr.Button("Buat Ringkasan", variant="primary") summarize_button.click( fn=summarize_pdf, inputs=pdf_input, outputs=summary_output ) # Jalankan aplikasi! print("Menjalankan antarmuka Gradio...") demo.launch(debug=True) # share=True akan membuat link publik sementara