KI-Agent auf WhatsApp wie ein Mensch schreiben lassen
Prompt-Regeln, die eigene Formatierung von WhatsApp und TypeScript-Code, der das Markdown eines Modells in kurze, geordnete Nachrichten wie von einem Menschen umwandelt.

Das Wichtigste
- WhatsApp formatiert Text mit eigener Syntax (*fett*, _kursiv_, ~durchgestrichen~, drei Backticks für Monospace), deshalb muss das Markdown, das ein Modell standardmäßig schreibt, vor dem Senden umgewandelt werden.
- Eine Chat-Antwort funktioniert am besten als zwei oder drei kurze Nachrichten mit je einem Gedanken statt als ein langer Block, und der Prompt sollte das in Zahlen sagen.
- Der Prompt legt den Stil fest, aber der Code sollte ihn durchsetzen: Markdown umwandeln, an Leerzeilen teilen, die Zahl der Nachrichten begrenzen und jeden Teil mit eigenem Idempotency-Key senden.
- whasp hat keine Tippanzeige und sendet die Nachrichten einer Nummer eine nach der anderen, im Abstand von etwa einer Sekunde, deshalb wirkt eine langsame Antwort wie Schweigen und ein schnelles Modell zählt mehr als eine künstliche Verzögerung.
- Jeder Teil einer geteilten Antwort zählt auf die 1.500 Nachrichten pro Tag, die eine whasp-Nummer senden kann, die Zahl der Teile ist also ein Budget und nicht nur eine Stilfrage.
Damit ein KI-Agent auf WhatsApp wie ein Mensch schreibt, gib seinem System-Prompt vier Regeln: kurze Nachrichten mit je einem Gedanken, die eigene Formatierung von WhatsApp statt Markdown, höchstens eine Frage pro Runde und einfache Wörter ohne Assistenten-Floskeln. Setze sie dann im Code durch: Wandle Markdown in WhatsApp-Syntax um und teile die Antwort vor dem Senden in zwei oder drei Nachrichten.
Warum wirken KI-Antworten auf WhatsApp falsch?
Chat-Modelle antworten tendenziell wie Dokumente: eine Begrüßung, eine fett gesetzte Liste, am Ende das Angebot, weiter zu helfen. In einer Chat-Blase liest sich das wie ein Formbrief, und Zeichen wie # kommen genau so an, wie sie getippt wurden. Menschen schreiben in kurzen Schüben, und eine Antwort, die nicht wie ein Schub aussieht, verrät den Agenten schon in der ersten Nachricht.
Die Modellübersicht von Anthropic selbst sagt Entwicklern, die kürzere Antworten wollen, sie sollen im Prompt darum bitten, und das gilt für jedes Modell. Nimm eine Nachricht, „Es lief super, ich habe den Job“, und zwei Antworten darauf:
Herzlichen Glückwunsch zu deiner neuen Stelle. Das sind wunderbare Neuigkeiten. Hier sind einige Schritte, die du bedenken kannst:
**1. Das Angebot im Detail prüfen**
**2. Die erste Woche vorbereiten**
Sag Bescheid, wenn ich bei einem dieser Punkte helfen kann.
Maya, das sind tolle Neuigkeiten. Glückwunsch.
Erzähl mir alles. Wie haben sie es dir gesagt?
Die zweite besteht aus zwei Nachrichten, einer Frage und ohne Formatierung. Die erste ist ein Block, mit Markdown, das nicht zur dokumentierten Syntax von WhatsApp gehört.
Welche Formatierung unterstützt WhatsApp?
Die Hilfeseite Wie du deine Nachrichten formatierst von WhatsApp dokumentiert acht Syntaxelemente, und ihre Versionen für Android, iPhone und Web führen dieselben auf.
| Format | Was du tippst |
|---|---|
| Fett | *Text* |
| Kursiv | _Text_ |
| Durchgestrichen | ~Text~ |
| Monospace | drei Backticks vor und nach dem Text |
| Inline-Code | ein Backtick vor und nach dem Text |
| Aufzählung | * Text oder - Text, eine pro Zeile |
| Nummerierte Liste | 1. Text, eine pro Zeile |
| Zitat | > Text |
Fett ist ein einzelnes Sternchen, weshalb die **doppelten Sternchen** und # Überschriften, die ein Modell standardmäßig schreibt, umgewandelt werden müssen. Die Seite nennt keine Syntax für Überschriften, Tabellen oder Linktext, schreib URLs also einfach hin und mach aus Tabellenzeilen kurze Zeilen.
Ein Vorbehalt von der Seite selbst: Ihre Web-Version vermerkt, dass die neuere Formatierung nur im Web und auf dem Mac-Desktop verfügbar ist, während die Android- und iPhone-Versionen dieselbe Syntax ohne diesen Hinweis zeigen. Betrachte Listen und Zitate als Bonus. - Punkt und 1. Punkt lesen sich als einfacher Text immer noch gut, wo sie nicht dargestellt werden.
Ein paar Regeln verhindern, dass die Formatierung wie ein Dokument aussieht. Setze pro Nachricht höchstens ein Wort oder eine Wendung fett. Nutze eine Liste nur für drei oder mehr gleichrangige Punkte, etwa Schritte. Sende nie eine Tabelle. Setze einen Link pro Nachricht: Metas Referenz zu Textnachrichten für die Business API sagt, dass der WhatsApp-Client nur für die erste URL in einem Nachrichtentext eine Vorschau darstellt.
Was sollte der System-Prompt enthalten?
Ein System-Prompt für einen WhatsApp-Agenten sollte Stilregeln als Zahlen und Beispiele formulieren, denn Adjektive wie „prägnant“ und „freundlich“ sagen einem Modell wenig. Diese Vorlage deckt das oben beschriebene Verhalten ab, die Zeile zur Persona füllst du selbst:
Du bist Ava und schreibst auf WhatsApp mit {{name}}. {{eine Zeile: wer du bist, wie du sprichst}}
So schreibst du:
- Du schreibst eine Chatnachricht, keine E-Mail. Ein Gedanke pro Nachricht, ein bis drei Sätze.
- Sende höchstens 3 Nachrichten pro Runde. Setze eine Leerzeile zwischen die Nachrichten: Jeder Absatz wird als eigene Nachricht gesendet.
- Pass dich der Person in Länge und Energie an. Schreibt sie vier Wörter, antworte nicht mit vierzig.
- Stell höchstens eine Frage pro Runde, und nur, wenn du die Antwort brauchst. Beende nicht jede Runde mit einer Frage.
- Nutze einfache Wörter. Kein "Gerne", kein "Ich hoffe, das hilft", kein "Als KI-Sprachmodell".
- Emoji: höchstens eins pro Runde, und nur, wenn die Person welche nutzt. Oft keins.
Formatierung (WhatsApp, nicht Markdown):
- Fett ist *ein Sternchen auf jeder Seite*. Kursiv ist _Unterstriche_.
- Nutze nie #, Tabellen, **doppelte Sternchen** oder Links wie [Text](url). Schreib die URL einfach hin.
- Nutze eine Liste nur für drei oder mehr gleichrangige Punkte, einer pro Zeile, beginnend mit "- " oder "1. ".
- Ein Link pro Nachricht, in einer eigenen Zeile.
Schickt die Person eine Sprachnachricht, ein Foto oder eine Datei, bekommst du ein Transkript oder eine Beschreibung in eckigen Klammern. Antworte, als hättest du es gehört oder gesehen.
Fragt die Person, ob du eine KI bist, sag in einem Satz ja und mach weiter.
Bittet die Person dich, ihr nicht mehr zu schreiben, bestätige das einmal in einer kurzen Nachricht.
Vier Entscheidungen darin zählen. Die Leerzeilen-Regel gibt deinem Code eine verlässliche Stelle zum Teilen. Die Zahlen („ein bis drei Sätze“, „höchstens 3 Nachrichten“) sind prüfbar, ein vages „fass dich kurz“ ist es nicht. Die KI-Zeile kommt aus einem Sicherheitsgedanken, nicht aus einem stilistischen: Wie ein Mensch zu klingen ist eine Schreibweise, keine Erlaubnis, zu leugnen, eine KI zu sein, und die Sicherheitsregeln für KI-Begleiter behandeln, wo die Offenlegung eine gesetzliche Pflicht ist. Zuletzt der Name: Das message.received-Event trägt sender_name, den Namen, den sich die Person selbst auf WhatsApp gegeben hat. Das ist Text, den sie kontrolliert, behandle ihn also als Daten und nie als Anweisung.
Wie setzt du die Regeln im Code durch?
Setze die Regeln des Prompts im Code durch, denn Modelle driften. Diese TypeScript-Datei wandelt Markdown in WhatsApp-Syntax um, teilt an Leerzeilen und sendet jeden Teil über POST /v1/messages:
// Wandelt das Markdown, das ein Modell gern schreibt, in die eigene Syntax von WhatsApp um.
export function toWhatsApp(md: string): string {
return md
.replace(/\r\n/g, "\n")
.replace(/\[([^\]]+)\]\((https?:\/\/[^)\s]+)\)/g, "$1 $2") // [Text](url) -> Text url
.replace(/^#{1,6}\s+(.+)$/gm, (_, t: string) => `*${t.replace(/\*/g, "")}*`) // # Titel -> *Titel*
.replace(/\*\*(.+?)\*\*/g, "*$1*") // **fett** -> *fett*
.replace(/__(.+?)__/g, "*$1*") // __fett__ -> *fett*
.replace(/^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/gm, "") // horizontale Linien
.replace(/\n{3,}/g, "\n\n")
.trim();
}
// Ein Absatz = eine Nachricht. Lange Absätze werden an Satzenden getrennt.
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);
}
// Über dem Limit: den Rest an die letzte erlaubte Nachricht anhängen, bis zu 4.000 Zeichen.
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) ?? []); // das Textlimit bei whasp ist 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",
// Dasselbe Event und derselbe Teil bekommen immer denselben Key, ein Retry sendet also nie doppelt.
"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...
}
}
}
Die Schleife wartet auf jeden Versand, die Teile erreichen whasp also der Reihe nach, und whasp sendet die Nachrichten einer Nummer dann eine nach der anderen, in Reihenfolge. Der Idempotency-Key setzt sich aus der Webhook-Event-ID und dem Index des Teils zusammen. whasp behält einen Key 7 Tage lang und liefert bei einem wiederholten Key die erste Nachricht zurück, ein Webhook-Retry kann denselben Teil also nicht zweimal senden. Ein abgelehnter Versand (ein 4xx) verbraucht seinen Key nicht.
Passe maxChars und maxParts an die Persona an: Ein knapper Assistent nimmt vielleicht 300 und 3, ein Geschichtenerzähler 900 und 5. Ein regulärer Ausdruck kann nicht alles reparieren. Schreibt ein Modell eine Markdown-Tabelle, lässt der Konverter oben sie in Ruhe, und die Lösung gehört in den Prompt. Das *kursiv* von Markdown wird in WhatsApp zu Fett, ein weiterer Grund, warum die Vorlage das Modell Unterstriche nutzen lässt. Binde sendReply in den Webhook-Ablauf aus dem Leitfaden zum Bau eines Agenten mit der OpenAI API ein und behalte die Signaturprüfung aus den whasp-Docs.
Wie schnell sollte der Agent antworten?
Ein Agent auf whasp sollte schnell und ohne künstliche Verzögerung antworten, denn eine Nummer kann keine Tippanzeige zeigen. Tippanzeigen werden nicht unterstützt, eine Antwort, die 40 Sekunden braucht, sieht also wie Schweigen aus, und eine Verzögerung, die du absichtlich einbaust, sieht genauso aus. Nutze für normale Chat-Runden ein schnelles Modell. Sende bei Arbeit, die von Natur aus langsam ist, etwa einem Tool-Aufruf oder einer Suche, eine kurze Zwischennachricht („Moment, ich schaue nach“) und danach die Antwort.
Eine geteilte Antwort ist zugleich das Tempo. whasp sendet die Nachrichten einer Nummer eine nach der anderen, im Abstand von etwa einer Sekunde, drei Teile kommen also als schneller Schub an, so wie Menschen schreiben.
Plane die Teile als Budget. Eine whasp-Nummer kann in 24 Stunden 1.500 Nachrichten senden und ist für etwa 100 aktive Nutzer gebaut. Das ergibt im Schnitt rund 15 gesendete Nachrichten pro Nutzer und Tag, und eine Antwort mit vier Teilen verbraucht davon ein Viertel in einer einzigen Runde. Über dem Limit schlagen Sendungen mit 429 number_daily_limit fehl. Auf mehr Nummern skalieren behandelt die Kapazitätsrechnung.
Welcher Ton wirkt wie ein Mensch?
Ein WhatsApp-Agent wirkt wie ein Mensch, wenn er der Gegenseite folgt und sich nicht inszeniert. Ein paar Gewohnheiten leisten den größten Teil der Arbeit:
- Länge spiegeln. Auf eine Ein-Wort-Nachricht kommt eine Zeile zurück. Auf eine lange Nachricht über einen schlechten Tag kommt eine längere Antwort, trotzdem in kurzen Absätzen.
- In ihrer Sprache antworten. Wechselt die Person vom Deutschen ins Englische, wechselt der Agent mit.
- Den Abschiedssatz weglassen. Kein „Sag Bescheid, wenn du noch etwas brauchst“ am Ende jeder Runde.
- Nicht wiederholen. Gib die Nachricht der Person nicht wieder, bevor du sie beantwortest.
- Eins fragen. Zwei Fragen in einer Nachricht bekommen eine Antwort, meist die leichtere.
- Einmal grüßen. Sag in der ersten Nachricht eines Gesprächs Hallo, oder nach einer Pause von Tagen, nicht in jeder Runde.
- Wählen statt aufzählen. Gefragt, was man kochen soll, sagt ein Freund „Nudeln, du hast alles dafür da“, nicht fünf Optionen.
- Lücken kurz zugeben. „Keine Ahnung, ehrlich gesagt“ schlägt drei Sätze Absicherung.
- Den Namen sparsam nutzen. Den Namen in jeder Nachricht zu verwenden klingt wie ein Callcenter-Skript.
Begleiter brauchen mehr als Stil: eine stabile Persona, ein Gedächtnis für das, was die Person letzte Woche gesagt hat, und Regeln für sensible Momente. Einen KI-Begleiter auf WhatsApp starten behandelt den ganzen Weg, und Konversationsgedächtnis den Teil, der „letzte Woche“ erst möglich macht.
Um das Ergebnis zu prüfen, lies echte Gesprächsverläufe, nicht nur den Prompt. Halte fünf feste Testnachrichten bereit und lass sie jedes Mal neu laufen, wenn du Modell oder Prompt änderst: eine Ein-Wort-Nachricht, eine lange Nachricht über einen schlechten Tag, eine Bitte, die Schritte braucht, „Bist du eine KI?“ und eine Nachricht in einer anderen Sprache. Ein schneller automatischer Durchlauf hilft ebenfalls: Zähle, wie oft eine Antwort **, eine #-Überschrift oder mehr als vier Teile enthält, und verfolge die mittlere Nachrichtenlänge. Diese Zahlen driften, sobald das Modell driftet.
Was tust du als Nächstes?
Verbinde das mit einer Live-Nummer. Baue Webhook und Modellaufruf mit der OpenAI API, füge Sprachnachrichten und Fotos hinzu, damit der Agent beantworten kann, was Menschen tatsächlich schicken, und speichere den Verlauf selbst, denn die Server von whasp speichern keine Nachrichten. Der Quickstart in den whasp-Docs bringt eine Nummer, einen Webhook und eine erste Antwort zum Laufen, und die Preise nennen, was eine Nummer kostet.
Fragen
Unterstützt WhatsApp Markdown?
Nicht Markdown als solches. Die Hilfeseite von WhatsApp dokumentiert eine eigene Syntax: _kursiv_, *fett*, ~durchgestrichen~, drei Backticks für Monospace, Listen, die mit *, - oder 1. beginnen, Zitate mit > und Inline-Code in einfachen Backticks. Für Überschriften, Tabellen oder Linktext steht dort nichts.
Wie verhindere ich, dass ein WhatsApp-Bot Textwände schickt?
Lege die Grenze im System-Prompt in Zahlen fest, zum Beispiel ein bis drei Sätze pro Nachricht und höchstens drei Nachrichten pro Runde. Setze sie dann im Code durch, indem du die Antwort an Leerzeilen teilst und die Zahl der Teile begrenzt.
Wie lang darf eine WhatsApp-Nachricht über die whasp-API sein?
Das Feld text nimmt bis zu 4.096 Zeichen. Bleib im Chat weit darunter: Eine Nachricht von wenigen hundert Zeichen liest sich wie eine Chatnachricht, mehrere tausend wie eine E-Mail.
Kann mein Agent eine Tippanzeige zeigen, während das Modell nachdenkt?
Nein. whasp-Nummern sind Telefone, die wie ein Mensch bedient werden, und Tippanzeigen werden nicht unterstützt. Nutze für normale Chat-Runden ein schnelles Modell und sende bei langsamer Arbeit zuerst eine kurze Zwischennachricht.
Sollte ein Agent, der wie ein Mensch schreibt, sagen, dass er eine KI ist?
Ja, wenn man ihn fragt. Natürlich zu klingen ist eine Stilentscheidung, keine Erlaubnis, zu leugnen, eine KI zu sein. Nimm eine Zeile in den System-Prompt auf, die den Agenten das in einem Satz sagen und weitermachen lässt.


