Spaces:
Sleeping
Sleeping
import gradio as gr | |
from app.document_handling import * | |
from app.llm_handling import answer_question | |
from app.logging_config import configure_logging | |
configure_logging() | |
def update_dropdowns(): | |
"""Aggiorna tutti i dropdown con la lista aggiornata dei database""" | |
databases = list_databases() | |
return [gr.update(choices=databases) for _ in range(6)] | |
def extract_text_from_files(files): | |
text = "" | |
for file in files: | |
try: | |
if file.name.endswith('.pdf'): | |
text += extract_text_from_pdf(file.name) | |
elif file.name.endswith('.docx'): | |
text += extract_text_from_docx(file.name) | |
else: | |
with open(file.name, 'r', encoding='utf-8') as f: | |
text += f.read() | |
except Exception as e: | |
logging.error(f"Errore durante la lettura del file {file.name}: {e}") | |
return text | |
with gr.Blocks() as rag_chatbot: | |
gr.Markdown("# Chatbot basato su RAG") | |
databases = list_databases() | |
# Definizione dei dropdown prima del loro utilizzo | |
db_name_upload = gr.State() | |
db_name_list = gr.State() | |
db_name_chat = gr.State() | |
db_name_new = gr.State() | |
modify_db_old_name = gr.State() | |
delete_db_dropdown = gr.State() | |
with gr.Tab("Chatbot"): | |
with gr.Row(): | |
with gr.Column(scale=2): | |
db_name_chat = gr.Dropdown(choices=databases, label="Seleziona Database", value="default_db") | |
# Aggiornato il tipo del chatbot | |
chatbot = gr.Chatbot(label="Conversazione", type="messages") | |
with gr.Row(): | |
# Aggiunta upload file direttamente nella chat | |
file_input = gr.File( | |
label="Carica PDF per la conversazione", | |
file_types=[".pdf", ".docx", ".txt"], | |
file_count="multiple" | |
) | |
upload_button = gr.Button("Carica Documenti") | |
question_input = gr.Textbox( | |
label="Fai una domanda", | |
placeholder="Scrivi qui la tua domanda...", | |
lines=2 | |
) | |
with gr.Row(): | |
ask_button = gr.Button("Invia") | |
clear_button = gr.Button("Pulisci Chat") | |
chat_state = gr.State([]) | |
def chat_upload_and_respond(files, chat_history, db_name): | |
# Estrai il testo dai file | |
text = extract_text_from_files(files) | |
# Aggiungi il testo alla chat come messaggio dell'utente | |
chat_history.append((None, "📄 Contenuto dei documenti caricati:")) | |
chat_history.append((None, text)) | |
return chat_history | |
def respond(message, chat_history, db_name): | |
bot_message = answer_question(message, db_name) | |
chat_history.append((message, bot_message)) | |
return "", chat_history | |
def clear_chat(): | |
return [], [] | |
# Eventi | |
upload_button.click( | |
chat_upload_and_respond, | |
inputs=[file_input, chat_state, db_name_chat], | |
outputs=[chatbot] | |
) | |
ask_button.click( | |
respond, | |
inputs=[question_input, chat_state, db_name_chat], | |
outputs=[question_input, chatbot] | |
) | |
clear_button.click( | |
clear_chat, | |
outputs=[chatbot, chat_state] | |
) | |
with gr.Tab("Gestione Database"): | |
gr.Markdown("## Operazioni sui Database") | |
with gr.Row(): | |
with gr.Column(): | |
gr.Markdown("### Crea Database") | |
db_name_input = gr.Textbox(label="Nome Nuovo Database") | |
create_db_button = gr.Button("Crea Database") | |
create_output = gr.Textbox(label="Stato Creazione") | |
with gr.Column(): | |
gr.Markdown("### Rinomina Database") | |
modify_db_old_name = gr.Dropdown(choices=databases, label="Database da Rinominare") | |
modify_db_new_name = gr.Textbox(label="Nuovo Nome") | |
modify_db_button = gr.Button("Rinomina Database") | |
modify_output = gr.Textbox(label="Stato Modifica") | |
with gr.Column(): | |
gr.Markdown("### Elimina Database") | |
delete_db_dropdown = gr.Dropdown(choices=databases, label="Database da Eliminare") | |
delete_db_button = gr.Button("Elimina Database") | |
delete_output = gr.Textbox(label="Stato Eliminazione") | |
# Eventi per i pulsanti di gestione database | |
create_db_button.click( | |
create_database, | |
inputs=db_name_input, | |
outputs=create_output | |
).then( | |
update_dropdowns, | |
outputs=[db_name_upload, db_name_list, db_name_chat, db_name_new, modify_db_old_name, delete_db_dropdown] | |
) | |
modify_db_button.click( | |
modify_database, | |
inputs=[modify_db_old_name, modify_db_new_name], | |
outputs=modify_output | |
).then( | |
update_dropdowns, | |
outputs=[db_name_upload, db_name_list, db_name_chat, db_name_new, modify_db_old_name, delete_db_dropdown] | |
) | |
delete_db_button.click( | |
delete_database, | |
inputs=delete_db_dropdown, | |
outputs=delete_output | |
).then( | |
update_dropdowns, | |
outputs=[db_name_upload, db_name_list, db_name_chat, db_name_new, modify_db_old_name, delete_db_dropdown] | |
) | |
with gr.Tab("Gestione Documenti"): | |
with gr.Column(): | |
gr.Markdown("### Carica Documenti") | |
with gr.Row(): | |
file_input = gr.File( | |
label="Carica i tuoi documenti", | |
file_types=[".txt", ".pdf", ".docx"], | |
file_count="multiple" | |
) | |
db_name_upload = gr.Dropdown( | |
choices=databases, | |
label="Seleziona Database", | |
value="default_db" | |
) | |
with gr.Row(): | |
title_input = gr.Textbox(label="Titolo del documento") | |
author_input = gr.Textbox(label="Autore") | |
upload_button = gr.Button("Indicizza Documenti") | |
upload_output = gr.Textbox(label="Stato Upload") | |
with gr.Column(): | |
gr.Markdown("### Documenti nel Database") | |
db_name_list = gr.Dropdown( | |
choices=databases, | |
label="Seleziona Database", | |
value="default_db" | |
) | |
list_button = gr.Button("Visualizza Files") | |
list_output = gr.Textbox(label="Files nel Database") | |
delete_file_input = gr.Textbox(label="Nome file da eliminare") | |
delete_file_button = gr.Button("Elimina File") | |
delete_file_output = gr.Textbox(label="Stato Eliminazione") | |
# Eventi modificati | |
upload_button.click( | |
upload_and_index, | |
inputs=[file_input, title_input, author_input, db_name_upload], | |
outputs=upload_output | |
).then( | |
list_indexed_files, | |
inputs=db_name_list, | |
outputs=list_output | |
) | |
list_button.click( | |
list_indexed_files, | |
inputs=db_name_list, | |
outputs=list_output | |
) | |
delete_file_button.click( | |
delete_file_from_database, | |
inputs=[delete_file_input, db_name_list], | |
outputs=delete_file_output | |
).then( | |
list_indexed_files, | |
inputs=db_name_list, | |
outputs=list_output | |
).then( | |
update_dropdowns, | |
outputs=[db_name_upload, db_name_list, db_name_chat, db_name_new, modify_db_old_name, delete_db_dropdown] | |
) | |
with gr.Tab("Visualizza Documenti Indicizzati"): | |
with gr.Column(): | |
gr.Markdown("### Documenti nel Database") | |
db_name_list = gr.Dropdown( | |
choices=databases, | |
label="Seleziona Database", | |
value="default_db", | |
interactive=True | |
) | |
list_button = gr.Button("Visualizza Documenti") | |
list_output = gr.Textbox( | |
label="Elenco Documenti", | |
lines=10, | |
interactive=False, | |
value="Clicca 'Visualizza Documenti' per vedere l'elenco" | |
) | |
# Evento click con aggiornamento | |
list_button.click( | |
fn=list_indexed_documents, | |
inputs=[db_name_list], | |
outputs=[list_output], | |
api_name="list_docs" | |
) | |
# Adding a new tab for new functionalities | |
with gr.Tab("Nuove Funzionalità"): | |
gr.Markdown("## Cerca Documenti e Genera Riassunto") | |
db_name_new = gr.Dropdown(choices=databases, label="Seleziona Database", value="default_db") | |
search_input = gr.Textbox(label="Inserisci Termine di Ricerca") | |
search_button = gr.Button("Cerca Documenti") | |
search_output = gr.Textbox(label="Documenti Trovati") | |
summary_button = gr.Button("Genera Riassunto") | |
summary_output = gr.Textbox(label="Riassunto") | |
search_button.click( | |
search_documents, | |
inputs=[search_input, db_name_new], | |
outputs=search_output | |
) | |
# summary_button.click( | |
# generate_summary, | |
# inputs=db_name_new, | |
# outputs=summary_output | |
# ) | |
# Avvio dell'app | |
if __name__ == "__main__": | |
rag_chatbot.launch() |