File size: 4,615 Bytes
103086e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
114
115
116
117
118
119
120
121
122
123
124
import gradio as gr
import logging
import os
from groq import Groq
from dotenv import load_dotenv

load_dotenv()

logging.basicConfig(level=logging.INFO, filename="chatbot_v10.log", filemode="a",
                    format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)

client = Groq(api_key=os.getenv('GROQ_API_KEY'))

def generate_response_groq(user_input: str, current_history: list) -> str:
    """

    Menghasilkan respons dari Groq API berdasarkan input pengguna dan riwayat percakapan.

    

    Args:

        user_input (str): Pesan yang dimasukkan oleh pengguna.

        current_history (list): Riwayat percakapan Gradio, berupa list of tuples (user_msg, bot_msg).



    Returns:

        str: Respons dari asisten AI.

    """
    try:
        messages_for_api = []
        for user_msg, bot_msg in current_history:
            messages_for_api.append({"role": "user", "content": user_msg})
            messages_for_api.append({"role": "assistant", "content": bot_msg})
        
        messages_for_api.append({"role": "user", "content": user_input})

        system_prompt = {
            "role": "system",
            "content": "Anda adalah asisten AI yang profesional, ramah, dan membantu. Berikan respons dalam bahasa yang digunakan pengguna."
        }
        
        messages = [system_prompt] + messages_for_api
        
        if len(messages) > 100:
            messages[:] = messages[-100:] 

        chat_completion = client.chat.completions.create(
            messages=messages,
            model="llama3-70b-8192", 
            max_tokens=5000,        
            temperature=0.7,        
            top_p=0.9,              
            stream=False            
        )
        
        assistant_response = chat_completion.choices[0].message.content.strip()
        
        if not assistant_response:
            assistant_response = "Maaf, saya tidak dapat memahami permintaan Anda. Bisakah Anda menjelaskan lebih lanjut?"
        
        logger.info(f"Input: {user_input} | Respons: {assistant_response}")
        return assistant_response
    
    except Exception as e:
        logger.error(f"Error Groq API: {str(e)}")
        return f"Maaf, terjadi masalah dengan API: {str(e)}. Silakan coba lagi nanti."

def chatbot_interface(user_input: str, history: list) -> tuple:
    """

    Fungsi ini dipanggil oleh Gradio setiap kali pengguna mengirim pesan.

    

    Args:

        user_input (str): Pesan yang dimasukkan pengguna.

        history (list): Riwayat percakapan yang dikelola oleh Gradio.



    Returns:

        tuple: (string kosong untuk mengosongkan input textbox, riwayat percakapan yang diperbarui).

    """
    if not user_input.strip():
        logger.warning("Input kosong diterima dari pengguna.")
        return "", history
    
    response = generate_response_groq(user_input, history)
    
    history.append((user_input, response))
    
    return "", history

# Setup antarmuka Gradio
with gr.Blocks(css="""

    .chatbot {height: 500px; overflow-y: auto;}

    .title {font-size: 28px; font-weight: bold; text-align: center; color: #2C3E50; margin-bottom: 10px; font-family: 'Arial', sans-serif;}

    .subtitle {font-size: 16px; text-align: center; color: #7F8C8D; margin-bottom: 20px;}

    .button {background-color: #2980B9; color: white; border-radius: 8px; padding: 10px 20px; font-size: 16px; cursor: pointer; transition: background-color 0.3s ease;}

    .button:hover {background-color: #3498DB;} /* Efek hover untuk tombol */

    .input-box {border-radius: 8px; border: 2px solid #BDC3C7; padding: 10px;}

""") as demo:
    gr.Markdown('<div class="title">Asisten AI Profesional</div>')
    gr.Markdown('<div class="subtitle">Ajukan pertanyaan atau mulai percakapan dalam bahasa Indonesia atau Inggris!</div>')
    
    chatbot = gr.Chatbot(label="Percakapan", elem_classes="chatbot", show_copy_button=True)
    
    user_input = gr.Textbox(
        label="Pesan Anda",
        placeholder="Contoh: 'Selamat pagi' atau 'Apa kabar?'",
        elem_classes="input-box"
    )
    
    submit_button = gr.Button("Kirim", elem_classes="button")
    
    submit_button.click(
        fn=chatbot_interface,
        inputs=[user_input, chatbot],
        outputs=[user_input, chatbot]
    )

    user_input.submit(
        fn=chatbot_interface,
        inputs=[user_input, chatbot],
        outputs=[user_input, chatbot]
    )

# Luncurkan aplikasi Gradio
if __name__ == "__main__":
    demo.launch()