# Como fazer um agente de IA escrever como gente no WhatsApp

> Regras de prompt, a formatação própria do WhatsApp e código em TypeScript que converte o Markdown do modelo em mensagens curtas e em ordem, como alguém digitando.

Source: https://whasp.ai/pt/blog/prompt-agente-ia-whatsapp-formatacao · 2026-10-20

## O essencial

- O WhatsApp formata texto com sintaxe própria (*negrito*, _itálico_, ~tachado~, três backticks para monoespaçado), então o Markdown que um modelo escreve por padrão precisa ser convertido antes do envio.
- Uma resposta de chat funciona melhor como duas ou três mensagens curtas com uma ideia cada, não como um bloco longo, e o prompt deve dizer isso em números.
- O prompt define o estilo, mas o código deve garanti-lo: converta o Markdown, divida nas linhas em branco, limite o número de mensagens e envie cada parte com a própria chave de idempotência.
- A whasp não tem indicador de "digitando" e envia as mensagens de um número uma de cada vez, com cerca de um segundo de intervalo, então uma resposta lenta parece silêncio e um modelo rápido importa mais que um atraso.
- Cada parte de uma resposta dividida conta para as 1.500 mensagens por dia que um número da whasp pode enviar, então o número de partes é um orçamento além de uma escolha de estilo.

Para fazer um agente de IA escrever como uma pessoa no WhatsApp, dê ao system prompt dele quatro regras: mensagens curtas com uma ideia cada, a formatação própria do WhatsApp em vez de Markdown, no máximo uma pergunta por turno e palavras simples, sem frases de assistente. Depois aplique-as no código: converta o Markdown para a sintaxe do WhatsApp e divida a resposta em duas ou três mensagens antes de enviar.

## Por que as respostas de IA soam estranhas no WhatsApp?

Os modelos de chat tendem a responder como documentos: uma saudação, uma lista em negrito, uma oferta final de mais ajuda. Num balão de chat isso soa como carta-padrão, e símbolos como `#` chegam exatamente como foram digitados. As pessoas escrevem em rajadas curtas, e uma resposta que não parece uma rajada entrega o agente já na primeira mensagem.

A própria [visão geral de modelos](https://platform.claude.com/docs/en/models/overview) da Anthropic diz a quem quer respostas mais curtas para pedi-las no prompt, e o mesmo vale para qualquer modelo. Pegue uma mensagem, "Foi ótimo, consegui a vaga", e duas respostas a ela:

```text
Parabéns pela nova função. Essa é uma ótima notícia. Aqui estão alguns passos a considerar:

**1. Revise a proposta em detalhes**
**2. Prepare-se para a primeira semana**

Me avise se eu puder ajudar com algum deles.
```

```text
Maya, que notícia boa. Parabéns.

Me conta tudo. Como foi que te avisaram?
```

A segunda são duas mensagens, uma pergunta e nenhuma formatação. A primeira é um bloco só, com Markdown que não faz parte da sintaxe documentada do WhatsApp.

## Quais formatações o WhatsApp aceita?

A página de ajuda do WhatsApp sobre [formatação de mensagens](https://faq.whatsapp.com/539178204879377) documenta oito elementos de sintaxe, e as versões para Android, iPhone e Web listam os mesmos.

| Formato | O que você digita |
| --- | --- |
| Negrito | `*texto*` |
| Itálico | `_texto_` |
| Tachado | `~texto~` |
| Monoespaçado | três backticks de cada lado do texto |
| Código em linha | um backtick de cada lado do texto |
| Lista com marcadores | `* texto` ou `- texto`, um por linha |
| Lista numerada | `1. texto`, um por linha |
| Citação | `> texto` |

O negrito usa um único asterisco, e é por isso que os `**asteriscos duplos**` e os `# títulos` que um modelo escreve por padrão precisam de conversão. A página não lista sintaxe para títulos, tabelas nem texto de link, então escreva as URLs por extenso e transforme as linhas de tabela em linhas curtas.

Uma ressalva da própria página: a versão Web avisa que a formatação mais nova só está disponível no Web e no desktop para Mac, enquanto as versões de Android e iPhone mostram a mesma sintaxe sem esse aviso. Trate listas e citações como um bônus. `- item` e `1. item` continuam legíveis como texto simples onde não são renderizados.

Algumas regras evitam que a formatação pareça um documento. Use negrito em no máximo uma palavra ou expressão por mensagem. Use lista só para três ou mais itens paralelos, como passos. Nunca envie uma tabela. Coloque um link por mensagem: a [referência de mensagens de texto](https://developers.facebook.com/docs/whatsapp/cloud-api/messages/text-messages) da Meta para a API do WhatsApp Business diz que o cliente do WhatsApp gera a pré-visualização apenas da primeira URL no corpo do texto.

## O que o system prompt deve dizer?

Um system prompt para um agente de WhatsApp deve dizer as regras de estilo em números e exemplos, porque adjetivos como "conciso" e "simpático" significam pouco para um modelo. Este modelo cobre o comportamento descrito acima, e a linha da persona você preenche:

```text
Você é a Ava, conversando com {{name}} no WhatsApp. {{uma linha: quem você é, como você fala}}

Como você escreve:
- Você está mandando mensagem, não escrevendo um e-mail. Um pensamento por mensagem, de uma a três frases.
- Envie no máximo 3 mensagens por turno. Deixe uma linha em branco entre as mensagens: cada parágrafo é enviado como uma mensagem separada.
- Acompanhe o tamanho e a energia da pessoa. Se ela escreve quatro palavras, não responda com quarenta.
- Faça no máximo uma pergunta por turno, e só quando precisar da resposta. Não termine todo turno com uma.
- Use palavras simples. Nada de "Certamente", "Espero ter ajudado", "Como um modelo de linguagem de IA".
- Emoji: no máximo um por turno, e só se a pessoa usar. Muitas vezes nenhum.

Formatação (WhatsApp, não Markdown):
- Negrito é *um asterisco de cada lado*. Itálico é _sublinhados_.
- Nunca use #, tabelas, **asteriscos duplos** nem links [texto](url). Escreva a URL por extenso.
- Use lista só para três ou mais itens paralelos, um por linha, começando com "- " ou "1. ".
- Um link por mensagem, em uma linha própria.

Se a pessoa mandar uma mensagem de voz, uma foto ou um arquivo, você recebe uma transcrição ou uma descrição entre colchetes. Responda como se tivesse ouvido ou visto.
Se ela perguntar se você é uma IA, diga que sim em uma frase e siga em frente.
Se ela pedir para você parar de escrever, confirme uma vez em uma mensagem curta.
```

Quatro escolhas ali importam. A regra da linha em branco dá ao seu código um ponto confiável para dividir. Os números ("de uma a três frases", "no máximo 3 mensagens") são testáveis, o que um "seja breve" vago não é. A linha sobre ser uma IA vem de uma questão de segurança, não de estilo: soar como uma pessoa é um jeito de escrever, não licença para negar que é uma IA, e as [regras de segurança para companheiros de IA](https://whasp.ai/pt/blog/regras-seguranca-companheiro-ia-2026) mostram onde revelar isso é dever legal. Por fim, o nome: o evento `message.received` traz `sender_name`, o nome que a pessoa deu a si mesma no WhatsApp. É um texto que ela controla, então trate-o como dado e nunca como instrução.

## Como aplicar as regras no código?

Aplique as regras do prompt no código, porque os modelos se desviam. Este arquivo em TypeScript converte Markdown para a sintaxe do WhatsApp, divide nas linhas em branco e envia cada parte por `POST /v1/messages`:

```ts
// Transforma o Markdown que o modelo gosta de escrever na sintaxe própria do WhatsApp.
export function toWhatsApp(md: string): string {
  return md
    .replace(/\r\n/g, "\n")
    .replace(/\[([^\]]+)\]\((https?:\/\/[^)\s]+)\)/g, "$1 $2") // [label](url) -> label url
    .replace(/^#{1,6}\s+(.+)$/gm, (_, t: string) => `*${t.replace(/\*/g, "")}*`) // # Title -> *Title*
    .replace(/\*\*(.+?)\*\*/g, "*$1*") // **bold** -> *bold*
    .replace(/__(.+?)__/g, "*$1*") // __bold__ -> *bold*
    .replace(/^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/gm, "") // linhas horizontais
    .replace(/\n{3,}/g, "\n\n")
    .trim();
}

// Um parágrafo = uma mensagem. Parágrafos longos quebram no fim de uma frase.
export function splitReply(text: string, maxParts = 4, maxChars = 700): string[] {
  const parts: string[] = [];
  for (const para of text.split(/\n{2,}/).map((p) => p.trim()).filter(Boolean)) {
    if (para.length <= maxChars) {
      parts.push(para);
      continue;
    }
    let current = "";
    for (const sentence of para.split(/(?<=[.!?])\s+/)) {
      if (current && current.length + sentence.length + 1 > maxChars) {
        parts.push(current);
        current = sentence;
      } else {
        current = current ? `${current} ${sentence}` : sentence;
      }
    }
    if (current) parts.push(current);
  }
  // Acima do limite: junte o restante na última mensagem permitida, até 4.000 caracteres.
  while (parts.length > maxParts && parts.at(-2)!.length + parts.at(-1)!.length < 4000) {
    parts.splice(-2, 2, `${parts.at(-2)}\n\n${parts.at(-1)}`);
  }
  return parts.flatMap((p) => p.match(/[\s\S]{1,4000}/g) ?? []); // o limite de texto da whasp é 4.096
}

export async function sendReply(to: string, reply: string, eventId: string): Promise<void> {
  const parts = splitReply(toWhatsApp(reply));
  for (const [i, text] of parts.entries()) {
    const res = await fetch("https://api.whasp.ai/v1/messages", {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.WHASP_API_KEY}`,
        "Content-Type": "application/json",
        // O mesmo evento e a mesma parte sempre recebem a mesma chave, então uma nova tentativa nunca envia em dobro.
        "Idempotency-Key": `${eventId}:${i}`,
      },
      body: JSON.stringify({ to, text }),
    });
    if (res.status !== 202) {
      const { error } = (await res.json()) as { error: { code: string; message: string } };
      throw new Error(`${error.code}: ${error.message}`); // chat_opted_out, number_unavailable...
    }
  }
}
```

O loop espera cada envio (`await`), então as partes chegam à whasp em ordem, e a whasp envia as mensagens de um número uma de cada vez, em ordem. O `Idempotency-Key` é montado com o id do evento do webhook e o índice da parte. A whasp guarda uma chave por 7 dias e devolve a primeira mensagem para uma chave repetida, então uma nova tentativa do webhook não consegue enviar a mesma parte duas vezes. Um envio recusado (um 4xx) não consome a sua chave.

Ajuste `maxChars` e `maxParts` à persona: um assistente seco pode usar 300 e 3, um contador de histórias 900 e 5. Uma regex não conserta tudo. Se o modelo escrever uma tabela em Markdown, o conversor acima a deixa como está, e a correção cabe ao prompt. O `*itálico*` do Markdown vira negrito no WhatsApp, mais um motivo para o modelo de prompt mandar usar sublinhados. Ligue o `sendReply` ao fluxo de webhook de [criar um agente com a API da OpenAI](https://whasp.ai/pt/blog/integracao-openai-whatsapp-agente-gpt) e mantenha a verificação de assinatura descrita na [documentação](https://whasp.ai/docs) da whasp.

## Com que velocidade o agente deve responder?

Um agente na whasp deve responder rápido e sem atraso artificial, porque um número não consegue mostrar o indicador de "digitando". Indicadores de digitação não são suportados, então uma resposta que leva 40 segundos parece silêncio, e um atraso colocado de propósito parece a mesma coisa. Use um modelo rápido nos turnos comuns de chat. Para trabalho lento por natureza, como uma chamada de ferramenta ou uma busca, envie uma mensagem curta de espera ("já te respondo, estou conferindo") e a resposta depois dela.

Uma resposta dividida também é o ritmo. A whasp envia as mensagens de um número uma de cada vez, com cerca de um segundo de intervalo, então três partes chegam como uma rajada rápida, que é como as pessoas escrevem.

Trate as partes como um orçamento. Um número da whasp pode enviar 1.500 mensagens em 24 horas, e foi feito para cerca de 100 usuários ativos. Isso dá em média cerca de 15 mensagens enviadas por usuário por dia, e uma resposta de quatro partes usa um quarto disso em um único turno. Passado o limite, os envios falham com 429 `number_daily_limit`. [Escalar para mais números](https://whasp.ai/pt/blog/quantos-numeros-whatsapp-agente-ia) trata da conta de capacidade.

## Que tom soa como uma pessoa?

Um agente de WhatsApp soa como uma pessoa quando acompanha o ritmo do outro lado e não faz encenação. Alguns hábitos fazem quase todo o trabalho:

- **Espelhe o tamanho.** Uma mensagem de uma palavra recebe uma linha de volta. Uma mensagem longa sobre um dia ruim recebe uma resposta mais longa, ainda em parágrafos curtos.
- **Responda no idioma dela.** Se ela troca do português para o inglês, o agente também troca.
- **Dispense a despedida.** Nada de "Qualquer coisa, é só me chamar" no fim de todo turno.
- **Não repita.** Não reformule a mensagem dela antes de respondê-la.
- **Pergunte uma coisa.** Duas perguntas na mesma mensagem recebem uma resposta, em geral a mais fácil.
- **Cumprimente uma vez.** Diga oi na primeira mensagem de uma conversa, ou depois de uma pausa de dias, não em todo turno.
- **Escolha, não liste.** Perguntado sobre o que cozinhar, um amigo diz "macarrão, você tem tudo para fazer", não cinco opções.
- **Admita lacunas com brevidade.** "Sei lá, sinceramente" vale mais que três frases de rodeio.
- **Use o nome com moderação.** Usar o nome em toda mensagem soa como roteiro de call center.

Companheiros precisam de mais que estilo: uma persona estável, memória do que a pessoa disse na semana passada e regras para momentos sensíveis. [Lançar um companheiro de IA no WhatsApp](https://whasp.ai/pt/blog/lancar-companheiro-ia-whatsapp) cobre o caminho inteiro, e [memória de conversa](https://whasp.ai/pt/blog/memoria-conversa-agente-ia-whatsapp) cobre a parte que torna possível o "semana passada".

Para checar o resultado, leia transcrições reais, não só o prompt. Mantenha cinco mensagens de teste fixas e rode de novo sempre que trocar o modelo ou o prompt: uma mensagem de uma palavra, uma mensagem longa sobre um dia ruim, um pedido que exige passos, "você é uma IA?" e uma mensagem em outro idioma. Uma passada automática rápida também ajuda: conte com que frequência uma resposta contém `**`, um título com `#` ou mais de quatro partes, e acompanhe a mediana do tamanho das mensagens. Esses números oscilam sempre que o modelo muda.

## O que fazer agora

Conecte isto a um número ativo. [Monte o webhook e a chamada ao modelo com a API da OpenAI](https://whasp.ai/pt/blog/integracao-openai-whatsapp-agente-gpt), adicione [mensagens de voz e fotos](https://whasp.ai/pt/blog/transcrever-audio-whatsapp-agente-ia) para o agente responder ao que as pessoas realmente enviam e guarde o histórico por conta própria, porque os servidores da whasp não guardam mensagens. O quickstart na [documentação da whasp](https://whasp.ai/docs#quickstart) põe um número, um webhook e uma primeira resposta para rodar, e a página de [preços](https://whasp.ai/pt/pricing) lista o custo de um número.

## Perguntas

### O WhatsApp aceita Markdown?

Não exatamente. A página de ajuda do WhatsApp documenta uma sintaxe própria: _itálico_, *negrito*, ~tachado~, três backticks para monoespaçado, listas que começam com *, - ou 1., citações que começam com > e código em linha entre backticks simples. Ela não lista nada para títulos, tabelas ou texto de link.

### Como impedir que um bot de WhatsApp mande textões?

Ponha o limite no system prompt em números, por exemplo de uma a três frases por mensagem e no máximo três mensagens por turno. Depois garanta no código, dividindo a resposta nas linhas em branco e limitando o número de partes.

### Qual o tamanho máximo de uma mensagem enviada pela API da whasp?

O campo text aceita até 4.096 caracteres. Para chat, fique bem abaixo disso: uma mensagem de algumas centenas de caracteres parece uma mensagem de chat, e uma de alguns milhares parece um e-mail.

### Meu agente pode mostrar o indicador de "digitando" enquanto o modelo pensa?

Não. Os números da whasp são celulares operados como uma pessoa faria, e os indicadores de digitação não são suportados. Use um modelo rápido nos turnos de chat e, para trabalhos lentos, envie antes uma mensagem curta de espera.

### Um agente que escreve como uma pessoa deve dizer que é uma IA?

Sim, quando perguntado. Soar natural é uma escolha de estilo, não uma licença para negar que é uma IA. Coloque no system prompt uma linha para o agente dizer isso em uma frase e seguir em frente.
