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