| | 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
|
| |
|
| |
|
| | 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]
|
| | )
|
| |
|
| |
|
| | if __name__ == "__main__":
|
| | demo.launch()
|
| |
|
| |
|