Iniciar sessãoIniciar teste gratuito
Meta Tech Provider

Crie um agente de WhatsApp com o Vercel AI SDK

As mensagens recebidas chegam a um route handler definido como destino do webhook do número. O handler chama generateText e envia a resposta através da Cloud API. Para as ferramentas que atuam sobre o número, o createMCPClient de @ai-sdk/mcp liga-se ao servidor MCP da EasyCoexistence por HTTP, com início de sessão por OAuth através de um authProvider.

@ai-sdk/mcp

O pacote que disponibiliza createMCPClient, o cliente MCP do AI SDK.

authProvider

O OAuth é suportado no transporte HTTP MCP do AI SDK através de um authProvider.

20 msg/s

Throughput fixo para um número usado em simultâneo com a app WhatsApp Business e a Cloud API.

Como recebe o route handler as mensagens do WhatsApp?

Com dois métodos na mesma rota, definida como destino do webhook do número, com um segredo aleatório longo no caminho.

O GET responde à verificação da Meta. Leia hub.mode, hub.verify_token e hub.challenge da query, compare o token e devolva o challenge como texto simples. Devolvê-lo através de um helper de JSON é o erro clássico: o corpo chega com aspas à volta e a Meta nunca começa a entregar.

O POST recebe os eventos. Devolva 200 rapidamente e faça a chamada ao modelo depois, porque a Meta volta a tentar quando a resposta é lenta, e um arranque a frio que execute o modelo no próprio pedido pode responder duas vezes à mesma mensagem. Nas plataformas que terminam a função quando a resposta é enviada, passe o trabalho para uma fila ou para o mecanismo da plataforma para trabalho posterior à resposta.

O segredo no caminho é a autenticação. A Meta assina cada entrega com o app secret do Tech Provider, pelo que o cabeçalho X-Hub-Signature-256 não pode ser verificado do seu lado.

Como carrega o AI SDK as ferramentas do WhatsApp?

Com o createMCPClient de @ai-sdk/mcp e o transporte HTTP, que a documentação do AI SDK recomenda para produção. O transporte recebe o URL do servidor e um authProvider, e é através do OAuth com authProvider que o servidor MCP da EasyCoexistence é autorizado: publica os metadados OAuth, suporta registo dinâmico de clientes e PKCE, e emite os seus próprios tokens após um início de sessão. Não há nenhuma chave de API para colocar num cabeçalho.

As ferramentas do cliente passam diretamente para o generateText ou o streamText. O modelo passa então a ver list_numbers, send_message, send_template, get_number_health e as restantes, com descrições que indicam a janela de 24 horas. Feche o cliente quando a chamada terminar, no callback onEnd num stream ou num bloco finally nos outros casos, como pede a documentação do AI SDK.

Use-o quando for o modelo a decidir. Para responder à mensagem que acabou de chegar, uma chamada direta à Cloud API a partir do handler é mais curta.

MCP client over HTTP with OAuth, as the AI SDK documents it
import { createMCPClient } from "@ai-sdk/mcp";

const mcp = await createMCPClient({
  transport: {
    type: "http",
    url: "https://easycoexistence.com/api/mcp",
    authProvider, // your OAuthClientProvider implementation
  },
});

try {
  const tools = await mcp.tools();
  // pass tools to generateText({ model, tools, prompt })
} finally {
  await mcp.close();
}

O que muda por o número estar em Coexistence?

Duas coisas que o código deve ter em conta. Primeiro, pode já haver uma pessoa na conversa. A app WhatsApp Business continua a funcionar no número, e cada resposta escrita no telemóvel chega à rota como um evento echo. Um handler que, após um echo, põe o modelo em pausa para esse contacto evita que este responda por cima de uma pessoa.

Segundo, o envio está limitado a 20 mensagens por segundo, um valor fixo para o número. Um agente conversacional nunca chega perto disso, mas um ciclo de difusão escrito com Promise.all sobre uma lista de contactos chega, por isso envie em lotes.

Tudo o resto é a Cloud API normal. Nas 24 horas seguintes à última mensagem do cliente, o texto livre é permitido. Depois disso, só passa um template aprovado, e o texto livre devolve o erro 131047 sem que o cliente veja nada.

Erros comuns

  • Devolver o challenge com um helper de resposta JSON. As aspas à volta fazem falhar a verificação da Meta.
  • Executar o generateText antes de responder à Meta. Num arranque a frio, a nova tentativa produz uma segunda resposta.
  • Esquecer-se de fechar o cliente MCP. Cada pedido deixa uma ligação aberta até a plataforma a terminar.
Fazer isto com a EasyCoexistence

Ligue o número em easycoexistence.com, defina o destino do webhook para o seu route handler e adicione o cliente MCP com um único início de sessão OAuth. A partir de US$ 9 por número ligado por mês, descendo até US$ 1 à medida que adiciona números, com os primeiros 3 dias grátis.

Perguntas frequentes

Isto só funciona na Vercel?

Não. O AI SDK é uma biblioteca TypeScript, e a rota pode correr em qualquer alojamento que sirva HTTPS e responda a um GET e a um POST.

Preciso mesmo do cliente MCP?

Não para responder. Um fetch ao endpoint de mensagens da Cloud API com o token do número faz isso. O MCP justifica-se quando é o modelo a escolher o que fazer.

Que fornecedor pode ser usado para o modelo?

Qualquer um que o AI SDK suporte. O lado do WhatsApp é independente do modelo, pelo que mudar de fornecedor não afeta a rota nem a chamada à Cloud API.

A EasyCoexistence vê as mensagens?

Não. A Meta entrega diretamente na sua rota e o conteúdo das mensagens nunca é guardado do nosso lado.

Continue a ler

Pronto para começar?

Configure a Coexistência do WhatsApp em minutos, não em meses. A aplicação continua a funcionar no telemóvel.

Começar período experimental gratuito

Verificado em

Vercel AI SDK no WhatsApp, Cloud API