Streaming + Chunking
OpenClaw hat zwei getrennte Streaming-Ebenen:- Block-Streaming (Kanäle): sendet abgeschlossene Blöcke, während der Assistent schreibt. Das sind normale Kanalnachrichten (keine Token-Deltas).
- Vorschau-Streaming (Telegram/Discord/Slack): aktualisiert während der Generierung eine temporäre Vorschau-Nachricht.
Block-Streaming (Kanalnachrichten)
Block-Streaming sendet Assistent-Ausgaben in groben Chunks, sobald sie verfügbar werden.text_delta/events: Stream-Ereignisse des Modells (bei nicht-streamenden Modellen möglicherweise spärlich).chunker:EmbeddedBlockChunker, der Mindest-/Höchstgrenzen + Trennpräferenz anwendet.channel send: tatsächliche ausgehende Nachrichten (Blockantworten).
agents.defaults.blockStreamingDefault:"on"/"off"(standardmäßig aus).- Kanalüberschreibungen:
*.blockStreaming(und Varianten pro Konto), um"on"/"off"pro Kanal zu erzwingen. agents.defaults.blockStreamingBreak:"text_end"oder"message_end".agents.defaults.blockStreamingChunk:{ minChars, maxChars, breakPreference? }.agents.defaults.blockStreamingCoalesce:{ minChars?, maxChars?, idleMs? }(zusammengeführte gestreamte Blöcke vor dem Senden).- Feste Kanalobergrenze:
*.textChunkLimit(z. B.channels.whatsapp.textChunkLimit). - Kanal-Chunk-Modus:
*.chunkMode(lengthstandardmäßig,newlineteilt an Leerzeilen (Absatzgrenzen), bevor nach Länge gechunked wird). - Discord-Softlimit:
channels.discord.maxLinesPerMessage(standardmäßig 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 Assistent-Nachricht fertig 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 vonEmbeddedBlockChunker implementiert:
- Untere Grenze: nichts ausgeben, bis der Puffer >=
minCharsist (außer wenn erzwungen). - Obere Grenze: Trennungen vor
maxCharsbevorzugen; wenn erzwungen, beimaxCharstrennen. - Trennprä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 kanalbezogene textChunkLimit begrenzt, sodass per-Kanal-Limits nicht überschritten werden können.
Coalescing (gestreamte Blöcke zusammenführen)
Wenn Block-Streaming aktiviert ist, kann OpenClaw aufeinanderfolgende Block-Chunks zusammenführen, bevor sie gesendet werden. Das reduziert „Einzelzeilen-Spam“ und liefert trotzdem eine schrittweise Ausgabe.- Coalescing wartet vor dem Flushen auf Leerlauf-Lücken (
idleMs). - Puffer sind durch
maxCharsbegrenzt und werden geflusht, wenn sie diesen Wert überschreiten. minCharsverhindert, dass winzige Fragmente gesendet werden, bevor genug Text zusammenkommt (der abschließende Flush sendet immer den restlichen Text).- Der Verknüpfer wird aus
blockStreamingChunk.breakPreferenceabgeleitet (paragraph→\n\n,newline→\n,sentence→ Leerzeichen). - Kanalüberschreibungen sind über
*.blockStreamingCoalesceverfügbar (einschließlich Konfigurationen pro Konto). - Das standardmäßige Coalesce-
minCharswird für Signal/Slack/Discord auf 1500 erhöht, sofern nicht überschrieben.
Menschlich wirkendes Timing zwischen Blöcken
Wenn Block-Streaming aktiviert ist, können Sie eine zufällige Pause zwischen Blockantworten hinzufügen (nach dem ersten Block). Dadurch wirken Antworten mit mehreren Blasen natürlicher.- Konfiguration:
agents.defaults.humanDelay(Überschreibung pro Agent überagents.list[].humanDelay). - Modi:
off(Standard),natural(800–2500ms),custom(minMs/maxMs). - Gilt nur für Blockantworten, nicht für endgültige Antworten oder Tool-Zusammenfassungen.
”Chunks streamen oder alles”
Dies wird wie folgt zugeordnet:- Chunks streamen:
blockStreamingDefault: "on"+blockStreamingBreak: "text_end"(während der Ausgabe senden). Nicht-Telegram-Kanäle benötigen zusätzlich*.blockStreaming: true. - Alles am Ende streamen:
blockStreamingBreak: "message_end"(einmal flushen, möglicherweise mehrere Chunks, wenn sehr lang). - Kein Block-Streaming:
blockStreamingDefault: "off"(nur endgültige Antwort).
*.blockStreaming explizit auf true gesetzt ist. Kanäle können eine Live-Vorschau
(channels.<channel>.streaming) streamen, ohne Blockantworten zu senden.
Zur Erinnerung zum Konfigurationsort: Die blockStreaming*-Standards befinden sich unter
agents.defaults, nicht in der Root-Konfiguration.
Vorschau-Streaming-Modi
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, endgültige Antwort nach Abschluss.
Kanalzuordnung
| Kanal | off | partial | block | progress |
|---|---|---|---|---|
| Telegram | ✅ | ✅ | ✅ | wird partial zugeordnet |
| Discord | ✅ | ✅ | ✅ | wird partial zugeordnet |
| Slack | ✅ | ✅ | ✅ | ✅ |
channels.slack.streaming.nativeTransportschaltet Slack-native Streaming-API-Aufrufe um, wennchannels.slack.streaming.mode="partial"(Standard:true).- Slack-natives Streaming und der Slack-Assistent-Thread-Status erfordern ein Antwort-Thread-Ziel; DMs auf oberster Ebene zeigen diese Thread-Vorschau nicht an.
- Telegram:
streamMode+ booleschesstreamingwerden automatisch zurstreaming-Enum migriert. - Discord:
streamMode+ booleschesstreamingwerden automatisch zurstreaming-Enum migriert. - Slack:
streamModewird automatisch zustreaming.modemigriert; booleschesstreamingwird automatisch zustreaming.modeplusstreaming.nativeTransportmigriert; Legacy-nativeStreamingwird automatisch zustreaming.nativeTransportmigriert.
Laufzeitverhalten
Telegram:- Verwendet
sendMessage+editMessageTextfür Vorschau-Aktualisierungen in DMs sowie Gruppen/Themen. - Vorschau-Streaming wird übersprungen, wenn Telegram-Block-Streaming explizit aktiviert ist (um doppeltes Streaming zu vermeiden).
/reasoning streamkann Reasoning in die Vorschau schreiben.
- Verwendet Vorschau-Nachrichten mit Senden + Bearbeiten.
- Der Modus
blockverwendet Draft-Chunking (draftChunk). - Vorschau-Streaming wird übersprungen, wenn Discord-Block-Streaming explizit aktiviert ist.
partialkann Slack-natives Streaming (chat.startStream/append/stop) verwenden, wenn verfügbar.blockverwendet Vorschauen im Anhänge-Stil für Entwürfe.progressverwendet Statusvorschautext und danach die endgültige Antwort.
Verwandt
- Nachrichten — Nachrichtenlebenszyklus und Zustellung
- Wiederholung — Wiederholungsverhalten bei Zustellungsfehlern
- Kanäle — Streaming-Unterstützung pro Kanal