File size: 3,693 Bytes
22cc2f4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113

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