Agentic AI-reisboeking voor TMC's en OTA's

De senior move voor een boekingsagent is geen slimmer model. Het is de LLM uit de control flow halen.

We bouwden een autonome reisboekingsagent waarvan de control flow deterministisch Python is. Het model parseert alleen het reisverzoek en formuleert het antwoord. Elke boekingsstap registreert een compenserende actie, zodat wanneer een hotelprijs verloopt nadat de vlucht is geticket, de agent het ticket voidt binnen het 24-uursvenster en de reiziger eerlijke alternatieven aanreikt in plaats van hen te laten stranden.

100%

Consistente terminal state, by construction

Synthetische batch van 200 scenario's met vaste seed, vs 65% voor de LLM-in-control-baseline

0 / 0

Gestrande reizigers, verzonnen boekingen getoond

Dezelfde batch, vs 40 en 30 voor de baseline

$3.25

Gem. GDS-zoekkosten per boeking

vs $7.57 baseline; GDS rekent per search, Lufthansa verhoogde fees op 1 januari 2026

Alle scenario's zijn synthetisch over een gesimuleerde GDS en CRS; luchthavencodes en hotelnamen zijn realistisch gevormde fixtures, geen live inventory of echte boekingen.

Zet een LLM aan het roer van een transactie en er gaan twee dingen mis

Geen van beide is een model-IQ-falen. Beide zijn in 2026 al een bugklasse.

Het laat reizigers stranden

De agent ticket een vlucht, de hotelstap faalt, en zonder compensatielogica zegt hij nog steeds "You're all set." Iemand blijft achter met een vlucht en geen kamer. Een perfect model laat een reiziger nog steeds stranden als niets het ticket voidt.

Het toont inventory die niet bestaat

Het verzint een plausibel hotel en boekt het. De property stond nooit in de CRS. Niets controleerde voordat het de reiziger bereikte, omdat in een reasoning loop het model zowel de proposer als de judge is.

De reden dat een beter model dit niet oplost, is dat de storingen infrastructuur- en gebruiksgebeurtenissen zijn, onafhankelijk van modelkwaliteit. Een tarief verloopt tussen twee API-calls. Een hold wordt afgewezen nadat een ticket is uitgegeven. Een search storm verteert marge. Stochastisch redeneren stapelt zich hiertegen: tien stappen bij 90 percent betrouwbaarheid komen uit op ruwweg 34 percent van begin tot eind, en GPT-4 met ReAct voltooit echte meerdaagse itineraries op 0.6 percent (TravelPlanner, OSU NLP, arXiv 2402.01622). Je kunt je met prompts niet uit opeenstapelend stochastisch falen werken.

En de deployer is eigenaar van elke uitspraak die de agent doet. In Moffatt v. Air Canada (BC Civil Resolution Tribunal, 14 februari 2024) werd de luchtvaartmaatschappij veroordeeld tot betaling van $812.02 nadat haar chatbot een bereavement-fare-beleid had verzonnen, en het argument dat de AI een aparte entiteit was, werd verworpen.

Hoe het werkt: agents adviseren, code beslist

De control flow is een handgebouwde Python-statemachine van ruwweg tien nodes. De LLM is beperkt tot twee leaf-taken. Alles daartussen is deterministisch.

input → extract (LLM leaf) → search → policy gate → verify gate → hold → ticket → hotel-book → commit

Extract, de enige gestructureerde taak van de LLM

Het model parseert intent in natuurlijke taal naar een Pydantic-getypeerde TripRequest (origin, destination, date, passengers, cabin, hotel). Dat getypeerde object is het enige gestructureerde artefact dat de LLM produceert. Het is provider-wisselbaar via Pydantic AI en draait volledig offline met een deterministische stub wanneer er geen key aanwezig is.

Beleid gecompileerd naar code

Corporate policy leeft als pure Python-predicaten: alleen economy, een fareplafond van $600 per segment, preferred carriers (United, American, Delta), een hotelplafond van $350 per nacht. Opties buiten policy zijn fysiek niet presenteerbaar omdat ze worden gefilterd voordat ze getoond kunnen worden, niet achteraf gemarkeerd. Onbekende fare families falen veilig, behandeld als boven policy in plaats van stilzwijgend als economy. Zonder in-policy vlucht escaleert de agent naar een menselijke wachtrij in plaats van te bluffen.

De verificatiegate

Elk hotel wordt bevestigd tegen de CRS op property_id. Een property die het model verzint, staat simpelweg niet in de CRS, dus het wordt geweigerd en nooit getoond, en de boeking bereikt de terminal state abstained. De gate weigert ongebevestigde inventory; hij vraagt het model niet om zijn eigen output te beoordelen.

De Saga, het deel dat de meeste demo's overslaan

Elke voorwaartse stap registreert op uitvoertijd zijn omgekeerde actie. Ticketing registreert bijvoorbeeld "void ticket, 24-hour window." Bij een storing op stap N lopen compensaties van N-1 tot 1 in omgekeerde volgorde, en pas daarna rapporteert de agent. Dit is wat een demo van een product onderscheidt, omdat het voorkomt dat een partieel falen een gestrande klant wordt.

De GDS-kostenmeter en het audit trail

Een live teller volgt GDS-zoekkosten van $3.25 per segment, omdat searches in rekening worden gebracht, niet alleen boekingen. Een L2B-cache en uitgestelde search houden het vlak waar een speculatieve agent opnieuw zoekt en marge verteert. Elke boeking schrijft een append-only JSON-eventlog, exporteerbaar als audit-<pnr>.json, met het model en de versie, het getypeerde trip request, elk node-oordeel, elke Saga-compensatie, de EU AI Act Article 50-disclosurevlag, en de terminal state.

Wat de demo toont

Vier knoppen, naast elkaar met een echte LLM-in-control-baseline op hetzelfde scenario. Elk screenshot hieronder is vastgelegd vanuit de draaiende app.

Een normale boeking, node voor node

De demo die een normale ORD-naar-SFO-boeking uitvoert. Rechts loopt de deterministische pipeline-trace elke node beurtelings, van intent-extractie via policy gate, CRS-verificatie, holds, ticketuitgifte en hotel-commit, eindigend in een confirmed PNR met de GDS-zoekkostenmeter op $3.25. Links antwoordt het paneel No Tools and No Verification simpelweg dat alles is geboekt.

"ORD to SFO next Tuesday, one night downtown, company policy." De statemachine voert elke node uit, bevestigt de Hyatt Regency SF tegen de CRS op property_id, en de zoekmeter blijft op $3.25 bij één gecachte search. Terminal state: confirmed, met een PNR.

De verificatiegate weigert een hotel dat niet bestaat

De CRS-verificatiestap gemarkeerd als failed. Het detailpaneel vermeldt dat Tabacon Springs Eco-Lodge niet in de CRS staat en is geweigerd, niet getoond. De propertykaart is gestempeld REFUSED met de noot dat de verificatiegate het weigerde en het niet aan de reiziger is getoond.

Het verzoek noemde een verzonnen property, "Tabacon Springs Eco-Lodge," een naam die twee echte resorts mengt en by design geen property_id heeft. De gate vindt geen CRS-match en weigert het te tonen. De agent onthoudt zich eerlijk, "Ik kon die property niet bevestigen," in plaats van er een te verzinnen.

De Saga-rollback, versus de LLM in control

De pipeline-trace nadat een hotelprijs verliep na ticketuitgifte. Drie Saga-compensatiestappen lopen in omgekeerde volgorde, en een banner meldt dat de hold verliep vóór commit en de Saga-rollback in omgekeerde volgorde compenseert. De resultaatkaart leest ROLLED BACK, TRAVELER SAFE, met een noot dat het vliegticket kosteloos is gevoid en alternatieve hotels worden aangeboden.

De hotelprijs verloopt nadat de vlucht al is geticket. Aan onze kant vuurt de Saga: void het ticket binnen het 24-uursvenster, geef de holds vrij, en antwoord eerlijk dat het ticket kosteloos is gevoid met alternatieven bijgevoegd. Terminal state: rolled back, traveler safe. De baseline in hetzelfde scenario laat het ticket uitgegeven, biedt geen compensatie, en geeft een vals "You're all set" af, wat precies het Air Canada-precedent is dat staat te gebeuren.

Een exporteerbaar audit trail

Onderin de console de link Export Audit Trail (JSON), naast het rolled-back resultaat dat uitlegt dat het vastgehouden tarief verliep vóór commit, het ticket kosteloos is gevoid, en twee alternatieve hotels worden aangeboden, met de GDS-zoekkosten op $3.25.

Eén klik exporteert audit-<pnr>.json: het model en de versie, het getypeerde trip request, elke node en zijn deterministische oordeel, elke Saga-compensatie, de EU AI Act Article 50-disclosurevlag (transparantieverplichtingen gelden vanaf 2 augustus 2026), en de terminal state.

De 200-scenario-benchmark

Het benchmarkscorebord over 200 synthetische boekingen bij een vaste seed met identieke geïnjecteerde storingen. Vier tegels vergelijken de deterministische agent met een plain LLM-baseline: 100 percent versus 65 percent consistente terminal state, 0 versus 40 gestrande reizigers, 0 versus 30 verzonnen boekingen, en $3.25 versus $7.57 gemiddelde GDS-kosten. Een resultatentabel somt per-scenario-uitkomsten op, waaronder confirmed, rolled back, abstained, escalated, integrity breach en stranded.

Dezelfde 200 synthetische boekingen, één vaste seed (42), en dezelfde geïnjecteerde infrastructurele storingen door beide architecturen. De scenariomix is 50 percent happy, 20 percent hotel-fail-after-ticket, 15 percent hallucinated-entity en 15 percent search-storm. Onze garanties houden by construction; de storingen van de baseline komen uit dezelfde data.

Deterministische control flow versus een LLM in the loop

De baseline is een echte ReAct-stijl LLM-in-control-agent op dezelfde scenario's, een eerlijk anker in plaats van een stroman. Cijfers hieronder zijn over de synthetische batch van 200 scenario's met vaste seed (benchmark.py, seed 42, n=200).

Metric Deterministische agent (onze) Baseline (LLM-in-control)
Consistente terminal state 100.0% 65.0%
Gestrande reizigers 0 40
Verzonnen boekingen getoond 0 30
Gem. GDS-zoekkosten per boeking $3.25 $7.57

De 100 percent, 0 en 0 houden by construction over deze synthetische batch met vaste seed, niet als een open-world productiegarantie. De claim is smal en duurzaam: een partiële boeking wordt nooit als confirmed getoond, en een reiziger wordt nooit gestrand. Het gat van $3.25 versus $7.57 is een margecijfer dat bij elke modelkwaliteit houdt.

Wat deze demo niet doet

  • Hij verbindt niet met een live GDS, CRS of NDC. De GDS en CRS, IATA- en ARC-ticketuitgifte, en PCI-betaling zijn gestubd en gesimuleerd. De fixture-adapter is de V1-integratie; er is geen live Amadeus-, Sabre- of Duffel-account.
  • Hij geeft geen echte tickets uit en verplaatst geen echt geld, en Veriprajna is niet IATA- of ARC-geaccrediteerd. Tickets en betaling zijn stubs.
  • De scenario's, PNR's, hotels en reizigers zijn synthetisch. "Tabacon Springs Eco-Lodge" is een bewust verzonnen property, een demonstratie van de faalmodus. Echt genoemde hotels zoals Hyatt Regency SF zijn fixture-inventory, geen echte boekingen.
  • Hij claimt niet meer, goedkoper of slimmer te boeken dan een GDS of OTA, en claimt geen zero hallucination van het model. De LLM stelt de intent nog steeds op; de garantie is dat de gate ongebevestigde inventory weigert en de Saga partiële storingen opruimt.
  • De engine is een handgebouwde Python-statemachine, geen LangGraph. LangGraph wordt genoemd als een uitgestelde productie-swap-in. LLM-leaf-calls gebruiken Pydantic AI.

Vragen die kopers stellen

Kan ik een AI-agent vertrouwen om reizen te boeken zonder mijn reizigers te laten stranden?

De garantie komt niet van het vertrouwen van het model. In deze demo is de control flow deterministisch Python, en elke voorwaartse stap registreert een compenserende actie op het moment dat hij draait. Wanneer een stap faalt nadat een ticket is uitgegeven, voert de engine die compensaties in omgekeerde volgorde uit (een Saga), voidt het ticket binnen het 24-uursvenster, en rapporteert eerlijk. Een reiziger blijft nooit achter met een vlucht en geen kamer omdat niets afhangt van het model dat besluit op te ruimen.

Verbindt dit met Amadeus, Sabre of Duffel?

Nee. De GDS, CRS, ticketuitgifte en betaling zijn in deze demo allemaal gestubd en gesimuleerd. De fixture-adapter is de V1-integratie, en er zit geen live Amadeus-, Sabre- of Duffel-account achter. De demo bewijst de control-flow-architectuur en de compensatielogica, geen productieboekingspijplijn.

Wat gebeurt er als het hotel faalt nadat de vlucht al is geticket?

Dat is precies het geval waarvoor de Saga is gebouwd. Ticketing registreert zijn eigen omgekeerde actie (void het ticket binnen het 24-uursvenster) op het moment dat hij draait. Als de hotelprijs verloopt vóór commit, vuurt de engine de compensaties in omgekeerde volgorde, voidt het ticket kosteloos, geeft de holds vrij, en reikt de reiziger eerlijke alternatieven aan. De terminal state is rolled back, niet confirmed en niet stranded.

Wat weerhoudt de agent ervan een hotel te verzinnen dat niet bestaat?

Een verificatiegate bevestigt elke property tegen de CRS op zijn property_id voordat hij getoond kan worden. Toen het verzoek in onze demo een verzonnen property noemde, vond de gate geen CRS-match en weigerde hem te tonen, en de agent onthield zich eerlijk in plaats van hem te boeken. De gate markeert een verzonnen hotel niet achteraf; hij maakt het fysiek niet presenteerbaar.

Hoe verschilt dit van GPT-4 in een agent loop met tools zetten?

Een ReAct-stijl agent zet de LLM aan het roer van de transactie, zodat hij beslist wanneer te zoeken, boeken en ticketen, en hij heeft geen gate en geen compensatielogica. Op dezelfde synthetische batch van 200 scenario's met vaste seed toonde die baseline verzonnen inventory en liet uitgegeven tickets staan zonder rollback, met een vals "You're all set." Hier is de LLM een getypeerde leaf-node die alleen intent parseert en het antwoord formuleert; deterministische code bezit de flow en elke stap draagt zijn eigen undo.

Wie is aansprakelijk als de agent een reiziger iets verkeerds vertelt?

De deployer is eigenaar van elke uitspraak die zijn agent doet. In Moffatt v. Air Canada (BC Civil Resolution Tribunal, 14 februari 2024) werd de luchtvaartmaatschappij veroordeeld tot betaling van $812.02 nadat haar chatbot een bereavement-fare-beleid had verzonnen, en het het-was-de-AI-verweer werd verworpen. De demo exporteert een JSON-audit trail per boeking met het model en de versie, elk node-oordeel, elke Saga-compensatie, en een EU AI Act Article 50-disclosurevlag, zodat wat de agent deed achteraf inspecteerbaar is.

Technisch onderzoek

Het onderzoek achter deze demo — de architectuur, het verificatieontwerp en de enterprise-blueprint.

Een agentic boekingslaag evalueren waarop je het bedrijf niet kunt verwedden?

De storingen die reizigers laten stranden en hotels verzinnen zijn infrastructuurgebeurtenissen, geen model-IQ-problemen.

Als je team afweegt waar de LLM hoort in een high-stakes boekingsagent, en hoe je voorkomt dat een partieel falen een Air Canada-achtige aansprakelijkheid wordt, wisselen we graag van gedachten. Het probleem is branchebreed en de antwoorden zullen dat ook zijn.

Review van de agentarchitectuur

  • ✓ Breng in kaart waar de LLM vandaag in je control flow zit
  • ✓ Identificeer de stappen die een compenserende actie nodig hebben
  • ✓ Stresstest de faalmodi: tariefverloop, holds na ticket, search storms
  • ✓ Definieer de terminal states waarop een operator kan vertrouwen

Bouw van een deterministische agent

  • ✓ Een statemachine die search, policy en ticketing bezit
  • ✓ Een verificatiegate en een Saga-compensatie-engine
  • ✓ Beleid gecompileerd naar code, met fail-safe defaults
  • ✓ Een exporteerbaar audit trail met een Article 50-disclosurevlag
Social

Ook gepubliceerd op