-
This image is currently processing. Please be patient...
Inspiration
Planning a good evening means jumping between disconnected recommendation systems. Your music app knows your listening habits. A restaurant search knows your location. A streaming service knows your watch history. None of them gives you a small, coherent plan with a cultural thread running through it.
Afterglow starts with a few things you already love and asks a more useful question: where else could that taste take you tonight?
What it does
Describe a few favorite artists, films or creators. Choose a city, party size and total budget. Afterglow builds one evening: a soundtrack to start with, a dinner spot to look up, and a film for the end of the night.
Each recommendation includes a short explanation and a link for the next step. You can replace a pick, inspect the execution trail, or save a compact itinerary. Rejected results become exclusions, while the interface keeps the other two choices stable. Budget allocations make the plan tangible without pretending to know current menu or streaming prices.
How we built it
The TypeScript agent exposes three tools: resolve_tastes, discover, and compose_plan. A live Qloo provider resolves favorite names and requests cross-category Insights recommendations, using the returned entity IDs as taste signals. Place discovery applies locality and price-tier filters; rejected entities are excluded from subsequent requests.
An optional Mistral function-calling loop chooses the tool calls and selections. The application executes tools and validates the result: a model cannot insert an entity that was never returned by discovery. Qloo explainability metadata, when available, remains visible in the trace. We distinguish retrieved evidence from the planner's contextual explanation.
A deterministic planner and curated mock provider share the same tool interface so the experience stays runnable without credentials. We adapted the mock/live gateway, observable workflow and substitution patterns from our earlier AgentCart project into a new cultural-planning product. There is no checkout or payment integration.
Current demo disclosure
The current public GitHub Pages demo uses a hand-authored fixture catalog and a rule-based planner. It is not evidence of live Qloo recommendations. The Qloo REST adapter is implemented and contract-tested; a credentialed integration test is pending API access. We also tested the Mistral tool-calling loop locally against the fixture provider. This state is visible in the app and documented in the repository.
Challenges and what we learned
The difficult part is keeping a charming recommendation experience honest. A taste match is not a reservation, a budget allocation is not a quoted price, and a language model's explanation is not automatically Qloo evidence. We made those boundaries explicit while preserving a short, friendly flow.
We also learned that an agent benefits from strict result validation. Tool-selected IDs, explicit exclusions and inspectable inputs make the workflow easier to trust and debug than an unconstrained generated itinerary.
What's next
Activate and verify the live Qloo integration, then test whether cross-domain suggestions help people find a more coherent evening than separate category searches. Later versions could add date-specific availability and reservation partners. The MVP deliberately focuses on one good flow rather than a general travel or shopping assistant.
Try it out
- Open the demo URL. No login or payment is required.
- Leave the example brief in place, choose a city, and click Find my evening.
- Inspect the three recommendations and open Why this fits.
- Open Follow the agent's trail to see tool inputs, outputs and the current provider/planner mode.
- Click the circular-arrow button on the film card. The film changes while the other two choices stay in place.
- Click Save evening to download the plan.
Built With
- ai-agents
- function-calling
- github
- javascript
- mistral-ai
- node.js
- qloo
- react
- typescript
- vite
Log in or sign up for Devpost to join the conversation.