Streaming + chunking
OpenClaw memiliki dua lapisan streaming yang terpisah:- Block streaming (channel): mengirim blok yang sudah selesai saat asisten menulis. Ini adalah pesan channel biasa (bukan delta token).
- Preview streaming (Telegram/Discord/Slack): memperbarui pesan preview sementara selama proses pembuatan.
Block streaming (pesan channel)
Block streaming mengirim output asisten dalam potongan besar saat tersedia.text_delta/events: event stream model (bisa jarang untuk model non-streaming).chunker:EmbeddedBlockChunkeryang menerapkan batas min/maks + preferensi pemisahan.channel send: pesan keluar yang sebenarnya (balasan blok).
agents.defaults.blockStreamingDefault:"on"/"off"(default off).- Override channel:
*.blockStreaming(dan varian per akun) untuk memaksa"on"/"off"per channel. agents.defaults.blockStreamingBreak:"text_end"atau"message_end".agents.defaults.blockStreamingChunk:{ minChars, maxChars, breakPreference? }.agents.defaults.blockStreamingCoalesce:{ minChars?, maxChars?, idleMs? }(gabungkan blok yang di-stream sebelum dikirim).- Hard cap channel:
*.textChunkLimit(misalnya,channels.whatsapp.textChunkLimit). - Mode chunk channel:
*.chunkMode(lengthsebagai default,newlinememisahkan pada baris kosong (batas paragraf) sebelum chunking berdasarkan panjang). - Soft cap Discord:
channels.discord.maxLinesPerMessage(default 17) memisahkan balasan yang tinggi untuk menghindari pemotongan UI.
text_end: stream blok segera setelah chunker mengeluarkan hasil; flush pada setiaptext_end.message_end: tunggu hingga pesan asisten selesai, lalu flush output yang dibuffer.
message_end tetap menggunakan chunker jika teks dalam buffer melebihi maxChars, sehingga bisa mengeluarkan beberapa chunk di akhir.
Algoritma chunking (batas rendah/tinggi)
Block chunking diimplementasikan olehEmbeddedBlockChunker:
- Batas rendah: jangan emit sampai buffer >=
minChars(kecuali dipaksa). - Batas tinggi: prioritaskan pemisahan sebelum
maxChars; jika dipaksa, pisahkan dimaxChars. - Preferensi pemisahan:
paragraph→newline→sentence→whitespace→ hard break. - Code fence: jangan pernah memisahkan di dalam fence; ketika dipaksa di
maxChars, tutup + buka kembali fence agar Markdown tetap valid.
maxChars dijepit ke textChunkLimit channel, sehingga Anda tidak bisa melebihi batas per channel.
Coalescing (menggabungkan blok yang di-stream)
Saat block streaming diaktifkan, OpenClaw dapat menggabungkan block chunk yang berurutan sebelum mengirimkannya. Ini mengurangi “spam satu baris” sambil tetap memberikan output progresif.- Coalescing menunggu jeda idle (
idleMs) sebelum flush. - Buffer dibatasi oleh
maxCharsdan akan flush jika melebihinya. minCharsmencegah fragmen kecil dikirim sampai cukup banyak teks yang terkumpul (flush akhir selalu mengirim sisa teks).- Joiner diturunkan dari
blockStreamingChunk.breakPreference(paragraph→\n\n,newline→\n,sentence→ spasi). - Override channel tersedia melalui
*.blockStreamingCoalesce(termasuk konfigurasi per akun). - Default coalesce
minCharsdinaikkan menjadi 1500 untuk Signal/Slack/Discord kecuali dioverride.
Tempo seperti manusia di antara blok
Saat block streaming diaktifkan, Anda dapat menambahkan jeda acak di antara balasan blok (setelah blok pertama). Ini membuat respons multi-bubble terasa lebih alami.- Konfigurasi:
agents.defaults.humanDelay(override per agen melaluiagents.list[].humanDelay). - Mode:
off(default),natural(800–2500ms),custom(minMs/maxMs). - Hanya berlaku untuk balasan blok, bukan balasan akhir atau ringkasan tool.
”Stream chunks or everything”
Ini dipetakan ke:- Stream chunks:
blockStreamingDefault: "on"+blockStreamingBreak: "text_end"(emit sambil berjalan). Channel non-Telegram juga memerlukan*.blockStreaming: true. - Stream everything at end:
blockStreamingBreak: "message_end"(flush sekali, mungkin beberapa chunk jika sangat panjang). - No block streaming:
blockStreamingDefault: "off"(hanya balasan akhir).
*.blockStreaming secara eksplisit disetel ke true. Channel dapat men-stream preview langsung
(channels.<channel>.streaming) tanpa balasan blok.
Pengingat lokasi konfigurasi: default blockStreaming* berada di bawah
agents.defaults, bukan konfigurasi root.
Mode preview streaming
Kunci kanonis:channels.<channel>.streaming
Mode:
off: nonaktifkan preview streaming.partial: satu preview yang diganti dengan teks terbaru.block: preview diperbarui dalam langkah bertahap yang di-chunk/ditambahkan.progress: preview status/kemajuan selama pembuatan, jawaban akhir saat selesai.
Pemetaan channel
| Channel | off | partial | block | progress |
|---|---|---|---|---|
| Telegram | ✅ | ✅ | ✅ | dipetakan ke partial |
| Discord | ✅ | ✅ | ✅ | dipetakan ke partial |
| Slack | ✅ | ✅ | ✅ | ✅ |
channels.slack.nativeStreamingmengaktifkan/nonaktifkan panggilan API native streaming Slack ketikastreaming=partial(default:true).
- Telegram:
streamMode+ booleanstreamingdimigrasikan otomatis ke enumstreaming. - Discord:
streamMode+ booleanstreamingdimigrasikan otomatis ke enumstreaming. - Slack:
streamModedimigrasikan otomatis ke enumstreaming; booleanstreamingdimigrasikan otomatis kenativeStreaming.
Perilaku runtime
Telegram:- Menggunakan update preview
sendMessage+editMessageTextdi DM serta grup/topik. - Preview streaming dilewati ketika Telegram block streaming diaktifkan secara eksplisit (untuk menghindari streaming ganda).
/reasoning streamdapat menulis reasoning ke preview.
- Menggunakan pesan preview send + edit.
- Mode
blockmenggunakan draft chunking (draftChunk). - Preview streaming dilewati ketika Discord block streaming diaktifkan secara eksplisit.
partialdapat menggunakan API native streaming Slack (chat.startStream/append/stop) jika tersedia.blockmenggunakan preview draf bergaya append.progressmenggunakan teks preview status, lalu jawaban akhir.