HELP — Come usare AgileTavK (round 3)

Questa guida permette di verificare il sistema senza leggere il codice. Segui i passi dall'alto verso il basso. Nei comandi, <host> è agiletavk.agile.software.

0. Architettura del sito pubblico (cosa risponde e da dove)

Il sito pubblico risponde sempre, per intero, dal box (CPU), anche senza GPU accesa:

PercorsoDa doveNote
/, /demo, /portale, /docs, /help, /sitofile statici del boxsempre
/salute, /v1/*, /admin/*, /vede, /persone/*, /presentazioni/*API sul box (CPU)sempre
/parla, /conversaAPI sul box (CPU)volto fermo dichiarato + audio vero
/parla, /conversa con pod accesoinoltrate al pod GPU in automaticolabiale vero EchoMimic

Senza GPU i motori del box girano in CPU con modelli più piccoli ma veri (SmolVLM-256M per la vista, Qwen2.5-1.5B GGUF Q4_K_M via llama.cpp per il cervello, faster-whisper base per l'ascolto, Kokoro-82M per la voce): le risposte arrivano comunque, più lentamente. Il video prodotto sul box dichiara la modalità con gli header X-Origine-Video: box-cpu e X-Modalita-Volto: statico-cpu (volto fermo dichiarato + audio vero: scelta deliberata, meglio una foto ferma onesta che una bocca disegnata; vedi docs/DECISIONI.md). Quando il pod GPU è collegato, /parla e /conversa vengono inoltrate al pod in automatico e il video ha il labiale vero EchoMimic (X-Origine-Video: pod-gpu). /salute riporta video_modalita e pod_collegato.

1. Percorso di giuria nel sito (il giro completo, senza comandi)

È il percorso che può fare chiunque dal browser, in un'unica sessione:

  1. Landing — Apri https://<host>/: pagina commerciale del prodotto

(cos'è, punti di forza). Pulsante Accedi in evidenza.

  1. Login — Entra con l'utente dimostrativo pre-creato:

nome utente demo (va bene anche demo@agile.software), password AgileTavK. La registrazione self-service resta disponibile dal pulsante Crea un conto (email + nome + password).

  1. Galleria — Nell'area conto vedi le tre persone digitali inventate

(Ada, Leo, Nova): volto fotorealistico, nome, ruolo, tono, voce e un video di presentazione per ciascuna. Sotto, la sezione I tuoi avatar.

  1. Crea il tuo avatar — Scheda Crea avatar: dai un nome, accendi

camera e microfono, registra 20–30 secondi mentre parli (il timer ferma da solo a 30 s), riguarda l'anteprima e conferma con Crea il mio avatar. Volto e voce vengono clonati e salvati nel conto: rientrando, l'avatar è ancora lì. In alternativa, dal riquadro Oppure da una foto: foto frontale (+ audio facoltativo di ~30 s per la voce clonata). Formati video accettati: mp4, webm, mov, mkv (il browser registra in webm).

  1. Conversa — Scheda Conversa: scegli una delle tre persone o il

tuo avatar. Si apre una videochiamata: il browser chiede microfono e camera una volta, poi parli e basta — il microfono è sempre aperto e il tuo turno parte da solo quando finisci di parlare (la barra in basso a sinistra mostra il livello della tua voce). L'avatar risponde in video con sottotitoli; mentre non parla, lo vedi vivo in attesa. I bottoni 🎙 e 📷 spengono microfono e camera come in ogni meeting; con Scatta e descrivi l'avatar descrive il fotogramma e ne tiene conto; Termina chiude la chiamata. Non serve nessuna API key: la sessione usa il tuo conto. Il tuo avatar parla con il tuo volto e la tua voce (clonata dal video di registrazione).

  1. API key — Scheda API (serve agli sviluppatori, non per parlare):

due livelli — test (atk_test_…, 50 chiamate/giorno) e live (atk_live_…, 1000/giorno) — mostrate una sola volta, con bottone Copia, elenco delle tue chiavi con livello, quota e uso, revoca con un clic, ed esempi pronti curl / Python / JavaScript (CORS aperto) già precompilati con host e chiave.

2. Ottenere una API key (sviluppatori)

2.1 Dal portale amministratore

  1. Apri https://<host>/portale.
  2. Accedi con la password di amministrazione (default di prova: admin).
  3. Clicca su Crea chiave: il token viene mostrato una sola volta.
  4. Copialo e usalo come header X-API-Key nelle chiamate API.

2.2 Via API (per test robotizzati)

Gli endpoint /admin/* (tranne il login) richiedono l'header X-Admin-Token ottenuto dal login:

# 1. login → token amministratore
TOKEN_ADMIN=$(curl -s -X POST "https://<host>/admin/login" \
  -H "Content-Type: application/json" \
  -d '{"password":"admin"}' | python3 -c "import json,sys;print(json.load(sys.stdin)['token'])")

# 2. creazione chiave
curl -s -X POST "https://<host>/admin/chiavi?quota=1000" \
  -H "X-Admin-Token: $TOKEN_ADMIN"

La risposta contiene il token da usare come X-API-Key. Le chiavi sono persistite sul box: restano valide anche se il servizio viene riavviato.

2.3 Percorso utente self-service (obiettivo E)

Un visitatore può ottenere una API key senza amministratore:

# registrazione (email, nome, password)
curl -s -X POST "https://<host>/v1/registrazione" \
  -H "Content-Type: application/json" \
  -d '{"email":"utente@example.com","nome":"Mario Rossi","password":"segreta"}'
# → {"token":"<token_utente>", ...}

# attivazione con codice promo
curl -s -X POST "https://<host>/v1/conti/mio/promo" \
  -H "X-User-Token: <token_utente>" \
  -H "Content-Type: application/json" -d '{"codice":"DEMO2026"}'

# generazione della propria API key
curl -s -X POST "https://<host>/v1/conti/mio/chiavi" \
  -H "X-User-Token: <token_utente>"
# → {"api_key":"...","quota_giornaliera":1000}

3. Le persone digitali

curl -s -H "X-API-Key: <token>" "https://<host>/v1/persone"

Risposta: le tre persone inventate più gli avatar personali del conto ("id":"avatar:<id>"). Ogni persona ha:

(PNG 1024×1024 generato sul pod con RealVisXL V4.0, OpenRAIL++);

(voce Kokoro + labiale EchoMimic, generato sul pod).

/v1/persone accetta anche X-User-Token (è la galleria dell'area conto); senza credenziali risponde 401.

4. Aprire una sessione

curl -s -X POST "https://<host>/v1/sessioni" \
  -H "X-API-Key: <token>" \
  -H "Content-Type: application/json" \
  -d '{"persona": "ada"}'

Risposta: {"id": "<sessione_id>"}. Per il tuo avatar: {"persona": "avatar:<id>"}.

5. Far parlare l'avatar (testo → video)

curl -s -X POST "https://<host>/v1/sessioni/<sessione_id>/parla" \
  -H "X-API-Key: <token>" \
  -F "testo=Ciao, sono l'avatar sovrano AgileTavK." \
  --output parla.mp4 -D -

Risposta: video/mp4. Controlla gli header: X-Origine-Video dice se il video viene dal box CPU (box-cpu, volto fermo dichiarato) o dal pod GPU (pod-gpu, labiale vero EchoMimic).

6. Conversare a voce (audio → video)

Prepara un file audio WAV o MP3 con la domanda, poi:

curl -s -X POST "https://<host>/v1/sessioni/<sessione_id>/conversa" \
  -H "X-API-Key: <token>" \
  -F "audio=@domanda.wav" \
  --output conversa.mp4 -D -

Risposta: video/mp4 con la risposta parlata. Gli header HTTP riportano i tempi di ogni anello:

e i sottotitoli (X-Testo-Domanda, X-Testo-Risposta, URL-encoded).

7. Provare la vista (/vede)

curl -s -X POST "https://<host>/v1/sessioni/<sessione_id>/vede" \
  -H "X-API-Key: <token>" \
  -F "fotogramma=@frame.jpg"

Risposta: {"descrizione": "..."}. Il modello non identifica persone reali, né descrive emozioni, etnia o salute, e resiste alle istruzioni scritte nel fotogramma. Se inquadri un documento lo dice («vedo un documento») ma non ne legge il contenuto: il filtro protegge l'identità, non la scena. Funziona sempre, anche senza GPU (SmolVLM-256M sul box).

8. Creare un avatar via API (clonazione volto + voce)

Lo stesso percorso della sala di registrazione, da qualsiasi applicazione:

# da video (mp4/webm, 20–30 s parlati): clona volto E voce
curl -s -X POST "https://<host>/v1/conti/mio/avatar" \
  -H "X-User-Token: <token_utente>" \
  -F "nome=Il mio avatar" \
  -F "video=@registrazione.webm"

# oppure da foto + campione audio (~30 s)
curl -s -X POST "https://<host>/v1/conti/mio/avatar" \
  -H "X-User-Token: <token_utente>" \
  -F "nome=Il mio avatar" \
  -F "foto=@foto.jpg" \
  -F "audio=@voce.wav"

L'avatar resta nel conto (GET /v1/conti/mio/avatar), si usa nelle sessioni con "persona":"avatar:<id>" e si cancella con DELETE /v1/conti/mio/avatar/<id> (cancella davvero volto, voce e registrazione originale). La voce è clonata con Kokoro + OpenVoice v2 (ToneColorConverter, MIT); il timbro arriva dal tuo campione, la pronuncia resta italiana. Tempi: la creazione è immediata (estrazione frame+audio); il primo video parlato paga il caricamento dei pesi (pochi secondi sul pod, di più sul box CPU).

8.1 Se nella registrazione ci sono più voci (diarizzazione)

Il campione viene pulito prima della clonazione, direttamente sul box (senza GPU): il motore di diarizzazione (VAD Silero + embedding ECAPA-TDNN SpeechBrain, Apache-2.0) trova i tratti parlati, conta le voci presenti e isola quella del soggetto — la persona che parla di più — scartando intervistatore, domande fuori campo e sottofondi. Stessa cosa per il volto: dal video viene ritagliato il volto più presente, non chi sta accanto.

La risposta della creazione riporta:

{
  "id": "…",
  "voci_trovate": 2,
  "voce_usata": 0,
  "isolamento": "attivo",
  "origine_volto": "volto_ritagliato",
  "messaggio": "Avatar creato… Ho trovato 2 voci nella registrazione: uso quella della persona che parla di più."
}

Se la voce scelta non è quella giusta, ricrea l'avatar passando -F "voce_indice=1" (0 = la più presente, 1 = la seconda, …). Se il motore di diarizzazione non è disponibile la creazione non si blocca: isolamento vale non_disponibile e si usa l'audio integrale.

9. Cosa aspettarsi

per l'audio; MP4/WEBM/MOV/MKV per i video di registrazione.

cura del cervello (llama.cpp GGUF):

catena): 8–16 s; parla con avatar: 2–6 s

ascolto 0,2–3 s · cervello 1–7 s · voce 0,2–0,5 s · volto 5–170 s (EchoMimic: il primo video paga il caricamento dei pesi).

10. Errori comuni

CodiceSignificatoCosa fare
401Chiave API mancante/revocata, o token admin/utente mancanteOttieni una chiave (passo 2) o rifai il login
403Conto non attivoApplica il codice promo (passo 2.3)
404Sessione/persona/avatar non trovatoCrea una nuova sessione o controlla l'id
422Input non validoControlla formato e campi obbligatori
429Quota giornaliera esauritaAttendi mezzanotte UTC o crea una chiave con quota maggiore
503Motore non prontoVerifica /salute e che i pesi siano presenti

11. Verificare che la rete sia chiusa

L'API del box gira con HF_HUB_OFFLINE=1: a runtime non scarica nulla. Sul pod (banco) la verifica è più forte: dopo make pesi (rete aperta), la prova blocca il traffico in uscita con DNS morto (nameserver 127.0.0.1) e proxy HTTP/HTTPS invalidi, monitorando che non ci siano connessioni TCP verso l'esterno durante una /conversa completa (su un host con privilegi di rete si può usare anche sudo iptables -P OUTPUT DROP). L'esito è registrato in banco/risultati/rete_chiusa.json e prova_rete_chiusa.json. make prova esegue automaticamente questa verifica.

12. Attivare il pod GPU per il labiale vero (opzionale)

Non serve per l'uso del sito: tutto funziona sul box. Se vuoi il labiale vero EchoMimic sul sito pubblico:

  1. Richiedi una GPU dal box:
pod chiedi 4090 2 "labiale vero sul sito pubblico"
  1. Sincronizza il repository e avvia l'API sul pod:
bash banco/su-pod.sh bash banco/avvia_api_pod.sh
  1. Apri il tunnel (porta 8001 del box → 8000 del pod):
bash banco/tunnel_pod.sh
  1. Verifica il ponte: curl https://<host>/salute deve riportare

"pod_collegato": true; le chiamate /parla e /conversa rispondono con header X-Origine-Video: pod-gpu.

  1. Al termine chiudi il tunnel e rilascia il pod:
pkill -f "ssh.*-L 8001:localhost:8000"
pod rilascia "fine labiale vero"

13. Collaudo robotizzato

Tutta la sequenza di questa guida è automatizzata:

make collaudo-pubblico SITO=https://agiletavk.agile.software

Esegue: salute → registrazione → promo → API key utente → login admin → 401 senza token admin → chiave admin → persone → sessione → parla → conversa → vede → 401 chiave inventata → 429 quota esaurita. I timeout sono adeguati alla CPU del box.

14. Amministrazione del servizio sul box

L'API del box è un servizio systemd (banco/agiletavk-api.service):

systemctl status agiletavk-api      # stato
journalctl -u agiletavk-api -f      # log
systemctl restart agiletavk-api     # riavvio

Chiavi e conti utente sono persistiti in dati/ (configurabile con DATI_DIR); le sessioni e i riferimenti vivono solo in memoria/disco di lavoro e vengono cancellati alla chiusura della sessione.