O contrato
O que a Zatten envia
Depende de como a tool foi configurada. Com Enviar dados da conversa ligado, o corpo sempre traz a identidade do lead, além dos campos da tool:leadNumber (o WhatsApp) ou leadId para achar o cliente no seu sistema.
Não confie em name: é o nome do WhatsApp e pode estar vazio ou ser um apelido.
O que devolver
O modelo vai ler a resposta e falar com o lead a partir dela. Então:- Só o que o modelo precisa dizer ou decidir. Não devolva o registro inteiro do banco.
- Nomes de campo claros, em português ou inglês legível.
horarios_livres, nãohl.status_entrega, nãost. - Valores prontos para falar.
"10 de outubro, às 14h"ajuda mais que1728568800. Se o modelo precisa repassar um valor a outra tool, mande também o formato técnico (ISO 8601). - Uma mensagem de resumo quando ajuda:
"mensagem": "Agendado para sexta, 10/10, às 14h, com a Dra. Ana." - Nada sensível que não é necessário. CPF completo, endereço de outros clientes, dados internos. Tudo o que você devolve fica no histórico da conversa e pode ser repetido ao lead.
- Limite listas. Devolva os 5 a 10 itens mais relevantes, não 500.
Exemplo 1: consultar horários disponíveis
Toolconsultar_horarios, GET, com o dado do modo IA data (texto, “Data
pedida pelo cliente, no formato AAAA-MM-DD”) e o fixo servico.
O que a Zatten envia:
inicio para passar à
tool de agendamento.
Sem horário naquele dia (200, não erro):
Exemplo 2: criar agendamento
Toolcriar_agendamento, POST, com Enviar dados da conversa ligado e o dado
do modo IA inicio.
O que a Zatten envia:
Exemplo 3: consultar pedido
Toolconsultar_pedido, GET, URL https://api.loja-exemplo.com.br/v1/pedidos/{{args.numero}},
com o dado do modo IA numero (“Número do pedido, só dígitos”).
Resposta ideal (200):
leadNumber (variável
{{wa_id}} num parâmetro da URL) e confira na sua API se o pedido é daquele
número.
Erros que o modelo entende
Quando a resposta não é 2xx, o modelo recebe uma mensagem como esta:- Use o status certo. 400 para dado inválido, 404 para não encontrado, 409 para conflito, 5xx para falha sua. Nunca devolva 200 com erro dentro, porque o modelo trata como sucesso.
- Ponha a
mensagemno começo do corpo e em até 500 caracteres: o resto é cortado. - Diga o que fazer, não só o que deu errado: “Peça o CPF com 11 dígitos”, “Ofereça outro horário”.
- Nada de stack trace ou HTML. Página de erro do servidor ocupa os 500 caracteres e não diz nada ao modelo.
- Dado inválido pede correção. Com uma mensagem clara, o modelo pergunta de novo ao lead e chama a tool outra vez.
O corpo do erro chega ao modelo marcado como dado externo, não instrução. A
instrução de verdade fica na Mensagem para a IA se a chamada falhar da tool.
Use a mensagem da API para dizer o que aconteceu e a da tool para dizer como o
agente deve agir.
Idempotência
O modelo pode chamar a mesma tool duas vezes: porque a primeira resposta não foi clara, porque o lead repetiu o pedido, ou por uma nova tentativa automática. Uma API que cria coisas precisa aguentar isso:- Recuse duplicata pelo que identifica o pedido: mesmo
leadNumber+ mesmoiniciojá agendado → devolva o agendamento existente com 200, não crie outro. - Ou use o
threadId(com Enviar dados da conversa) como parte da chave: uma conversa, um pedido. - Consultas (
GET) já são seguras para repetir.
Um servidor mínimo
Os dois exemplos fazem a mesma coisa: conferem a chave no cabeçalho, consultam horários e criam agendamento com proteção contra duplicata. O banco é um exemplo em memória.- Node (Express)
- Python (FastAPI)
attendantId e threadId) são
ignorados pelos dois exemplos. Faça o mesmo: não recuse campo desconhecido.
Armadilhas
- 200 com erro dentro. O modelo acha que deu certo e confirma ao lead.
- Resposta gigante. Cada caractere vira token pago e espaço a menos no contexto. Acima de 100.000 caracteres, ainda é cortada.
- API lenta. O lead espera em silêncio; acima de 180 segundos, o agente desiste.
- Recusar campos desconhecidos. Com Enviar dados da conversa, o corpo traz campos a mais. Uma API que valida “nenhum campo extra” responde 400 sempre.
- Redirecionamento (
http→https, barra no fim). Use a URL final. - Data sem fuso. Devolva e aceite datas com fuso (
-03:00), ou deixe claro que é horário de Brasília. - Dados de outro cliente. Confira na API se o recurso pedido é do WhatsApp que chamou.
Para saber mais
- Tool HTTP: referência
- Agendamento (playbook)
- Webhooks de eventos: o caminho contrário, a Zatten avisando a sua API.
- Anthropic, “Writing tools for agents” (respostas que o modelo entende): https://www.anthropic.com/engineering/writing-tools-for-agents
- Termos para buscar: “HTTP status codes”, “idempotency key”, “API error response design”, “ISO 8601”.