Files
2026-07-13 13:39:38 +08:00
..

Hotel Receptionist Example

A boutique-hotel receptionist agent. Handles room bookings, restaurant reservations, cancellations, invoices, charge disputes, and FAQs about the hotel — backed by a live SQLite database that streams its state to the playground in real time.

Running

python examples/hotel_receptionist/fake_data/seed.py
python examples/hotel_receptionist/agent.py console
# or, with the LiveKit playground:
python examples/hotel_receptionist/agent.py dev

fake_data/seed.py prints sample confirmation codes you can use to try the cancellation/invoice/dispute flows immediately, e.g. Cancel: last name 'Smith', code 'HTL-AB12'.

Architecture

agent.py           — HotelReceptionistAgent + tool mixins
tools_*.py         — Tool mixins: rooms, restaurant, services
book_*.py          — AgentTask subclasses for booking flows
hotel_db.py        — HotelDB (apsw) + schema + views + pricing + dispute policy
instructions.py    — Prompt instructions and routing rules
ui_view.py         — SQLite changeset streamer for the playground
fake_data/seed.py  — manual seed script (writes fake_data/hotel.db)

The LLM never owns money values. book_room computes the total server-side from rooms.nightly_rate × nights + PRICING.extras(...) + tax. file_dispute reads the disputed amount from the stored invoice line item by label and clamps any refund to ≤ amount.

Live DB → playground

sqlite_diff.py attaches an apsw.Session to the DB connection and captures binary changesets after every commit. A subscribe handshake gives each playground browser a base snapshot via byte stream, then each subsequent write fans out as a sqlite_diff RPC carrying the binary changeset. See the matching useSqliteMirror hook in the jukebox repo.