A category-by-category rundown of what the agent actually does and how it's delivered β no roadmap items, no aspirational copy. The one thing not fully closed out is called out explicitly below.
The system prompt drives seasonality reasoning with the current date injected; the agent verifies crowd and weather peaks via grounded web search and surfaces them as scenario highlights.
find_cheapest_dates samples a whole month with concurrent flex-window searches and renders the cheapest windows in the dates card.
Structured flight prices from the Kiwi.com MCP (no API key) and lodging from SerpApi Google Hotels; grounded web search is the universal price fallback. A deterministic mock mode (MCP_MODE=mock) protects the SerpApi quota in dev.
CostBreakdown gives transportation and accommodation subtotals plus a grand total; the scenario tool recomputes totals from parts so numbers always add up.
Live hotels/rentals for the exact stay dates with nightly + total rates, ratings, amenities, and booking links; min_rating / max_price honor taste and budget.
Legs support flight, train, bus, ferry, and car; search_ground_transport provides grounded routing (operators, times, duration, fares) for non-flight legs.
direct_flights_only and preferred transit modes are gathered once and honored by every flight search.
Ground legs are sequenced after flights with the onward departure aligned to arrival plus a realistic transfer buffer; tight and overnight connections are flagged.
The agent asks one focused question at a time through the interactive clarifying-question card (options + free-text "Other"), then persists preferences. Baselines are editable up-front in settings.
Connection buffers are enforced in the system prompt; risky connections surface in stress factors and timeline chips.
generate_scenarios renders 2β3 cards side-by-side with best-value and lowest-stress badges. Input validation enforces 2β3 scenarios and a complete day-by-day plan.
A 1β5 stress score backed by structured factors (layovers, overnight travel, tight connections, total hours), shown as a 5-pip gauge from Relaxed to Intense.
The agent learns the desired vibe through clarifying questions and stores vibe tags in preferences.
"I already have flights" β the agent skips that data tool, zeroes its cost, and plans only the rest, honoring scope limits and hard constraints (system-prompt directive 9).
Refine one scenario by its label ("make Scenario B direct-only") β the tool is re-called once with the full set, carrying the others over unchanged.
Conversational text plus generative-UI cards for preferences, clarifying questions, flights, dates, accommodations, research, ground transport, and scenario comparison.
A fire-and-forget sub-agent turns the conversation + vibe tags into a scene and renders it with a Gemini image model once a destination is known; fades in behind the sidebar row and the scenario-detail header. Optional (BACKGROUND_IMAGE_ENABLED).
The scenario detail modal shows the cost breakdown, stress factors, per-direction travel timeline, accommodation list, and an expandable day-by-day itinerary with Expand-all/Collapse-all.
A human-in-the-loop card pauses the run with concrete option buttons plus an always-present free-text field, then resumes with the answer (which rehydrates on reload).
Animated candy search-progress pills, a styled collapsible reasoning bubble, shimmer skeletons, and rose-tinted error cards plus a dismissible run-failure toast.
Desktop keeps the 3-pane split; on smaller screens the chat is full-width, the sidebar becomes an off-canvas drawer, and modals become bottom-sheets.
A persistent split-panel plots the active scenario's route: numbered stops, stay markers, and mode-colored legs with auto-fit bounds.
The agent runs each turn and appends to persisted history β feedback loops in naturally.
Full AG-UI message history is persisted per trip, so generative-UI cards rehydrate exactly as they were when you resume from the sidebar.
A singleton profile persists preferences across trips and loads as the baseline each run; the gear-button settings modal edits it directly.
"Save this trip" bookmarks a scenario; the Saved tab lists and reopens them β even after the original conversation is deleted.
Langfuse v4 / OpenTelemetry traces every PydanticAI run β LLM requests, tool calls, inputs and outputs β grouped per trip thread; a silent no-op when keys are absent.
Backend pytest (domain, DI, persistence, agent, REST routes on an isolated DB), frontend Vitest unit tests, and Playwright e2e specs for API, persistence, saved scenarios, and settings.
A 30-case golden dataset run headless against the real agent with deterministic fakes for flights/hotels/research; 10 evaluators (7 deterministic + 3 LLM-as-judge) score tool selection, constraint adherence, anti-fabrication, HITL behavior, and vibe/recommendation quality, plus a live dashboard. See evals.html.