Reserva de viajes con IA agéntica para TMCs y OTAs
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.
Ninguna de las dos es un fallo de IQ del modelo. Ambas ya son una clase de bug de 2026.
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.
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.
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
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.
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.
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.
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.
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.
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.
«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 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.
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 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.
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.
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.
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.
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.
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.
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.
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.
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.
La investigación detrás de esta demo — la arquitectura, el diseño de verificación y el plano empresarial.
Solución completa
Explore la solución Reserva de viajes con IA agéntica →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.