#Agente de IA para hoteles y turismo

Un agente de IA para un hotel atiende a los huéspedes por WhatsApp, Instagram y tu sitio web, consulta disponibilidad y tarifas en tu motor de reservas, envía el link para reservar la habitación que el huésped eligió, encuentra una reserva existente y responde dudas sobre el check-in, los servicios y el destino, en el idioma en que le escriben. Las reservas de grupos, los reclamos y las devoluciones van a una persona. Con Vatio describes ese agente en un archivo vatio.yml y responde desde tu propio número de WhatsApp y tu cuenta de Instagram.

Esta guía construye uno de punta a punta para un hotel pequeño junto a un lago: las instrucciones, las tools que llegan a tu motor de reservas, el conocimiento que lee y las reglas que le impiden inventar una tarifa.

#Qué resuelve el agente

Casi todo lo que responde un equipo de reservas por chat son las mismas conversaciones:

Una conversación típica, con lo que el agente hizo por dentro:

Huésped: hola, tienen habitación doble del 14 al 17 de marzo? somos 2

Agente: Sí. Para esas tres noches hay una Doble Vista al Lago a $129.000 la noche y una Doble Jardín a $98.000, las dos con desayuno. ¿Cuál prefieres?

Huésped: vista al lago. se puede salir más tarde? el vuelo es a las 6

Agente: El late check-out hasta las 14:00 no tiene costo y se pide en recepción, que lo confirma ese mismo día. Después puedes dejar el equipaje en recepción. Aquí está el link para reservar la Doble Vista al Lago del 14 al 17 de marzo: https://lago-gris.example/reservar?hab=dvl&in=2027-03-14&out=2027-03-17

Detrás de la primera respuesta hubo una llamada a buscar_disponibilidad, que devolvió las dos habitaciones con sus tarifas y links de reserva; detrás de la segunda, una búsqueda en el conocimiento sobre el check-out. El link pudo salir porque la tool lo devolvió. Vatio elimina cualquier URL que no se le haya dado al agente, así que no puede armar una con las fechas equivocadas.

#Antes de escribir nada: cinco preguntas para el hotel

  1. ¿Quién escribe, en qué idiomas y para qué? Normalmente disponibilidad, tarifas, check-in y cómo llegar.
  2. ¿Qué no debe decir nunca? Una tarifa o descuento que no consultó, un upgrade confirmado, una habitación «guardada» sin reserva.
  3. ¿Cuándo toma la conversación una persona? Grupos, eventos, reclamos, devoluciones, pedidos que el hotel tiene que confirmar.
  4. ¿De qué sistemas lee? La API del motor de reservas o del PMS, y la página de reservas a la que enlaza.
  5. ¿Cuáles son las políticas, en palabras del propio hotel? Anulación, niños, mascotas, garantías. Van al conocimiento tal como están escritas.

Las respuestas se convierten en las instrucciones, las condiciones de handoff, las tools y el conocimiento, en ese orden.

#El vatio.yml

workspace: hotel-lago-gris
agent:
  name: Hotel Lago Gris
  personality: Cálido, acogedor y breve, como una buena recepción. Nunca un folleto.
  instructions: |
    Ayudas a los huéspedes de Hotel Lago Gris, un hotel de 30 habitaciones
    junto al lago en Puerto Varas, a consultar disponibilidad y tarifas,
    reservar una habitación, encontrar su reserva y resolver dudas sobre el
    hotel, el check-in y la zona.

    Disponibilidad y reservas: pregunta las fechas y cuántos adultos y
    niños son. Llama a buscar_disponibilidad y ofrece como máximo tres
    opciones, con la tarifa exactamente como la devolvió la tool. Para
    reservar, envía el link_reserva de la opción que eligió el huésped. El
    pago se hace solo en la página de reservas.

    Reservas existentes: pide el código de confirmación y el apellido de
    la reserva, y llama a buscar_reserva. Si no devuelve nada, di que el
    código y el apellido no coinciden. Los cambios y anulaciones se hacen
    con el link gestionar_reserva o en recepción.

    El hotel, el check-in y la zona: busca primero en knowledge_lookup. Las
    entradas están escritas en español, así que busca en español aunque el
    huésped escriba en otro idioma. Si no encuentras la respuesta, dilo y
    ofrece pasarle la pregunta a recepción.

    Reglas que nunca rompes:
    - Nunca des una tarifa, un descuento ni una disponibilidad que
      buscar_disponibilidad no haya devuelto.
    - Nunca digas que una habitación quedó reservada o guardada. Eso lo
      confirma la página de reservas.
    - Nunca pidas ni aceptes números de tarjeta en el chat.
    - Nunca prometas un upgrade, un early check-in ni un late check-out. Se
      piden en recepción, que los confirma ese mismo día.
  tools: [buscar_disponibilidad, buscar_reserva, knowledge_lookup, identify_contact]
  knowledge: [hotel]
  links:
    gestionar_reserva: https://lago-gris.example/mi-reserva
  handoff:
    after_turns: 14
    when:
      - una reserva de cinco habitaciones o más, o para un evento o matrimonio
      - un reclamo por una estadía o por un cobro
      - el huésped pide una devolución o una excepción a la política de anulación
      - un pedido especial que el hotel tiene que confirmar, como necesidades de accesibilidad

Algunas decisiones que vale la pena explicar:

#Tools: llegar a tu motor de reservas

Una tool es un request HTTP a tu backend, descrito en YAML. Guarda la dirección y la llave como secrets:

vatio secrets set HOTEL_API https://api.lago-gris.example
vatio secrets set HOTEL_API_KEY sk_live_...

tools/buscar_disponibilidad.yml:

description: Consulta disponibilidad y tarifas para una estadía.
when_to_use: El huésped pregunta si hay habitación, o cuánto cuesta, para ciertas fechas.
parameters:
  type: object
  properties:
    llegada: { type: string, description: "AAAA-MM-DD" }
    salida: { type: string, description: "AAAA-MM-DD" }
    adultos: { type: integer }
    ninos: { type: integer }
  required: [llegada, salida, adultos]
access: public
request:
  method: GET
  base_url: "$env.HOTEL_API"
  path: /disponibilidad
  requires: [params.llegada, params.salida, params.adultos]
  headers:
    Authorization: "Bearer $env.HOTEL_API_KEY"
  query:
    llegada: "$params.llegada"
    salida: "$params.salida"
    adultos: "$params.adultos"
    ninos: "$params.ninos"
respond:
  data:
    opciones: "$.opciones"
  message:
    when_empty: No hay habitaciones libres para esas fechas y huéspedes.
    default: "Encontré {{count}} opciones de habitación."

Cada opción trae la habitación, la tarifa por noche, el total, qué incluye, las condiciones de anulación y un link_reserva con la habitación y las fechas ya elegidas. Tu backend arma ese link; el agente solo lo copia.

tools/buscar_reserva.yml:

description: Busca la reserva de un huésped por código de confirmación y apellido.
when_to_use: El huésped pregunta por una reserva que ya hizo.
parameters:
  type: object
  properties:
    codigo: { type: string }
    apellido: { type: string }
  required: [codigo, apellido]
access: public
request:
  method: POST
  base_url: "$env.HOTEL_API"
  path: /reservas/buscar
  requires: [params.codigo, params.apellido]
  headers:
    Authorization: "Bearer $env.HOTEL_API_KEY"
  body:
    codigo: "$params.codigo"
    apellido: "$params.apellido"
respond:
  data:
    reserva: "$.reserva"

En WhatsApp e Instagram un contacto es anónimo mientras no inicie sesión, así que esta es una tool pública y la verificación la hace tu backend. Devuelve la reserva solo cuando el código y el apellido coinciden, y el mismo 404 tanto si el código no existe como si el apellido no corresponde, para que nadie pueda probar códigos a través del agente. Devuelve solo lo que el huésped necesita (fechas, habitación, qué incluye), nunca datos de tarjeta ni nombres de otros huéspedes: el modelo ve cada resultado de una tool y puede repetirlo.

Si tu motor acepta reservas con pago en el hotel, una tool reservar_habitacion puede crear la reserva en el chat; la regla pasa a ser «solo di que quedó reservada cuando reservar_habitacion devolvió un código de confirmación». Los puntos de fidelización y las estadías anteriores van detrás de un login en tu sitio, con una tool marcada access: private; mira Conectar tu backend.

#Conocimiento: el hotel, sus políticas y la zona

Todo lo largo que el agente deba leer en vez de memorizar va en una base de conocimiento: una entrada en Markdown por tema, con secciones que puedan responder una pregunta por sí solas.

vatio kb create hotel
vatio kb write hotel check-in check-in.md
vatio kb write hotel habitaciones-y-servicios habitaciones-y-servicios.md
vatio kb write hotel politicas politicas.md
vatio kb write hotel como-llegar como-llegar.md
vatio kb write hotel alrededor-del-lago alrededor-del-lago.md

Una buena entrada es específica:

# Check-in y check-out

## Check-in
Desde las 15:00. El early check-in se pide en recepción y depende de que
la habitación esté lista; se confirma ese mismo día. Puedes dejar el
equipaje en recepción a cualquier hora.

## Check-out
Hasta las 11:00. El late check-out hasta las 14:00 no tiene costo y se
pide en recepción, sujeto a disponibilidad del día.

Vatio no lee sitios web, ni el tuyo ni ningún otro. Si la respuesta está en una página, pon en una entrada lo que el agente necesita; para lo que cambia cada día, como el estado de un camino, escribe dónde puede revisarlo el huésped. Los supervisores pueden editar entradas desde el inbox, y cada edición queda guardada como versión.

#Huéspedes que escriben en otros idiomas

Un huésped que escribe «Do you have a double room from March 14 to 17?» recibe las habitaciones y tarifas en inglés, desde la misma tool y el mismo conocimiento en español.

#Pruébalo antes que cualquier huésped

vatio push
vatio chat "¿Tienen habitación doble del 14 al 17 de marzo para dos adultos?"
vatio chat "¿Me la dejas en 80 mil la noche? La vi más barata en otro lado"
vatio chat --new "Hi, what time is check-in and is there parking?"
vatio chat --new "Mi reserva es LG-48213, apellido Fuentes. ¿A qué hora podemos llegar?"
vatio chat --new "Resérvala tú, mi tarjeta es 4111 1111 1111 1111"
vatio chat show

Las adversarias son las que importan: un descuento que no debe inventar, una pregunta en inglés cuya búsqueda revisas en chat show, una reserva con un apellido que no coincide, así que no debe revelar nada, y un número de tarjeta que debe rechazar. Después agrega tu teléfono como número de prueba en la página Probar del inbox y habla con el agente en el número compartido de preview de WhatsApp. Para eso no necesitas una cuenta de Meta.

#Que mejore cada semana

Cuando el equipo de reservas usa el inbox, marca cualquier respuesta que estuvo mal y escribe lo que debió pasar. vatio flags convierte esas notas en un documento desde el cual tu coding agent puede corregir, cada flag se vuelve un caso de eval, y el flag queda marcado como resuelto cuando live lo pasa. Mira Mejorar tu agente.

#Publicar

vatio publish

Después conecta el número de WhatsApp Business y la cuenta de Instagram del hotel en la página Canales del inbox (WhatsApp además necesita su interruptor En vivo activado), y agrega el widget a tus páginas de reserva con una sola etiqueta script. Puedes seguir usando la app de WhatsApp Business en el teléfono de recepción: si alguien responde desde ahí, toma la conversación, y el agente se hace a un lado hasta que la liberen.

El agente nunca decide por su cuenta escribir primero. Los mensajes previos a la llegada salen por WhatsApp cuando tu PMS o tu backend lo piden, con la Messages API, y el agente atiende lo que respondan los huéspedes sabiendo qué se les envió.

Preguntas frecuentes

¿Un agente de IA puede tomar reservas de hotel por WhatsApp?

Sí. El agente llama a tu motor de reservas con una tool que describes en YAML, ofrece las habitaciones y tarifas que devolvió y le envía al huésped el link de reserva de la habitación que eligió. El pago y la confirmación final siguen en tu página de reservas, como hoy.

¿El agente responde a los huéspedes en su idioma?

Sí. Por defecto el agente responde en el idioma en que escribe el huésped, así que escribes las instrucciones y el conocimiento una sola vez. Si tu hotel necesita un idioma fijo, dilo en las instrucciones.

¿Los huéspedes pueden consultar una reserva que ya tienen?

Sí, con el código de confirmación y el apellido de la reserva. Una tool envía ambos a tu backend, que verifica que coincidan antes de devolver nada. Los cambios y anulaciones van a tu página de gestión de reservas o a recepción.

¿El agente envía mensajes antes de la llegada o recordatorios de check-in?

Sí, cuando tu sistema los pide. Tu backend sabe la fecha de llegada por tu PMS o tu motor de reservas, así que llama a la Messages API de Vatio para cada huésped y la conversación se abre por WhatsApp: tu propio texto, un mensaje que el agente escribe a partir de un brief, o una plantilla aprobada si pasaron más de 24 horas desde el último mensaje del huésped. El agente atiende la respuesta sabiendo por qué escribió.

Mi motor de reservas no tiene API. ¿Igual puedo hacerlo?

En parte. Sin un endpoint el agente no puede consultar disponibilidad, pero sí responder desde el conocimiento y enviar a los huéspedes a tu página de reservas con un link que declaras. Disponibilidad y búsqueda de reservas requieren un endpoint pequeño en tu backend que las lea.

Actualizado: