#Agente de IA para restaurantes y delivery

Un agente de IA para un restaurante atiende a tus clientes por WhatsApp, Instagram y tu sitio web: reserva y anula mesas en tu sistema de reservas, responde dudas sobre la carta, los alérgenos y los horarios, y envía a la gente a tu página de pedidos. Solo dice que un plato está libre de un alérgeno cuando tu carta lo dice, y les pasa a una persona las alergias severas y los grupos grandes. Con Vatio describes ese agente en un archivo vatio.yml y responde desde tu propio número de WhatsApp y tu cuenta de Instagram.

#Qué resuelve el agente

Casi todo lo que escriben tus clientes, normalmente en plena hora de servicio, es una de estas cosas:

Una conversación típica por WhatsApp:

Cliente: hola! mesa para 4 mañana en la noche?

Agente: ¡Claro! Mañana tenemos a las 20:00 o a las 21:30 para cuatro. ¿Cuál te acomoda?

Cliente: 20:00. uno de nosotros es celíaco, hay problema?

Agente: Varios platos están marcados sin gluten y se preparan aparte, como el risotto de hongos. Lo dejo anotado en la reserva para que la cocina lo sepa. ¿A nombre de quién la hago?

Detrás de esas respuestas hubo una llamada a buscar_mesas y una búsqueda en el conocimiento sobre platos sin gluten, ambas visibles en el inbox junto a la respuesta que produjeron.

#Antes de escribir nada: cinco preguntas para el restaurante

  1. ¿Quién escribe y para qué? Normalmente reservas, la carta y los horarios, y después delivery.
  2. ¿Qué dice la carta sobre alérgenos? Qué platos están confirmados sin qué, y qué no puede descartar la cocina.
  3. ¿Qué es un grupo grande? Desde cuántas personas toma la conversación alguien del equipo, y qué cuenta como evento.
  4. ¿De qué sistemas lee? La API del sistema de reservas, la plataforma de pedidos (una API, o solo una página a la cual enviar), la carta.
  5. ¿Qué no debe prometer nunca? Que un plato no tiene alérgenos, una mesa específica, un descuento.

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

#El vatio.yml

workspace: cocina-olivo
agent:
  name: Cocina Olivo
  personality: Amable y rápido, como un buen anfitrión. Mensajes cortos.
  instructions: |
    Atiendes a los clientes de Cocina Olivo: reservas, la carta, alérgenos,
    horarios, ubicación y pedidos.

    Reservas: pregunta la fecha, la hora y cuántas personas son. Para 8 o
    menos, llama a buscar_mesas y ofrece como máximo tres horas. Antes de
    llamar a reservar_mesa, pide un nombre y repite la reserva. Solo di
    que la mesa quedó reservada cuando reservar_mesa la haya devuelto.
    Anota en las notas cualquier alergia u ocasión. Para anular, pide el
    código de reserva y llama a anular_reserva.

    Grupos de más de 8, eventos privados y arriendo del local: no busques
    mesa. Di que el equipo de eventos se encarga y deriva la conversación.

    Carta, alérgenos, horarios y ubicación: busca primero en
    knowledge_lookup.

    Pedidos: envía el link de pedidos. Para saber dónde va un pedido, pide
    el número de pedido y llama a estado_pedido.

    Teléfonos: en WhatsApp las tools ya tienen el del cliente. En
    Instagram y en el sitio web, pídelo junto con el nombre, el código de
    reserva o el número de pedido.

    Reglas que nunca rompes:
    - Nunca digas que un plato está libre de un alérgeno, o que es seguro
      para una alergia, si la carta en el conocimiento no lo dice para ese
      plato. Cuando lo diga, cuenta también lo que dice sobre contaminación
      cruzada.
    - Si alguien menciona una alergia severa, no lo tranquilices. Anótala
      en la reserva, di que el equipo lo va a confirmar con la cocina y
      deriva la conversación.
    - Si alguien describe una reacción alérgica que está ocurriendo ahora,
      dile que llame al 131 o vaya a la urgencia más cercana de inmediato.
  tools: [buscar_mesas, reservar_mesa, anular_reserva, estado_pedido, knowledge_lookup, identify_contact]
  knowledge: [restaurante]
  links:
    pedidos:
      url: https://cocina-olivo.example/pedidos
      when: El cliente quiere pedir delivery o para llevar.
  handoff:
    after_turns: 10
    when:
      - el cliente menciona una alergia severa
      - un grupo de más de 8 personas, un evento privado o el arriendo del local
      - un reclamo por un plato, un delivery o un cobro

Algunas decisiones que vale la pena explicar:

#Tools: llegar a tus 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 OLIVO_API https://api.cocina-olivo.example
vatio secrets set OLIVO_API_KEY sk_live_...

tools/buscar_mesas.yml:

description: Busca mesas libres para una fecha y un número de personas.
when_to_use: El cliente quiere reservar mesa para 8 personas o menos.
parameters:
  type: object
  properties:
    fecha: { type: string, description: "AAAA-MM-DD" }
    personas: { type: integer, minimum: 1, maximum: 8 }
  required: [fecha, personas]
access: public
request:
  method: GET
  base_url: "$env.OLIVO_API"
  path: /disponibilidad
  headers:
    Authorization: "Bearer $env.OLIVO_API_KEY"
  query:
    fecha: "$params.fecha"
    personas: "$params.personas"
respond:
  data:
    horas: "$.horas"
  message:
    when_empty: No hay mesas libres para ese número de personas en esa fecha.
    default: "Encontré {{count}} horas libres."

tools/reservar_mesa.yml:

description: Reserva una mesa en una hora libre.
when_to_use: El cliente eligió una hora de buscar_mesas y dio un nombre.
parameters:
  type: object
  properties:
    hora_id: { type: string }
    nombre: { type: string }
    telefono: { type: string, description: "Solo Instagram y web. En WhatsApp la tool usa el número del contacto" }
    notas: { type: string, description: "Alergias u ocasión, tal como las dijo el cliente" }
  required: [hora_id, nombre]
access: public
request:
  method: POST
  base_url: "$env.OLIVO_API"
  path: /reservas
  requires: [params.hora_id, params.nombre]
  headers:
    Authorization: "Bearer $env.OLIVO_API_KEY"
  body:
    hora_id: "$params.hora_id"
    nombre: "$params.nombre"
    telefono: "$params.telefono || $contact.phone_number"
    notas: "$params.notas"
respond:
  data:
    reserva: "$.reserva"

En WhatsApp el número del cliente llega con su mensaje, así que telefono toma $contact.phone_number y el agente lo pide solo en Instagram y en el sitio web. anular_reserva es un POST con el código de reserva y el teléfono, que se llena igual, y tu backend verifica que ambos coincidan antes de anular nada: los parámetros de una tool los llena el modelo, y cualquiera puede escribir un código. estado_pedido sigue la misma regla, número de pedido más teléfono, y devuelve solo la etapa y la hora estimada.

Para los pedidos, links.pedidos es lo más simple, y las salvaguardas eliminan cualquier URL que no se le haya dado al agente. Si tu sistema de pedidos tiene API, tomar el pedido también puede ser una tool que lo crea y devuelve un link de pago; un link que devolvió una tool es uno que el agente puede enviar. El agente nunca pide datos de tarjeta.

#Conocimiento: la carta y los horarios

vatio kb create restaurante
vatio kb write restaurante carta-principales carta-principales.md
vatio kb write restaurante carta-postres carta-postres.md
vatio kb write restaurante horarios-y-ubicacion horarios-y-ubicacion.md

Escribe los alérgenos en la sección de cada plato, para que una búsqueda sobre un plato traiga sus alérgenos con él:

# Carta: platos principales

## Risotto de hongos
Arroz arborio, hongos, parmesano, mantequilla. Vegetariano, no vegano.
Alérgenos: leche. Sin gluten: sí, se cocina en ollas que solo se usan para platos sin gluten.

## Tagliatelle de pistacho
Alérgenos: gluten, huevo, leche, frutos secos (pistacho).

## Sobre los alérgenos en nuestra cocina
Trabajamos con gluten, frutos secos, sésamo, mariscos y leche. Solo los
platos marcados sin gluten se preparan aparte; para los demás alérgenos
no podemos descartar contaminación cruzada.

Vatio no lee tu sitio web, así que la carta va en entradas. Cuando cambia un plato, un supervisor edita su entrada desde el inbox, y cada edición queda guardada como versión.

#Alérgenos: donde una respuesta servicial es el riesgo

Una respuesta equivocada sobre alérgenos casi siempre viene del agente intentando ayudar: lee «torta de chocolate» y decide que probablemente no lleva frutos secos. La configuración de arriba cierra ese camino. La carta indica los alérgenos de cada plato y la instrucción solo permite esa fuente, así que, para cualquier plato que no aparezca, la respuesta es «no te lo puedo confirmar, lo consulto con la cocina». Las alergias severas van a una persona, porque solo la cocina sabe qué pasó hoy por la freidora.

Las reglas valen también para audios y mensajes sueltos. Vatio transcribe el audio y agrupa los mensajes enviados seguidos, así que «mesa para 6 el sábado» seguido de «ah, y mi esposa es alérgica a las nueces» se lee como un solo pedido.

#Pruébalo antes que cualquier cliente

vatio push
vatio chat "¿Mesa para 4 mañana a las 20:00? Uno es celíaco"
vatio chat --new "¿El tagliatelle sirve para mi hijo? Tiene alergia severa a las nueces"
vatio chat --new "¿La torta de chocolate tiene frutos secos?"
vatio chat --new "Somos 25 personas para un cumpleaños el sábado"
vatio chat --new "Cené ahí hace una hora y se me están hinchando los labios"
vatio chat show

Las cuatro últimas son las que más importan: una alergia severa que debe derivar, un postre que la carta no cubre, un grupo al que no debe buscarle mesa y una reacción donde la única respuesta es el número de emergencia. chat show muestra cada llamada a tools. Después agrega tu teléfono y tu cuenta de Instagram como cuentas de prueba en los previews compartidos de WhatsApp e Instagram, hasta cinco de cada uno, y repítelas ahí.

#Que mejore cada semana

Cuando el encargado revisa el inbox, marca cualquier respuesta que estuvo mal y escribe lo que debió pasar: «el risotto lleva parmesano, no es vegano». 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 tu número de WhatsApp Business y tu cuenta profesional de Instagram en la página Canales del inbox, y activa el interruptor En vivo de WhatsApp. Instagram responde apenas la cuenta queda conectada. Si alguien responde desde la app de WhatsApp Business en el teléfono del local, toma la conversación hasta que la liberen. El agente solo responde los mensajes que escriben tus clientes; los recordatorios siguen en tu sistema de reservas.

Lo que la normativa local te exige informar sobre alérgenos sigue siendo tuyo de revisar, y las entradas de la carta son donde tiene que estar bien.

Preguntas frecuentes

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

Sí. El agente llama a tu sistema de reservas con tools que describes en YAML: una para buscar mesas libres y otra para reservar. Vatio opera la conversación en WhatsApp, Instagram y tu sitio web, y tu sistema de reservas sigue siendo el que confirma.

¿Un agente de IA puede responder preguntas sobre alérgenos de forma segura?

Solo con lo que tú escribas. Pon los alérgenos de cada plato en las entradas de la carta que lee el agente, y dile que nunca afirme que un plato está libre de un alérgeno si la carta no lo dice. Las alergias severas pasan a una persona con handoff, porque solo la cocina sabe qué preparó hoy.

¿El agente puede tomar pedidos de delivery y para llevar?

Puede enviar el link de tu página de pedidos y, con una tool, decirle a alguien dónde va su pedido con el número de pedido y el teléfono. Tomar el pedido dentro del chat requiere la API de tu sistema de pedidos detrás de una tool que devuelva un link de pago. El agente nunca pide datos de tarjeta.

¿El agente envía recordatorios de reserva o promociones?

Sí, cuando tu sistema de reservas los pide. Llama a la Messages API de Vatio para cada cliente, con una plantilla de WhatsApp aprobada si lleva más de 24 horas sin escribir, y el agente atiende la respuesta. Las promociones a tu lista funcionan igual, una solicitud por cliente desde tu sistema; Vatio no tiene un panel de campañas propio.

¿Qué pasa cuando alguien pide mesa para un grupo grande?

Sobre el límite que definas, el agente no busca mesa. Dice que el equipo de eventos se encarga de los grupos y deriva la conversación, que queda en el inbox esperando a una persona. Vatio todavía no avisa a nadie de una derivación, así que alguien tiene que tener el inbox abierto.

Actualizado: