TasteTable: AI-Powered Group Outing & Dining Planner
What Inspired the Project
Planning group outings—whether coordinating a dinner, a movie, and a bar crawl with friends—is notoriously frustrating. Everyone has different tastes, dietary preferences, and schedules, usually leading to endless group-chat arguments and compromises where someone always ends up underserved.
As a solo developer, I wanted to solve this friction by harnessing multi-domain taste intelligence from Qloo and combining it with autonomous tool-calling agents powered by Google Gemini. My goal was to build an intelligent companion acting as an unbiased "group concierge," balancing everyone's preferences mathematically and agentically so that every member of the group genuinely enjoys the itinerary.
How I Built It
TasteTable is built as a high-performance full-stack application leveraging modern asynchronous Python and AI agent frameworks:
Backend Framework: FastAPI (Python) handling asynchronous endpoints, real-time event streaming, and state management for multi-stop itinerary planning.
Taste Intelligence Engine: Integrated with the Qloo API to perform cross-domain entity search, group preference aggregation, and per-person affinity scoring across multiple categories (restaurants, bars, cafes, movies, books, and media).
AI Agentic Core: Powered by the Google Gemini API (google-genai SDK) utilizing native function/tool-calling declarations. The agent dynamically decides when to query group recommendations, handle tie-breakers for underserved participants, and adapt itineraries based on user constraints.
Deterministic Fallback: A robust, rule-based fairness optimization planner (plan_greedy) that acts as an instant fallback to guarantee zero downtime or failures if rate limits or network issues arise.
Frontend & UI: A sleek, neon-themed dark UI equipped with real-time progress feeds, interactive stop-swapping, constraint refinement boxes, and calendar synchronization.
Challenges Faced
Managing API Rate Limits & Parallel Scoring:
Querying Qloo insights simultaneously for multiple group members across multiple venue categories frequently triggered HTTP 429 Too Many Requests errors. I resolved this by engineering a custom asynchronous retry wrapper with exponential backoff (asyncio.sleep with backoff multipliers) to handle rate limits smoothly without crashing the request loop.
Migrating Agent Architectures:
Transitioning to Google Gemini's native tool-calling schema (types.Tool and FunctionDeclaration) required careful schema mapping to ensure the agent correctly parsed JSON briefs and fed tool outputs back into the chat session seamlessly.
Balancing Group Fairness vs. Highest Averages:
Standard recommendation engines simply pick the highest average score, often alienating the person with niche tastes. I implemented a custom fairness scoring algorithm that up-weights participants whose tastes have been underserved in preceding stops, ensuring equitable satisfaction across the entire itinerary.
What I Learned
The Power of Grounded AI Agents: Letting LLMs hallucinate recommendations leads to broken user experiences. Grounding Gemini strictly inside Qloo’s verified entity database ensures that every venue, movie, or bar suggested is 100% real, open, and data-backed.
Robust Error Handling in Distributed Systems: Building production-ready AI apps requires graceful degradation—combining dynamic LLM agent loops with deterministic fallback logic ensures users always get valid, usable plans even under strict network or rate-limiting conditions.
Asynchronous Python Optimization: Leveraging asyncio.gather for parallelized entity resolution and candidate scoring dramatically slashed response times, making the real-time planner feel instant.
Built With
- aiagent
- asyncio
- css3
- fairnessoptimization
- fastapi
- functioncalling
- googlegeminiapi
- googlegenaisdk
- groupplanning
- hackathon
- html5
- javascript
- python
- qlooapi
- qloohackathon
- recommendationengine
- render
- responsivedesign
- restapi
- tasteintelligence
- toolcalling
- uvicorn
Log in or sign up for Devpost to join the conversation.