AI Travel Booking Assistant
Conversational travel agent that searches real flights and hotels, creates itineraries, and remembers every detail of your trip - all through natural chat.
Quick Start
cd customer_service_agnt5
export OPENAI_API_KEY=sk-... SERPAPI_KEY=your_key
agnt5 dev up
What You Can Build
- Travel Booking Platforms: Multi-turn conversational booking with real-time flight/hotel search
- Customer Service Chatbots: Context-aware assistants that maintain conversation history and user preferences across sessions
- Trip Planning Services: AI agents that orchestrate complex multi-step workflows (search → compare → book → itinerary)
Installation
Prerequisites
- Python 3.10+
- AGNT5 CLI installed (installation guide)
- OpenAI API key
- SerpAPI key (for flight and hotel search)
Setup
Install uv (Python package manager):
curl -LsSf https://astral.sh/uv/install.sh | shClone or create from template:
agnt5 create --template travel-booking my-travel-agent cd my-travel-agentInstall dependencies:
uv syncSet up environment variables:
# Create .env file cat > .env << EOF OPENAI_API_KEY=your_openai_api_key_here SERPAPI_KEY=your_serpapi_key_here EOFGet a SerpAPI key at: https://serpapi.com (free tier available)
Start the AGNT5 dev server:
agnt5 dev up
Usage
Start the Travel Agent Worker
cd customer_service_agnt5
uv run python -m travel_booking.main
The worker connects to AGNT5 and registers the travel booking workflow.
Book Travel Through Chat
Option 1: Using the AGNT5 CLI
# Start planning a trip
agnt5 workflow run travel_booking_workflow \
--input '{"message": "I want to plan a trip from New York to Paris in December"}'
# Continue the conversation (use returned session_id)
agnt5 workflow run travel_booking_workflow \
--input '{"message": "Show me flights for December 15-22", "session_id": "abc-123"}'
# Ask for hotels
agnt5 workflow run travel_booking_workflow \
--input '{"message": "What hotels are available?", "session_id": "abc-123"}'
# Create full itinerary
agnt5 workflow run travel_booking_workflow \
--input '{"message": "Create a complete itinerary for my trip", "session_id": "abc-123"}'
Option 2: Using HTTP API
# First message
curl -X POST http://localhost:34183/v1/workflows/travel_booking_workflow/run \
-H "Content-Type: application/json" \
-d '{"message": "I need to book a flight from San Francisco to Tokyo"}'
# Follow-up in same session
curl -X POST http://localhost:34183/v1/workflows/travel_booking_workflow/run \
-H "Content-Type: application/json" \
-d '{"message": "Make it for 2 people departing January 10", "session_id": "xyz-789"}'
Option 3: From Python Code
from agnt5 import WorkflowClient
client = WorkflowClient()
# Start conversation
result = client.run_workflow(
"travel_booking_workflow",
inputs={"message": "Plan a family trip to London"}
)
session_id = result["session_id"]
# Continue conversation
result = client.run_workflow(
"travel_booking_workflow",
inputs={
"message": "We're a family of 4, traveling March 15-25",
"session_id": session_id
}
)
# Request complete itinerary
result = client.run_workflow(
"travel_booking_workflow",
inputs={
"message": "Create a complete itinerary with flights, hotels, and activities",
"session_id": session_id
}
)
View Results
The workflow returns comprehensive booking information:
{
"status": "completed",
"session_id": "abc-123-def-456",
"output": "I found 3 great flight options for you from JFK to CDG:\n\n1. Air France AF123 - $850\n Departs: 6:00 PM, Arrives: 8:00 AM+1\n Duration: 8h 0m\n\n2. Delta DL456 - $920\n Departs: 8:30 PM, Arrives: 10:30 AM+1\n Duration: 8h 0m\n\nAnd 3 hotel options in Paris:\n\n1. Hotel Plaza Athénée - $450/night (4.8★)\n...",
"tool_calls_made": 2,
"tools_used": ["search_flights", "search_hotels"],
"conversation_length": 6,
"total_searches": 2
}
What You Get
Each conversation provides:
Real-Time Search Results
- Flights: Airlines, prices, times, durations, flight numbers
- Hotels: Names, prices, ratings, reviews, amenities
- Powered by SerpAPI (live Google Flights/Hotels data)
Complete Itineraries
- Day-by-day activity suggestions
- Flight and hotel recommendations
- Total cost estimates
- Personalized based on preferences
Persistent Conversation State
- Full message history
- User preferences (budget, dates, destinations)
- Shopping cart (items being considered)
- Confirmed bookings
- Search history
Context-Aware Responses
- Agent remembers previous messages
- Never asks for information already provided
- Builds understanding incrementally across turns
Example Conversation
User: "I want to plan a trip from NYC to Paris"
Agent: "Great! I'd be happy to help you plan your Paris trip. When are you thinking of traveling?"
User: "December 15 to 22, for 2 people"
Agent: [Searches flights] "I found some excellent options:
1. Air France - $850/person, 6:00 PM departure...
2. Delta - $920/person, 8:30 PM departure...
Would you like me to search for hotels as well?"
User: "Yes, show me hotels near the Eiffel Tower"
Agent: [Searches hotels] "Here are top-rated hotels near the Eiffel Tower:
1. Hotel Plaza Athénée - $450/night (4.8★)...
Would you like me to create a complete itinerary?"
User: "Yes please"
Agent: [Creates itinerary] "Here's your complete Paris itinerary for Dec 15-22:
FLIGHTS:
- Outbound: Air France AF123, Dec 15, 6:00 PM...
HOTELS:
- Hotel Plaza Athénée, 7 nights, $3,150 total...
DAY-BY-DAY ACTIVITIES:
Day 1 (Dec 15): Arrival, check-in, evening Eiffel Tower visit...
Day 2 (Dec 16): Louvre Museum, Seine River cruise...
TOTAL ESTIMATED COST: $5,850 for 2 people"
Configuration
Environment Variables
# Required
OPENAI_API_KEY=sk-... # Your OpenAI API key
SERPAPI_KEY=your_key # Your SerpAPI key for flight/hotel search
# Optional
AGNT5_API_URL=http://localhost:34183 # AGNT5 Gateway URL
Customization Options
Modify src/travel_booking/agents.py to customize:
- LLM Model: Change from
gpt-4o-minitogpt-4ofor better quality - Communication Style: Adjust agent instructions for different tones (formal, casual, enthusiastic)
- Search Preferences: Modify default number of results returned
- Tools: Add new tools (car rentals, activities, restaurant bookings)
Example - Using GPT-4 for Premium Experience:
travel_booking_agent = Agent(
name="travel_booking_agent",
model="openai/gpt-4o", # Changed from gpt-4o-mini
instructions="""...""",
tools=[search_flights, search_hotels, create_itinerary],
temperature=0.2,
)
Example - Adding Budget Constraints:
# In agent instructions, add:
"""
## Budget Awareness
- Always ask about budget preferences early in the conversation
- Filter and prioritize results based on stated budget
- Provide options across different price ranges (economy, mid-range, luxury)
- Show total cost estimates proactively
"""
Architecture
System Architecture
Single-Agent Architecture with Tools
The system uses one intelligent agent with access to three tools:
User Message
↓
Travel Booking Agent (context-aware)
↓
Tool Selection
↓
┌─────┴──────┬──────────────┐
↓ ↓ ↓
search_flights search_hotels create_itinerary
↓ ↓ ↓
SerpAPI SerpAPI Framework
↓ ↓ ↓
Response with real-time data
Agent
Travel Booking Agent (travel_booking_agent)
- Model:
openai/gpt-4o-mini(configurable) - Context-aware: Reviews full conversation history
- Tools:
search_flights,search_hotels,create_itinerary - Temperature: 0.2 (focused, consistent responses)
- Capabilities:
- Multi-turn conversation handling
- Automatic information gathering
- Intelligent tool orchestration
- Airport code inference (NYC→JFK, LA→LAX, etc.)
- Context building across messages
Tools
search_flights- Real-time flight search via SerpAPI- Parameters: departure_id, arrival_id, outbound_date, return_date, adults
- Returns: Top 3 flights with prices, airlines, times, durations
- Backend: SerpAPI Google Flights
search_hotels- Real-time hotel search via SerpAPI- Parameters: location, check_in_date, check_out_date, adults
- Returns: Top 3 hotels with prices, ratings, amenities
- Backend: SerpAPI Google Hotels
create_itinerary- Itinerary framework creation- Parameters: destination, travel_dates, preferences
- Returns: Structured itinerary template
- Agent enriches with flight/hotel details
Workflow
travel_booking_workflow - Chat-enabled workflow:
@workflow
async def travel_booking_workflow(ctx, message, session_id):
# 1. Load/create session entity
session = TravelBookingSession(key=f"travel_booking:{session_id}")
# 2. Add user message to history
await session.add_message("user", message)
# 3. Get conversation context
messages = await session.get_messages()
# 4. Build context-aware input for agent
if len(messages) > 1:
# Include last 5 messages for context
context_str = build_context(messages[-5:])
agent_input = f"{context_str}\nCurrent message: {message}"
else:
agent_input = message
# 5. Run agent with tools
result = await travel_booking_agent.run_sync(agent_input, context=ctx)
# 6. Save response and track tool usage
await session.add_message("assistant", result.output)
if result.tool_calls:
await session.record_search({
"tools_used": [tc["name"] for tc in result.tool_calls]
})
# 7. Return response
return {"status": "completed", "output": result.output, ...}
State Management
TravelBookingSession Entity - Comprehensive session state:
TravelBookingSession(key="travel_booking:{session_id}")
├── messages: [
│ {role, content, timestamp}, # Full conversation history
│ ...
│ ]
├── preferences: { # User travel preferences
│ budget: "$2000",
│ dates: "Dec 15-22",
│ ...
│ }
├── cart_items: { # Items being considered
│ "flight_1": {type, details, cost},
│ "hotel_1": {type, details, cost},
│ ...
│ }
├── bookings: [ # Confirmed bookings
│ {booking_id, type, details, cost, confirmation_number},
│ ...
│ ]
├── search_history: [ # Search tracking
│ {tools_used, timestamp},
│ ...
│ ]
└── trip_details: { # Overall trip info
trip_name: "Paris Vacation",
start_date: "2024-12-15",
end_date: "2024-12-22",
status: "planning",
total_cost: 5850.00
}
Entity Features:
- ✅ Persists across workflow runs
- ✅ Survives server restarts
- ✅ Tracks complete booking lifecycle
- ✅ Supports cart/booking management
- ✅ Session-based isolation
Conversation Flow
Message 1: "I want to go to Paris"
→ Session created
→ Message stored
→ Agent extracts intent: travel to Paris
→ Response: "When would you like to travel?"
Message 2: "December 15-22"
→ Session loaded (has message 1)
→ Context: User wants Paris trip
→ Agent extracts dates
→ Calls search_flights(JFK→CDG, Dec 15-22)
→ Response: Flight options + hotel prompt
Message 3: "Show me hotels"
→ Session loaded (has messages 1-2)
→ Context: Paris trip Dec 15-22, flights shown
→ Calls search_hotels(Paris, Dec 15-22)
→ Response: Hotel options
Message 4: "Create full itinerary"
→ Session loaded (has messages 1-3)
→ Context: Full trip details known
→ Calls create_itinerary(Paris, Dec 15-22, prefs)
→ Agent combines all previous tool results
→ Response: Complete itinerary with flights, hotels, activities
Project Structure
customer_service_agnt5/
├── src/
│ └── travel_booking/
│ ├── agents.py # Travel booking agent
│ ├── workflows.py # Chat workflow
│ ├── tools.py # Flight, hotel, itinerary tools
│ ├── entities.py # TravelBookingSession entity
│ ├── main.py # Worker entry point
│ └── __init__.py
├── pyproject.toml # Dependencies
├── .env # Environment variables
└── README.md
Troubleshooting
Common Issues
Worker not starting:
# Check AGNT5 dev server
agnt5 dev status
# Restart dev server
agnt5 dev down
agnt5 dev up
API Key Errors:
# Verify OpenAI key
echo $OPENAI_API_KEY
# Verify SerpAPI key
echo $SERPAPI_KEY
# Check .env file
cat .env
No search results:
- Verify SerpAPI key is valid and has credits
- Check SerpAPI dashboard: https://serpapi.com/dashboard
- Review logs for API errors:
agnt5 dev logs - Test SerpAPI directly:
curl "https://serpapi.com/search?engine=google_flights&api_key=YOUR_KEY"
Agent not remembering context:
- Ensure using same
session_idacross messages - Check entity state in database
- Review conversation history: Look at
messagesfield in response - Context limited to last 5 messages (configurable in
workflows.py:91)
Slow responses:
- SerpAPI searches can take 5-10 seconds each
- Consider caching popular routes
- Use faster model: Change to
gpt-3.5-turboinagents.py
Invalid airport codes:
- Agent auto-infers codes (NYC→JFK, LA→LAX)
- Add more mappings in agent instructions (
agents.py:95-109) - Or modify to ask user for specific airport
Customization
Add More Tools
Extend beyond flights and hotels:
1. Add Car Rental Tool
# In tools.py
@tool(auto_schema=True)
async def search_car_rentals(
ctx: Context,
location: str,
pickup_date: str,
dropoff_date: str
) -> Dict:
"""Search for car rentals using SerpAPI."""
# Implementation
...
# In agents.py - add to tools list
tools=[search_flights, search_hotels, search_car_rentals, create_itinerary]
2. Add Activity Booking
@tool(auto_schema=True)
async def search_activities(
ctx: Context,
destination: str,
activity_type: str,
date: str
) -> Dict:
"""Search for tours and activities."""
# Use TripAdvisor or Viator API
...
3. Add Restaurant Reservations
@tool(auto_schema=True)
async def find_restaurants(
ctx: Context,
location: str,
cuisine: str,
date: str,
party_size: int
) -> Dict:
"""Find restaurants and availability."""
# Use OpenTable or Google Places API
...
Multi-Agent Extensions
Transform into multi-agent system with specialists:
- Flight Specialist Agent: Expert in finding best flight deals
- Hotel Specialist Agent: Expert in accommodation recommendations
- Itinerary Specialist Agent: Expert in creating day-by-day plans
- Triage Agent: Routes to appropriate specialist (like tutor agent)
See agnt5_tutor_agent blueprint for handoff pattern examples.
Related Templates
- Tutor Agent: See
agnt5_tutor_agentfor multi-agent handoff patterns - Deep Research: See
agnt5_deep_researchfor multi-stage workflows - Code Reviewer: See
code_reviewerfor quality assessment
Extension Ideas
- Price Alerts: Monitor prices and notify when deals appear
- Multi-City Trips: Support complex itineraries with multiple destinations
- Group Travel: Handle multiple travelers with different preferences
- Loyalty Programs: Integrate airline/hotel loyalty points
- Payment Integration: Add Stripe/PayPal for actual bookings
- Travel Insurance: Recommend and quote insurance options
- Visa Requirements: Check and advise on visa needs
- Weather Integration: Show forecast for travel dates
- Currency Conversion: Display prices in user's preferred currency
- Review Summaries: Aggregate hotel/restaurant reviews with AI
License
MIT License - see LICENSE file for details