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: EmbeddedBlockChunker die 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 (length standaard, newline splitst 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 elke text_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 op maxChars.
  • Breukvoorkeur: paragraphnewlinesentencewhitespace → 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 maxChars en worden geflusht als ze die overschrijden.
  • minChars voorkomt 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-minChars wordt 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 via agents.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: true nodig.
  • 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.nativeTransport schakelt Slack native streaming-API-aanroepen in of uit wanneer channels.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 streamMode en scalaire/booleaanse streaming-waarden worden gedetecteerd en gemigreerd door doctor-/configcompatibiliteitspaden naar streaming.mode.
  • Discord: streamMode + booleaanse streaming blijven runtime-aliassen voor de streaming-enum; voer openclaw doctor --fix uit om persistente configuratie te herschrijven.
  • Slack: streamMode blijft een runtime-alias voor streaming.mode; booleaanse streaming blijft een runtime-alias voor streaming.mode plus streaming.nativeTransport; legacy nativeStreaming blijft een runtime-alias voor streaming.nativeTransport. Voer openclaw doctor --fix uit 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 stream kan 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:

  • partial kan Slack native streaming (chat.startStream/append/stop) gebruiken wanneer beschikbaar.
  • block gebruikt append-achtige draftpreviews.
  • progress gebruikt 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.22 geleverd 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 off is of wanneer blokstreaming het bericht heeft overgenomen. In Telegram betekent streaming.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.toolProgress voor dat kanaal in op false. Om regels voor toolvoortgang zichtbaar te houden terwijl opdracht-/exec-tekst wordt verborgen, stel je streaming.preview.commandText in op "status" of streaming.progress.commandText op "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 je streaming.mode in op off.
  • Geselecteerde citaatantwoorden in Telegram vormen een uitzondering: wanneer replyToMode niet "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