simpleAI / app.py
Hokeno's picture
Upload app.py
103086e verified
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()