The problem
Turn a free-text trip request into a trustworthy, editable travel plan without hallucinated prices or flights, without running agents a request does not need, and without leaking PII or letting a model act unchecked.
04 / Project / Agentic AI
Supervisor-routed multi-agent travel planning with guardrails, evaluation and human review
01 / Overview
JourneyMesh is a production-shaped multi-agent AI travel planner. A single sentence such as “plan a relaxing 5-day family trip from Dhaka to Singapore with a budget of $2,000” becomes a reviewable plan: routes, a hotel shortlist, a forecast, a cost breakdown that separates confirmed prices from estimates, and a day-by-day itinerary. A LangGraph supervisor picks only the specialist agents a request needs, every external call goes through an MCP client and an authorisation guard, every draft is guarded and evaluated, and nothing is final until a human approves it - with request-changes re-running only the affected agents.
The problem
Turn a free-text trip request into a trustworthy, editable travel plan without hallucinated prices or flights, without running agents a request does not need, and without leaking PII or letting a model act unchecked.
Approach
A LangGraph supervisor routes each request to only the specialist agents it needs (flight, hotel, weather, budget, itinerary). Every external call passes an MCP tool guard; input and output guardrails screen prompt injection, unlawful intent and PII; a ten-dimension evaluator scores each draft; a human approves or requests changes, and only the affected agents re-run. State is checkpointed in PostgreSQL, traced with structured logs and optional LangSmith, and shipped as one Docker image through GitHub Actions to an OVHcloud VPS.
Measured outcome
Deployed live with an open-source codebase covered by 218 backend tests, 21 frontend tests and an offline evaluation suite gated in CI. Evidence
02 / Architecture
Grouped from the stack recorded for this project. Scroll to walk the layers, or hover one for its components.
Where a request or upload enters the system.
Handled by React, TypeScript.
Handled by FastAPI.
Handled by LangGraph, LangChain, Groq.
Handled by MCP.
Handled by PostgreSQL.
Handled by Docker, GitHub Actions, LangSmith.
Handled by Python.
03 / Tech stack
Interface
API & services
AI layer
Tools & integrations
Data & vector stores
Cloud & monitoring
Other components
04 / Case study
JourneyMesh - every journey, intelligently connected. It is built as an agentic system rather than a chatbot: a supervisor decides which specialists a request actually needs, every external call is authorised before it leaves the process, every draft is measured, and nothing is final until a human approves it.
The whole workflow runs end to end with no third-party credentials: without an API key each provider falls back to a deterministic adapter whose output is labelled ESTIMATE, so nothing is ever presented as a live price unless a provider confirmed it.

The supervisor reads the request and returns a routing decision; it never plans the trip itself. A weather question runs one agent, a full journey runs five. A stated budget pulls in flights and hotels, a multi-night itinerary pulls in hotels, and weather is opt-in. Routing is deterministic by default; a configured model may widen or narrow the selection but only within the known agent set.
LIVE, SEARCH_DERIVED, ESTIMATE or UNAVAILABLE.within_budget / near_limit / over_budget status.Each specialist owns exactly one slice of a shared TravelState and agents never call each other. When the reviewer requests a change (“find a cheaper hotel but keep my flights”), the supervisor re-runs only the affected agents - hotel, budget, itinerary - and every other slice stays byte-for-byte identical, up to a revision limit.
A ten-dimension evaluation module - relevance, completeness, groundedness, consistency, tool correctness, schema validity, safety, language correctness, itinerary feasibility and budget consistency - decides everything decidable by rule and uses an LLM-as-judge only where necessary. Structured JSON logs with PII redaction, in-process tracing and metrics are always on; optional LangSmith tracing shows each graph run, agent, model call and MCP tool call as one nested trace, named by revision.
218 pytest tests, 21 Vitest + React Testing Library tests and an offline evaluation suite, enforced by a GitHub Actions gate before any release.
Next step
Tell me what you’re working on and where it gets difficult. I’ll share how this project’s approach would apply to your case.