One message in chat fans out into a planning agent, two MCP servers, a grounded research sub-agent, a stress-scored set of trip scenarios, and a live map — all streamed back to you in real time. Here's exactly how a request travels through the system.
Reference pages for anyone who wants the details instead of the demo — start with how it's built and how it's measured.
Hexagonal backend, agent tools, MCP integrations, persistence, and the frontend component map.
What running a real LLM eval suite found — regressions caught, root causes, and fixes, updated live.
Every feature across 8 categories, with the phase that delivered it.
The Candy theme: color palette, typography, motion, and the UI component map.
All 16 stories from the product spec, traced to the tool or component that delivers each one.
A Next.js client talks to a FastAPI backend over the AG-UI protocol. The backend hosts a PydanticAI agent that reaches out to external data sources. Tap any block to learn what it does.
Each piece of the architecture has a specific job. Select one to see what it owns and where it lives in the codebase.
Follow one travel request from the chat box all the way to a saved, mapped itinerary. Press Run the flow to auto-advance, or click any step.
The agent decides which tools to call and in what order. Each call streams a generative-UI card into the chat. Click a tool to expand it.
Kompass never invents prices. Structured data comes from real providers; grounded search fills the gaps and acts as the fallback.
The official remote Kiwi MCP search-flight tool over streamable HTTP — no API key. Client-side max_stops / time filtering; cheapest-date sampling fires concurrent ±3-day flex searches.
A local FastMCP stdio server (accommodations_server.py) wrapping SerpApi. Returns nightly + total rates, ratings, amenities, links. MCP_MODE=mock serves deterministic fake data to save quota.
An isolated PydanticAI agent using native Google Search grounding — destination research, ground-transport (train/bus/ferry) routing, and the price fallback. Kept separate so grounding doesn't collide with structured output.
Async SQLAlchemy + aiosqlite. trips store the full AG-UI message_history so cards rehydrate on reload; plus user_profiles (singleton) and saved_scenarios.
available: false) and the agent falls back to grounded search_web. Prices are never invented. For flights, a transport failure raises KiwiTransportError instead of silently returning an empty list, so search_flights/find_cheapest_dates can tag the fallback with data_source_error: true — a dead connection stays distinguishable from Kiwi genuinely finding zero itineraries.Every tool call renders a purpose-built card, streamed live with animated loading states. Here's the family.
The agent core depends on ports (interfaces), never on infrastructure. Adapters plug the real world in — so a mock hotel server or a different DB is a one-line swap.