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.
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.
Everything happens in one conversation: search, refine, ask, and see the reasoning behind each result.
Describe the kind of accommodation you want, without filling out a page of filters.
“Find an apartment in Baku with WiFi and a balcony.”
Change your preferences mid-conversation. Everything you said before stays in the search.
“Actually, I also need a kitchen.”
Ask a follow-up about a recommended property. The answer comes from that listing’s data, or says it couldn’t be verified.
“Does the first apartment allow pets?”
Each result shows which of your requirements are confirmed, not confirmed or not satisfied, and why it was recommended.
When a request is ambiguous, Booking AI asks one follow-up question instead of guessing.
“Do you mean $200 per night or for the whole stay?”
Say what would only be nice to have. Optional wishes are kept apart from requirements and marked as not confirmed when the listing data is silent.
“A quiet street would be nice.”
Seven stages run on every search turn. Under each one, a real request recorded on the sample dataset shows what that stage produces.
A question about a shown listing takes a shorter path: Router → the shown listing it refers to → the question turned into requirements (LLM) → matching and evidence for that listing → a verdict rendered directly, without the response LLM. A clarifying question can end any turn before retrieval.
LLM interprets language and evidenceDeterministic decides state changes and verdicts
Decides what each message is: a new search, a change to the current one, a question about a shown listing, or general chat. An ambiguous turn gets a clarifying question, and a reference like “the first one” is checked against the results actually 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.”
→ new search · later “Only show places with a balcony.” → change to the current search
An LLM turns a new request into a typed search, or a follow-up into a small patch to it. Code validates dates, asks when a budget could be per night or for the stay, and applies the patch, so earlier requirements are kept.
city: Baku · stay: 10 Apr 2026 – 15 Apr 2026 · budget: up to 150 USD per night
Candidate listings for the city and dates come from the listing source: a bundled sample dataset in the demo, or an optional Apify-based retriever. Retrieval does not use embeddings.
Apartments in Baku available 10 Apr 2026 – 15 Apr 2026 from the sample dataset, priced for the requested nights.
Each requirement is checked against canonical listing fields such as amenities, policies and room facilities. Price, bedrooms, bathrooms and area are compared as numbers; an area must belong to the room or apartment being booked.
Requirements no field can answer are read from the listing text. The model must quote its evidence, each quote is verified against the listing, and code turns the signals into confirmed, not confirmed or not satisfied.
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 sorted into strong, partial and weak matches and the top ones are selected. A required item that is not confirmed never makes a strong match.
An LLM words the already-decided outcome, with a deterministic fallback. Answers about listing facts are rendered directly from the verdict, so a decided fact is never reworded.
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.
Each component is scored on its own hand-labelled golden set, whole conversations are scored end to end, and every change runs against an offline regression suite.
Component-level
Given listings with known verdicts, are the right ones surfaced, in the right order?
Deterministic · re-run on the current code · 103 hand-labelled cases · report
Component-level
Does a plain-English request become the right set of requirements?
LLM · saved run, April 2026 · measured before later prompt changes · report
Component-level
Given a requirement and a listing’s text, is the verdict YES, NO or UNCERTAIN?
LLM · saved run, April 2026 · measured before quote verification was added · report
50 hand-labelled requests run through the whole pipeline and are scored on the decision the answer implies — yes, no or uncertain — and on the top result. Each critical false “yes” was traced to a cause; the fixes that followed include quote verification, visible optional preferences, budget-scope questions and area attribution.
The last full run predates those fixes, so no end-to-end score is shown for the current system · method
Tests guard behaviour and contracts; they are not a measure of model accuracy.
measured on the current code · saved run of an earlier version
Not publicly yet. An interactive chat demo exists and runs against the same backend, but it is not online for now. The example conversation on this page is recorded output from that backend on a sample dataset.
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.
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