Edurag_beta / app_3.py
Nugh75's picture
update ristrutturazione file app.py con divisione file
47e4aa2
raw
history blame
9.88 kB
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()