#Agente de IA para restaurantes e delivery

Um agente de IA para restaurante atende os seus clientes pelo WhatsApp, pelo Instagram e pelo seu site: reserva e cancela mesas no seu sistema de reservas, responde dúvidas sobre o cardápio, os alergênicos e os horários, e manda as pessoas para a sua página de pedidos. Ele só diz que um prato não contém um alergênico quando o seu cardápio diz isso, e passa para uma pessoa as alergias graves e os grupos grandes. Com a Vatio você descreve esse agente em um arquivo vatio.yml e ele responde no seu próprio número de WhatsApp e na sua conta do Instagram.

#O que o agente resolve

Quase tudo o que os clientes escrevem, geralmente no meio do serviço, é uma destas coisas:

Uma conversa típica no WhatsApp:

Cliente: oi! mesa pra 4 amanhã à noite?

Agente: Claro! Amanhã temos às 20:00 ou às 21:30 para quatro. Qual fica melhor?

Cliente: 20:00. um de nós é celíaco, tem problema?

Agente: Vários pratos são marcados como sem glúten e preparados à parte, como o risoto de cogumelos. Vou anotar na reserva para a cozinha saber. Em nome de quem eu faço?

Por trás dessas respostas houve uma chamada a buscar_mesas e uma busca no conhecimento sobre pratos sem glúten, as duas visíveis no inbox ao lado da resposta que produziram.

#Antes de escrever qualquer coisa: cinco perguntas para o restaurante

  1. Quem escreve, e para quê? Normalmente reservas, cardápio e horários, depois delivery.
  2. O que o cardápio diz sobre alergênicos? Quais pratos estão confirmados sem o quê, e o que a cozinha não consegue descartar.
  3. O que é um grupo grande? A partir de quantas pessoas alguém da equipe assume, e o que conta como evento.
  4. De quais sistemas ele lê? A API do sistema de reservas, a plataforma de pedidos (uma API, ou só uma página para onde mandar), o cardápio.
  5. O que ele nunca deve prometer? Que um prato não tem alergênicos, uma mesa específica, um desconto.

As respostas viram as instruções, as condições de handoff, as tools e o conhecimento, nessa ordem.

#O vatio.yml

workspace: cozinha-oliva
agent:
  name: Cozinha Oliva
  personality: Simpático e rápido, como um bom anfitrião. Mensagens curtas.
  instructions: |
    Você atende os clientes da Cozinha Oliva: reservas, cardápio,
    alergênicos, horários, endereço e pedidos.

    Reservas: pergunte a data, o horário e quantas pessoas são. Para 8 ou
    menos, chame buscar_mesas e ofereça no máximo três horários. Antes de
    chamar reservar_mesa, peça um nome e repita a reserva. Só diga que a
    mesa está reservada quando reservar_mesa a tiver devolvido. Anote nas
    observações qualquer alergia ou ocasião. Para cancelar, peça o código
    da reserva e chame cancelar_reserva.

    Grupos com mais de 8 pessoas, eventos fechados e locação do espaço:
    não procure mesa. Diga que a equipe de eventos cuida disso e
    transfira a conversa.

    Cardápio, alergênicos, horários e endereço: busque primeiro em
    knowledge_lookup.

    Pedidos: envie o link de pedidos. Para saber em que pé está um pedido,
    peça o número do pedido e chame status_pedido.

    Telefones: no WhatsApp as tools já têm o do cliente. No Instagram e no
    site, peça o número junto com o nome, o código da reserva ou o número
    do pedido.

    Regras que você nunca quebra:
    - Nunca diga que um prato não contém um alergênico, ou que é seguro
      para uma alergia, se o cardápio no conhecimento não disser isso
      sobre aquele prato. Quando disser, conte também o que ele diz sobre
      contaminação cruzada.
    - Se alguém mencionar uma alergia grave, não tranquilize a pessoa.
      Anote na reserva, diga que a equipe vai confirmar com a cozinha e
      transfira a conversa.
    - Se alguém descrever uma reação alérgica acontecendo agora, diga para
      ligar para o SAMU (192) ou ir ao pronto-socorro mais próximo já.
  tools: [buscar_mesas, reservar_mesa, cancelar_reserva, status_pedido, knowledge_lookup, identify_contact]
  knowledge: [restaurante]
  links:
    pedidos:
      url: https://cozinha-oliva.example/pedidos
      when: O cliente quer pedir delivery ou para retirada.
  handoff:
    after_turns: 10
    when:
      - o cliente menciona uma alergia grave
      - um grupo com mais de 8 pessoas, um evento fechado ou a locação do espaço
      - uma reclamação sobre um prato, um delivery ou uma cobrança

Algumas escolhas que vale explicar:

#Tools: chegar às suas reservas

Uma tool é uma requisição HTTP para o seu backend, descrita em YAML. Guarde o endereço e a chave como secrets:

vatio secrets set OLIVA_API https://api.cozinha-oliva.example
vatio secrets set OLIVA_API_KEY sk_live_...

tools/buscar_mesas.yml:

description: Busca mesas livres para uma data e um número de pessoas.
when_to_use: O cliente quer reservar mesa para 8 pessoas ou menos.
parameters:
  type: object
  properties:
    data: { type: string, description: "AAAA-MM-DD" }
    pessoas: { type: integer, minimum: 1, maximum: 8 }
  required: [data, pessoas]
access: public
request:
  method: GET
  base_url: "$env.OLIVA_API"
  path: /disponibilidade
  headers:
    Authorization: "Bearer $env.OLIVA_API_KEY"
  query:
    data: "$params.data"
    pessoas: "$params.pessoas"
respond:
  data:
    horarios: "$.horarios"
  message:
    when_empty: Não há mesas livres para esse número de pessoas nessa data.
    default: "Encontrei {{count}} horários livres."

tools/reservar_mesa.yml:

description: Reserva uma mesa em um horário livre.
when_to_use: O cliente escolheu um horário de buscar_mesas e deu um nome.
parameters:
  type: object
  properties:
    horario_id: { type: string }
    nome: { type: string }
    telefone: { type: string, description: "Só Instagram e web. No WhatsApp a tool usa o número do contato" }
    observacoes: { type: string, description: "Alergias ou ocasião, do jeito que o cliente disse" }
  required: [horario_id, nome]
access: public
request:
  method: POST
  base_url: "$env.OLIVA_API"
  path: /reservas
  requires: [params.horario_id, params.nome]
  headers:
    Authorization: "Bearer $env.OLIVA_API_KEY"
  body:
    horario_id: "$params.horario_id"
    nome: "$params.nome"
    telefone: "$params.telefone || $contact.phone_number"
    observacoes: "$params.observacoes"
respond:
  data:
    reserva: "$.reserva"

No WhatsApp o número do cliente chega com a mensagem dele, então telefone usa $contact.phone_number e o agente só pede o número no Instagram e no site. cancelar_reserva é um POST com o código da reserva e o telefone, preenchido do mesmo jeito, e o seu backend confere se os dois batem antes de cancelar qualquer coisa: quem preenche os parâmetros de uma tool é o modelo, e qualquer pessoa pode digitar um código. status_pedido segue a mesma regra, número do pedido mais telefone, e devolve só a etapa e o horário previsto.

Para pedidos, links.pedidos é o mais simples, e as salvaguardas removem qualquer URL que não tenha sido dada ao agente. Se o seu sistema de pedidos tem API, fechar o pedido também pode ser uma tool que o cria e devolve um link de pagamento, por Pix ou cartão; um link que uma tool devolveu é um link que o agente pode enviar. O agente nunca pede dados de cartão.

#Conhecimento: o cardápio e os horários

vatio kb create restaurante
vatio kb write restaurante cardapio-principais cardapio-principais.md
vatio kb write restaurante cardapio-sobremesas cardapio-sobremesas.md
vatio kb write restaurante horarios-e-endereco horarios-e-endereco.md

Escreva os alergênicos na seção de cada prato, para que uma busca sobre um prato traga os alergênicos junto:

# Cardápio: pratos principais

## Risoto de cogumelos
Arroz arbóreo, cogumelos, parmesão, manteiga. Vegetariano, não vegano.
Alergênicos: leite. Sem glúten: sim, feito em panelas usadas só para pratos sem glúten.

## Talharim de pistache
Alergênicos: glúten, ovo, leite, castanhas (pistache).

## Sobre alergênicos na nossa cozinha
Trabalhamos com glúten, castanhas, gergelim, frutos do mar e leite. Só os
pratos marcados sem glúten são preparados à parte; para os outros
alergênicos não podemos descartar contaminação cruzada.

A Vatio não lê o seu site, então o cardápio vai em entradas. Quando um prato muda, um supervisor edita a entrada pelo inbox, e cada edição fica guardada como versão.

#Alergênicos: onde uma resposta prestativa é o risco

Uma resposta errada sobre alergênicos quase sempre vem do agente tentando ajudar: ele lê “torta de chocolate” e conclui que provavelmente não leva castanha. A configuração acima fecha esse caminho. O cardápio informa os alergênicos de cada prato e a instrução só aceita essa fonte, então, para qualquer prato que não esteja lá, a resposta é “não consigo confirmar isso, vou perguntar para a cozinha”. Alergias graves vão para uma pessoa, porque só a cozinha sabe o que passou pela fritadeira hoje.

As regras valem também para áudios e mensagens picadas. A Vatio transcreve o áudio e agrupa as mensagens enviadas em sequência, então “mesa pra 6 no sábado” seguido de “ah, minha esposa tem alergia a castanha” é lido como um pedido só.

#Teste antes de qualquer cliente

vatio push
vatio chat "Mesa para 4 amanhã às 20h? Um de nós é celíaco"
vatio chat --new "O talharim serve para o meu filho? Ele tem alergia grave a castanha"
vatio chat --new "A torta de chocolate tem castanha?"
vatio chat --new "Somos 25 pessoas para um aniversário no sábado"
vatio chat --new "Jantei aí há uma hora e meus lábios estão inchando"
vatio chat show

As quatro últimas são as que mais importam: uma alergia grave que ele deve transferir, uma sobremesa que o cardápio não cobre, um grupo para o qual ele não deve procurar mesa e uma reação em que a única resposta é o número de emergência. chat show mostra cada chamada a tools. Depois adicione o seu telefone e a sua conta do Instagram como contas de teste nos previews compartilhados do WhatsApp e do Instagram, até cinco de cada, e repita os testes lá.

#Melhore toda semana

Quando o gerente lê o inbox, ele marca qualquer resposta errada e escreve o que deveria ter acontecido: “o risoto leva parmesão, não é vegano”. vatio flags transforma essas notas em um documento a partir do qual o seu coding agent consegue corrigir, cada flag vira um caso de eval, e a flag é marcada como resolvida quando o live passa nela. Veja Melhorar seu agente.

#Publicar

vatio publish

Depois conecte o seu número do WhatsApp Business e a sua conta profissional do Instagram na página Canais do inbox, e ative a chave Em produção do WhatsApp. O Instagram responde assim que a conta é conectada. Uma resposta enviada pelo app do WhatsApp Business no celular da recepção assume a conversa até ela ser liberada. O agente só responde às mensagens que os clientes enviam; os lembretes continuam no seu sistema de reservas.

O que a legislação local exige que você informe sobre alergênicos continua sendo seu para verificar, e as entradas do cardápio são onde isso precisa estar certo.

Perguntas frequentes

Um agente de IA pode fazer reservas de restaurante pelo WhatsApp?

Sim. O agente chama o seu sistema de reservas com tools que você descreve em YAML: uma para buscar mesas livres e outra para reservar. A Vatio opera a conversa no WhatsApp, no Instagram e no seu site, e o seu sistema de reservas continua sendo quem confirma.

Um agente de IA consegue responder sobre alergênicos com segurança?

Só com o que você escrever. Coloque os alergênicos de cada prato nas entradas do cardápio que o agente lê e diga para ele nunca afirmar que um prato não contém um alergênico se o cardápio não disser isso. Alergias graves vão para uma pessoa com handoff, porque só a cozinha sabe o que preparou hoje.

O agente pode receber pedidos de delivery e para retirada?

Ele pode enviar o link da sua página de pedidos e, com uma tool, dizer em que pé está um pedido a partir do número do pedido e do telefone. Fechar o pedido dentro do chat exige a API do seu sistema de pedidos por trás de uma tool que devolva um link de pagamento. O agente nunca pede dados de cartão.

O agente envia lembretes de reserva ou promoções?

Sim, quando o seu sistema de reservas pede. Ele chama a Messages API da Vatio para cada cliente, com um modelo de WhatsApp aprovado se a pessoa está há mais de 24 horas sem escrever, e o agente cuida da resposta. Promoções para a sua lista funcionam do mesmo jeito, uma requisição por cliente a partir do seu sistema; a Vatio não tem um painel de campanhas próprio.

O que acontece quando alguém pede mesa para um grupo grande?

Acima do limite que você definir, o agente não procura mesa. Ele diz que a equipe de eventos cuida de grupos e transfere a conversa, que fica no inbox aguardando uma pessoa. A Vatio ainda não avisa ninguém de uma transferência, então alguém precisa estar com o inbox aberto.

Atualizado: