File size: 3,134 Bytes
4420602
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from google.ai.generativelanguage_v1beta.types import content
from typing import List, Optional
from pydantic import BaseModel, ValidationError
from dotenv import load_dotenv
load_dotenv()
import os 

ENDPOINT_AZURE = os.getenv("ENDPOINT_AZURE")
API_AZURE = os.getenv("API_AZURE")
API_KEY_GEMINI = os.getenv("API_KEY_GEMINI")
NO_ARTICLE = "NESSUN_ARTICOLO_COMPATIBILE"
SYSTEM_INSTRUCTION = (
    "Sei un esperto lettore di documenti. "
    "Estrai il tutto il formato JSON come da schema fornito! "
    "Mi raccomando compila tutti i campi! "
    "Estra SOLO gli Articoli il cui codice inizia per 'AVE' o 'AV' o '3V' o '44'. Attenzione a quelli che iniziano per 'GEW 44..' sono da ESCLUDERE! "
    "Nel campo 'TotaleNonIvato' inserisci il TOTALE MERCE per riga senza Iva: (Quantità * Prezzo Unitario) - Sconto. "
    "Potrebbe non esserci lo 'Sconto' oppure potrebbe esserci direttamente il TOTALE MERCE per riga. "
    "La 'Data' documento mettila in formato YYYY-MM-DD. "
    "Attenzione, a volte ci sono articoli con DESCRIZIONE AVE ma con codice NON CORRISPONDENTE, devi escluderli! "
    "Attenzione, a volte gli articoli AVE sono dentro la parentesi per esempio 'A789532 (AVE001)', qui l'articolo risulta COMPATIBILE perché ha AVE! " 
    "Attenzione, a volte i TOTALI hanno la formattazione con il punto (.) che rappresenta il SEPARATORE DELLE MIGLIAIA! Quindi 1.234,50 è 1234,50! "
    f"Se non sono presenti articoli compatibili scrivi '{NO_ARTICLE}' nel codice articolo e metti 0 nel 'TotaleNonIvato'"
)

USER_MESSAGE = (
    "Estrai i dati in formato JSON. "
)

class Articolo(BaseModel):
    CodiceArticolo: str
    DescrizioneArticolo: str
    TotaleNonIvato: float
    Verificato: Optional[int] = None

class Documento(BaseModel):
    TipoDocumento: str
    NumeroDocumento: str
    Data: str
    TotaleImponibile: float
    Articoli: List[Articolo]

GENERATION_CONFIG = {
    "temperature": 0.01,
    "top_p": 0.1, 
    "top_k": 5,   
    "max_output_tokens": 500000,
    "response_schema": content.Schema(
        type=content.Type.OBJECT,
        required=["TipoDocumento", "NumeroDocumento", "Data", "TotaleImponibile"],
        properties={
            "TipoDocumento": content.Schema(type=content.Type.STRING, enum=["FATTURA", "DDT"]),
            "NumeroDocumento": content.Schema(type=content.Type.STRING),
            "Data": content.Schema(type=content.Type.STRING),
            "TotaleImponibile": content.Schema(type=content.Type.NUMBER),
            "Articoli": content.Schema(
                type=content.Type.ARRAY,
                items=content.Schema(
                    type=content.Type.OBJECT,
                    required=["CodiceArticolo", "DescrizioneArticolo", "TotaleNonIvato"],
                    properties={
                        "CodiceArticolo": content.Schema(type=content.Type.STRING),
                        "DescrizioneArticolo": content.Schema(type=content.Type.STRING),
                        "TotaleNonIvato": content.Schema(type=content.Type.NUMBER),
                    },
                ),
            )
        },
    ),
    "response_mime_type": "application/json",
}