Akış + parçalama
OpenClaw iki ayrı akış katmanına sahiptir:- Blok akışı (kanallar): assistant yazarken tamamlanmış blokları yayar. Bunlar normal kanal mesajlarıdır (token deltaları değildir).
- Önizleme akışı (Telegram/Discord/Slack): oluşturma sırasında geçici bir önizleme mesajını günceller.
Blok akışı (kanal mesajları)
Blok akışı, kullanılabilir oldukça assistant çıktısını kaba parçalar halinde gönderir.text_delta/events: model akış olaylarıdır (akışsız modeller için seyrek olabilir).chunker: min/maks sınırlar + kırma tercihi uygulayanEmbeddedBlockChunker.channel send: gerçek giden mesajlar (blok yanıtları).
agents.defaults.blockStreamingDefault:"on"/"off"(varsayılan kapalı).- Kanal geçersiz kılmaları: kanal başına
"on"/"off"zorlamak için*.blockStreaming(ve hesap başına varyantlar). agents.defaults.blockStreamingBreak:"text_end"veya"message_end".agents.defaults.blockStreamingChunk:{ minChars, maxChars, breakPreference? }.agents.defaults.blockStreamingCoalesce:{ minChars?, maxChars?, idleMs? }(göndermeden önce akış bloklarını birleştirir).- Kanal katı üst sınırı:
*.textChunkLimit(ör.channels.whatsapp.textChunkLimit). - Kanal parçalama kipi:
*.chunkMode(lengthvarsayılan,newlineuzunluğa göre parçalamadan önce boş satırlarda bölünür (paragraf sınırları)). - Discord yumuşak üst sınırı:
channels.discord.maxLinesPerMessage(varsayılan 17), arayüz kırpmasını önlemek için uzun yanıtları böler.
text_end: chunker üretir üretmez blokları akıt; hertext_endüzerinde flush yap.message_end: assistant mesajı bitene kadar bekle, sonra tamponlanan çıktıyı flush et.
maxChars değerini aşarsa message_end yine chunker kullanır; bu nedenle sonda birden fazla parça yayabilir.
Parçalama algoritması (alt/üst sınırlar)
Blok parçalamaEmbeddedBlockChunker tarafından uygulanır:
- Alt sınır: tampon >=
minCharsolana kadar yayma (zorlanmadıkça). - Üst sınır: bölmeleri
maxCharsöncesinde tercih et; zorlanırsamaxCharsdeğerinde böl. - Kırma tercihi:
paragraph→newline→sentence→whitespace→ sert kırma. - Kod çitleri: çitlerin içinde asla bölme;
maxCharsdeğerinde zorlandığında Markdown geçerliliğini korumak için çiti kapat + yeniden aç.
maxChars, kanal textChunkLimit değerine sıkıştırılır; böylece kanal başına sınırları aşamazsınız.
Birleştirme (akış bloklarını birleştirme)
Blok akışı etkin olduğunda, OpenClaw ardışık blok parçalarını göndermeden önce birleştirebilir. Bu, ilerlemeli çıktı sağlamaya devam ederken “tek satırlık spam”i azaltır.- Birleştirme, flush yapmadan önce boşta kalma aralıklarını (
idleMs) bekler. - Tamponlar
maxCharsile sınırlandırılır ve bu sınırı aşarlarsa flush edilir. minChars, yeterli metin birikene kadar küçük parçaların gönderilmesini önler (son flush her zaman kalan metni gönderir).- Birleştirici,
blockStreamingChunk.breakPreferencedeğerinden türetilir (paragraph→\n\n,newline→\n,sentence→ boşluk). - Kanal geçersiz kılmaları
*.blockStreamingCoalescearacılığıyla kullanılabilir (hesap başına config’ler dahil). - Varsayılan birleştirme
minChars, geçersiz kılınmadıkça Signal/Slack/Discord için 1500’e yükseltilir.
Bloklar arasında insan benzeri tempo
Blok akışı etkin olduğunda, blok yanıtları arasında (ilk bloktan sonra) rastgeleleştirilmiş bir duraklama ekleyebilirsiniz. Bu, çoklu baloncuk yanıtlarının daha doğal hissettirmesini sağlar.- Config:
agents.defaults.humanDelay(ajan başınaagents.list[].humanDelayile geçersiz kılınabilir). - Kipler:
off(varsayılan),natural(800–2500ms),custom(minMs/maxMs). - Yalnızca blok yanıtlarına uygulanır, son yanıtlara veya araç özetlerine uygulanmaz.
”Parçaları akıt veya her şeyi”
Bu, şu anlama gelir:- Parçaları akıt:
blockStreamingDefault: "on"+blockStreamingBreak: "text_end"(ilerledikçe yay). Telegram dışındaki kanallarda ayrıca*.blockStreaming: truegerekir. - Her şeyi sonda akıt:
blockStreamingBreak: "message_end"(bir kez flush yapar, çok uzunsa yine birden fazla parça olabilir). - Blok akışı yok:
blockStreamingDefault: "off"(yalnızca son yanıt).
*.blockStreaming açıkça true
olarak ayarlanmadıkça blok akışı kapalıdır. Kanallar blok yanıtları olmadan da canlı önizleme
(channels.<channel>.streaming) akıtabilir.
Config konumu hatırlatması: blockStreaming* varsayılanları kök config altında değil,
agents.defaults altında bulunur.
Önizleme akışı kipleri
Kurallı anahtar:channels.<channel>.streaming
Kipler:
off: önizleme akışını devre dışı bırak.partial: en son metinle değiştirilen tek bir önizleme.block: parçalanmış/eklenmiş adımlarla önizleme güncellemeleri.progress: oluşturma sırasında ilerleme/durum önizlemesi, tamamlandığında son yanıt.
Kanal eşleme
| Kanal | off | partial | block | progress |
|---|---|---|---|---|
| Telegram | ✅ | ✅ | ✅ | partial olarak eşlenir |
| Discord | ✅ | ✅ | ✅ | partial olarak eşlenir |
| Slack | ✅ | ✅ | ✅ | ✅ |
streaming=partialolduğundachannels.slack.nativeStreaming, Slack yerel akış API çağrılarını açıp kapatır (varsayılan:true).
- Telegram:
streamMode+ booleanstreaming, otomatik olarakstreamingenum’una geçirilir. - Discord:
streamMode+ booleanstreaming, otomatik olarakstreamingenum’una geçirilir. - Slack:
streamMode, otomatik olarakstreamingenum’una geçirilir; booleanstreaming, otomatik olaraknativeStreamingdeğerine geçirilir.
Çalışma zamanı davranışı
Telegram:- DM’ler ve grup/konular genelinde
sendMessage+editMessageTextönizleme güncellemelerini kullanır. - Telegram blok akışı açıkça etkinleştirildiğinde önizleme akışı atlanır (çift akışı önlemek için).
/reasoning stream, önizlemeye akıl yürütme yazabilir.
- gönder + düzenle önizleme mesajları kullanır.
blockkipi taslak parçalama (draftChunk) kullanır.- Discord blok akışı açıkça etkinleştirildiğinde önizleme akışı atlanır.
partial, mevcut olduğunda Slack yerel akışını (chat.startStream/append/stop) kullanabilir.block, ekleme tarzı taslak önizlemeleri kullanır.progress, durum önizleme metni kullanır, ardından son yanıtı gönderir.
İlgili
- Mesajlar — mesaj yaşam döngüsü ve teslimat
- Yeniden deneme — teslimat başarısızlığında yeniden deneme davranışı
- Kanallar — kanal başına akış desteği