# Prompt pour agent IA WhatsApp : écrire comme une personne

> Règles de prompt, mise en forme propre à WhatsApp et code TypeScript qui convertit le Markdown d'un modèle en messages courts et ordonnés, comme quelqu'un qui écrit.

Source: https://whasp.ai/fr/blog/prompt-agent-ia-whatsapp · 2026-10-20

## L’essentiel

- WhatsApp met en forme le texte avec sa propre syntaxe (*gras*, _italique_, ~barré~, trois backticks pour le monospace) : le Markdown qu'un modèle écrit par défaut doit donc être converti avant l'envoi.
- Une réponse de chat fonctionne mieux en deux ou trois messages courts d'une idée chacun, pas en un long bloc, et le prompt doit le dire en chiffres.
- Le prompt fixe le style, mais c'est le code qui doit le faire respecter : convertir le Markdown, découper sur les lignes vides, plafonner le nombre de messages et envoyer chaque partie avec sa propre clé d'idempotence.
- whasp n'a pas d'indicateur de saisie et envoie les messages d'un numéro un par un, à environ une seconde d'écart : une réponse lente ressemble à un silence, et un modèle rapide compte plus qu'un délai.
- Chaque partie d'une réponse découpée compte dans les 1 500 messages par jour qu'un numéro whasp peut envoyer : le nombre de parties est donc un budget autant qu'un choix de style.

Pour qu'un agent IA écrive comme une personne sur WhatsApp, donnez à son system prompt quatre règles : des messages courts avec une idée chacun, la mise en forme propre à WhatsApp plutôt que le Markdown, une question par tour au maximum et des mots simples, sans formules d'assistant. Appliquez-les ensuite dans le code : convertissez le Markdown en syntaxe WhatsApp et découpez la réponse en deux ou trois messages avant de l'envoyer.

## Pourquoi les réponses d'une IA sonnent-elles faux sur WhatsApp ?

Les modèles de chat ont tendance à répondre comme des documents : une formule d'accueil, une liste en gras, une offre d'aide supplémentaire en conclusion. Dans une bulle de chat, cela fait lettre type, et les symboles comme `#` arrivent tels quels. Les gens écrivent par petites rafales, et une réponse qui n'a pas cette allure trahit l'agent dès son premier message.

La [présentation des modèles](https://platform.claude.com/docs/en/models/overview) d'Anthropic invite elle-même les développeurs qui veulent des réponses plus courtes à les demander dans le prompt, et c'est valable pour n'importe quel modèle. Prenons un message, « Ça s'est super bien passé, j'ai eu le poste », et deux réponses possibles :

```text
Félicitations pour votre nouveau poste. C'est une excellente nouvelle. Voici quelques étapes à envisager :

**1. Examiner l'offre en détail**
**2. Préparer votre première semaine**

N'hésitez pas à me dire si je peux vous aider sur l'un de ces points.
```

```text
Maya, c'est une super nouvelle. Félicitations.

Raconte-moi tout. Comment ils te l'ont annoncé ?
```

La seconde fait deux messages, une question et aucune mise en forme. La première est un seul bloc, avec du Markdown qui ne fait pas partie de la syntaxe documentée de WhatsApp.

## Quelle mise en forme WhatsApp prend-il en charge ?

La page d'aide de WhatsApp [sur la mise en forme des messages](https://faq.whatsapp.com/539178204879377) documente huit éléments de syntaxe, et ses versions Android, iPhone et Web listent les mêmes.

| Mise en forme | Ce que vous tapez |
| --- | --- |
| Gras | `*texte*` |
| Italique | `_texte_` |
| Barré | `~texte~` |
| Monospace | trois backticks de chaque côté du texte |
| Code en ligne | un backtick de chaque côté du texte |
| Liste à puces | `* texte` ou `- texte`, un par ligne |
| Liste numérotée | `1. texte`, un par ligne |
| Citation | `> texte` |

Le gras s'écrit avec un seul astérisque, c'est pourquoi les `**doubles astérisques**` et les `# titres` qu'un modèle écrit par défaut doivent être convertis. La page ne liste aucune syntaxe pour les titres, les tableaux ou le texte de lien : écrivez donc les URL telles quelles et transformez les lignes de tableau en phrases courtes.

Une réserve vient de la page elle-même : sa version Web précise que la mise en forme la plus récente n'est disponible que sur Web et sur l'application de bureau Mac, alors que les versions Android et iPhone affichent la même syntaxe sans cette remarque. Considérez les listes et les citations comme un bonus. `- élément` et `1. élément` restent lisibles en texte brut là où ils ne s'affichent pas.

Quelques règles empêchent la mise en forme de ressembler à un document. Mettez en gras un mot ou une expression par message au maximum. N'utilisez une liste que pour trois éléments parallèles ou plus, comme des étapes. N'envoyez jamais de tableau. Ne mettez qu'un lien par message : la [référence des messages texte](https://developers.facebook.com/docs/whatsapp/cloud-api/messages/text-messages) de Meta pour son API Business indique que le client WhatsApp n'affiche l'aperçu que de la première URL d'un corps de texte.

## Que doit dire le system prompt ?

Le system prompt d'un agent WhatsApp doit énoncer les règles de style en chiffres et en exemples, car des adjectifs comme « concis » et « amical » disent peu de chose à un modèle. Ce modèle couvre les comportements décrits plus haut, et vous remplissez vous-même la ligne du persona :

```text
Tu es Ava, tu écris à {{name}} sur WhatsApp. {{une ligne : qui tu es, comment tu parles}}

Ta façon d'écrire :
- Tu envoies des messages, pas un e-mail. Une idée par message, une à trois phrases.
- Au maximum 3 messages par tour. Laisse une ligne vide entre les messages : chaque paragraphe part comme un message séparé.
- Adapte-toi à la longueur et à l'énergie de la personne. Si elle écrit quatre mots, ne réponds pas en quarante.
- Pose au plus une question par tour, et seulement si tu as besoin de la réponse. Ne termine pas chaque tour par une question.
- Utilise des mots simples. Pas de « Bien sûr », pas de « J'espère que cela vous aide », pas de « En tant que modèle de langage ».
- Émojis : un seul par tour au maximum, et seulement si la personne en utilise. Souvent aucun.

Mise en forme (WhatsApp, pas Markdown) :
- Le gras s'écrit *avec un astérisque de chaque côté*. L'italique s'écrit _avec des tirets bas_.
- N'utilise jamais de #, de tableaux, de **doubles astérisques** ni de liens [texte](url). Écris l'URL telle quelle.
- N'utilise une liste que pour trois éléments parallèles ou plus, un par ligne, qui commence par "- " ou "1. ".
- Un seul lien par message, sur sa propre ligne.

Si la personne envoie un message vocal, une photo ou un fichier, tu reçois une transcription ou une description entre crochets. Réponds comme si tu l'avais entendu ou vu.
Si elle te demande si tu es une IA, réponds oui en une phrase et continue.
Si elle te demande d'arrêter de lui écrire, confirme une fois en un seul message court.
```

Quatre choix y comptent. La règle de la ligne vide donne à votre code un endroit fiable où découper. Les chiffres (« une à trois phrases », « au maximum 3 messages ») sont testables, ce qu'un vague « reste court » n'est pas. La ligne sur l'IA vient d'un souci de sécurité, pas de style : écrire comme une personne est une manière d'écrire, pas une autorisation de nier être une IA, et les [règles de sécurité des compagnons IA](https://whasp.ai/fr/blog/compagnon-ia-regles-securite-2026) indiquent où la transparence est une obligation légale. Enfin, le prénom : l'événement `message.received` contient `sender_name`, le nom que la personne s'est donné sur WhatsApp. C'est un texte qu'elle maîtrise : traitez-le comme une donnée, jamais comme une instruction.

## Comment faire respecter les règles dans le code ?

Faites respecter les règles du prompt dans le code, car les modèles dérivent. Ce fichier TypeScript convertit le Markdown en syntaxe WhatsApp, découpe sur les lignes vides et envoie chaque partie via `POST /v1/messages` :

```ts
// Transforme le Markdown que les modèles aiment écrire en syntaxe propre à WhatsApp.
export function toWhatsApp(md: string): string {
  return md
    .replace(/\r\n/g, "\n")
    .replace(/\[([^\]]+)\]\((https?:\/\/[^)\s]+)\)/g, "$1 $2") // [libellé](url) -> libellé url
    .replace(/^#{1,6}\s+(.+)$/gm, (_, t: string) => `*${t.replace(/\*/g, "")}*`) // # Titre -> *Titre*
    .replace(/\*\*(.+?)\*\*/g, "*$1*") // **gras** -> *gras*
    .replace(/__(.+?)__/g, "*$1*") // __gras__ -> *gras*
    .replace(/^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/gm, "") // lignes horizontales
    .replace(/\n{3,}/g, "\n\n")
    .trim();
}

// Un paragraphe = un message. Les longs paragraphes se coupent en fin de phrase.
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);
  }
  // Au-delà du plafond : on fusionne la fin dans le dernier message autorisé, jusqu'à 4 000 caractères.
  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) ?? []); // limite de texte de 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",
        // Un même événement et une même partie reçoivent toujours la même clé : un nouvel essai n'envoie jamais deux fois.
        "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...
    }
  }
}
```

La boucle attend chaque envoi (`await`), donc les parties arrivent chez whasp dans l'ordre, puis whasp envoie les messages d'un numéro un par un, dans l'ordre. L'`Idempotency-Key` est construite à partir de l'identifiant de l'événement webhook et de l'indice de la partie. whasp conserve une clé pendant 7 jours et renvoie le premier message pour une clé répétée : une relance du webhook ne peut donc pas envoyer deux fois la même partie. Un envoi refusé (un 4xx) ne consomme pas sa clé.

Ajustez `maxChars` et `maxParts` au persona : un assistant laconique pourra prendre 300 et 3, un conteur 900 et 5. Une regex ne répare pas tout. Si un modèle écrit un tableau Markdown, le convertisseur ci-dessus n'y touche pas, et la correction relève du prompt. Le `*italique*` du Markdown devient du gras dans WhatsApp, ce qui est une raison de plus pour laquelle le modèle de prompt demande d'utiliser les tirets bas. Branchez `sendReply` dans le flux webhook de [la création d'un agent avec l'API OpenAI](https://whasp.ai/fr/blog/integration-openai-whatsapp-agent-gpt) et gardez la vérification de signature décrite dans la [documentation](https://whasp.ai/docs) de whasp.

## À quelle vitesse l'agent doit-il répondre ?

Un agent sur whasp doit répondre vite et sans délai artificiel, car un numéro ne peut pas afficher d'indicateur de saisie. Les indicateurs de saisie ne sont pas pris en charge : une réponse qui met 40 secondes ressemble donc à un silence, et un délai ajouté exprès aussi. Utilisez un modèle rapide pour les tours de conversation ordinaires. Pour un travail lent par nature, comme un appel d'outil ou une recherche, envoyez d'abord un court message d'attente (« une minute, je regarde »), puis la réponse.

Une réponse découpée fait aussi office de rythme. whasp envoie les messages d'un numéro un par un, à environ une seconde d'écart : trois parties arrivent donc en rafale rapide, comme quand les gens s'écrivent.

Comptez les parties comme un budget. Un numéro whasp peut envoyer 1 500 messages en 24 heures, et il est conçu pour environ 100 utilisateurs actifs. Cela fait environ 15 messages envoyés par utilisateur et par jour en moyenne, et une réponse en quatre parties en consomme le quart en un seul tour. Au-delà de la limite, les envois échouent avec 429 `number_daily_limit`. [Passer à plusieurs numéros](https://whasp.ai/fr/blog/combien-numeros-whatsapp-agent-ia) détaille le calcul de capacité.

## Quel ton passe pour celui d'une personne ?

Un agent WhatsApp passe pour une personne quand il suit l'autre et ne fait pas de numéro. Quelques habitudes font l'essentiel du travail :

- **Calquer la longueur.** Un message d'un mot appelle une ligne en retour. Un long message sur une mauvaise journée appelle une réponse plus longue, toujours en paragraphes courts.
- **Répondre dans sa langue.** Si la personne passe du français à l'espagnol, l'agent aussi.
- **Supprimer la formule finale.** Pas de « N'hésitez pas si vous avez besoin d'autre chose » à la fin de chaque tour.
- **Ne pas faire écho.** Ne reformulez pas son message avant d'y répondre.
- **Ne demander qu'une chose.** Deux questions dans un message obtiennent une seule réponse, en général la plus facile.
- **Saluer une seule fois.** Dites bonjour dans le premier message d'une conversation, ou après plusieurs jours de silence, pas à chaque tour.
- **Choisir, pas énumérer.** Si on lui demande quoi cuisiner, un ami répond « des pâtes, tu as tout ce qu'il faut », pas cinq options.
- **Avouer ses lacunes en peu de mots.** « Aucune idée, franchement » vaut mieux que trois phrases de précautions.
- **Utiliser le prénom avec parcimonie.** Le prénom dans chaque message sonne comme un script de centre d'appels.

Les compagnons demandent plus que du style : un persona stable, la mémoire de ce que la personne a dit la semaine dernière et des règles pour les moments sensibles. [Lancer un compagnon IA sur WhatsApp](https://whasp.ai/fr/blog/compagnon-ia-whatsapp) couvre tout le parcours, et [la mémoire de conversation](https://whasp.ai/fr/blog/agent-ia-whatsapp-memoire-conversation) couvre la partie qui rend « la semaine dernière » possible.

Pour vérifier le résultat, lisez de vraies conversations, pas seulement le prompt. Gardez cinq messages de test fixes et rejouez-les à chaque changement de modèle ou de prompt : un message d'un mot, un long message sur une mauvaise journée, une demande qui nécessite des étapes, « tu es une IA ? » et un message dans une autre langue. Un passage automatisé rapide aide aussi : comptez la fréquence des réponses qui contiennent `**`, un titre `#` ou plus de quatre parties, et suivez la longueur médiane des messages. Ces chiffres bougent dès que le modèle bouge.

## Que faire ensuite ?

Branchez tout cela sur un numéro réel. [Construisez le webhook et l'appel au modèle avec l'API OpenAI](https://whasp.ai/fr/blog/integration-openai-whatsapp-agent-gpt), ajoutez [les messages vocaux et les photos](https://whasp.ai/fr/blog/transcrire-message-vocal-whatsapp) pour que l'agent réponde à ce que les gens envoient vraiment, et stockez l'historique vous-même, car les serveurs de whasp ne conservent aucun message. Le guide de démarrage de la [documentation whasp](https://whasp.ai/docs#quickstart) fait tourner un numéro, un webhook et une première réponse, et les [tarifs](https://whasp.ai/fr/pricing) indiquent ce que coûte un numéro.

## Questions

### WhatsApp prend-il en charge le Markdown ?

Pas le Markdown à proprement parler. La page d'aide de WhatsApp documente sa propre syntaxe : _italique_, *gras*, ~barré~, trois backticks pour le monospace, des listes qui commencent par *, - ou 1., des citations qui commencent par > et du code en ligne entre backticks simples. Elle ne mentionne rien pour les titres, les tableaux ou le texte de lien.

### Comment empêcher un bot WhatsApp d'envoyer des pavés de texte ?

Fixez la limite dans le system prompt avec des chiffres, par exemple une à trois phrases par message et trois messages par tour au maximum. Faites-la ensuite respecter dans le code en découpant la réponse sur les lignes vides et en plafonnant le nombre de parties.

### Quelle longueur peut avoir un message WhatsApp envoyé par l'API whasp ?

Le champ text accepte jusqu'à 4 096 caractères. Pour du chat, restez très en dessous : un message de quelques centaines de caractères se lit comme un texto, quelques milliers comme un e-mail.

### Mon agent peut-il afficher un indicateur de saisie pendant que le modèle réfléchit ?

Non. Les numéros whasp sont des téléphones pilotés comme le ferait une personne, et les indicateurs de saisie ne sont pas pris en charge. Utilisez un modèle rapide pour les tours de chat et, pour un travail lent, envoyez d'abord un court message d'attente.

### Un agent qui écrit comme une personne doit-il dire qu'il est une IA ?

Oui, quand on le lui demande. Écrire naturellement est un choix de style, pas une autorisation de nier être une IA. Mettez dans le system prompt une consigne qui lui fait le dire en une phrase avant de continuer.
