Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -31,7 +31,7 @@ if st.session_state.logged == False:
|
|
31 |
with login_placeholder.container():
|
32 |
container = st.container(border=True)
|
33 |
username = container.text_input('Username')
|
34 |
-
password = container.text_input('Passowrd')
|
35 |
login = container.button(' Login ', type='primary')
|
36 |
if not login or username != os.getenv("LOGIN_USER") or password != os.getenv("LOGIN_PASSWORD"):
|
37 |
if login:
|
@@ -46,21 +46,21 @@ with st.expander("Guida completa"):
|
|
46 |
## Funzionalità Principali
|
47 |
|
48 |
- **Caricamento e Gestione dei Documenti**
|
49 |
-
- Supporta il caricamento di file PDF, JPG, JPEG e PNG tramite un’interfaccia Streamlit.
|
50 |
-
- Se il file è un PDF con più pagine, viene suddiviso in sezioni (configurabile tramite uno slider) per una gestione più efficace. Più il numero è basso più il risultato è preciso.
|
51 |
|
52 |
- **Conversione dei Dati**
|
53 |
-
- **Upload e Inoltro a Gemini**: I file vengono caricati e inviati al rispettivo servizio AI.
|
54 |
-
- **Estrazione dei Dati**: Il sistema invia il documento a un modello di generazione AI per ottenere una rappresentazione JSON contenente i dati (ad es. numero di documento, data, totale imponibile e articoli).
|
55 |
|
56 |
- **Validazione e Verifica**
|
57 |
-
- **Validazione JSON**: Utilizza Pydantic per verificare la correttezza della struttura e dei dati estratti. In caso di errori, il documento viene riprocessato fino a 3 volte per cercare di correggere le anomalie.
|
58 |
-
- **Verifica Incrociata dei Contenuti**: Per i PDF, viene estratto il testo con PyPDF2 e confrontato con i codici articolo per assicurarsi che i dati siano effettivamente presenti nel documento.
|
59 |
-
- **Filtraggio Articoli**: Vengono mantenuti solo gli articoli compatibili con i criteri specifici (codici articolo e importi non nulli).
|
60 |
|
61 |
- **Visualizzazione e Highlighting**
|
62 |
-
- I dati validati vengono mostrati in formato tabellare e in JSON.
|
63 |
-
- Se il documento è un PDF, il sistema evidenzia graficamente (con rettangoli rossi) i testi relativi agli articoli compatibili, semplificando il controllo visivo.
|
64 |
|
65 |
## Avvertenze per l'Operatore
|
66 |
|
@@ -114,7 +114,7 @@ def wait_for_files_active(files):
|
|
114 |
print("\n...all files ready")
|
115 |
|
116 |
# Chiamata API Gemini
|
117 |
-
def send_message_to_gemini(chat_session, message, max_attempts=
|
118 |
"""Tenta di inviare il messaggio tramite la chat_session, riprovando fino a max_attempts in caso di eccezioni, con un delay di 10 secondi tra i tentativi. """
|
119 |
for attempt in range(max_attempts):
|
120 |
try:
|
@@ -233,7 +233,14 @@ def process_document_splitted(file_path: str, chunk_label: str, use_azure: bool
|
|
233 |
files = [upload_to_gemini(file_path, mime_type=mime_type)]
|
234 |
wait_for_files_active(files)
|
235 |
chat_history = [{ "role": "user","parts": [files[0]]}]
|
236 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
237 |
max_validation_attempts = 3
|
238 |
max_number_reprocess = 3
|
239 |
chunk_document = None
|
|
|
31 |
with login_placeholder.container():
|
32 |
container = st.container(border=True)
|
33 |
username = container.text_input('Username')
|
34 |
+
password = container.text_input('Passowrd', type='password')
|
35 |
login = container.button(' Login ', type='primary')
|
36 |
if not login or username != os.getenv("LOGIN_USER") or password != os.getenv("LOGIN_PASSWORD"):
|
37 |
if login:
|
|
|
46 |
## Funzionalità Principali
|
47 |
|
48 |
- **Caricamento e Gestione dei Documenti**
|
49 |
+
- Supporta il caricamento di file PDF, JPG, JPEG e PNG tramite un’interfaccia Streamlit.
|
50 |
+
- Se il file è un PDF con più pagine, viene suddiviso in sezioni (configurabile tramite uno slider) per una gestione più efficace. Più il numero è basso più il risultato è preciso.
|
51 |
|
52 |
- **Conversione dei Dati**
|
53 |
+
- **Upload e Inoltro a Gemini**: I file vengono caricati e inviati al rispettivo servizio AI.
|
54 |
+
- **Estrazione dei Dati**: Il sistema invia il documento a un modello di generazione AI per ottenere una rappresentazione JSON contenente i dati (ad es. numero di documento, data, totale imponibile e articoli).
|
55 |
|
56 |
- **Validazione e Verifica**
|
57 |
+
- **Validazione JSON**: Utilizza Pydantic per verificare la correttezza della struttura e dei dati estratti. In caso di errori, il documento viene riprocessato fino a 3 volte per cercare di correggere le anomalie.
|
58 |
+
- **Verifica Incrociata dei Contenuti**: Per i PDF, viene estratto il testo con PyPDF2 e confrontato con i codici articolo per assicurarsi che i dati siano effettivamente presenti nel documento.
|
59 |
+
- **Filtraggio Articoli**: Vengono mantenuti solo gli articoli compatibili con i criteri specifici (codici articolo e importi non nulli).
|
60 |
|
61 |
- **Visualizzazione e Highlighting**
|
62 |
+
- I dati validati vengono mostrati in formato tabellare e in JSON.
|
63 |
+
- Se il documento è un PDF, il sistema evidenzia graficamente (con rettangoli rossi) i testi relativi agli articoli compatibili, semplificando il controllo visivo.
|
64 |
|
65 |
## Avvertenze per l'Operatore
|
66 |
|
|
|
114 |
print("\n...all files ready")
|
115 |
|
116 |
# Chiamata API Gemini
|
117 |
+
def send_message_to_gemini(chat_session, message, max_attempts=5):
|
118 |
"""Tenta di inviare il messaggio tramite la chat_session, riprovando fino a max_attempts in caso di eccezioni, con un delay di 10 secondi tra i tentativi. """
|
119 |
for attempt in range(max_attempts):
|
120 |
try:
|
|
|
233 |
files = [upload_to_gemini(file_path, mime_type=mime_type)]
|
234 |
wait_for_files_active(files)
|
235 |
chat_history = [{ "role": "user","parts": [files[0]]}]
|
236 |
+
for attempt in range(3):
|
237 |
+
try:
|
238 |
+
chat_session = model.start_chat(history=chat_history)
|
239 |
+
break
|
240 |
+
except Exception as e:
|
241 |
+
print(f"Errore nello Start chat")
|
242 |
+
time.sleep(10)
|
243 |
+
|
244 |
max_validation_attempts = 3
|
245 |
max_number_reprocess = 3
|
246 |
chunk_document = None
|