Inspiration
Travel search is broken. Not because flights are hard to find, but because people don't think in destinations. They think in feelings.
You don't wake up wanting "Barcelona". You wake up wanting sunshine, slow mornings, street food, or a weekend that feels like disappearing somewhere new.
But every travel tool starts the same way: "Where do you want to go?"
That's the wrong question.
What it does
SKAI is an AI travel companion that turns emotional intent into real, ranked travel options.
You just chat. No forms, no filters, no dropdowns for origin, destination, or budget.
Conversational travel planning
Talk to Skai like a friend. It picks up on what you're actually after, origin, budget, dates, group size and translates it into something more useful: the vibe of the trip you want.
Vibe-based matching (11 dimensions)
Every request becomes an 11-dimensional vibe profile:
pace · social · adventure · culture · beach · urban · nature · climate · foodie · luxury · family
Instead of searching for cities, Skai searches for emotional compatibility.
Smart ranking system
Destinations are scored using a hybrid formula:
| Factor | Weight |
|---|---|
| Vibe compatibility | 55% |
| Price efficiency | 30% |
| Personal history | 10% |
| Novelty | 5% |
The result is not the cheapest trip, it's the most you trip.
Real-time flight search
Skai connects to the Skyscanner API for live indicative prices. Flights are the starting point, not the ranking criteria.
AI-generated city personalities
Each destination has a structured personality generated by an LLM, a consistent 11-dimensional vibe vector cached and reused across searches. Paris is always Paris, not a different version every time you ask.
Personalized memory (RAG)
SKAI remembers past searches using a vector database. It retrieves similar travel intents and adapts recommendations over time, learning your travel identity.
Visual and narrative experience
Every result includes an interactive map, a 7-day weather forecast, and a short AI-written narrative for each city. Not just data, context and story.
How we built it
User intent → ReAct agent → flight candidates → vibe enrichment → scoring → narrative → UI
| Layer | Technology |
|---|---|
| Frontend | React + Vite + Leaflet |
| Backend | FastAPI (async Python) |
| Agent | LangGraph ReAct agent |
| LLM | Azure OpenAI (GPT-4o) |
| Flight search | Skyscanner API |
| Memory | Chroma (vector DB) + MongoDB |
| Weather | Open-Meteo API |
| Geocoding | OpenStreetMap (Nominatim) |
Challenges
A few things that genuinely hurt us during the hackathon:
Getting the LLM to return reliable structured JSON on every call (not just most of the time) took a lot of prompt iteration and fallback parsing. It's one of those problems that feels solved until it isn't.
Chroma is synchronous, which doesn't play nicely with FastAPI's async event loop. We ended up offloading all embedding operations to background threads to stop everything from blocking.
The Skyscanner Indicative API returned partial or inconsistent results more often than we expected. We built fallback query logic and deduplication on top of it, which added time we didn't really have.
Early on, the LLM was generating a slightly different "personality" for each city on every call, which made the scoring wildly inconsistent. Strict output constraints, coordinate validation, and MongoDB caching fixed it, but it took longer to figure out than it should have.
What we learned
Mostly, that intent-based search is genuinely harder than keyword search and that's exactly why it's worth doing. ReAct agents are powerful but fragile without strong structural guardrails. Caching LLM outputs isn't just a performance trick, it's a consistency requirement. And honestly, making the agent's reasoning visible in the UI made the whole thing feel more trustworthy, which we didn't fully expect.
What's next
- Persistent user accounts with a travel identity that evolves over time
- Direct booking integration
- Multi-city itinerary planning
- Image-based vibe input
Closing
The future of travel planning will not start with a map. It will start with a feeling.
Built With
- azurefoundry
- chroma
- fastapi
- langgraph
- leaflet.js
- mongodb
- open-meteo-api
- openstreetmap
- python
- react
- skyscanner-api
- vite


Log in or sign up for Devpost to join the conversation.