Skip to main content
Back to Projects

Vinny: AI Beverage Concierge

A personal project: a live AI wine and beverage concierge that recommends a bottle and says why, with search that matches on meaning and keywords and an MCP server other AI agents can query.

2025 - 2026

Next.js
TypeScript
Supabase
pgvector
Vercel AI SDK
Claude Sonnet 4.6
Cohere Rerank
MCP
  • Wine recommendations live; the spirits catalog is loaded, and the beer and cocktail loads are pending
  • A catalog of about 100,000 wines from an openly licensed dataset (X-Wines), plus 5,000+ food pairings
  • Each drink category (wine, beer, spirits, cocktails) has its own table and search index, so every search stays within its category
  • Search matches on meaning and on keywords, then a reranking model orders the results, so both "a bold Italian red" and an exact bottle name work
Vinny: AI Beverage Concierge title card

System Architecture

Vinny: AI Beverage Concierge system architecture diagramOpen the diagram full size

Problem

Most wine recommendations either filter by price and region or depend on a sommelier being on hand. General AI chat tools can invent wine names and tasting notes because they are not grounded in real catalog data. Most places that pour wine also pour beer, spirits and cocktails, so wine-only is not enough.

Approach

Vinny looks up real data before it answers (retrieval-augmented generation, or RAG). It started with wine and is adding beer, spirits and cocktails. Each drink category has its own table and search index. The model sees one search tool with a category parameter, and the backend dispatches to the matching search function; cross-category pairing search is built in the database, not yet a chat tool.

Architecture

Next.js and the Vercel AI SDK run the conversation on Claude Sonnet 4.6 by default; GPT-5.4 reads images and takes over if the Anthropic call fails before streaming starts. Search runs inside Supabase: one database function matches on meaning and on keywords and merges the two result lists, and a Cohere model then reranks them in the app. Its data comes from the X-Wines catalog and Wikipedia wine articles, Catalog.beer for beer, Wikidata for spirits, TheCocktailDB and the IBA list for cocktails, the Grapeminds live wine API and Tavily web search, and an MCP server lets outside AI agents query the catalog.

More Results

  • Row-level security on venue and user tables, with anonymous guest traffic scoped to its venue by the server route
  • Live demo deployed on Vercel

Lessons Learned

People mix descriptive queries ("bold Italian red") with exact names ("2019 Barolo"), so search needs vector matching, keyword matching and a reranker together. When categories differ this much in structure (wine, beer, cocktails), separate tables kept both the indexes and the code cleaner than one shared table.