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", }