البث + التجزئة
يحتوي OpenClaw على طبقتين منفصلتين للبث:- بث الكتل (القنوات): إصدار كتل مكتملة أثناء كتابة المساعد. وهذه رسائل قنوات عادية (وليست فروق رموز token deltas).
- بث المعاينة (Telegram/Discord/Slack): تحديث رسالة معاينة مؤقتة أثناء التوليد.
بث الكتل (رسائل القنوات)
يرسل بث الكتل مخرجات المساعد على شكل أجزاء كبيرة نسبيًا عندما تصبح متاحة.text_delta/events: أحداث تدفق النموذج (وقد تكون متفرقة في النماذج غير المتدفقة).chunker: EmbeddedBlockChunkerالذي يطبق حدودًا دنيا/عليا + تفضيل نقاط الانقطاع.channel send: الرسائل الصادرة الفعلية (ردود الكتل).
agents.defaults.blockStreamingDefault: "on"/"off"(الافتراضي off).- تجاوزات القنوات:
*.blockStreaming(ومتغيرات لكل حساب) لفرض"on"/"off"لكل قناة. agents.defaults.blockStreamingBreak: "text_end"أو"message_end".agents.defaults.blockStreamingChunk: { minChars, maxChars, breakPreference? }.agents.defaults.blockStreamingCoalesce: { minChars?, maxChars?, idleMs? }(دمج الكتل المتدفقة قبل الإرسال).- الحد الصارم للقناة:
*.textChunkLimit(مثلchannels.whatsapp.textChunkLimit). - وضع تجزئة القناة:
*.chunkMode(lengthافتراضيًا، وnewlineيقسم عند الأسطر الفارغة (حدود الفقرات) قبل التجزئة حسب الطول). - الحد المرن لـ Discord:
channels.discord.maxLinesPerMessage(الافتراضي 17) يقسم الردود الطويلة رأسيًا لتجنب قص واجهة المستخدم.
text_end: بث الكتل بمجرد أن يصدرها chunker؛ والتفريغ عند كلtext_end.message_end: الانتظار حتى تنتهي رسالة المساعد، ثم تفريغ المخرجات المخزنة.
message_end أيضًا chunker إذا تجاوز النص المخزن maxChars، لذلك يمكنه إصدار عدة أجزاء في النهاية.
خوارزمية التجزئة (الحدود الدنيا/العليا)
تُنفَّذ تجزئة الكتل بواسطةEmbeddedBlockChunker:
- الحد الأدنى: لا تُصدر شيئًا حتى يصبح المخزن >=
minChars(ما لم يكن ذلك إجباريًا). - الحد الأعلى: يُفضَّل التقسيم قبل
maxChars؛ وإذا كان ذلك إجباريًا، فيتم التقسيم عندmaxChars. - تفضيل نقطة الانقطاع:
paragraph→newline→sentence→whitespace→ انقطاع صارم. - أسوار الشيفرة: لا يتم أبدًا التقسيم داخل الأسوار؛ وعند الإجبار عند
maxChars، يتم إغلاق السياج ثم إعادة فتحه للحفاظ على صحة Markdown.
maxChars بحد textChunkLimit الخاص بالقناة، لذلك لا يمكنك تجاوز الحدود الخاصة بكل قناة.
الدمج (دمج الكتل المتدفقة)
عند تفعيل بث الكتل، يمكن لـ OpenClaw دمج أجزاء الكتل المتتالية قبل إرسالها. ويقلل هذا من “إزعاج الأسطر المفردة” مع الاستمرار في توفير مخرجات تدريجية.- ينتظر الدمج فجوات الخمول (
idleMs) قبل التفريغ. - تُحدَّد المخازن بـ
maxCharsوسيتم تفريغها إذا تجاوزته. - يمنع
minCharsإرسال الأجزاء الصغيرة جدًا حتى يتراكم مقدار كافٍ من النص (ويُرسل التفريغ النهائي دائمًا النص المتبقي). - يُشتق الموصل من
blockStreamingChunk.breakPreference(paragraph→\n\n،newline→\n،sentence→ مسافة). - تتوفر تجاوزات القنوات عبر
*.blockStreamingCoalesce(بما في ذلك إعدادات لكل حساب). - يتم رفع القيمة الافتراضية لـ coalesce
minCharsإلى 1500 في Signal/Slack/Discord ما لم يتم تجاوزها.
الإيقاع الشبيه بالبشر بين الكتل
عند تفعيل بث الكتل، يمكنك إضافة توقف عشوائي بين ردود الكتل (بعد الكتلة الأولى). وهذا يجعل الردود متعددة الفقاعات تبدو أكثر طبيعية.- الإعداد:
agents.defaults.humanDelay(يمكن تجاوزه لكل وكيل عبرagents.list[].humanDelay). - الأوضاع:
off(الافتراضي)،natural(800–2500ms)،custom(minMs/maxMs). - ينطبق فقط على ردود الكتل، وليس الردود النهائية أو ملخصات الأدوات.
”بث الأجزاء أم كل شيء”
يُربط هذا إلى:- بث الأجزاء:
blockStreamingDefault: "on"+ blockStreamingBreak: "text_end"(إصدار أثناء التقدم). كما تحتاج القنوات غير Telegram أيضًا إلى*.blockStreaming: true. - بث كل شيء في النهاية:
blockStreamingBreak: "message_end"(تفريغ مرة واحدة، وربما عدة أجزاء إذا كان طويلًا جدًا). - لا يوجد بث كتل:
blockStreamingDefault: "off"(الرد النهائي فقط).
*.blockStreaming صراحةً على true. ويمكن للقنوات بث معاينة مباشرة
(channels.<channel>.streaming) من دون ردود كتل.
تذكير بموقع الإعداد: توجد القيم الافتراضية blockStreaming* تحت
agents.defaults، وليس في جذر الإعداد.
أوضاع بث المعاينة
المفتاح الأساسي:channels.<channel>.streaming
الأوضاع:
off: تعطيل بث المعاينة.partial: معاينة واحدة يتم استبدالها بأحدث نص.block: تحديثات معاينة مجزأة/ملحقة.progress: معاينة تقدم/حالة أثناء التوليد، ثم الإجابة النهائية عند الاكتمال.
ربط القنوات
| القناة | off | partial | block | progress |
|---|---|---|---|---|
| Telegram | ✅ | ✅ | ✅ | يُربط إلى partial |
| Discord | ✅ | ✅ | ✅ | يُربط إلى partial |
| Slack | ✅ | ✅ | ✅ | ✅ |
- يبدّل
channels.slack.nativeStreamingاستدعاءات API الخاصة بالبث الأصلي في Slack عندما تكونstreaming=partial(الافتراضي:true).
- Telegram: تتم الترحيل التلقائي لـ
streamModeوbooleanstreamingإلى enumstreaming. - Discord: تتم الترحيل التلقائي لـ
streamModeوbooleanstreamingإلى enumstreaming. - Slack: تتم الترحيل التلقائي لـ
streamModeإلى enumstreaming؛ وتتم الترحيل التلقائي لـ booleanstreamingإلىnativeStreaming.
سلوك وقت التشغيل
Telegram:- يستخدم
sendMessage+editMessageTextلتحديثات المعاينة عبر الرسائل المباشرة والمجموعات/الموضوعات. - يتم تخطي بث المعاينة عندما يكون بث كتل Telegram مفعّلًا صراحةً (لتجنب البث المزدوج).
- يمكن لـ
/reasoning streamكتابة الاستدلال في المعاينة.
- يستخدم رسائل معاينة من نوع send + edit.
- يستخدم وضع
blockتجزئة المسودة (draftChunk). - يتم تخطي بث المعاينة عندما يكون بث كتل Discord مفعّلًا صراحةً.
- يمكن أن يستخدم
partialالبث الأصلي في Slack (chat.startStream/append/stop) عندما يكون متاحًا. - يستخدم
blockمعاينات مسودة بنمط الإلحاق. - يستخدم
progressنص معاينة للحالة، ثم الإجابة النهائية.
ذو صلة
- الرسائل — دورة حياة الرسالة وتسليمها
- إعادة المحاولة — سلوك إعادة المحاولة عند فشل التسليم
- القنوات — دعم البث لكل قناة