Why This Is Asked
Travel booking is a classic agent design problem: it requires multi-step planning, real-world tool use, error handling, user confirmation for high-stakes actions, and graceful degradation when things go wrong.
Key Concepts to Cover
- Tool design — what APIs the agent needs access to
- Planning — how the agent breaks down a complex goal into steps
- User confirmation — when to pause and ask before taking irreversible actions
- Error handling — what to do when a tool call fails
- State management — tracking progress across a multi-step booking flow
- Safety constraints — budget limits, cancellation windows, authorization checks
How to Approach This
1. Clarify Requirements
- What can the agent book? (flights only, or hotels + transport too?)
- Can it complete bookings autonomously, or does it require human approval?
- What are the safety constraints? (max spend, approved airlines, travel policy?)
- What happens if a step fails mid-booking?
2. Tool Design
tools = [
search_flights(origin, destination, date, passengers),
search_hotels(city, checkin, checkout, guests),
hold_reservation(item_id, duration_minutes),
confirm_booking(hold_id, payment_method_id),
cancel_hold(hold_id),
get_user_profile(),
send_confirmation(booking_ids, user_email),
]
Key decisions:
- Search vs. book are separate: Never book without showing options first
- Hold before confirm: Temporary hold before charging gives time for user confirmation
- Read-only tools are low-risk: Distinguish between search (safe) and book (irreversible)
3. Planning Loop (ReAct)
User: "Book me a flight from NYC to London next Friday. Budget $800."
THINK: I need to search for flights first.
ACT: search_flights("JFK", "LHR", "2025-03-07", 1)
OBSERVE: [3 options returned, cheapest is $720]
THINK: Found a good option within budget. Confirm with the user before booking.
ACT: present_options_to_user([...])
OBSERVE: User selected option 2 ($740)
THINK: Hold the reservation before confirming payment.
ACT: hold_reservation("flight_123", duration_minutes=15)
OBSERVE: Hold confirmed, expires in 15 minutes
ACT: request_payment_confirmation(total=$740, payment_method="Visa ending 4242")
OBSERVE: User confirmed
ACT: confirm_booking("hold_123", "payment_method_456")
OBSERVE: Booking confirmed, #UA-789012
4. Safety Constraints
- Price above threshold → require user approval
- Irreversible actions (confirm booking) → always confirm
- If hold expires before user confirms → cancel and restart, never auto-confirm
5. Error Handling
- Search returns no results: Ask for alternative dates or airports
- Hold fails: Inform user, search for alternatives
- Network timeout: Retry with exponential backoff; check status before retrying
Common Follow-ups
-
"How do you prevent the agent from getting stuck in an infinite loop?" Set a maximum number of steps (e.g., 20 actions). If exceeded, hand off to a human agent with a summary of what was tried.
-
"How do you handle the agent making a mistake mid-booking?" The hold-before-confirm pattern gives a cancellation window. If an error occurs after a booking is confirmed, trigger a human escalation flow.
-
"How would you test an agent like this without making real bookings?" Build a sandbox mode where all tool calls hit mock APIs. Use recorded real API responses for integration tests. Inject failures to verify graceful handling.