Messages and delivery
Nachrichten
Eingehende Nachrichten durchlaufen Routing, Deduplizierung/Entprellung, einen Agentenlauf und die ausgehende Zustellung:
Eingehende Nachricht -> Routing/Bindungen -> Sitzungsschlüssel -> Deduplizierung + Entprellung -> Warteschlange (wenn bereits ein Lauf aktiv ist) -> Agentenlauf (Streaming + Tools) -> ausgehende Antworten (Kanallimits + Aufteilung)Wichtige Konfigurationsbereiche:
messages.*für Präfixe, Warteschlangen, die Entprellung eingehender Nachrichten und das Gruppenverhalten.agents.defaults.*für Block-Streaming, Aufteilung und Standardwerte für stille Antworten.- Kanalspezifische Überschreibungen (
channels.telegram.*,channels.whatsapp.*usw.) für kanalspezifische Obergrenzen und Streaming-Schalter.
Das vollständige Schema finden Sie unter Konfiguration.
Deduplizierung eingehender Nachrichten
Kanäle können dieselbe Nachricht nach einer erneuten Verbindung erneut zustellen. OpenClaw verwaltet einen In-Memory-Cache, dessen Schlüssel aus dem Agentenbereich, der Kanalroute (Kanal + Gegenstelle + Konto + Thread) und der Nachrichten-ID besteht, sodass eine erneut zugestellte Nachricht keinen zweiten Agentenlauf auslöst. Der Cache-Eintrag läuft nach 20 Minuten oder nach Erreichen von 5000 erfassten Einträgen ab, je nachdem, was zuerst eintritt.
Entprellung eingehender Nachrichten
Mehrere schnell aufeinanderfolgende Textnachrichten desselben Absenders können über messages.inbound zu einem einzigen Agentendurchlauf zusammengefasst werden. Die Entprellung gilt jeweils pro Kanal + Unterhaltung und verwendet die neueste Nachricht für Antwort-Threading/IDs.
{ messages: { inbound: { debounceMs: 2000, byChannel: { discord: 1500, slack: 1500, whatsapp: 5000, }, }, },}- Die Entprellung gilt nur für reine Textnachrichten; Medien/Anhänge werden sofort weitergeleitet.
- Steuerbefehle (Stopp/Abbruch/Status usw.) umgehen die Entprellung, sodass sie sofort weitergeleitet werden.
- Standardmäßig deaktiviert:
messages.inbound.debounceMshat keinen integrierten Standardwert, sodass die Entprellung erst aktiviert wird, wenn Sie ihn festlegen (global oder pro Kanal). - Die optionale iMessage-Einstellung
coalesceSameSenderDmsist die einzige Ausnahme: Sie hält alle DM-Texte desselben Absenders (einschließlich Befehlen) lange genug zurück, damit Apples getrenntes Senden von Befehl und URL als ein einziger Durchlauf eingeht. Gruppenchats werden unabhängig von dieser Einstellung immer sofort weitergeleitet.
Sitzungen und Geräte
Sitzungen gehören dem Gateway, nicht den Clients.
- Direktchats werden im Hauptsitzungsschlüssel des Agenten zusammengeführt.
- Gruppen/Kanäle erhalten eigene Sitzungsschlüssel.
- Der Sitzungsspeicher und die Transkripte befinden sich auf dem Gateway-Host.
Mehrere Geräte/Kanäle können derselben Sitzung zugeordnet sein, der Verlauf wird jedoch nicht vollständig mit jedem Client synchronisiert. Verwenden Sie für lange Unterhaltungen ein primäres Gerät, um voneinander abweichenden Kontext zu vermeiden. Die Control UI und TUI zeigen stets das vom Gateway bereitgestellte Sitzungstranskript an und sind daher die maßgebliche Quelle.
Details: Sitzungsverwaltung.
Prompt-Inhalte und Verlaufskontext
Kanal-Plugins befüllen mehrere Textfelder im eingehenden Kontext, geordnet von der höchsten bis zur niedrigsten Priorität:
| Feld | Zweck |
|---|---|
BodyForAgent |
An das Modell gerichteter Text für den aktuellen Durchlauf. Fällt auf CommandBody / RawBody / Body zurück, wenn nicht gesetzt. |
BodyForCommands |
Bereinigter Text für die Analyse von Direktiven/Befehlen. Fällt auf CommandBody / RawBody / Body zurück, wenn nicht gesetzt. |
CommandBody |
Veralteter Zwischeninhalt; bevorzugen Sie BodyForCommands. |
RawBody |
Veralteter Alias für CommandBody. |
Body |
Veralteter Prompt-Inhalt; kann Kanalumschläge und Verlaufs-Wrapper enthalten. |
Wenn ein Kanal einen Verlauf bereitstellt, umschließt er ihn mit:
[Chat messages since your last reply - for context][Current message - respond to this]
Bei Chats, die keine Direktchats sind (Gruppen/Kanäle/Räume), wird dem aktuellen Nachrichtentext das Absenderlabel vorangestellt, entsprechend dem für Verlaufseinträge verwendeten Stil. Das Entfernen von Direktiven gilt nur für den Abschnitt der aktuellen Nachricht, sodass der Verlauf unverändert bleibt. Kanäle, die den Verlauf einbetten, sollten BodyForCommands (oder die veralteten Felder CommandBody / RawBody) auf den ursprünglichen Nachrichtentext setzen und Body als kombinierten Prompt beibehalten.
Verlaufspuffer enthalten nur ausstehende Nachrichten: Sie umfassen Gruppennachrichten, die keinen Lauf ausgelöst haben (beispielsweise Nachrichten, für die eine Erwähnung erforderlich ist), und schließen Nachrichten aus, die bereits im Sitzungstranskript enthalten sind. Strukturierte Verlaufs-, Antwort-, Weiterleitungs- und Kanalmetadaten werden bei der Prompt-Zusammenstellung als nicht vertrauenswürdige Kontextblöcke der Benutzerrolle dargestellt.
Konfigurieren Sie die Verlaufsgröße mit messages.groupChat.historyLimit (globaler Standardwert) oder mit kanalspezifischen Überschreibungen wie channels.slack.historyLimit und channels.telegram.accounts.<id>.historyLimit (setzen Sie den Wert zum Deaktivieren auf 0).
Metadaten von Tool-Ergebnissen
Der content eines Tool-Ergebnisses ist das für das Modell sichtbare Ergebnis; details enthält Laufzeitmetadaten für die UI-Darstellung, Diagnose, Medienübermittlung und Plugins.
toolResult.detailswird vor der erneuten Wiedergabe an den Provider und vor der Eingabe für die Compaction entfernt.- Persistierte Sitzungstranskripte behalten nur begrenzte
details; übergroße Metadaten werden durch eine kompakte Zusammenfassung mit der MarkierungpersistedDetailsTruncated: trueersetzt. - Plugins und Tools sollten Text, den das Modell lesen muss, in
contentablegen, nicht nur indetails.
Warteschlangen und Folgeanfragen
Wenn bereits ein Lauf aktiv ist, werden eingehende Nachrichten standardmäßig in diesen Lauf eingespeist. messages.queue steuert den Modus:
| Modus | Verhalten |
|---|---|
steer (Standard) |
Speist den neuen Prompt in den aktiven Lauf ein. |
followup |
Führt die Nachricht aus, nachdem der aktive Lauf abgeschlossen ist. |
collect |
Bündelt kompatible Nachrichten in einem späteren Durchlauf. |
interrupt |
Bricht den aktiven Lauf ab und startet dann den neuesten Prompt. |
Standardwerte: messages.queue.debounceMs beträgt 500ms (gilt gleichermaßen für die Bündelung bei steer, followup und collect), messages.queue.cap beträgt 20 Nachrichten in der Warteschlange und messages.queue.drop ist summarize (old und new sind ebenfalls verfügbar). Konfigurieren Sie kanalspezifische Überschreibungen über messages.queue.byChannel und messages.queue.debounceMsByChannel.
Details: Befehlswarteschlange und Steuerungswarteschlange.
Eigentümerschaft von Kanalläufen
Kanal-Plugins können die Reihenfolge beibehalten, Eingaben entprellen und Transport-Gegendruck anwenden, bevor eine Nachricht in die Sitzungswarteschlange gelangt. Sie sollten keinen separaten Timeout um den Agentendurchlauf selbst legen. Sobald eine Nachricht an eine Sitzung weitergeleitet wurde, steuern die Lebenszyklen von Sitzung, Tool und Runtime lang laufende Aufgaben, damit alle Kanäle langsame Durchläufe einheitlich melden und sich davon erholen.
Streaming, Aufteilung und Bündelung
Block-Streaming sendet Teilantworten, während das Modell Textblöcke erzeugt; die Aufteilung berücksichtigt die Textgrenzen des Kanals und vermeidet das Trennen eingezäunter Codeblöcke.
agents.defaults.blockStreamingDefault(on|off, Standardoff)agents.defaults.blockStreamingBreak(text_end|message_end)agents.defaults.blockStreamingChunk(minChars|maxChars|breakPreference)agents.defaults.blockStreamingCoalesce(leerlaufbasierte Bündelung)agents.defaults.humanDelay(menschenähnliche Pause zwischen Blockantworten)- Kanalüberschreibungen:
*.streaming.block.enabledund*.streaming.block.coalescebei Kanälen mit verschachtelter Streaming-Konfiguration (Telegram, Discord, Slack, iMessage, Microsoft Teams); flache Optionen*.blockStreaming/*.blockStreamingCoalescebei Kanälen ohne verschachtelte Streaming-Konfiguration. Block-Streaming ist auf jedem Kanal einschließlich Telegram deaktiviert, sofern es nicht ausdrücklich aktiviert wird.
Details: Streaming und Aufteilung.
Sichtbarkeit von Reasoning und Token
/reasoning on|off|streamsteuert die Sichtbarkeit.- Reasoning-Inhalte werden weiterhin auf die Token-Nutzung angerechnet, wenn das Modell sie erzeugt.
- Telegram unterstützt das Streaming von Reasoning in eine vorübergehende Entwurfsblase, die nach der endgültigen Zustellung gelöscht wird; verwenden Sie
/reasoning onfür eine dauerhafte Reasoning-Ausgabe.
Details: Thinking- und Reasoning-Direktiven und Token-Nutzung.
Präfixe, Threads und Antworten
- Kaskade ausgehender Präfixe:
messages.responsePrefix,channels.<channel>.responsePrefix,channels.<channel>.accounts.<id>.responsePrefix. WhatsApp verfügt außerdem überchannels.whatsapp.messagePrefixfür ein eingehendes Präfix. - Antwort-Threading über
replyToModeund kanalspezifische Standardwerte.
Details: Konfiguration und Kanaldokumentation.
Stille Antworten
Das Stille-Token NO_REPLY (Groß-/Kleinschreibung wird nicht berücksichtigt, daher stimmt auch no_reply überein) bedeutet „keine für Benutzer sichtbare Antwort zustellen“. Wenn ein Durchlauf außerdem ausstehende Tool-Medien enthält, etwa erzeugtes TTS-Audio, entfernt OpenClaw den stillen Text, stellt den Medienanhang jedoch weiterhin zu.
Die Richtlinie für Stille richtet sich nach dem Unterhaltungstyp:
- Direkte Unterhaltungen erhalten niemals
NO_REPLY-Prompt-Anweisungen. Wenn ein direkter Lauf versehentlich ausschließlich ein Stille-Token zurückgibt, unterdrückt OpenClaw es, anstatt es umzuschreiben oder zuzustellen. - Gruppen/Kanäle erlauben standardmäßig Stille. Im Modus für sichtbare Antworten
message_toolbedeutet Stille, dass das Modellmessage(action=send)nicht aufruft. - Interne Orchestrierung erlaubt standardmäßig Stille.
Die Standardwerte befinden sich unter agents.defaults.silentReply; surfaces.<id>.silentReply kann die Gruppen-/internen Richtlinien pro Oberfläche überschreiben.
OpenClaw verwendet stille Antworten außerdem bei allgemeinen internen Runner-Fehlern in nicht direkten Chats, damit Gruppen/Kanäle keine standardisierten Gateway-Fehlermeldungen sehen. Klassifizierte Fehler mit benutzerorientierten Hinweisen zur Behebung, etwa Benachrichtigungen zu fehlender Authentifizierung, Ratenbegrenzungen oder Überlastung, können weiterhin zugestellt werden. Direkte Chats zeigen standardmäßig eine kompakte Fehlermeldung; rohe Runner-Details werden nur angezeigt, wenn /verbose full aktiviert ist.
Ausschließlich aus einem Stille-Token bestehende Antworten werden auf allen Oberflächen verworfen, sodass übergeordnete Sitzungen still bleiben, anstatt Sentinel-Text in ausweichendes Fallback-Gerede umzuschreiben.
Verwandte Themen
- Überarbeitung des Nachrichtenlebenszyklus - Zielentwurf für dauerhaftes Senden und Empfangen
- Streaming - Nachrichtenzustellung in Echtzeit
- Wiederholungsversuche - Verhalten bei erneuten Zustellversuchen
- Warteschlange - Warteschlange für die Nachrichtenverarbeitung
- Kanäle - Integrationen für Messaging-Plattformen