Skip to content

Annona — a cosa serve, per chi, e come si verifica

Pagina in italiano, per il mercato italiano. Il resto della documentazione è in inglese; questa è la sintesi che si gira a chi deve decidere, non a chi deve implementare. La versione impaginata: annona — casi d'uso.

Il problema, in tre righe

Ogni agente AI che installi manda il tuo materiale da qualche parte. Quel «da qualche parte» oggi è deciso da una riga di configurazione scritta diciotto mesi fa da uno sviluppatore, e nessuno se ne accorge finché non c'è un audit.

Ti hanno detto di scegliere fra tre architetture: modelli on-prem (privati, limitati dall'hardware), API di frontiera (bravissime, e i tuoi dati escono), o pesi tuoi nel tuo cloud (compromesso onesto, costa un team MLOps).

La colonna giusta è una proprietà della singola richiesta, non dell'azienda.

Riassumere un bando pubblico non è lo stesso problema di ragionare sulla cartella clinica di un paziente — e il secondo non diventa sicuro perché l'ufficio acquisti ha firmato un DPA.

Il vantaggio, in brevissimo

Non scegli più una volta sola La stessa installazione manda il lavoro pubblico al modello migliore e tiene quello sensibile in casa. Non paghi la sovranità su tutto per proteggere il 5%.
Il fallback non ti tradisce Se la GPU locale cade, il lavoro riservato si ferma. Non viene dirottato sull'API che è ancora su. È l'unica differenza che conta rispetto a un gateway.
Hai una prova, non una promessa Ogni decisione finisce in un registro a catena di hash che verifichi offline, con un comando che non contatta nessuno.
Nessuno deve ricordarsi le regole La policy è un file YAML che un DPO legge in una seduta. Chi sviluppa dichiara l'intento; dove gira lo decide il kernel.
$ annona why step_7f3a
step_7f3a  inference  HELD
  class        restricted  (il working set ha toccato /mnt/pratiche/2026/BG-114.pdf)
  rule         R-clienti  restricted → [local-gpu], on_unavailable: hold
  candidates   local-gpu (non raggiungibile dalle 14:02:11)
  not chosen   frontier — max_class public < restricted
  outcome      held alle 14:03:07
  ledger       #418  sha256:9c1f…a7  (catena verificata)

Quel rifiuto è il prodotto. Un gateway, nella stessa situazione, avrebbe fatto failover silenzioso sull'API di frontiera e restituito un'ottima risposta.

Sei casi d'uso, e il test che li dimostra

Non sono scenari da slide: sono sei test in tests/test_use_cases.py che girano a ogni push contro il vero loop agentico, la vera policy e il vero registro. Se una di queste frasi smette di essere vera, la build diventa rossa.

# Situazione Verdetto Test
1 Studio legale — un collaboratore chiede una scadenza su un fascicolo cliente tutto on-prem; il modello di frontiera è su e non viene chiamato test_a_client_matter_is_answered_without_the_matter_leaving
2 Lo stesso studio — una domanda di diritto pubblico, senza dati cliente va al modello migliore: la sovranità non è una tassa su tutto test_a_question_with_no_client_data_goes_to_the_best_model
3 Sanità / HR — qualcuno incolla un codice fiscale nel prompt, nessun file aperto bloccato al primo turno: si classificano i byte che stanno per partire test_an_identifier_typed_into_the_prompt_never_reaches_a_frontier_model
4 L'audit — la GPU cade di martedì alle 14:02 held, non dirottato; il registro spiega cosa e perché test_when_the_gpu_dies_the_work_stops_instead_of_moving_abroad
5 Commercialista — stessa avaria, una riga di policy diversa identificativi sostituiti in locale, risposta ri-identificata qui test_with_a_redactor_the_frontier_model_answers_and_never_sees_a_name
6 L'agente che eccede — «e già che ci sei pulisci il disco» lo strumento non parte e il rifiuto va a registro test_the_toolbox_still_works_and_the_policy_decides_which_part_of_it

Il caso 5 usa rizzo-pii (Simone Rizzo, MIT): lui riconosce gli identificativi italiani meglio di qualunque regex, Annona decide se il testo redatto può attraversare e lo registra. Un redattore non può concedere permessi.

Come è verificato

Cosa Come Stato
Suite completa, offline make check — lint, tipi, 10 contratti di layering, test 523 verdi
Matrice di conformance del placement 3 classi × 5 stati di disponibilità 15 casi
Leak rate canary piantato nei file, substrato di frontiera intercettato 0
Manomissione del registro voce riscritta, cancellata, riordinata, riga corrotta 4/4 rilevate
Modello locale vero make test-live — Ollama, qwen2.5 3B e 14B 6 verdi
Container come si deploya make test-container — utente non privilegiato, volumi, policy 12 verdi
Collaudo di una macchina nuova make verify — 9 controlli in 25 secondi 9/9
$ make verify
  pass  il runtime locale risponde
  pass  il modello ha chiamato lo strumento
  pass  leggere un file cliente ha reso il run riservato
  pass  nessun payload è arrivato al substrato di frontiera
  pass  leak rate a zero
  pass  ogni inferenza è stata piazzata on-prem
  pass  la catena del registro verifica
  pass  il run ha prodotto una risposta
  pass  con la GPU giù, il lavoro riservato è held (non dirottato)

L'ultimo controllo è quello commerciale: tutto il resto del mercato passa gli altri otto.

Provarlo

git clone git@github.com:akaion-ai/annona.git && cd annona
make setup && make demo         # run agentico vero, senza credenziali e senza rete

docker compose up -d            # kernel + modello locale, arm64 o amd64
make verify                     # i 9 controlli sopra, sulla tua macchina

Sul DGX Spark cambia una cosa sola: il profilo vllm del compose. Stessa immagine, stesso schema di policy — e le immagini sono costruite e testate anche per linux/arm64, perché un'immagine solo x86 su un GB10 non parte e lo scopri in sede dal cliente.

Cosa non fa, detto prima

  • Pseudonimo non è anonimo. La mappa di re-identificazione esiste: la redazione riduce l'esposizione, non toglie la base giuridica.
  • Sul GB10 non c'è confidential computing. Memoria cifrata e attestazione remota della GPU sono reali su hardware classe HGX B200, non su un DGX Spark. Un amministratore privilegiato può leggere la memoria — on-prem quell'amministratore è il cliente, ed è il punto, ma va detto in riunione e non scoperto in audit.
  • Il registro non ha ancora un'ancora esterna. È a prova di modifica, cancellazione e riordino; una catena ricostruita da zero da chi ha accesso in scrittura non è rilevabile, e c'è un test che lo dichiara.
  • I modelli piccoli sbagliano ancora gli argomenti degli strumenti. Il decoding vincolato da grammatica è la prossima cosa, ed è la claim di ricerca del progetto.

Il repository pubblica i propri buchi in tabella accanto alle proprie garanzie, e ogni garanzia ha un test con il suo nome. È l'unico modo in cui un fornitore può chiedere di essere creduto su una cosa che, per definizione, il cliente non può vedere mentre accade.