An AI-powered travel itinerary planning system that combines Hayhooks (Haystack AI pipeline serving), a multi-agent itinerary planning system, and Open WebUI for a chat interface.
- Multi-agent architecture: specialized agents for different aspects of travel planning
- Real-time data: live data from Google Maps, route optimization, and Perplexity
- Hierarchical planning: from macro route planning to detailed daily itineraries
- Accommodation optimization: strategic lodging placement for multi-day trips
- Chat interface: Open WebUI for natural-language interaction
- Containerized: one
docker compose upto run the whole stack locally
- Macro Itinerary Agent (
self.agent)- Main orchestrator for multi-day travel planning
- Establishes macro routes and coordinates the other agents
- Day Itinerary Agent (
day_itinerary_agent)- Creates detailed single-day itineraries
- Tool name:
daily_itinerary_planning_agent
- Lodging Agent (
lodging_itinerary_agent)- Determines optimal accommodation placement across the route
- Tool name:
accommodation_strategy_optimizer
- Google Maps API — place search, details, location data
- Optimal Route service — multi-destination route optimization
- Perplexity API — real-time research and local insights
- Docker and Docker Compose
- API keys for Google Maps, Perplexity, and OpenAI
Copy the example and fill in your keys:
cp .env.example .envRequired:
HAYHOOKS_PIPELINES_DIR=/pipelines
HAYHOOKS_SHOW_TRACEBACKS=true
GOOGLE_MAPS_API_KEY=your_google_maps_api_key # used by google-maps and optimal-route
PERPLEXITY_API_KEY=your_perplexity_api_key
OPENAI_API_KEY=your_openai_api_keyOptional — enable Langfuse tracing of the Haystack pipeline:
HAYSTACK_CONTENT_TRACING_ENABLED=true
LANGFUSE_SECRET_KEY=your_langfuse_secret_key
LANGFUSE_PUBLIC_KEY=your_langfuse_public_key
LANGFUSE_HOST=https://cloud.langfuse.comdocker compose up -d --buildNavigate to http://localhost:3000.
Auth is disabled by default for local use — you'll go straight to the chat.
docker compose logs -f
docker compose psdocker compose downStart a new chat and describe your trip, for example:
Plan a 5-day trip to Italy focusing on art and cuisine.
I prefer boutique hotels, have a moderate budget, and will be traveling by train.
I want to visit Rome, Florence, and Venice.
.
├── pipelines/
│ └── itinerary_agent/
│ ├── pipeline_wrapper.py # Multi-agent orchestration
│ ├── macro_itinerary_system_prompt.txt
│ ├── day_itinerary_system_prompt.txt
│ └── lodging_itinerary_system_prompt.txt
├── docker-compose.yml
├── Dockerfile
├── .env.example
└── README.md
| Service | Purpose | Network port |
|---|---|---|
open-webui |
Chat interface | 3000 (host) |
hayhooks |
Haystack pipeline server | 1416 (internal) |
google-maps |
Google Maps MCP server | 8100 (internal) |
optimal-route |
Route optimization MCP server | 8080 (internal) |
perplexity |
Perplexity MCP server | 8080 (internal) |
Only open-webui is exposed on the host. The other services communicate over the Docker network.
The system uses OpenAI's gpt-4.1 by default. To change it, edit the llm in pipelines/itinerary_agent/pipeline_wrapper.py:
llm = OpenAIChatGenerator(model="o4-mini") # or your preferred model- Define the MCP toolset in
pipeline_wrapper.py - Add the tools to the appropriate agent(s)
- Update the relevant system prompt
- Rebuild:
docker compose up -d --build
pipeline_wrapper.py includes a lightweight policy-compliance agent that rejects requests over 10 days / 7 locations or that look like prompt-injection attempts. Remove or relax it in load_validation_system_message() if you don't need it.