Inspiration
Recommendation engines know what people clicked, but date-night planning is about taste: the texture of a Wes Anderson film, the mood of a Taylor Swift record. Qloo's taste graph is the first API that answers "what feels like this" across domains. DateNight Agent makes that answer a plan.
What it does
You describe a person and an evening in plain English (e.g., "Plan a date night for someone who loves Wes Anderson films and Taylor Swift, in Chicago"). The agent runs a 5-step agentic loop:
- Parse — LLM extracts taste seeds, location, occasion (rule-based fallback when no LLM key is set).
- Fingerprint — each seed resolves to Qloo taste-graph entity IDs via
/search; the set is the user's taste fingerprint. - Investigate — cross-domain
/v2/insightsqueries seeded by the fingerprint pull dinner (food & beverage places), film, and evening stroll picks (restaurants map tourn:entity:placeper the hackathon API's supported filter types; aliases handled in code). - Rank — picks are ordered by Qloo affinity score, surfaced as evidence, not hidden.
- Narrate — an LLM narrates a coherent itinerary citing the affinity scores (template fallback included).
The web UI shows a live/mock mode badge: without the hackathon API key it runs a clearly labeled deterministic mock, so judges (and the entrant) see the full agentic flow with zero configuration.
How we built it
Zero-dependency Python (stdlib only): a lightweight HTTP server (agent.py), a taste-API client (qloo_client.py) with a labeled mock fallback, and a single-page UI (static/index.html). Mock mode is deterministic so the demo is reproducible. Test flow (test_flow.py) runs the full loop end-to-end.
Challenges
The hackathon API rejects urn:entity:restaurant as a filter type (verified live, Oct 17); food & beverage must use urn:entity:place, and search results carry types[] rather than type. Affinity scores live in each insight entity's query.affinity, not a top-level affinity field (verified live, Oct 27 — reading the wrong field silently ranked everything 0.0). Signal entity IDs must be raw UUIDs; urn:entity:<uuid>-prefixed signals are rejected with HTTP 400 (verified live, Oct 27). All three are normalized in the client with a documented alias/field map. The demo runs identically against mock or live backends.
Accomplishments
A working agentic planner that exercises Qloo as a true tool in a multi-step loop (not a single API call), with affinity scores cited as evidence in the final itinerary.
What's next
Location-aware filtering (geohash/radius) for dinner picks, and LLM taste-seed expansion for richer fingerprints.
Try it out
Repo: https://github.com/midnightmichigan/datenight-agent
Demo: python3 agent.py → http://127.0.0.1:8001 ; python3 test_flow.py runs the full loop in mock mode.
Built With
- python
- qloo-taste-api
- rest/json
Log in or sign up for Devpost to join the conversation.