- Agentic AI
- Solo project: full stack and AI
- Aug - Sep 2025
Fantasy Football AI Auction Manager
Turns a spoken or typed auction sentence into a validated roster update, shared live with every participant.

- FastAPI
- LangChain
- GPT-4o-mini
- Google Speech-to-Text
- Redis
- WebSockets
- Next.js
- React
- TypeScript
- Tailwind
- shadcn/ui
The problem
During a fantasy football auction (6 to 12 teams, configurable budget) someone has to note by hand who buys which player and for how much, and keep budgets and role slots up to date. I wanted to say or type a sentence like "Dzeko squadraX 150" and get a structured update of the rosters, visible in real time to the other participants. It is a personal project.
What I built
A FastAPI backend: session creation, updates from text or audio, rosters, available players, player removal with refund, CSV export and a WebSocket for broadcast. Sessions are stored in Redis.
A Next.js frontend: a control panel for the operator (text input, microphone, role selector, team cards with budget and slots) and a read-only guest page, shared by link, that receives rosters over WebSocket.
How the agent works
This is a single-step LLM pipeline, not an agent with a tool loop. Audio is recorded in the browser, converted to WAV and sent to Google Speech-to-Text with phrase hints made of the player and team names, which biases recognition towards the auction vocabulary. A LangChain chain with GPT-4o-mini at temperature 0 then extracts player, team and price as structured output. The prompt only receives the players still available for the current role and the list of teams, so the model also resolves an imprecise transcript to the canonical name.
Guardrails: the returned player and team must match the provided lists exactly, otherwise it is an error. Then deterministic code checks that the player is not already assigned, the budget is enough, the role has a free slot and the team exists. The model never writes to state directly. The operator chooses the current role, sees the outcome and can remove a purchase with a refund.
Interesting decisions
Domain rules are validated in code, not by the model.
After each change the backend broadcasts to the session; a failed broadcast does not block the update, and a new socket gets the current roster immediately.
CSV export compatible with LegheFantacalcio.
What I would do differently today
The grounding here is often called RAG, but it is really context injected into the prompt: player lists read from CSV and Redis, filtered by role and auction state. There is no vector store and no embeddings.
There are also no evals, no tool calling and no conversational memory. I have not measured recognition accuracy or latency, so I cannot back the quality of the pipeline with numbers.
Need something similar?
Tell me about your project: I usually reply within one working day.
Get in touch