
Gioco investigativo basato sulla voce. Mistral Large 3 + Voxtral STT + ElevenLabs TTS. Realizzato per il Mistral Worldwide Hackathon 2026.

Un gioco investigativo basato sulla voce. Sei un detective. Mistral è un sospettato che mente. Il tuo compito è smascherare la bugia solo con le domande.
Ogni caso è generato proceduralmente — un crimine finanziario unico, un sospettato, una storia di copertura e una bugia nascosta. Il sospettato è interpretato da Mistral Large, dotato di una backstory completa e istruito a difenderla sotto pressione avversaria. Non esistono due casi uguali.
Realizzato per la Mistral Worldwide Hackathon 2026 (Online Track).
"Mistral sa ragionare. Io l'ho fatta mentire. Il tuo compito è smascherarla."
L'IA è istruita a non confessare mai, nemmeno sotto massimo stress. Vinci facendo un'accusa specifica e accurata — non facendo crollare il sospettato.
npm install
cp .env.example .env # Inserisci le tue chiavi API
npm run dev # http://localhost:3000
MISTRAL_API_KEY= # Richiesta — generazione casi, interrogatorio, valutazione, STT
ELEVENLABS_API_KEY= # Richiesta — TTS per la voce del sospettato
ELEVENLABS_VOICE_ID= # Opzionale — ID voce specifico ElevenLabs
NEXT_PUBLIC_SUPABASE_URL= # Richiesta — URL del progetto Supabase
NEXT_PUBLIC_SUPABASE_ANON_KEY= # Richiesta — chiave anon Supabase (protetta da RLS)
SUPABASE_SERVICE_ROLE_KEY= # Opzionale — endpoint esportazione admin
EXPORT_SECRET= # Opzionale — autenticazione esportazione admin
Le chiavi API possono anche essere configurate nella pagina Impostazioni in fase di esecuzione — l'app viene fornita senza chiavi e i giocatori portano le proprie.
npm run dev # Server di sviluppo
npm run build # Build di produzione
npm run start # Server di produzione
npm run lint # ESLint
| Livello | Indizi | Timer | Comportamento sospettato |
|---|---|---|---|
| Facile | 2 | 5 min | Bugia ovvia, nervoso |
| Medio | 3 | 7 min | Bugia scopribile, composto |
| Difficile | 4 | 9 min | Bugia sottile, abile nel deviare |
| Esperto | 5 | 10 min | Bugia profondamente nascosta, manipolatore |
È disponibile anche una modalità timer illimitato — in difficoltà difficile/esperto, il sospettato chiamerà un avvocato dopo 4 scambi consecutivi ad alto stress.
Gli indizi si sbloccano a soglie di stress distribuite tra 1 e 9, limitate da:
Il pulsante Accusa si sblocca solo dopo aver raccolto tutti gli indizi richiesti.
punteggio = punteggioTempo x moltiplicatoreDifficoltà x bonusEfficienza x penalitàSuggerimento x penalitàAccusa
punteggioTempo = 1000 x sqrt(max(0, 1 - tempoTrascorso / (parTempo x 2)))
moltiplicatore = facile 1.0x, medio 1.5x, difficile 2.0x, esperto 2.5x
bonusEfficienza = 1.0-1.5x (meno domande del par = bonus)
penalitàSuggerimento = 0.85^suggerimentiUsati
penalitàAccusa = max(0, 1 - accuseSbagliate x 0.1)
Il punteggio viene calcolato lato server dalle statistiche congelate al momento della vittoria — i valori del client vengono ignorati.
app/
├── page.tsx # Schermata del titolo
├── cases/ # Selezione caso — location + difficoltà
├── game/
│ ├── page.tsx # Orchestratore principale del gioco
│ ├── hooks/ # useVoiceRecorder, useTTS, useGameTimer, useSfx, useSettings
│ ├── components/ # Dock, TopBar, CaseFile, SuspectZone, BriefingScreen, dialoghi
│ ├── win/ # Schermata vittoria + Inserimento iniziali
│ └── lose/ # Schermata sconfitta
├── leaderboard/ # Top 20, animazione nuovo inserimento
├── settings/ # Configurazione chiavi API, esportazione, preferenze
├── help/ # Come giocare, punteggio, info
├── about/ # Info realizzatore
└── api/
├── generate-case/ # GET — generazione caso Mistral
├── interrogate/ # POST — domanda giocatore → risposta sospettato
├── accuse/ # POST — valutazione accusa (giudice separato)
├── evaluate/ # POST — analisi vittoria/sconfitta
├── hint/ # POST — suggerimenti oscurati sull'attivazione dello stress
├── tts/ # POST — ElevenLabs TTS
├── transcribe/ # POST — Voxtral STT
├── leaderboard/ # GET/POST — classifica Supabase
├── patterns/ # GET/POST — pattern di apprendimento tra sessioni
└── export/ # GET — esportazione admin JSONL
src/lib/
├── mistral/ # Client Mistral, interrogatorio, valutazione, generazione casi, embeddings
├── game-session.ts # Archivio sessioni lato server, token vittoria, esportazione
├── game-state.ts # Definizioni dei tipi
├── scoring.ts # Calcolo punteggio + valutazioni detective
├── sanitize.ts # Validazione input, rilevamento iniezioni
├── db.ts # Client Supabase
└── rate-limit.ts # Limitazione richieste per IP
Il gioco esegue un'IA avversaria contro l'input del giocatore — la sicurezza è una caratteristica fondamentale, non un ripensamento.
Sanitizzazione input: oltre 30 pattern regex di iniezione, normalizzazione Unicode (NFKD), rimozione caratteri a larghezza zero, rilevamento payload base64, blocco di testi senza senso/non inglesi.
Scansione output: Risposte IA controllate per segreti del caso con fuzzy matching (soglia 40%, filtro stop-word). Risposte che rivelano segreti sostituite con deviazioni.
Isolamento giudice: La valutazione dell'accusa utilizza una chiamata Mistral separata con prompt di sistema dedicato, token di delimitazione randomizzati, marcatori di iniezione rimossi. Le chiamate al giudice non usano mai chiavi API fornite dal giocatore.