import streamlit as st
from ragpipeline import (RAGPipeline,Retriever,ChatBot)
import tempfile
import pandas as pd
from textutils import ParagraphDocumentProcessor, DocumentProcessor,WholeTextDocumentProcessor
from HFChatbot import HFBot
import os
###########################################
# MAIN CON STREAMLIT
###########################################
def main():
UPLOAD_DIR = "/tmp/"
os.makedirs(UPLOAD_DIR, exist_ok=True)
codice_tabella = f"
| 💡AURA: | AI-Driven Unified Regulatory Audit |
"
st.markdown(codice_tabella, unsafe_allow_html=True)
if "faiss_builder" not in st.session_state:
ragpipeline = RAGPipeline(numero_frammenti=10)
st.session_state["faiss_builder"] = ragpipeline
else:
ragpipeline = st.session_state["faiss_builder"]
if "storico_domande" not in st.session_state:
st.session_state["storico_domande"] = []
if "indice_creato" not in st.session_state:
st.session_state["indice_creato"] = False
modelliLLM = [
'Almawave/Velvet-2B',
'Almawave/Velvet-14B',
'mistralai/Mistral-7B-Instruct-v0.1',
]
modelliOllama = [
'deepseek-r1:1.5b',
'qwen2.5:7b',
'deepseek-r1:7b',
'llama3.2:3b',
'Almawave/Velvet:2B',
'Almawave/Velvet:14b',
'mistral:latest',
"vaiton/minerva",
'qwen2.5:0.5b',
'qwen3:4b',
'minerva',
'nemo',
'deepseek-r1:14b',
'qwen3:14b',
'phi4-mini-reasoning',
'gemma3:12b',
]
modello_scelto = st.selectbox("Seleziona un modello:", modelliLLM)
st.write(f"Hai selezionato: {modello_scelto}")
st.title("Suddivisione in paragrafi")
docprocessor_options = {
"ParagraphDocumentProcessor": ParagraphDocumentProcessor(),
"WholeText": WholeTextDocumentProcessor()
}
selected_docprocessor = st.selectbox("Divisione in paragrafi", docprocessor_options.keys())
docprocessor = docprocessor_options[selected_docprocessor]
st.write(f"Hai selezionato: **{selected_docprocessor}**")
ragpipeline.docprocessor = docprocessor
if not st.session_state["indice_creato"]:
st.subheader("Carica l'atto principale (Determinazione)")
main_pdf = st.file_uploader("Carica 1 file PDF - Determinazione", type=["pdf"], key="main_pdf")
if main_pdf:
st.session_state["main_pdf_nome"] = main_pdf.name
st.subheader("Carica eventuali Allegati PDF multipli")
other_pdfs = st.file_uploader("Carica allegati (puoi caricare più PDF)",
type=["pdf"],
accept_multiple_files=True,
key="allegati_pdf")
if st.button("Crea indice FAISS"):
if main_pdf is not None:
try:
save_path = os.path.join(UPLOAD_DIR, main_pdf.name)
with open(save_path, "wb") as f:
f.write(main_pdf.read())
st.success(f"✅ Determinazione caricata con successo! File salvato in: `{save_path}`")
ragpipeline.aggiungi_file_pdf(save_path)
except Exception as e:
st.error(f"❌ Errore nel salvataggio del file: {e}")
else:
st.warning("Nessun PDF di Determinazione caricato.")
if other_pdfs:
for uploaded_file in other_pdfs:
with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf", dir=UPLOAD_DIR) as tmp_file:
tmp_file.write(uploaded_file.read())
tmp_path = tmp_file.name
ragpipeline.aggiungi_file_pdf(tmp_path)
st.subheader(f"Caricato file {tmp_file.name}")
st.success("Allegati caricati con successo!")
else:
st.info("Nessun allegato caricato.")
ragpipeline.crea_indice()
st.success("Indice FAISS generato e caricato.")
st.session_state["indice_creato"] = True
frammenti_recuperati =ragpipeline.attributi_frammenti
for frammento_recuperato in frammenti_recuperati:
RAGPipeline.dump_excel(dizionario=frammento_recuperato, filename="frammentiChatbot.xlsx")
if st.session_state["indice_creato"]:
with st.form(key="domanda_form"):
domanda = st.text_area("Inserisci la domanda", key="domanda_input")
istruzione = st.text_area("Inserisci le istruzioni", key="istruzione_input")
submit_button = st.form_submit_button("Analizza atto")
if submit_button:
if domanda.strip().upper() == "FINE":
st.stop()
#cb = ChatBot(model_name="flaollama", model_orig=modello_scelto)
cb = HFBot(model_name=modello_scelto)
ret = Retriever(
indice=ragpipeline.indice,
sentence_transformer_model=ragpipeline.sentence_transformer_model,
query=domanda + istruzione,
documenti=ragpipeline.documenti,
frammenti_indicizzati=ragpipeline.frammenti_indicizzati,
attributi_frammenti=ragpipeline.attributi_frammenti
)
ret.esegui_query(top_k=3)
risposta = cb.generate(
query=domanda,
relevant_docs=ret.passaggi_rilevanti,
attributi_frammenti_rilevanti=ret.attributi_rilevanti,
istruzioni=istruzione
)
st.session_state.storico_domande.append((modello_scelto, domanda, istruzione, risposta))
st.markdown(
f"Domanda: {domanda}
"
f"Istruzioni: {istruzione}
"
f"Risposta: {risposta}
",
unsafe_allow_html=True
)
id_frammenti_recuperati = ":".join(sorted(set(elemento['id'] for elemento in ret.attributi_rilevanti)))
dump = {
'timestamp': ragpipeline.timestamp,
"modello": cb.model_orig,
"documenti": st.session_state.get("main_pdf_nome", "non disponibile"),
"file_recuperati": "",
"file_gold": "",
"frammenti_recuperati":id_frammenti_recuperati,
"frammenti_gold": "",
"domanda":domanda,
"istruzioni":istruzione,
"risposta_gold": " ",
"risposta":cb.pulisci_risposta(risposta)}
RAGPipeline.dump_excel(dizionario=dump,filename="dumpChatbot.xlsx")
if st.session_state.storico_domande:
st.markdown("---")
st.subheader("Storico delle domande analizzate")
for idx, (mymod, q, inst, resp) in enumerate(st.session_state.storico_domande, 1):
st.markdown(
f"""
**{idx}. Domanda:** {q}
Modello: {mymod}
Istruzioni: {inst}
Risposta: {resp}
""",
unsafe_allow_html=True
)
if __name__ == "__main__":
main()