Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -19,21 +19,71 @@ import fitz
|
|
19 |
import re
|
20 |
import io
|
21 |
from collections import Counter
|
22 |
-
|
|
|
|
|
23 |
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
|
30 |
authenticator = Authenticate(
|
31 |
-
secret_credentials_path
|
32 |
-
cookie_name=
|
33 |
-
cookie_key=
|
34 |
-
redirect_uri
|
35 |
)
|
36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
GENERATION_CONFIG = settings_ai.GENERATION_CONFIG
|
38 |
SYSTEM_INSTRUCTION = settings_ai.SYSTEM_INSTRUCTION
|
39 |
USER_MESSAGE = settings_ai.USER_MESSAGE
|
@@ -396,52 +446,5 @@ def main():
|
|
396 |
os.remove(file_path)
|
397 |
|
398 |
if __name__ == "__main__":
|
399 |
-
st.title("Import Fatture AI ✨")
|
400 |
-
with st.expander("Guida completa"):
|
401 |
-
st.write("""Questa applicazione Python, basata su Streamlit, integra servizi di intelligenza artificiale di Gemini per automatizzare l'estrazione e la validazione dei dati dalle fatture. Il sistema gestisce documenti in vari formati (PDF, immagini) e li elabora in maniera modulare per facilitare la conversione e la verifica delle informazioni.
|
402 |
-
|
403 |
-
## Funzionalità Principali
|
404 |
-
|
405 |
-
- **Caricamento e Gestione dei Documenti**
|
406 |
-
- Supporta il caricamento di file PDF, JPG, JPEG e PNG tramite un’interfaccia Streamlit.
|
407 |
-
- 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.
|
408 |
-
|
409 |
-
- **Conversione dei Dati**
|
410 |
-
- **Upload e Inoltro a Gemini**: I file vengono caricati e inviati al rispettivo servizio AI.
|
411 |
-
- **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).
|
412 |
-
|
413 |
-
- **Validazione e Verifica**
|
414 |
-
- **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.
|
415 |
-
- **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.
|
416 |
-
- **Filtraggio Articoli**: Vengono mantenuti solo gli articoli compatibili con i criteri specifici (codici articolo e importi non nulli).
|
417 |
-
|
418 |
-
- **Visualizzazione e Highlighting**
|
419 |
-
- I dati validati vengono mostrati in formato tabellare e in JSON.
|
420 |
-
- Se il documento è un PDF, il sistema evidenzia graficamente (con rettangoli rossi) i testi relativi agli articoli compatibili, semplificando il controllo visivo.
|
421 |
-
|
422 |
-
## Avvertenze per l'Operatore
|
423 |
-
|
424 |
-
- **Controllo Manuale Obbligatorio**:
|
425 |
-
L'operatore **deve sempre verificare** i dati elaborati.
|
426 |
-
Nonostante il riprocessamento automatico in caso di errori, è fondamentale controllare la correttezza dei dati estratti e la validità degli articoli.
|
427 |
-
|
428 |
-
- **Validazione dei Dati**:
|
429 |
-
L'operazione di validazione tramite Pydantic e la verifica incrociata sul contenuto del PDF sono cruciali.
|
430 |
-
Assicurarsi che non vi siano discrepanze, specialmente nei casi in cui alcuni articoli risultino non verificati.
|
431 |
-
""")
|
432 |
-
|
433 |
-
st.write("📄 **Legge più PDF:** Carica più file PDF contemporaneamente")
|
434 |
-
st.write("🤖 **Sfrutta l'AI di Gemini:** Per ogni documento, estrae i dati in formato JSON e in formato tabellare.")
|
435 |
-
st.write("✅ **Mostra Articoli Compatibili:** Filtra e visualizza solo gli articoli che rispettano i criteri richiesti.")
|
436 |
-
st.write("🔍 **Anteprima Documento:** Visualizza un'anteprima del documento evidenziando gli articoli compatibili.")
|
437 |
st.divider()
|
438 |
main()
|
439 |
-
#authenticator.check_authentification()
|
440 |
-
#authenticator.login()
|
441 |
-
#if st.session_state['connected']:
|
442 |
-
# st.divider()
|
443 |
-
# main()
|
444 |
-
#else:
|
445 |
-
# with st.sidebar:
|
446 |
-
# st.title("Login")
|
447 |
-
# st.write("Seleziona l'account aziendale per accedere")
|
|
|
19 |
import re
|
20 |
import io
|
21 |
from collections import Counter
|
22 |
+
import secrets
|
23 |
+
|
24 |
+
st.set_page_config(page_title="Import Fatture AI✨")
|
25 |
|
26 |
+
from streamlit_google_auth import Authenticate
|
27 |
+
google_auth_str = os.getenv("JSON_GOOGLE_SECRET")
|
28 |
+
google_auth_data = json.loads(google_auth_str)
|
29 |
+
with open("google_credentials.json", "w") as f:
|
30 |
+
json.dump(google_auth_data, f, indent=4)
|
31 |
|
32 |
authenticator = Authenticate(
|
33 |
+
secret_credentials_path='google_credentials.json',
|
34 |
+
cookie_name=f"llm_pdf_digest_{secrets.token_hex(4)}",
|
35 |
+
cookie_key=secrets.token_hex(32),
|
36 |
+
redirect_uri=os.getenv("URL_REDIRECT"),
|
37 |
)
|
38 |
|
39 |
+
st.title("Import Fatture AI ✨")
|
40 |
+
with st.expander("Guida completa"):
|
41 |
+
st.write("""Questa applicazione Python, basata su Streamlit, integra servizi di intelligenza artificiale di Gemini per automatizzare l'estrazione e la validazione dei dati dalle fatture. Il sistema gestisce documenti in vari formati (PDF, immagini) e li elabora in maniera modulare per facilitare la conversione e la verifica delle informazioni.
|
42 |
+
|
43 |
+
## Funzionalità Principali
|
44 |
+
|
45 |
+
- **Caricamento e Gestione dei Documenti**
|
46 |
+
- Supporta il caricamento di file PDF, JPG, JPEG e PNG tramite un’interfaccia Streamlit.
|
47 |
+
- 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.
|
48 |
+
|
49 |
+
- **Conversione dei Dati**
|
50 |
+
- **Upload e Inoltro a Gemini**: I file vengono caricati e inviati al rispettivo servizio AI.
|
51 |
+
- **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).
|
52 |
+
|
53 |
+
- **Validazione e Verifica**
|
54 |
+
- **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.
|
55 |
+
- **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.
|
56 |
+
- **Filtraggio Articoli**: Vengono mantenuti solo gli articoli compatibili con i criteri specifici (codici articolo e importi non nulli).
|
57 |
+
|
58 |
+
- **Visualizzazione e Highlighting**
|
59 |
+
- I dati validati vengono mostrati in formato tabellare e in JSON.
|
60 |
+
- Se il documento è un PDF, il sistema evidenzia graficamente (con rettangoli rossi) i testi relativi agli articoli compatibili, semplificando il controllo visivo.
|
61 |
+
|
62 |
+
## Avvertenze per l'Operatore
|
63 |
+
|
64 |
+
- **Controllo Manuale Obbligatorio**:
|
65 |
+
L'operatore **deve sempre verificare** i dati elaborati.
|
66 |
+
Nonostante il riprocessamento automatico in caso di errori, è fondamentale controllare la correttezza dei dati estratti e la validità degli articoli.
|
67 |
+
|
68 |
+
- **Validazione dei Dati**:
|
69 |
+
L'operazione di validazione tramite Pydantic e la verifica incrociata sul contenuto del PDF sono cruciali.
|
70 |
+
Assicurarsi che non vi siano discrepanze, specialmente nei casi in cui alcuni articoli risultino non verificati.
|
71 |
+
""")
|
72 |
+
|
73 |
+
st.write("📄 **Legge più PDF:** Carica più file PDF contemporaneamente")
|
74 |
+
st.write("🤖 **Sfrutta l'AI di Gemini:** Per ogni documento, estrae i dati in formato JSON e in formato tabellare.")
|
75 |
+
st.write("✅ **Mostra Articoli Compatibili:** Filtra e visualizza solo gli articoli che rispettano i criteri richiesti.")
|
76 |
+
st.write("🔍 **Anteprima Documento:** Visualizza un'anteprima del documento evidenziando gli articoli compatibili.")
|
77 |
+
|
78 |
+
authenticator.check_authentification()
|
79 |
+
authenticator.login()
|
80 |
+
|
81 |
+
if not st.session_state.get('connected'):
|
82 |
+
with st.sidebar:
|
83 |
+
st.title("Login")
|
84 |
+
st.write("Seleziona l'account aziendale per accedere")
|
85 |
+
st.stop()
|
86 |
+
|
87 |
GENERATION_CONFIG = settings_ai.GENERATION_CONFIG
|
88 |
SYSTEM_INSTRUCTION = settings_ai.SYSTEM_INSTRUCTION
|
89 |
USER_MESSAGE = settings_ai.USER_MESSAGE
|
|
|
446 |
os.remove(file_path)
|
447 |
|
448 |
if __name__ == "__main__":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
449 |
st.divider()
|
450 |
main()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|