البث + التقسيم إلى أجزاء
يحتوي OpenClaw على طبقتين منفصلتين للبث:- بث الكتل (القنوات): إرسال الكتل المكتملة أثناء كتابة المساعد. هذه رسائل قناة عادية (وليست فروق رموز مميزة).
- بث المعاينة (Telegram/Discord/Slack): تحديث رسالة معاينة مؤقتة أثناء الإنشاء.
بث الكتل (رسائل القنوات)
يرسل بث الكتل مخرجات المساعد على شكل أجزاء كبيرة نسبيًا عند توفرها.text_delta/events: أحداث تدفق النموذج (قد تكون متفرقة للنماذج غير الداعمة للبث).chunker: EmbeddedBlockChunkerالذي يطبق حدود الحد الأدنى/الأقصى + تفضيل نقاط الفصل.channel send: الرسائل الصادرة الفعلية (ردود الكتل).
agents.defaults.blockStreamingDefault: "on"/"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(بما في ذلك إعدادات كل حساب). - يتم رفع القيمة الافتراضية لـ
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.streaming.nativeTransportاستدعاءات واجهة Slack الأصلية للبث عندما يكونchannels.slack.streaming.mode="partial"(الافتراضي:true). - يتطلب البث الأصلي في Slack وحالة سلسلة مساعد Slack هدف سلسلة رد؛ فالرسائل المباشرة ذات المستوى الأعلى لا تُظهر تلك المعاينة بنمط السلسلة.
- Telegram: يتم ترحيل
streamModeوالقيمة المنطقيةstreamingتلقائيًا إلى التعدادstreaming. - Discord: يتم ترحيل
streamModeوالقيمة المنطقيةstreamingتلقائيًا إلى التعدادstreaming. - Slack: يتم ترحيل
streamModeتلقائيًا إلىstreaming.mode؛ ويتم ترحيل القيمة المنطقيةstreamingتلقائيًا إلىstreaming.modeبالإضافة إلىstreaming.nativeTransport؛ كما يتم ترحيل المفتاح القديمnativeStreamingتلقائيًا إلىstreaming.nativeTransport.
سلوك وقت التشغيل
Telegram:- يستخدم تحديثات معاينة
sendMessage+editMessageTextعبر الرسائل المباشرة والمجموعات/الموضوعات. - يتم تخطي بث المعاينة عندما يكون بث الكتل في Telegram مفعّلًا صراحةً (لتجنب البث المزدوج).
- يمكن لـ
/reasoning streamكتابة الاستدلال إلى المعاينة.
- يستخدم رسائل المعاينة بالإرسال ثم التعديل.
- يستخدم وضع
blockتقسيم المسودة إلى أجزاء (draftChunk). - يتم تخطي بث المعاينة عندما يكون بث الكتل في Discord مفعّلًا صراحةً.
- يمكن لوضع
partialاستخدام البث الأصلي في Slack (chat.startStream/append/stop) عند توفره. - يستخدم وضع
blockمعاينات مسودة بنمط الإلحاق. - يستخدم وضع
progressنص معاينة الحالة، ثم الإجابة النهائية.
ذو صلة
- الرسائل — دورة حياة الرسالة وتسليمها
- إعادة المحاولة — سلوك إعادة المحاولة عند فشل التسليم
- القنوات — دعم البث لكل قناة