Messages and delivery
Streaming en opdelen in segmenten
OpenClaw heeft twee afzonderlijke streaminglagen:
- Blokstreaming (kanalen): emit voltooide blokken terwijl de assistent schrijft. Dit zijn normale kanaalberichten (geen token-delta's).
- Previewstreaming (Telegram/Discord/Slack): werk een tijdelijk previewbericht bij tijdens het genereren.
Er is vandaag geen echte token-delta-streaming naar kanaalberichten. Previewstreaming is berichtgebaseerd (verzenden + bewerkingen/toevoegingen).
Blokstreaming (kanaalberichten)
Blokstreaming verzendt assistentuitvoer in grove chunks zodra die beschikbaar komt.
Model output
└─ text_delta/events
├─ (blockStreamingBreak=text_end)
│ └─ chunker emits blocks as buffer grows
└─ (blockStreamingBreak=message_end)
└─ chunker flushes at message_end
└─ channel send (block replies)
Legenda:
text_delta/events: modelstreamgebeurtenissen (kunnen schaars zijn voor niet-streamende modellen).chunker:EmbeddedBlockChunkerdie min/max-grenzen + breukvoorkeur toepast.channel send: daadwerkelijke uitgaande berichten (blokantwoorden).
Bedieningselementen:
agents.defaults.blockStreamingDefault:"on"/"off"(standaard uit).- Kanaaloverschrijvingen:
*.blockStreaming(en varianten per account) om"on"/"off"per kanaal te forceren. agents.defaults.blockStreamingBreak:"text_end"of"message_end".agents.defaults.blockStreamingChunk:{ minChars, maxChars, breakPreference? }.agents.defaults.blockStreamingCoalesce:{ minChars?, maxChars?, idleMs? }(voeg gestreamde blokken samen vóór verzending).- Harde kanaallimiet:
*.textChunkLimit(bijv.channels.whatsapp.textChunkLimit). - Kanaalchunkmodus:
*.chunkMode(lengthstandaard,newlinesplitst op lege regels (alineagrenzen) vóór chunking op lengte). - Zachte Discord-limiet:
channels.discord.maxLinesPerMessage(standaard 17) splitst hoge antwoorden om UI-afkapping te voorkomen.
Grenssemantiek:
text_end: stream blokken zodra de chunker emit; flush bij elketext_end.message_end: wacht tot het assistentbericht klaar is en flush daarna de gebufferde uitvoer.
message_end gebruikt nog steeds de chunker als de gebufferde tekst maxChars overschrijdt, dus kan het aan het einde meerdere chunks emitten.
Medialevering met blokstreaming
MEDIA:-directieven zijn normale leveringsmetadata. Wanneer blokstreaming vroeg een
mediablok verzendt, onthoudt OpenClaw die levering voor de beurt. Als de definitieve
assistentpayload dezelfde media-URL herhaalt, verwijdert de definitieve levering de
dubbele media in plaats van de bijlage opnieuw te verzenden.
Exact dubbele definitieve payloads worden onderdrukt. Als de definitieve payload
onderscheidende tekst toevoegt rond media die al was gestreamd, verzendt OpenClaw nog steeds de
nieuwe tekst terwijl de media slechts één keer wordt geleverd. Dit voorkomt dubbele spraaknotities
of bestanden op kanalen zoals Telegram wanneer een agent MEDIA: emit tijdens
streaming en de provider deze ook opneemt in het voltooide antwoord.
Chunkingalgoritme (lage/hoge grenzen)
Blokchunking wordt geïmplementeerd door EmbeddedBlockChunker:
- Lage grens: emit niet totdat buffer >=
minChars(tenzij geforceerd). - Hoge grens: geef de voorkeur aan splitsingen vóór
maxChars; als geforceerd, splits opmaxChars. - Breukvoorkeur:
paragraph→newline→sentence→whitespace→ harde breuk. - Code fences: splits nooit binnen fences; wanneer geforceerd op
maxChars, sluit + heropen de fence om Markdown geldig te houden.
maxChars wordt begrensd tot de kanaal-textChunkLimit, dus je kunt limieten per kanaal niet overschrijden.
Coalescing (gestreamde blokken samenvoegen)
Wanneer blokstreaming is ingeschakeld, kan OpenClaw opeenvolgende blokchunks samenvoegen voordat ze worden verzonden. Dit vermindert "single-line spam" terwijl nog steeds progressieve uitvoer wordt geleverd.
- Coalescing wacht op inactieve intervallen (
idleMs) voordat er wordt geflusht. - Buffers worden begrensd door
maxCharsen worden geflusht als ze die overschrijden. minCharsvoorkomt dat kleine fragmenten worden verzonden totdat genoeg tekst is verzameld (definitieve flush verzendt altijd resterende tekst).- Joiner wordt afgeleid van
blockStreamingChunk.breakPreference(paragraph→\n\n,newline→\n,sentence→ spatie). - Kanaaloverschrijvingen zijn beschikbaar via
*.blockStreamingCoalesce(inclusief configuraties per account). - Standaard coalesce-
minCharswordt verhoogd naar 1500 voor Signal/Slack/Discord tenzij overschreven.
Mensachtig tempo tussen blokken
Wanneer blokstreaming is ingeschakeld, kun je een gerandomiseerde pauze toevoegen tussen blokantwoorden (na het eerste blok). Daardoor voelen antwoorden met meerdere bubbels natuurlijker aan.
- Configuratie:
agents.defaults.humanDelay(per agent overschrijven viaagents.list[].humanDelay). - Modi:
off(standaard),natural(800-2500ms),custom(minMs/maxMs). - Geldt alleen voor blokantwoorden, niet voor definitieve antwoorden of toolsamenvattingen.
"Chunks streamen of alles"
Dit komt overeen met:
- Chunks streamen:
blockStreamingDefault: "on"+blockStreamingBreak: "text_end"(emit terwijl je bezig bent). Niet-Telegram-kanalen hebben ook*.blockStreaming: truenodig. - Alles aan het einde streamen:
blockStreamingBreak: "message_end"(één keer flushen, mogelijk meerdere chunks als het erg lang is). - Geen blokstreaming:
blockStreamingDefault: "off"(alleen definitief antwoord).
Kanaalnotitie: Blokstreaming is uit tenzij
*.blockStreaming expliciet is ingesteld op true. Kanalen kunnen een live preview streamen
(channels.<channel>.streaming) zonder blokantwoorden.
Herinnering aan configuratielocatie: de blockStreaming*-standaarden staan onder
agents.defaults, niet in de rootconfiguratie.
Previewstreamingmodi
Canonieke sleutel: channels.<channel>.streaming
Modi:
off: schakel previewstreaming uit.partial: één preview die wordt vervangen door de nieuwste tekst.block: preview wordt bijgewerkt in gechunkte/toegevoegde stappen.progress: voortgangs-/statuspreview tijdens generatie, definitief antwoord bij voltooiing.
streaming.mode: "block" is een previewstreamingmodus voor kanalen die bewerkingen ondersteunen,
zoals Discord en Telegram. Het schakelt daar geen kanaalbloklevering in.
Gebruik streaming.block.enabled of de legacy kanaalsleutel blockStreaming wanneer
je normale blokantwoorden wilt. Microsoft Teams is de uitzondering: het heeft geen
draft-preview-bloktransport, dus streaming.mode: "block" wordt gekoppeld aan Teams-bloklevering
in plaats van native gedeeltelijke/voortgangsstreaming.
Kanaalkoppeling
| Kanaal | off |
partial |
block |
progress |
|---|---|---|---|---|
| Telegram | ✅ | ✅ | ✅ | bewerkbare voortgangsdraft |
| Discord | ✅ | ✅ | ✅ | bewerkbare voortgangsdraft |
| Slack | ✅ | ✅ | ✅ | ✅ |
| Mattermost | ✅ | ✅ | ✅ | ✅ |
| MS Teams | ✅ | ✅ | ✅ | native voortgangsstream |
Alleen Slack:
channels.slack.streaming.nativeTransportschakelt Slack native streaming-API-aanroepen in of uit wanneerchannels.slack.streaming.mode="partial"(standaard:true).- Slack native streaming en Slack-assistentthreadstatus vereisen een doel voor antwoordthread. Top-level DM's tonen die threadachtige preview niet, maar kunnen nog steeds Slack-draftpreviewposts en bewerkingen gebruiken.
Migratie van legacy sleutel:
- Telegram: legacy
streamModeen scalaire/booleaansestreaming-waarden worden gedetecteerd en gemigreerd door doctor-/configcompatibiliteitspaden naarstreaming.mode. - Discord:
streamMode+ booleaansestreamingblijven runtime-aliassen voor destreaming-enum; voeropenclaw doctor --fixuit om persistente configuratie te herschrijven. - Slack:
streamModeblijft een runtime-alias voorstreaming.mode; booleaansestreamingblijft een runtime-alias voorstreaming.modeplusstreaming.nativeTransport; legacynativeStreamingblijft een runtime-alias voorstreaming.nativeTransport. Voeropenclaw doctor --fixuit om persistente configuratie te herschrijven.
Runtimegedrag
Telegram:
- Gebruikt
sendMessage+editMessageText-previewupdates in DM's en groepen/topics. - Definitieve tekst bewerkt de actieve preview ter plekke; lange definitieve antwoorden hergebruiken dat bericht voor de eerste chunk en verzenden alleen de resterende chunks.
progress-modus houdt toolvoortgang bij in een bewerkbare statusdraft, wist die draft bij voltooiing en verzendt het definitieve antwoord via normale levering.- Als de definitieve bewerking mislukt voordat de voltooide tekst is bevestigd, gebruikt OpenClaw normale definitieve levering en ruimt het de verouderde preview op.
- Previewstreaming wordt overgeslagen wanneer Telegram-blokstreaming expliciet is ingeschakeld (om dubbel streamen te voorkomen).
/reasoning streamkan redenering schrijven naar een tijdelijke preview die na definitieve levering wordt verwijderd.
Discord:
- Gebruikt verzenden + bewerken van previewberichten.
block-modus gebruikt draftchunking (draftChunk).- Previewstreaming wordt overgeslagen wanneer Discord-blokstreaming expliciet is ingeschakeld.
- Definitieve media-, fout- en expliciete-antwoordpayloads annuleren wachtende previews zonder een nieuwe draft te flushen en gebruiken daarna normale levering.
Slack:
partialkan Slack native streaming (chat.startStream/append/stop) gebruiken wanneer beschikbaar.blockgebruikt append-achtige draftpreviews.progressgebruikt statuspreviewtekst, daarna het definitieve antwoord.- Top-level DM's zonder antwoordthread gebruiken draftpreviewposts en bewerkingen in plaats van Slack native streaming.
- Native en draftpreviewstreaming onderdrukken blokantwoorden voor die beurt, zodat een Slack-antwoord slechts via één leveringspad wordt gestreamd.
- Definitieve media-/foutpayloads en voortgangsdefinitieven maken geen wegwerp-draftberichten aan; alleen tekst-/blokdefinitieven die de preview kunnen bewerken, flushen wachtende drafttekst.
Mattermost:
- Streamt denken, toolactiviteit en gedeeltelijke antwoordtekst naar één draftpreviewpost die ter plekke definitief wordt gemaakt wanneer het definitieve antwoord veilig kan worden verzonden.
- Valt terug op het verzenden van een nieuwe definitieve post als de previewpost is verwijderd of anderszins niet beschikbaar is op het moment van definitief maken.
- Definitieve media-/foutpayloads annuleren wachtende previewupdates vóór normale levering in plaats van een tijdelijke previewpost te flushen.
Matrix:
- Draftpreviews worden ter plekke definitief gemaakt wanneer de definitieve tekst de previewgebeurtenis kan hergebruiken.
- Alleen-media-, fout- en antwoorddoel-mismatchdefinitieven annuleren wachtende previewupdates vóór normale levering; een al zichtbare verouderde preview wordt geredacteerd.
Previewupdates voor toolvoortgang
Previewstreaming kan ook toolvoortgangs-updates bevatten - korte statusregels zoals "zoeken op het web", "bestand lezen" of "tool aanroepen" - die in hetzelfde previewbericht verschijnen terwijl tools worden uitgevoerd, vóór het definitieve antwoord. Dit houdt toolbeurten met meerdere stappen visueel levend in plaats van stil tussen de eerste denkpreview en het definitieve antwoord.
Ondersteunde oppervlakken:
- Discord, Slack, Telegram en Matrix streamen standaard toolvoortgang naar de live voorvertoningsbewerking wanneer previewstreaming actief is. Microsoft Teams gebruikt zijn native voortgangsstream in persoonlijke chats.
- Telegram wordt sinds
v2026.4.22geleverd met ingeschakelde updates voor toolvoortgang in de voorvertoning; door ze ingeschakeld te houden blijft dat uitgebrachte gedrag behouden. - Mattermost neemt toolactiviteit al op in zijn ene conceptvoorvertoningsbericht (zie hierboven).
- Bewerkingen voor toolvoortgang volgen de actieve previewstreamingmodus; ze worden overgeslagen wanneer previewstreaming
offis of wanneer blokstreaming het bericht heeft overgenomen. In Telegram betekentstreaming.mode: "off"alleen definitief: algemene voortgangsberichten worden ook onderdrukt in plaats van als zelfstandige statusberichten te worden geleverd, terwijl goedkeuringsprompts, media-payloads en fouten nog steeds normaal worden gerouteerd. - Om previewstreaming te behouden maar regels voor toolvoortgang te verbergen, stel je
streaming.preview.toolProgressvoor dat kanaal in opfalse. Om regels voor toolvoortgang zichtbaar te houden terwijl opdracht-/exec-tekst wordt verborgen, stel jestreaming.preview.commandTextin op"status"ofstreaming.progress.commandTextop"status"; de standaardwaarde is"raw"om uitgebracht gedrag te behouden. Dit beleid wordt gedeeld door concept-/voortgangskanalen die OpenClaws compacte voortgangsrenderer gebruiken, waaronder Discord, Matrix, Microsoft Teams, Mattermost, Slack-conceptvoorvertoningen en Telegram. Om voorvertoningsbewerkingen volledig uit te schakelen, stel jestreaming.modein opoff. - Geselecteerde citaatantwoorden in Telegram vormen een uitzondering: wanneer
replyToModeniet"off"is en geselecteerde citaattekst aanwezig is, slaat OpenClaw de antwoordvoorvertoningsstream voor die beurt over, zodat regels voor toolvoortgang in de voorvertoning niet kunnen renderen. Antwoorden op het huidige bericht zonder geselecteerde citaattekst behouden previewstreaming nog steeds. Zie de Telegram-kanaaldocumentatie voor details.
Houd voortgangsregels zichtbaar maar verberg ruwe opdracht-/exec-tekst:
{
"channels": {
"telegram": {
"streaming": {
"mode": "partial",
"preview": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
Gebruik dezelfde vorm onder een andere compacte voortgangskanaalsleutel, bijvoorbeeld channels.discord, channels.matrix, channels.msteams, channels.mattermost, of Slack-conceptvoorvertoningen. Zet voor de voortgangsconceptmodus hetzelfde beleid onder streaming.progress:
{
"channels": {
"telegram": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
Gerelateerd
- Refactor van berichtlevenscyclus - doelontwerp voor gedeelde voorvertoning, bewerking, stream en finalisatie
- Voortgangsconcepten - zichtbare berichten over werk in uitvoering die tijdens lange beurten worden bijgewerkt
- Berichten - berichtlevenscyclus en levering
- Opnieuw proberen - gedrag voor opnieuw proberen bij leveringsfouten
- Kanalen - streamingondersteuning per kanaal