Inspiration
Recommendation tools hand you a list and ask you to trust it. But the people who act on taste data, such as event programmers, brand partnership teams and playlist editors, need to know why two things share an audience. I wanted an agent that goes looking for surprising connections across culture and shows its evidence for every one.
What it does
Type something you love: a film, a band, a book. CultureGraph Explorer asks Qloo what audiences connect to it, chooses which branch to follow, and keeps going on a small query budget. The result is a route across categories, drawn as a map. For example: Interstellar → Constellation (TV) → Lana Del Rey (music) → Louis Vuitton (brand).
Click any line to see what Qloo actually returned: the request, the time, the affinity score and the tags Qloo gives both ends. The app's own wording is labelled as the app's, never passed off as Qloo's. A dotted line would mean a guess with no Qloo result behind it.
A Bridge Brief turns a route into a one-page summary (the audience's shared language, hop-by-hop scores, and ideas for using the link) that you can copy, download or print.
How I built it
- Backend: Python and FastAPI. The Qloo key stays on the server. It uses Qloo's search and Insights endpoints across artists, films, TV, books and brands, paces requests to the key's rate limit, caches privately, and rate-limits visitors.
- The agent: a bounded loop with hard limits: 12 queries per journey (3 kept back so you can follow threads yourself), 3 hops, and scoring that rewards crossing into new categories while demoting categories that drift off-topic. A validator refuses to draw any link that lacks its Qloo provenance. [If you enable a language model: The model only chooses among results Qloo returned and writes hedged explanations; if it fails, the rules take over.]
- Frontend: React and Vite, with a hand-written force layout. Events stream from the server as the agent works, so you watch it decide.
- Tests: 37 offline tests, including a stub Qloo server.
Challenges
- The real API differed from my assumptions: the category lives in a
subtypefield, and one category the guide lists was rejected for my key. - A shortcut I wrote to remember unsupported categories once blacklisted valid ones after a single error. I fixed it to remember only an explicit "not supported" answer, and only briefly.
- Keeping it honest: separating what Qloo returned from what the app says about it, and labelling each.
What I learned
Grounding an agent means constraining it. The most useful rules were the ones that stop it inventing: choose only from returned results, show the source, and say who wrote each sentence.
What's next
Testing the agent's own guesses with a verification query, adding audience demographics to the brief, and city filters for places and destinations.
Built With
- css
- docker
- fastapi
- javascript
- ndjson-streaming
- python
- qloo-api
- qloo-insights-api
- react
- render
- rest-api
- svg
- vite
Log in or sign up for Devpost to join the conversation.