π Why we built Tasteprint
Somewhere in every family there is one person who is impossible to buy for. Their tastes are specific, cross-genre and deeply personal: BjΓΆrk and Studio Ghibli and Sally Rooney. Gift guides answer that complexity with "a candle." We believe the reason gift-giving feels so generic is that most tools search product categories, while a person's gift lives in their culture: the albums on repeat, the films they quote, the worlds they get lost in.
Qloo's taste API makes that culture computable, with hundreds of millions of entities and real cross-domain affinity. So we built Tasteprint: an autonomous agent that walks a person's cultural taste graph and returns gifts that prove you were listening. A person's taste is a fingerprint. The gift should match the whole print.
π€ What it does
Tell Tasteprint who you're shopping for (a few interests, a budget, an occasion) and an LLM agent hunts for gifts by calling Qloo like a set of tools, streaming its whole investigation live:
- Entity resolution with taste-appropriate humility. Free text becomes real entities. When "Coco" could be a Pixar soundtrack, an indie-pop artist, or a 1996 Kinks album, the agent stops and asks you which one, mid-run.
- Two-hop taste expansion. Direct neighbors are obvious. The interesting picks live two bridges away, and the agent decides for itself whether first-hop density justifies a second, riskier hop.
- Catalog scoring with receipts. Every one of the 241 catalog products gets a real affinity score with contributor shares, so you can see the exact chain of taste signals behind each pick.
- Three lanes, three confidence levels: π’ The Sure Thing (maximum affinity), π©· The Unexpected (a cross-domain wildcard, diversified so it's never the same category), and π‘ Better Together (a coherent bundle within budget).
- A live 3D taste constellation. The graph the agent explored, rendered in three.js and orbitable with mouse or keyboard, with reduced-motion and no-WebGL fallbacks.
- Refinement as conversation. "Less music, more books," a spoken voice note, a mood shift, or a veto on any pick: constraints flow back through SSE and the agent re-thinks.
- A cultural dossier, because a gift without a story is just a price tag.
A run that started from a single interest, Fela Kuti, recently returned Mulatu Astatke's Ethio-jazz vinyl as the sure thing, a hand-painted Malian mud cloth as the wildcard, and a bundle pairing One Hundred Years of Solitude with Miriam Makeba on vinyl. No gift guide wrote that.
π οΈ How we built it
- Stack: Next.js 16 (App Router) + React 19 + TypeScript + Tailwind 4, with a fully stateless server. All session state lives in the client and a shareable URL.
- The agent (
agent.ts) is an open LLM tool loop:resolve_entityβexpand_tasteβscore_candidatesβcheck_budgetβselect_lanesβsynthesize_dossierβfinish. It uses typed tool schemas, guarded arguments, and a hard 14-step budget so a confused model can't wander forever. - The deterministic pipeline (
pipeline.ts) mirrors the agent: entity resolution β 1-hop/2-hop Qloo insights with explainability β batch affinity scoring β lane selection. The wildcard uses Maximal Marginal Relevance:
$$MMR = \arg\max_{i\in R}\left[\lambda\,rel(i) - (1-\lambda)\max_{j\in S}sim(i,j)\right]$$
and the bundle $B$ satisfies $\sum_{i\in B} p_i \le \text{budget}$.
- A 241-product catalog across 22 categories, every item anchored to a verified Qloo entity. We deliberately made it culturally broad (Afrobeats to Ethio-jazz, qawwali to bossa nova, Pachinko to Persepolis, tagines, gobans, kente and loterΓa) because a taste graph is only as useful as the things you can actually buy at the end of it.
- SSE streaming end-to-end: every tool decision, discovery and clarification lands in the UI in real time. Demo-safety is built in: recorded golden runs replay with realistic pacing for stage, with one-click graduation to a live search.
- An adversarial eval harness (
npm run eval): 10 fixed profiles checked against catalog authenticity, lane budget compliance, category divergence, cross-lane duplication and evidence integrity. - Look and feel: three.js for the constellation, self-hosted Manrope and a deep-black editorial design system, deployed on Vercel.
π§ Challenges we ran into
- Ambiguity is the whole game. "Coco," "Dune," "BjΓΆrk-as-artist-vs-documentary": the difference between a gift that lands and one that doesn't is one wrong entity. We invest heavily in typed disambiguation, with typed candidate chips in the form and agent-initiated clarifications mid-run.
- Agents wander. Early runs burned their step budget asking redundant questions. We bounded the loop, guarded every tool, and made the handoff to the deterministic pipeline transparent instead of hidden. The UI literally prints "step budget reached, handing off."
- Real-world rate limits. Live Qloo/LLM calls fail in production. Rather than pretend otherwise, we replay golden fixtures with paced realism so a demo never dies on stage, then hand back to live mode on one click.
- Model capability mismatch is real. Our first model choice rejected function tools on the Chat Completions API mid-build, and the same pipeline has to survive OpenAI-compatible providers with different quirks. We ended up with a thin, provider-agnostic
callChatand a model that fits the API surface, not the other way around. - Cultural breadth is a data problem, not a model problem. The agent will only recommend what exists in the catalog, and an AirTag is never the wildcard a Fela Kuti fan deserves. We audited every product's cultural anchor and rebuilt the catalog around verified global entities.
- Honest copy or nothing. Early LLM explanations invented stories. Now all copy is grounded in structured evidence (contributor shares, via-chains, real prices), with templates as fallback.
π What we learned
An agent isn't a prompt in a loop. It's a system of bounded autonomy, typed tools, honest legibility, and a plan B that's good enough to demo on its worst day. The magic moment isn't the graph itself; it's when the audience sees why: the chain from Fela Kuti through West-African guitar traditions to a mud cloth on a real storefront. Taste intelligence is the missing layer between "personalized" and "personal."
Built With
- agentic-ai
- llm-agent
- next.js
- node.js
- openai
- qloo-api
- react
- recommendation-engine
- server-sent-events
- tailwind-css
- taste-graph
- three.js
- typescript
- vercel
- web-speech-api
Log in or sign up for Devpost to join the conversation.