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