|
import gradio as gr
|
|
import logging
|
|
|
|
from config import SHARE_GRADIO_WITH_PUBLIC_URL
|
|
from chains import qa_chain, summarization_chain
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
TRANSLATIONS = {
|
|
"en": {
|
|
"title": "# 📚 Study Buddy: AI Learning Assistant",
|
|
"subtitle": "## 🤖 A smart, user-friendly chatbot for students!",
|
|
"summary_subtitle": "## 📄 Upload Notes for Summarization",
|
|
"chat_input_label": "Type your question here:",
|
|
"chat_placeholder": "e.g., Explain Newton's laws",
|
|
"chat_button_label": "Get Answer",
|
|
"summary_button_label": "Summarize Notes",
|
|
"upload_file_label": "Upload .txt or .pdf file",
|
|
"summary_output_label": "Summary",
|
|
"language_label": "Language / Langue",
|
|
"ai_response_label": "AI Response"
|
|
},
|
|
"fr": {
|
|
"title": "# 📚 Study Buddy: Assistant d'apprentissage IA",
|
|
"subtitle": "## 🤖 Un chatbot intelligent et convivial pour les étudiants!",
|
|
"summary_subtitle": "## 📄 Subir notas para resumir",
|
|
"chat_input_label": "Tapez votre question ici:",
|
|
"chat_placeholder": "ex : Expliquez les lois de Newton",
|
|
"chat_button_label": "Obtenir une réponse",
|
|
"summary_button_label": "Résumer les notes",
|
|
"upload_file_label": "Téléchargez un fichier .txt ou .pdf",
|
|
"summary_output_label": "Résumé",
|
|
"language_label": "Langue / Language",
|
|
"ai_response_label": "Réponse de l'IA"
|
|
}
|
|
}
|
|
|
|
|
|
def chatbot_response(user_input, lang):
|
|
try:
|
|
response = qa_chain.invoke({"question": user_input})
|
|
logger.info("chatbot_response completed")
|
|
return response
|
|
except Exception as e:
|
|
msg = f"Error : {e}"
|
|
logger.exception(msg)
|
|
return TRANSLATIONS[lang].get("error_message", "Sorry, an error occurred while processing your request.")
|
|
|
|
|
|
def summarize_text(text, lang):
|
|
try:
|
|
summary = summarization_chain.invoke({"document_text": text})
|
|
logger.info("summarize_text completed")
|
|
return summary
|
|
except Exception as e:
|
|
msg = f"Error : {e}"
|
|
logger.exception(msg)
|
|
return TRANSLATIONS[lang].get("error_message", "Sorry, an error occurred while summarizing your notes.")
|
|
|
|
|
|
def update_language(lang):
|
|
return (
|
|
TRANSLATIONS[lang]["title"],
|
|
TRANSLATIONS[lang]["subtitle"],
|
|
TRANSLATIONS[lang]["chat_input_label"],
|
|
TRANSLATIONS[lang]["chat_placeholder"],
|
|
TRANSLATIONS[lang]["chat_button_label"],
|
|
TRANSLATIONS[lang]["upload_file_label"],
|
|
TRANSLATIONS[lang]["summary_button_label"],
|
|
TRANSLATIONS[lang]["summary_output_label"],
|
|
TRANSLATIONS[lang]["ai_response_label"]
|
|
)
|
|
|
|
|
|
def create_interface():
|
|
with gr.Blocks(css="body { font-family: sans-serif; background-color: #f9f9f9; }") as study_buddy:
|
|
|
|
|
|
lang = "en"
|
|
|
|
title = gr.Markdown(f"{TRANSLATIONS[lang]['title']}")
|
|
|
|
with gr.Row():
|
|
with gr.Column():
|
|
gr.Markdown("", height=4)
|
|
|
|
language = gr.Radio(
|
|
choices=["en", "fr"],
|
|
value=lang,
|
|
label=TRANSLATIONS[lang]["language_label"]
|
|
)
|
|
|
|
gr.Markdown("", height=4)
|
|
|
|
subtitle = gr.Markdown(f"{TRANSLATIONS[lang]['subtitle']}")
|
|
|
|
chat_input = gr.Textbox(
|
|
label=TRANSLATIONS[lang]["chat_input_label"],
|
|
lines=4,
|
|
placeholder=TRANSLATIONS[lang]["chat_placeholder"]
|
|
)
|
|
|
|
with gr.Column():
|
|
gr.Markdown("", height=4)
|
|
summary_subtitle = gr.Markdown(f"{TRANSLATIONS[lang]['summary_subtitle']}")
|
|
file_input = gr.File(file_types=[".pdf", ".txt"])
|
|
file_label = gr.Markdown(TRANSLATIONS[lang]["upload_file_label"])
|
|
|
|
with gr.Row():
|
|
with gr.Column():
|
|
|
|
chat_button = gr.Button(TRANSLATIONS[lang]["chat_button_label"], variant="primary")
|
|
chat_output = gr.Textbox(label=TRANSLATIONS[lang]["ai_response_label"], lines=5, interactive=True)
|
|
|
|
|
|
chat_button.click(
|
|
chatbot_response,
|
|
inputs=[chat_input, language],
|
|
outputs=chat_output
|
|
)
|
|
|
|
with gr.Column():
|
|
|
|
summary_button = gr.Button(TRANSLATIONS[lang]["summary_button_label"], variant="primary")
|
|
summary_output = gr.Textbox(label=TRANSLATIONS[lang]["summary_output_label"], lines=5, interactive=True)
|
|
|
|
|
|
summary_button.click(
|
|
summarize_text,
|
|
inputs=[file_input, language],
|
|
outputs=summary_output
|
|
)
|
|
|
|
|
|
def update_labels(lang):
|
|
return (
|
|
TRANSLATIONS[lang]["title"],
|
|
TRANSLATIONS[lang]["subtitle"],
|
|
TRANSLATIONS[lang]["summary_subtitle"],
|
|
TRANSLATIONS[lang]["chat_input_label"],
|
|
TRANSLATIONS[lang]["chat_placeholder"],
|
|
TRANSLATIONS[lang]["chat_button_label"],
|
|
TRANSLATIONS[lang]["summary_button_label"],
|
|
TRANSLATIONS[lang]["summary_output_label"],
|
|
TRANSLATIONS[lang]["ai_response_label"],
|
|
TRANSLATIONS[lang]["upload_file_label"]
|
|
)
|
|
|
|
language.change(
|
|
update_labels,
|
|
inputs=[language],
|
|
outputs=[
|
|
title, subtitle, summary_subtitle,
|
|
chat_input, chat_input,
|
|
chat_button,
|
|
summary_button, summary_output, chat_output, file_label
|
|
]
|
|
)
|
|
|
|
return study_buddy
|
|
|
|
if __name__ == "__main__":
|
|
study_buddy = create_interface()
|
|
study_buddy.launch(share=SHARE_GRADIO_WITH_PUBLIC_URL)
|
|
|