Streaming + Chunking
OpenClaw hat zwei separate Streaming-Ebenen:- Block-Streaming (Channels): abgeschlossene Blöcke ausgeben, während der Assistant schreibt. Das sind normale Channel-Nachrichten (keine Token-Deltas).
- Vorschau-Streaming (Telegram/Discord/Slack): eine temporäre Vorschau-Nachricht während der Generierung aktualisieren.
Block-Streaming (Channel-Nachrichten)
Block-Streaming sendet Assistant-Ausgaben in groben Chunks, sobald sie verfügbar werden.text_delta/events: Modell-Stream-Ereignisse (können bei nicht streamenden Modellen spärlich sein).chunker:EmbeddedBlockChunker, der Min-/Max-Grenzen + Umbruchpräferenz anwendet.channel send: tatsächliche ausgehende Nachrichten (Block-Antworten).
agents.defaults.blockStreamingDefault:"on"/"off"(Standard: aus).- Channel-Überschreibungen:
*.blockStreaming(und Varianten pro Konto), um pro Channel"on"/"off"zu erzwingen. agents.defaults.blockStreamingBreak:"text_end"oder"message_end".agents.defaults.blockStreamingChunk:{ minChars, maxChars, breakPreference? }.agents.defaults.blockStreamingCoalesce:{ minChars?, maxChars?, idleMs? }(gestreamte Blöcke vor dem Senden zusammenführen).- Harte Channel-Grenze:
*.textChunkLimit(z. B.channels.whatsapp.textChunkLimit). - Channel-Chunk-Modus:
*.chunkMode(lengthstandardmäßig,newlinetrennt an Leerzeilen (Absatzgrenzen) vor dem Chunking nach Länge). - Discord-Soft-Grenze:
channels.discord.maxLinesPerMessage(Standard 17) teilt hohe Antworten, um UI-Abschneiden zu vermeiden.
text_end: Blöcke streamen, sobald der Chunker sie ausgibt; bei jedemtext_endflushen.message_end: warten, bis die Assistant-Nachricht abgeschlossen ist, dann gepufferte Ausgabe flushen.
message_end verwendet weiterhin den Chunker, wenn der gepufferte Text maxChars überschreitet, sodass am Ende mehrere Chunks ausgegeben werden können.
Chunking-Algorithmus (untere/obere Grenzen)
Block-Chunking wird durchEmbeddedBlockChunker implementiert:
- Untere Grenze: nichts ausgeben, bis der Puffer >=
minCharsist (außer wenn erzwungen). - Obere Grenze: Trennungen vor
maxCharsbevorzugen; wenn erzwungen, beimaxCharstrennen. - Umbruchpräferenz:
paragraph→newline→sentence→whitespace→ harter Umbruch. - Code-Fences: niemals innerhalb von Fences trennen; wenn bei
maxCharserzwungen, die Fence schließen + erneut öffnen, damit Markdown gültig bleibt.
maxChars wird auf das Channel-textChunkLimit begrenzt, sodass per-Channel-Grenzen nicht überschritten werden können.
Zusammenführen (gestreamte Blöcke zusammenführen)
Wenn Block-Streaming aktiviert ist, kann OpenClaw aufeinanderfolgende Block-Chunks zusammenführen, bevor sie gesendet werden. Das reduziert „Einzeilen-Spam“, liefert aber weiterhin schrittweise Ausgabe.- Das Zusammenführen wartet vor dem Flush auf Leerlaufabstände (
idleMs). - Puffer sind durch
maxCharsbegrenzt und werden geflusht, wenn sie diesen Wert überschreiten. minCharsverhindert, dass winzige Fragmente gesendet werden, bevor genug Text zusammengekommen ist (der finale Flush sendet immer verbleibenden Text).- Das Verbindungszeichen wird aus
blockStreamingChunk.breakPreferenceabgeleitet (paragraph→\n\n,newline→\n,sentence→ Leerzeichen). - Channel-Überschreibungen sind über
*.blockStreamingCoalesceverfügbar (einschließlich Konfigurationen pro Konto). - Der Standardwert für
minCharsbeim Zusammenführen wird für Signal/Slack/Discord auf 1500 erhöht, sofern nicht überschrieben.
Menschlich wirkendes Tempo zwischen Blöcken
Wenn Block-Streaming aktiviert ist, können Sie eine zufällige Pause zwischen Block-Antworten hinzufügen (nach dem ersten Block). Dadurch wirken Antworten mit mehreren Sprechblasen natürlicher.- Konfiguration:
agents.defaults.humanDelay(Überschreibung pro Agent überagents.list[].humanDelay). - Modi:
off(Standard),natural(800–2500 ms),custom(minMs/maxMs). - Gilt nur für Block-Antworten, nicht für finale Antworten oder Tool-Zusammenfassungen.
„Chunks streamen oder alles“
Dies entspricht:- Chunks streamen:
blockStreamingDefault: "on"+blockStreamingBreak: "text_end"(währenddessen ausgeben). Nicht-Telegram-Channels benötigen außerdem*.blockStreaming: true. - Alles am Ende streamen:
blockStreamingBreak: "message_end"(einmal flushen, bei sehr langer Ausgabe eventuell mehrere Chunks). - Kein Block-Streaming:
blockStreamingDefault: "off"(nur finale Antwort).
*.blockStreaming nicht explizit auf true gesetzt ist. Channels können eine Live-Vorschau streamen
(channels.<channel>.streaming) ohne Block-Antworten.
Hinweis zum Konfigurationsort: Die Standardwerte blockStreaming* liegen unter
agents.defaults, nicht in der Root-Konfiguration.
Modi für Vorschau-Streaming
Kanonischer Schlüssel:channels.<channel>.streaming
Modi:
off: Vorschau-Streaming deaktivieren.partial: einzelne Vorschau, die durch den neuesten Text ersetzt wird.block: Vorschau-Aktualisierungen in gechunkten/angehängten Schritten.progress: Fortschritts-/Statusvorschau während der Generierung, finale Antwort nach Abschluss.
Channel-Zuordnung
| Channel | off | partial | block | progress |
|---|---|---|---|---|
| Telegram | ✅ | ✅ | ✅ | wird zu partial zugeordnet |
| Discord | ✅ | ✅ | ✅ | wird zu partial zugeordnet |
| Slack | ✅ | ✅ | ✅ | ✅ |
channels.slack.nativeStreamingschaltet native Slack-Streaming-API-Aufrufe um, wennstreaming=partialgesetzt ist (Standard:true).
- Telegram:
streamMode+ booleschesstreamingwerden automatisch auf das Enumstreamingmigriert. - Discord:
streamMode+ booleschesstreamingwerden automatisch auf das Enumstreamingmigriert. - Slack:
streamModewird automatisch auf das Enumstreamingmigriert; booleschesstreamingwird automatisch aufnativeStreamingmigriert.
Laufzeitverhalten
Telegram:- Verwendet
sendMessage+editMessageTextfür Vorschau-Aktualisierungen in DMs und Gruppen/Themen. - Vorschau-Streaming wird übersprungen, wenn Telegram-Block-Streaming explizit aktiviert ist (um doppeltes Streaming zu vermeiden).
/reasoning streamkann Begründungen in die Vorschau schreiben.
- Verwendet Senden + Bearbeiten von Vorschau-Nachrichten.
- Der Modus
blockverwendet Entwurfs-Chunking (draftChunk). - Vorschau-Streaming wird übersprungen, wenn Discord-Block-Streaming explizit aktiviert ist.
partialkann natives Slack-Streaming (chat.startStream/append/stop) verwenden, wenn verfügbar.blockverwendet Entwurfsvorschauen im Append-Stil.progressverwendet Statusvorschautext und danach die finale Antwort.