|
import gradio as gr |
|
import logging |
|
import PyPDF2 |
|
|
|
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_output = qa_chain.invoke({"question": user_input}) |
|
response = response_output.content |
|
logger.info("chatbot_response completed") |
|
print("> chatbot_response completed") |
|
return response |
|
except Exception as e: |
|
msg = f"Error : {e}" |
|
logger.exception(msg) |
|
print(msg) |
|
return TRANSLATIONS[lang].get("error_message", "Sorry, an error occurred while processing your request.") |
|
|
|
|
|
def summarize_pdf(pdf, lang): |
|
try: |
|
with open(pdf, "rb") as file: |
|
reader = PyPDF2.PdfReader(file) |
|
page = reader.pages[0] |
|
text = page.extract_text() |
|
print(text) |
|
summary = summarize_text(text, lang) |
|
logger.info("summarize_pdf completed") |
|
print("> summarize_pdf completed") |
|
return summary |
|
except Exception as e: |
|
msg = f"Error : {e}" |
|
logger.exception(msg) |
|
print(msg) |
|
return TRANSLATIONS[lang].get("error_message", "Sorry, an error occurred while summarizing your notes.") |
|
|
|
|
|
def summarize_text(text, lang): |
|
try: |
|
summary_output = summarization_chain.invoke({"document_text": text}) |
|
print(summary_output) |
|
summary = summary_output.content |
|
logger.info("summarize_text completed") |
|
print("> summarize_text completed") |
|
return summary |
|
except Exception as e: |
|
msg = f"Error : {e}" |
|
logger.exception(msg) |
|
print(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= "Type your question here: / Tapez votre question ici:", |
|
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(label="File / Fichier",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 = "AI Response / Réponse de l'IA", |
|
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="Summary / Résumé", |
|
lines=5, |
|
interactive=True |
|
) |
|
|
|
|
|
summary_button.click( |
|
summarize_pdf, |
|
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() |
|
|