Reserva de viajes con IA agéntica para TMCs y OTAs

La jugada senior para un agente de reservas no es un modelo más inteligente. Es sacar al LLM del flujo de control.

Construimos un agente autónomo de reserva de viajes cuyo flujo de control es Python determinista. El modelo solo parsea la solicitud de viaje y redacta la respuesta. Cada paso de reserva registra una acción compensatoria, de modo que cuando una tarifa hotelera caduca después de emitir el billete de avión, el agente anula el billete dentro de la ventana de 24 horas y entrega al viajero alternativas honestas en lugar de dejarlo varado.

100%

Estado terminal consistente, por construcción

Lote sintético de 200 escenarios con semilla fija, frente al 65% de la línea base con LLM al mando

0 / 0

Viajeros varados, reservas fabricadas expuestas

El mismo lote, frente a 40 y 30 de la línea base

$3.25

Gasto medio de búsqueda GDS por reserva

frente a $7.57 de la línea base; el GDS cobra por búsqueda, Lufthansa subió las tarifas el 1 de enero de 2026

Todos los escenarios son sintéticos sobre un GDS y un CRS simulados; los códigos de aeropuerto y los nombres de hotel son fixtures de forma real, no inventario en vivo ni reservas reales.

Ponga un LLM al mando de una transacción y dos cosas salen mal

Ninguna de las dos es un fallo de IQ del modelo. Ambas ya son una clase de bug de 2026.

Deja varados a los viajeros

El agente emite un vuelo, el paso del hotel falla, y sin lógica de compensación sigue diciendo «Todo listo.» Alguien se queda con un vuelo y sin habitación. Un modelo perfecto aún deja varado a un viajero si nada anula el billete.

Expone inventario que no existe

Inventa un hotel plausible y lo reserva. La propiedad nunca estuvo en el CRS. Nada lo comprobó antes de llegar al viajero, porque en un bucle de razonamiento el modelo es a la vez el proponente y el juez.

La razón por la que un modelo mejor no arregla esto es que los fallos son eventos de infraestructura y de uso, independientes de la calidad del modelo. Una tarifa caduca entre dos llamadas a API. Un hold se rechaza después de emitir un billete. Una tormenta de búsquedas quema el margen. El razonamiento estocástico se acumula contra esto: diez pasos al 90 por ciento de fiabilidad salen a aproximadamente el 34 por ciento de extremo a extremo, y GPT-4 con ReAct completa itinerarios reales de varios días al 0.6 por ciento (TravelPlanner, OSU NLP, arXiv 2402.01622). No se puede salir de un fallo estocástico compuesto a base de prompts.

Y el desplegador es dueño de cada declaración que hace el agente. En Moffatt v. Air Canada (BC Civil Resolution Tribunal, 14 de febrero de 2024) se ordenó a la aerolínea pagar $812.02 después de que su chatbot inventara una política de tarifa por duelo, y se rechazó el argumento de que la IA era una entidad separada.

Cómo funciona: los agentes aconsejan, el código decide

El flujo de control es una máquina de estados Python hecha a mano de unos diez nodos. El LLM se limita a dos trabajos hoja. Todo lo que hay entre ellos es determinista.

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

Extract, el único trabajo estructurado del LLM

El modelo parsea la intención en lenguaje natural en un Pydantic-typed TripRequest (origin, destination, date, passengers, cabin, hotel). Ese objeto tipado es el único artefacto estructurado que produce el LLM. Es intercambiable de proveedor a través de Pydantic AI y se ejecuta totalmente offline con un stub determinista cuando no hay clave.

Política compilada a código

La política corporativa vive como predicados Python puros: solo economy, un techo de tarifa de $600 por segmento, aerolíneas preferidas (United, American, Delta), un techo hotelero de $350 por noche. Las opciones fuera de política son físicamente no presentables porque se filtran antes de poder mostrarse, no se marcan después. Las familias de tarifa desconocidas fallan de forma segura, tratadas como por encima de la política en lugar de silenciosamente como economy. Sin vuelo dentro de política, el agente escala a una cola humana en lugar de farolear.

La compuerta de verificación

Cada hotel se confirma contra el CRS por property_id. Una propiedad que el modelo inventa simplemente no está en el CRS, así que se rechaza y nunca se expone, y la reserva llega al estado terminal abstained. La compuerta rechaza el inventario no confirmado; no pide al modelo que califique su propia salida.

La Saga, la parte que la mayoría de las demos omiten

Cada paso hacia adelante registra su acción inversa en el momento de ejecución. La emisión de billete, por ejemplo, registra «anular billete, ventana de 24 horas». Ante un fallo en el paso N, las compensaciones de N-1 hasta 1 se ejecutan en orden inverso, y solo entonces informa el agente. Esto es lo que separa una demo de un producto, porque es lo que impide que un fallo parcial se convierta en un cliente varado.

El medidor de coste GDS y el rastro de auditoría

Un contador en vivo rastrea el gasto de búsqueda GDS a $3.25 por segmento, porque se cobra por las búsquedas, no solo por las reservas. Una caché L2B y la búsqueda diferida lo mantienen plano donde un agente especulativo vuelve a buscar y quema margen. Cada reserva escribe un registro de eventos JSON de solo añadir, exportable como audit-<pnr>.json, que lleva el modelo y la versión, la solicitud de viaje tipada, cada veredicto de nodo, cada compensación Saga, el flag de divulgación EU AI Act Article 50, y el estado terminal.

Lo que muestra la demo

Cuatro botones, lado a lado con una línea base real de LLM al mando sobre el mismo escenario. Cada captura de pantalla de abajo está tomada de la app en ejecución.

Una reserva normal, nodo a nodo

La demo ejecutando una reserva normal de ORD a SFO. A la derecha, el rastro del pipeline determinista ejecuta cada nodo por turno, desde la extracción de intención hasta la compuerta de políticas, la verificación CRS, los holds, la emisión del billete y el commit del hotel, terminando en un PNR confirmed con el medidor de gasto de búsqueda GDS en $3.25. A la izquierda, el panel etiquetado No Tools and No Verification simplemente responde que todo está reservado.

«ORD to SFO next Tuesday, one night downtown, company policy.» La máquina de estados ejecuta cada nodo, confirma el Hyatt Regency SF contra el CRS por property_id, y el medidor de búsqueda se mantiene en $3.25 en una sola búsqueda en caché. Estado terminal: confirmed, con un PNR.

La compuerta de verificación rechaza un hotel que no existe

El paso de verificación CRS marcado como fallido. El panel de detalle indica que Tabacon Springs Eco-Lodge no está en el CRS y ha sido rechazado, no expuesto. La tarjeta de la propiedad está sellada REFUSED con la nota de que la compuerta de verificación lo rechazó y no se expuso al viajero.

La solicitud nombraba una propiedad fabricada, «Tabacon Springs Eco-Lodge», un nombre que mezcla dos resorts reales y no tiene property_id por diseño. La compuerta no encuentra coincidencia en el CRS y se niega a exponerla. El agente se abstiene con honestidad: «No pude confirmar esa propiedad», en lugar de inventar una.

El rollback de la Saga, frente al LLM al mando

El rastro del pipeline después de que una tarifa hotelera caducara tras la emisión del billete. Tres pasos de compensación Saga se ejecutan en inverso, y un banner indica que el hold caducó antes del commit y el rollback de la Saga está compensando en inverso. La tarjeta de resultado lee ROLLED BACK, TRAVELER SAFE, con una nota de que el billete de avión se anuló sin cargo y se ofrecen hoteles alternativos.

La tarifa hotelera caduca después de que el vuelo ya está emitido. De nuestro lado la Saga se dispara: anula el billete dentro de la ventana de 24 horas, libera los holds y responde con honestidad que el billete se anuló sin cargo, con alternativas adjuntas. Estado terminal: rolled back, viajero a salvo. La línea base en el mismo escenario deja el billete emitido, no ofrece compensación y emite un falso «Todo listo», que es exactamente el precedente de Air Canada esperando ocurrir.

Un rastro de auditoría exportable

La parte inferior de la consola mostrando el enlace Export Audit Trail (JSON), junto al resultado rolled-back que explica que la tarifa en hold caducó antes del commit, el billete se anuló sin cargo y se ofrecen dos hoteles alternativos, con el gasto de búsqueda GDS en $3.25.

Un clic exporta audit-<pnr>.json: el modelo y la versión, la solicitud de viaje tipada, cada nodo y su veredicto determinista, cada compensación Saga, el flag de divulgación EU AI Act Article 50 (las obligaciones de transparencia aplican desde el 2 de agosto de 2026), y el estado terminal.

El benchmark de 200 escenarios

El marcador del benchmark sobre 200 reservas sintéticas con semilla fija e idénticos fallos inyectados. Cuatro tarjetas comparan el agente determinista con una línea base de LLM simple: 100 por ciento frente a 65 por ciento de estado terminal consistente, 0 frente a 40 viajeros varados, 0 frente a 30 reservas fabricadas, y $3.25 frente a $7.57 de gasto GDS medio. Una tabla de resultados lista los desenlaces por escenario, incluidos confirmed, rolled back, abstained, escalated, integrity breach y stranded.

Las mismas 200 reservas sintéticas, una semilla fija (42), y los mismos fallos de infraestructura inyectados se ejecutan en ambas arquitecturas. La mezcla de escenarios es 50 por ciento happy, 20 por ciento hotel-fail-after-ticket, 15 por ciento hallucinated-entity y 15 por ciento search-storm. Nuestras garantías se sostienen por construcción; los fallos de la línea base emergen de los mismos datos.

Flujo de control determinista frente a un LLM en el bucle

La línea base es un agente real de estilo ReAct con LLM al mando ejecutado sobre los mismos escenarios, un ancla honesta más que un hombre de paja. Los números de abajo son sobre el lote sintético de 200 escenarios con semilla fija (benchmark.py, seed 42, n=200).

Métrica Agente determinista (el nuestro) Línea base (LLM-in-control)
Estado terminal consistente 100.0% 65.0%
Viajeros varados 0 40
Reservas fabricadas expuestas 0 30
Gasto medio de búsqueda GDS por reserva $3.25 $7.57

El 100 por ciento, el 0 y el 0 se sostienen por construcción sobre este lote sintético de semilla fija, no como una garantía de producción en mundo abierto. La afirmación es estrecha y duradera: una reserva parcial nunca se muestra como confirmed, y un viajero nunca queda stranded. La brecha de $3.25 frente a $7.57 es un número de margen que se sostiene a cualquier calidad de modelo.

Lo que esta demo no hace

  • No se conecta a un GDS, CRS o NDC en vivo. El GDS y el CRS, la emisión de billetes IATA y ARC, y el pago PCI están stubbed y simulados. El adaptador de fixtures es la integración V1; no hay cuenta en vivo de Amadeus, Sabre ni Duffel.
  • No emite billetes reales ni mueve dinero real, y Veriprajna no está acreditada por IATA ni ARC. Los billetes y el pago son stubs.
  • Los escenarios, PNRs, hoteles y viajeros son sintéticos. «Tabacon Springs Eco-Lodge» es una propiedad deliberadamente fabricada, una demostración del modo de fallo. Los hoteles con nombre real como Hyatt Regency SF son inventario fixture, no reservas reales.
  • No afirma reservar más, más barato o más inteligente que un GDS o una OTA, y no afirma alucinación cero del modelo. El LLM aún redacta la intención; la garantía es que la compuerta rechaza el inventario no confirmado y la Saga limpia los fallos parciales.
  • El motor es una máquina de estados Python hecha a mano, no LangGraph. LangGraph se nombra como un recambio de producción diferido. Las llamadas hoja del LLM usan Pydantic AI.

Preguntas que hacen los compradores

¿Puedo confiar en un agente de IA para reservar viajes sin dejar varados a mis viajeros?

La garantía no viene de confiar en el modelo. En esta demo el flujo de control es Python determinista, y cada paso hacia adelante registra una acción compensatoria en el momento en que se ejecuta. Cuando un paso falla después de emitir un billete, el motor ejecuta esas compensaciones en inverso (una Saga), anula el billete dentro de la ventana de 24 horas e informa con honestidad. Un viajero nunca se queda con un vuelo y sin habitación porque nada depende de que el modelo decida limpiar.

¿Esto se conecta a Amadeus, Sabre o Duffel?

No. El GDS, el CRS, la emisión de billetes y el pago están todos stubbed y simulados en esta demo. El adaptador de fixtures es la integración V1, y no hay ninguna cuenta en vivo de Amadeus, Sabre ni Duffel detrás. La demo prueba la arquitectura del flujo de control y la lógica de compensación, no un pipeline de reserva en producción.

¿Qué ocurre si el hotel falla después de que el vuelo ya está emitido?

Ese es exactamente el caso para el que está construida la Saga. La emisión de billete registra su propia acción inversa (anular el billete dentro de la ventana de 24 horas) en el momento en que se ejecuta. Si la tarifa hotelera caduca antes del commit, el motor dispara las compensaciones en orden inverso, anula el billete sin cargo, libera los holds y entrega al viajero alternativas honestas. El estado terminal es rolled back, no confirmed y no stranded.

¿Qué impide que el agente invente un hotel que no existe?

Una compuerta de verificación confirma cada propiedad contra el CRS por su property_id antes de poder mostrarla. Cuando la solicitud nombró una propiedad fabricada en nuestra demo, la compuerta no encontró coincidencia en el CRS y se negó a exponerla, y el agente se abstuvo con honestidad en lugar de reservarla. La compuerta no marca un hotel inventado a posteriori; lo hace físicamente no presentable.

¿En qué se diferencia esto de poner GPT-4 en un bucle de agente con herramientas?

Un agente de estilo ReAct pone al LLM al mando de la transacción, de modo que decide cuándo buscar, reservar y emitir, y no tiene compuerta ni lógica de compensación. En el mismo lote sintético de 200 escenarios con semilla fija, esa línea base expuso inventario fabricado y dejó billetes emitidos sin rollback, emitiendo un falso Todo listo. Aquí el LLM es un nodo hoja tipado que solo parsea la intención y redacta la respuesta; el código determinista posee el flujo y cada paso lleva su propio deshacer.

¿Quién es responsable si el agente le dice algo incorrecto a un viajero?

El desplegador es dueño de cada declaración que hace su agente. En Moffatt v. Air Canada (BC Civil Resolution Tribunal, 14 de febrero de 2024) se ordenó a la aerolínea pagar $812.02 después de que su chatbot inventara una política de tarifa por duelo, y se rechazó la defensa de que fue la IA. La demo exporta un rastro de auditoría JSON por reserva con el modelo y la versión, cada veredicto de nodo, cada compensación Saga, y un flag de divulgación EU AI Act Article 50, de modo que lo que hizo el agente es inspeccionable a posteriori.

Investigación técnica

La investigación detrás de esta demo — la arquitectura, el diseño de verificación y el plano empresarial.

¿Evaluando una capa de reserva agéntica con la que no puede jugarse la empresa?

Los fallos que dejan varados a los viajeros e inventan hoteles son eventos de infraestructura, no problemas de IQ del modelo.

Si su equipo está sopesando dónde pertenece el LLM en un agente de reserva de alto impacto, y cómo evitar que un fallo parcial se convierta en una responsabilidad al estilo Air Canada, nos gustaría de verdad comparar notas. El problema es de todo el sector y las respuestas también lo serán.

Revisión de arquitectura de agentes

  • ✓ Mapear dónde se sitúa el LLM en su flujo de control hoy
  • ✓ Identificar los pasos que necesitan una acción compensatoria
  • ✓ Someter a prueba de estrés los modos de fallo: caducidad de tarifa, holds posteriores al billete, tormentas de búsquedas
  • ✓ Definir los estados terminales en los que un operador puede confiar

Construcción de agente determinista

  • ✓ Una máquina de estados que posee la búsqueda, la política y la emisión de billetes
  • ✓ Una compuerta de verificación y un motor de compensación Saga
  • ✓ Política compilada a código, con valores por defecto fail-safe
  • ✓ Un rastro de auditoría exportable con un flag de divulgación EU AI Act Article 50
Redes sociales

También publicado en