- AI agentica
- Progetto personale: full stack e AI
- Ago - Set 2025
Fantasy Football AI Auction Manager
Trasforma una frase d'asta, detta a voce o scritta, in un aggiornamento validato delle rose, condiviso in tempo reale con tutti i partecipanti.

- FastAPI
- LangChain
- GPT-4o-mini
- Google Speech-to-Text
- Redis
- WebSockets
- Next.js
- React
- TypeScript
- Tailwind
- shadcn/ui
Il problema
Durante un'asta di fantacalcio (da 6 a 12 squadre, budget configurabile) qualcuno deve annotare a mano chi compra quale giocatore e a quanto, e tenere aggiornati budget e slot per ruolo. Volevo dire o scrivere una frase come "Dzeko squadraX 150" e ottenere un aggiornamento strutturato delle rose, visibile in tempo reale agli altri partecipanti. È un progetto personale.
Cosa ho realizzato
Un backend FastAPI: creazione delle sessioni, aggiornamenti da testo o audio, rose, giocatori disponibili, rimozione di un giocatore con rimborso, export CSV e un WebSocket per il broadcast. Le sessioni sono salvate su Redis.
Un frontend Next.js: un pannello di controllo per l'operatore (input testuale, microfono, selettore del ruolo, card delle squadre con budget e slot) e una pagina ospite in sola lettura, condivisa tramite link, che riceve le rose via WebSocket.
Come funziona l'agente
Si tratta di una pipeline LLM a singolo passaggio, non di un agente con un ciclo di tool. L'audio viene registrato nel browser, convertito in WAV e inviato a Google Speech-to-Text con phrase hints composti dai nomi di giocatori e squadre, che orientano il riconoscimento verso il vocabolario dell'asta. Una chain LangChain con GPT-4o-mini a temperatura 0 estrae poi giocatore, squadra e prezzo come output strutturato. Il prompt riceve solo i giocatori ancora disponibili per il ruolo corrente e l'elenco delle squadre, così il modello riconduce anche una trascrizione imprecisa al nome corretto.
Guardrail: il giocatore e la squadra restituiti devono corrispondere esattamente alle liste fornite, altrimenti è un errore. Poi codice deterministico verifica che il giocatore non sia già assegnato, che il budget sia sufficiente, che il ruolo abbia uno slot libero e che la squadra esista. Il modello non scrive mai direttamente sullo stato. L'operatore sceglie il ruolo corrente, vede l'esito e può rimuovere un acquisto con rimborso.
Scelte interessanti
Le regole di dominio sono validate nel codice, non dal modello.
Dopo ogni modifica il backend fa broadcast alla sessione; un broadcast fallito non blocca l'aggiornamento, e un nuovo socket riceve subito la rosa corrente.
Export CSV compatibile con LegheFantacalcio.
Cosa farei diversamente oggi
Il grounding qui viene spesso chiamato RAG, ma in realtà è contesto iniettato nel prompt: liste di giocatori lette da CSV e Redis, filtrate per ruolo e stato dell'asta. Non ci sono né vector store né embeddings.
Non ci sono nemmeno evals, tool calling o memoria conversazionale. Non ho misurato l'accuratezza del riconoscimento né la latenza, quindi non posso supportare con numeri la qualità della pipeline.
Ti serve qualcosa di simile?
Raccontami il tuo progetto: di solito rispondo entro un giorno lavorativo.
Contattami