NomadAgent
Describe your trip in plain language, watch AI research it in real time, and receive a verified itinerary.
Features Tech Stack Architecture
Overview
NomadAgent is an AI-powered travel research agent that turns natural-language trip descriptions into fully verified itineraries. You describe where you want to go, what you're interested in, and how long you're staying — then watch in real time as the agent plans research tasks, searches the web, extracts structured venue data, and compiles a day-by-day itinerary with coordinates, opening hours, and source citations.
Built with a Flutter mobile frontend and a Python FastAPI backend powered by LangGraph and Google Gemini, NomadAgent demonstrates how agentic AI pipelines can solve real-world planning problems end to end.
Features
- Natural Language Trip Input — Describe your trip in plain English; the agent parses destination, duration, and interests automatically
- Multi-Step Agent Pipeline — LangGraph orchestrates a
planner → researcher → extractor → compilerworkflow with full state management - Real-Time Streaming — Server-Sent Events (SSE) stream thought logs, venue verifications, and self-corrections to the app as they happen
- Intelligent Web Research — Tavily search with hybrid relevance scoring filters irrelevant results using confidence + destination keyword matching
- LLM-Powered Data Extraction — Gemini extracts structured venue data (coordinates, addresses, hours, descriptions) from raw web content
- Venue Verification — Tiered verification scoring with type-specific weight tables so nature venues aren't penalized for lacking opening hours
- Interactive Map View — Flutter Map renders all venues with accurate coordinates on an interactive OpenStreetMap layer
- Day-by-Day Itinerary — Compiled itinerary groups venues by day with travel logistics and time estimates
- PDF Export & Sharing — Generate and share polished PDF itineraries directly from the app
- Parallel Extraction —
asyncio.gatherruns concurrent LLM calls across venue tasks, cutting extraction time by ~60% - Bounded Event History — Monotonic cursor + rolling buffer keeps streaming memory-bounded during long generations
- Graceful Error Handling — Failed search tasks and 503 errors are skipped without blocking the pipeline
Demo
| Home Screen | Home with Prompt | Event Streaming | Itinerary View | Map View |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Video Demo: Full end-to-end generation for this test prompt:
"I'm planning a weekend trip to Barcelona next month. I'm interested in food and history. I have 2 days and a budget of $500."
Generation time: ~46 seconds (edited for brevity)
Tech Stack
| Layer | Technology |
|---|---|
| Mobile App | Flutter 3.11+ · Dart · Riverpod · GoRouter · Flutter Map |
| Backend API | Python 3.10+ · FastAPI · Uvicorn · SSE-Starlette |
| Agent Pipeline | LangGraph · LangChain Google GenAI (Gemini) |
| Web Search | Tavily Python SDK |
| Data Validation | Pydantic v2 · Pydantic Settings |
| Code Quality | Ruff (linter + formatter) · Pytest · flutter_lints |
Architecture
┌─────────────────────────────────────────────────────────┐
│ Flutter Mobile App │
│ (Riverpod · GoRouter · Flutter Map) │
│ │
│ Home → Generation (SSE) → Itinerary → Map → PDF Export │
└────────────────────────┬────────────────────────────────┘
│ SSE (Server-Sent Events)
▼
┌─────────────────────────────────────────────────────────┐
│ FastAPI Backend │
│ POST /api/v1/generate │
│ GET /api/v1/health │
├─────────────────────────────────────────────────────────┤
│ LangGraph Agent Pipeline │
│ │
│ ┌──────────┐ ┌────────────┐ ┌───────────┐ │
│ │ Planner │──▶│ Researcher │──▶│ Extractor │ │
│ │ (Gemini) │ │ (Tavily) │ │ (Gemini) │ │
│ └──────────┘ └────────────┘ └─────┬─────┘ │
│ │ │
│ ┌─────▼─────┐ │
│ │ Compiler │ │
│ │ (Gemini) │ │
│ └───────────┘ │
└─────────────────────────────────────────────────────────┘
Pipeline flow:
- Planner — Parses the user prompt, identifies the destination, duration, and interest categories, then generates up to 3 focused research tasks
- Researcher — Executes Tavily web searches for each task with relevance scoring and result deduplication
- Extractor — Runs parallel Gemini calls to extract structured venue data (name, coordinates, address, hours, description, source URL) from raw search content
- Compiler — Assembles verified venues into a day-by-day itinerary with logistics and time estimates




