Capítulo 5 de 13

Responder com IA: a chamada ao modelo e o envio

A função que pergunta ao modelo, a função que devolve pelo WhatsApp e quanto custa cada resposta.

Manual gratuito de Certu · Atualizado em 30 de agosto de 2026 · ver o manual inteiro

Como fazer uma IA responder automaticamente no WhatsApp?

Resposta curta

Você manda ao modelo de IA duas coisas: um texto fixo com as informações e as regras do seu negócio, e a mensagem que o cliente escreveu. O modelo devolve a resposta pronta e você a envia de volta pela API do WhatsApp, na mesma chamada em que recebeu.

O que ter aberto antes de começar

As duas funções que faltam

Uma pergunta ao modelo, a outra devolve pelo WhatsApp. Cole no mesmo arquivo do capítulo 4.

src/index.js, no fim do arquivojavascript
// ── 1. Pergunta ao modelo ────────────────────────────────────────────
async function pensarResposta(env, cerebro, mensagemDoCliente) {
  const resposta = await fetch(
    'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent',
    {
      method: 'POST',
      headers: {
        'x-goog-api-key': env.GEMINI_API_KEY,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        system_instruction: { parts: [{ text: cerebro }] },
        contents: [{ role: 'user', parts: [{ text: mensagemDoCliente }] }],
        generationConfig: { temperature: 0.4, maxOutputTokens: 300 },
      }),
    },
  );

  if (!resposta.ok) {
    console.log('modelo falhou', resposta.status, await resposta.text());
    return null; // o capitulo 8 explica por que nao inventar resposta aqui
  }

  const dados = await resposta.json();
  return dados?.candidates?.[0]?.content?.parts?.[0]?.text?.trim() ?? null;
}

// ── 2. Devolve pelo WhatsApp ─────────────────────────────────────────
async function enviarWhatsApp(env, para, texto) {
  const resposta = await fetch(
    'https://graph.facebook.com/v26.0/' + env.PHONE_NUMBER_ID + '/messages',
    {
      method: 'POST',
      headers: {
        Authorization: 'Bearer ' + env.WHATSAPP_TOKEN,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        messaging_product: 'whatsapp',
        to: para,
        type: 'text',
        text: { body: texto },
      }),
    },
  );

  if (!resposta.ok) {
    console.log('envio falhou', resposta.status, await resposta.text());
  }
}

// ── 3. Marca como lida. Opcional, e muda a sensacao do atendimento ──
async function marcarComoLida(env, idDaMensagem) {
  await fetch('https://graph.facebook.com/v26.0/' + env.PHONE_NUMBER_ID + '/messages', {
    method: 'POST',
    headers: {
      Authorization: 'Bearer ' + env.WHATSAPP_TOKEN,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      messaging_product: 'whatsapp',
      status: 'read',
      message_id: idDaMensagem,
    }),
  }).catch(() => {});
}

Ligando no webhook

Onde estava o console.log do capítulo 4, agora entra isto.

Em Cloudflare Workers, o contexto vem como terceiro parâmetro do fetch: mude a assinatura para async fetch(request, env, context).

Em Node, o equivalente é responder 200 e continuar processando, ou empurrar para uma fila.

src/index.js, dentro do POSTjavascript
const CEREBRO = `Voce e o atendente da Padaria do Ze, em Florianopolis.
Horario: segunda a sabado, das 6h as 20h. Domingo ate as 12h.
Encomenda de bolo: com 48 horas de antecedencia.
Se nao souber a resposta, diga que vai confirmar e avise que alguem responde.`;

// Responde 200 primeiro e trabalha depois: a Meta reenvia
// a mensagem se o seu endereco demorar.
context.waitUntil((async () => {
  await marcarComoLida(env, mensagem.id);

  const resposta = await pensarResposta(env, CEREBRO, texto);
  if (resposta) {
    await enviarWhatsApp(env, de, resposta);
  }
})());

return new Response('ok', { status: 200 });

Onde as pessoas se queimam

Nunca guarde a chave do modelo nem a chave da Meta dentro do arquivo. Elas entram como segredo, com npx wrangler secret put, e são lidas de env. Chave no código é chave publicada no dia em que o repositório virar público.

Quanto custa cada resposta?

Com Gemini 2.5 Flash-Lite, a US$ 0,10 por milhão de fichas de entrada e US$ 0,40 por milhão de saída.

Uma resposta típica de atendimento manda cerca de 1.500 fichas de entrada, contando o texto do negócio, e devolve umas 200 de saída.

A conta: 0,0015 milhão vezes US$ 0,10, mais 0,0002 milhão vezes US$ 0,40. Dá cerca de US$ 0,00023 por mensagem respondida, ou algo em torno de um milésimo de real.

Uma conversa inteira, com oito ou dez mensagens, custa em torno de um centavo. Mil conversas por mês ficam na casa de dez reais de modelo. O capítulo 13 junta isso com o resto da conta.

Trocando o modelo

A estrutura não muda: um texto de sistema com as regras, o histórico e a mensagem nova. O que muda é o endereço, o nome do campo e o formato da resposta.

Modelos mais caros escrevem melhor em português e erram menos quando as regras são longas. Comece pelo mais barato, meça no capítulo 12 e só suba se o teste mostrar que precisa.

Perguntas frequentes

Dá para usar ChatGPT ou Claude no lugar?

Dá. O desenho é o mesmo: um texto de sistema com as regras do negócio, a mensagem do cliente e uma chamada HTTP. Muda o endereço e o nome dos campos.

A resposta demora quanto?

Entre um e três segundos com um modelo rápido. O cliente percebe como atendimento imediato, e marcar a mensagem como lida antes de responder ajuda nessa sensação.

E se o modelo estiver fora do ar?

Não invente uma resposta genérica. Avise que alguém vai responder e chame um humano, do jeito que o capítulo 9 mostra. Silêncio total é pior que uma frase honesta.

Preciso pagar o modelo desde o primeiro dia?

Não para testar. O nível gratuito de vários modelos aguenta o desenvolvimento inteiro. A cobrança começa quando o volume real chega.

E onde entra Certu

Certu roda exatamente estas três chamadas, com uma diferença que só aparece no volume: fila para pico de mensagens, tentativa de novo quando o modelo falha e troca de modelo sem mexer no seu texto. Montando sozinho, é isto aqui mais o que você for descobrindo em produção.

Ver o que Certu faz e quanto custa

Continuar o manual