| 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()
|
|
|
|
|