Modern Loft Apartment
- Price
- 750.0 USD total for 5 night(s)
- Budget
- Within your budget of 750.0 USD
Confirmed · 3
- Kitchen
- Wifi
- BudgetPRICE: 750.0 <= allowed total 750.0
Not confirmed · 1
- Quiet streetOptional
Conversational accommodation search
Booking AI turns a plain-English request into explicit requirements, checks every listing against them, and shows what is confirmed, what is not, and why.
Apartment in Baku from April 10 to 15 with WiFi and a kitchen, up to $150 per night. A quiet street would be nice.
InspectorWhy this result
Selected because all required constraints are confirmed. 3 requirements confirmed, 1 optional detail not confirmed.
Confirmed · 3
Not confirmed · 1
New search, refinement, listing questions and general chat, with explicit state between turns.
LLMs interpret language; deterministic code matches, verifies evidence and ranks.
Hermetic test suite plus golden-set and end-to-end evaluation.
Screenshots of the demo replaying responses the real backend produced on the sample dataset. Recorded, not a live AI session.

1 · Search with several requirements
WiFi and a kitchen are required, a quiet street is optional, the budget is per night. Each card shows what is confirmed; the Decision Inspector shows why the first result was selected.

2 · Refine the search
“Only show places with a balcony.” The balcony is added; city, dates, budget and the other requirements stay.
Open full size
3 · Ask about a listing
“Does the first one have parking?” The listing data does not say, so the answer is “couldn’t verify”, not “no”.
Open full size
4 · Ask before guessing
“$200 max” for a three-night stay is ambiguous, so the assistant asks one question before searching.
Open full sizeSix things the system does today, each one visible in the Decision Inspector.
City, dates, guests, budget and what matters to you, written as one plain-English message.
Apartment in Baku, April 10–15, WiFi and a kitchen
Every wish becomes an explicit requirement, marked as required, nice to have or excluded.
kitchen · required quiet street · optional
Each listing shows which requirements are confirmed, not confirmed or not satisfied, with the reason.
✓ WiFi ✓ Kitchen ? Quiet street
Change one thing in your own words. City, dates and the other requirements stay as they were.
Only show places with a balcony.
Ask about a listing you were shown. The answer is checked against that listing’s own data.
Does the first one have parking?
When the data does not say, the answer is “not confirmed”. Unclear requests get one short question.
Do you mean $200 per night or for the whole stay?
Eight implemented parts. Language models handle language; everything that decides an outcome is ordinary, tested code.
Classifies each message as a new search, a refinement, a listing question or general chat. Ambiguous turns get a clarifying question; “the second one” is validated against what was shown.
Turns the message into a typed search request or a patch to the current one. Code normalises dates, asks about budget scope and never turns a monthly rate into a nightly price.
Fetches candidate listings for the city and dates. The demo searches a bundled sample dataset; an optional Apify-based retriever loads live data. No embeddings.
Checks requirements against canonical listing fields. Price, bedrooms, bathrooms and area are compared as numbers; area must belong to the bookable unit.
Requirements no field answers are read from the listing text. The model must quote the listing, quotes are verified, and code decides the verdict.
Sorts eligible listings into strong, partial and weak matches. An unconfirmed required item never yields a strong match; unchecked optional wishes stay visible.
A public record of each turn: routing, the understood request, every verdict with its reason and evidence, plus latency, LLM calls and estimated cost.
One application service per turn behind POST /api/chat with per-session state. Astro and React render the public turn contract without duplicating search logic.
Seven stages run on every search turn. Under each step, one real request shows what that stage produces.
The message arrives with the conversation state: the current search and the listings already shown.
“Apartment in Baku from April 10 to 15 with WiFi and a kitchen, up to $150 per night. A quiet street would be nice.”
A router decides what the message is, and an LLM extracts the search. Code validates dates and asks when the budget scope is unclear.
action: new search · city: Baku · stay: 10 Apr 2026 – 15 Apr 2026 · budget: up to 150 USD per night
Listings for the city and dates come from the listing source, in the demo a bundled sample dataset. No embeddings are used.
Apartments in Baku available 10 Apr 2026 – 15 Apr 2026 from the sample dataset, priced for the requested nights.
Requirements are checked against structured listing fields. Price, bedrooms and area are compared as numbers.
Requirements no field answers go to an LLM, which must quote the listing. The quote is checked against the listing text before it counts.
Another sample listing, Sunny Central Apartment, asked about a “quiet location”:
“Quiet street but still central.”
quote found in listing text → confirmed
Eligible listings are tiered and ordered by what is confirmed. An unconfirmed required item is never a strong match.
An LLM words the already-decided outcome, with a deterministic fallback. Facts about a listing are rendered straight from the verdict.
The reply is worded from the decided outcome: 2 strong matches in Baku. Listing cards and the Decision Inspector come straight from the same data.
Real exchanges recorded from the backend on the sample dataset, replayed here. Pick a scenario.
Dates, budget, required amenities and an optional wish in a single request.
Apartment in Baku from April 10 to 15 with WiFi and a kitchen, up to $150 per night. A quiet street would be nice.
2 options in Baku for April 10–15. Here is the first one.
Confirmed · 3
Not confirmed · 1
Recorded on sample data
A stay is a set of requirements, some strict and some flexible. Filters flatten them into fields, and the real answer often sits in the listing text.
Three steps to see what Booking AI does and how it is built.
The walkthrough shows the demo replaying responses the real backend produced on a bundled sample dataset. It is recorded, not a live session.
See the walkthroughThese are the prompts behind the recorded examples. How it works traces the first one through all seven stages.
Every listing card sorts requirements into three groups, and the Decision Inspector shows why. The code behind each verdict is on GitHub.
A language model turns your message into a structured search: city, dates, guests, budget and a list of requirements, each marked as required, nice to have or excluded. Code then validates it — for example, it asks whether a budget is per night or for the whole stay instead of assuming.
Requirements are checked against structured listing fields first. If a field does not answer it, a model reads the listing text and has to quote it; the quote is verified against the listing. Anything still unproven is shown as “not confirmed” — it is never counted as a yes, and a required item that is not confirmed keeps a listing from being a strong match.
Yes. Say what to change — “only places with a balcony”, “make it a hotel instead” — and the existing search is updated while everything else is kept. You can also ask about a listing you were shown, such as “Does the first one have parking?”.
The examples on this site were recorded on a bundled sample dataset, so listings, prices and links are illustrative and say nothing about real availability. The backend also has an optional Apify-based retriever for live listing data, which is not enabled in the demo.
No. Booking AI is a search and decision assistant. It does not take bookings or payments and does not guarantee availability or prices.
Not online yet. The interactive demo is not public for now; it runs against the same backend when the project is run locally. The walkthrough and use cases on this page show recorded output from that backend.
English. Requests in other languages are not supported yet.
Yes. The whole project, including the backend, its tests and the evaluation harness, is on GitHub. View source code.
Booking AI was designed and built independently, end to end: conversation state, typed contracts between stages, evidence verification, evaluation, the API and this site.
Code, tests and evaluation are on GitHub.
View source code