From One Sentence to a Fully Costed Shopping List: Building the CymbalMart Party Planner & AI Shopping Agent

Gemini 2.5 · React + TypeScript · Node/Express · Voice AI

· Ajoy Saha

View the code on GitHub
CymbalMart Party Planner & AI Shopping Agent — event blueprint UI showing 50-guest birthday party plan with shopping docket, budget tracker, and voice control panel

From "plan a taco fiesta for 15 guests" to a fully costed shopping list, aisle-mapped and ready to checkout. That's the promise of CymbalMart Party Planner & AI Shopping Agent — an end-to-end AI system I built solo, powered by Gemini 2.5, that turns a single sentence into a complete party plan.

What it actually does

  1. You describe an event — guests, duration, dietary needs, budget
  2. It generates a full menu, recipes, batch-scaling math, and a prep countdown
  3. It builds a shopping list mapped to real store aisles, with brand-tier swaps to optimise cost
  4. You can talk to it — hands-free — to add items, check off groceries, or ask "what's my total cost?"
  5. It checks out via curbside pickup or express delivery

The build — three distinct layers

Layer 1 · The App — structured AI output you can actually trust

The hard part wasn't calling an LLM — it was getting Gemini to reliably return structured JSON (menus, itemised costs, department budgets) that a UI can render and a budget engine can recalculate live. Getting structured outputs to hold up across edge cases — odd guest counts, tight budgets, complex dietary constraints — taught me more about prompt and schema design than any tutorial.

The key discipline: treat the LLM's output as an API contract, not a suggestion. Define the schema first, validate every response against it, and handle the failure modes explicitly rather than hoping the model stays on-format.

Layer 2 · The Chatbot — context is the whole game

A generic chatbot is easy. A chatbot that's grounded in your specific, live party plan — that can answer "what wine goes with the tacos?" and then actually edit your shopping list in response — is a different problem entirely.

This is where I really internalised what tool use means in practice: the assistant isn't just talking, it's calling structured functions that mutate real application state. The chatbot holds the full plan in context and exposes a set of typed tools — addItem, markBought, recalculateBudget — that Gemini can call when the user's intent warrants an action rather than just an answer.

Layer 3 · The Voice Agent — parsing intent from messy human speech

Hands-free mode was the toughest layer. "Add two packs of limes" and "mark ground beef as bought" both need to become structured commands — no retries, no clarifying questions, in real time. Building the natural language voice parser on top of the Web Speech API pushed me to think hard about intent recognition under noisy, ambiguous input — a very different discipline from designing a clean text prompt.

The practical lesson: voice interfaces need a much more defensive parser than text ones. Users don't self-correct mid-sentence, don't know what the system expects, and the STT layer introduces its own noise before your intent classifier even sees the input. Building each of those failure modes into the design upfront — rather than discovering them at demo time — is what made hands-free mode actually usable.

Stack

  • Front end: React 18 + TypeScript + Tailwind CSS
  • Back end: Node.js / Express with the Google Gen AI SDK
  • Model: Gemini 2.5 Flash — structured outputs, tool use, and streaming
  • Voice: Web Speech API (STT + TTS), custom intent parser

What this taught me

23+ years in enterprise delivery taught me how to ship. Building this taught me how AI systems actually reason, fail, and recover — one layer at a time.

The three layers weren't just technical layers — they mapped directly to three distinct AI engineering disciplines: structured output reliability, stateful tool-use orchestration, and real-time intent classification under noisy input. You don't get the full picture from any one of them alone. Building all three in a single system, where they had to actually work together, is what made each one click.

MIT licensed — feel free to fork or star: github.com/ajoys24/Party-Planner-Shopping-Agent