Messages and delivery
البث والتقسيم إلى أجزاء
لدى OpenClaw طبقتان منفصلتان للبث:
- بث الكتل (القنوات): يصدر كتلاً مكتملة أثناء كتابة المساعد. هذه رسائل قناة عادية (وليست فروق رموز).
- بث المعاينة (Telegram/Discord/Slack): يحدّث رسالة معاينة مؤقتة أثناء التوليد.
لا يوجد اليوم بث حقيقي لفروق الرموز إلى رسائل القنوات. بث المعاينة قائم على الرسائل (إرسال + تعديلات/إلحاقات).
بث الكتل (رسائل القنوات)
يرسل بث الكتل مخرجات المساعد في أجزاء كبيرة نسبياً عند توفرها.
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)
المفتاح:
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: بث الكتل فور إصدارها من المقسّم؛ التفريغ عند كلtext_end.message_end: الانتظار حتى تنتهي رسالة المساعد، ثم تفريغ المخرجات المخزنة مؤقتاً.
لا يزال message_end يستخدم المقسّم إذا تجاوز النص المخزن مؤقتاً maxChars، لذلك يمكنه إصدار عدة أجزاء في النهاية.
تسليم الوسائط مع بث الكتل
توجيهات MEDIA: هي بيانات وصفية عادية للتسليم. عندما يرسل بث الكتل كتلة
وسائط مبكراً، يتذكر OpenClaw ذلك التسليم للدورة. إذا كررت حمولة المساعد
النهائية عنوان URL نفسه للوسائط، يزيل التسليم النهائي الوسائط المكررة بدلاً
من إرسال المرفق مرة أخرى.
تُحجب الحمولات النهائية المطابقة تماماً. إذا أضافت الحمولة النهائية نصاً
مميزاً حول وسائط بُثّت بالفعل، فسيظل OpenClaw يرسل النص الجديد مع إبقاء
الوسائط بتسليم واحد. يمنع هذا تكرار الملاحظات الصوتية أو الملفات على قنوات
مثل Telegram عندما يصدر وكيل MEDIA: أثناء البث ويضمّنه المزوّد أيضاً في
الرد المكتمل.
خوارزمية التجزئة (حدود منخفضة/مرتفعة)
تنفذ 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: معاينة تقدم/حالة أثناء التوليد، والإجابة النهائية عند الاكتمال.
streaming.mode: "block" هو وضع بث معاينة للقنوات القادرة على التعديل
مثل Discord وTelegram. لا يمكّن تسليم كتل القناة هناك.
استخدم streaming.block.enabled أو مفتاح القناة القديم blockStreaming عندما
تريد ردود كتل عادية. Microsoft Teams هو الاستثناء: ليست لديه
وسيلة نقل كتل لمعاينة المسودة، لذلك يناظر streaming.mode: "block" تسليم كتل Teams
بدلاً من البث الجزئي/التقدمي الأصلي.
تعيين القنوات
| القناة | off |
partial |
block |
progress |
|---|---|---|---|---|
| Telegram | ✅ | ✅ | ✅ | مسودة تقدم قابلة للتحرير |
| Discord | ✅ | ✅ | ✅ | مسودة تقدم قابلة للتحرير |
| Slack | ✅ | ✅ | ✅ | ✅ |
| Mattermost | ✅ | ✅ | ✅ | ✅ |
| MS Teams | ✅ | ✅ | ✅ | بث تقدم أصلي |
خاص بـ Slack فقط:
- يبدّل
channels.slack.streaming.nativeTransportاستدعاءات واجهة برمجة تطبيقات البث الأصلية في Slack عندchannels.slack.streaming.mode="partial"(الافتراضي:true). - يتطلب بث Slack الأصلي وحالة خيط مساعد Slack هدف خيط رد. لا تعرض الرسائل المباشرة من المستوى الأعلى تلك المعاينة بنمط الخيط، لكنها لا تزال تستطيع استخدام منشورات معاينة مسودة Slack وتعديلاتها.
ترحيل المفاتيح القديمة:
- Telegram: تُكتشف قيم
streamModeالقديمة وقيمstreamingالعددية/المنطقية وتُرحّل عبر مسارات توافق الطبيب/الإعداد إلىstreaming.mode. - Discord: يظل
streamMode+streamingالمنطقيان أسماء بديلة وقت التشغيل لتعدادstreaming؛ شغّلopenclaw doctor --fixلإعادة كتابة الإعداد المحفوظ. - Slack: يظل
streamModeاسماً بديلاً وقت التشغيل لـstreaming.mode؛ ويظلstreamingالمنطقي اسماً بديلاً وقت التشغيل لـstreaming.modeإضافةً إلىstreaming.nativeTransport؛ ويظلnativeStreamingالقديم اسماً بديلاً وقت التشغيل لـstreaming.nativeTransport. شغّلopenclaw doctor --fixلإعادة كتابة الإعداد المحفوظ.
سلوك وقت التشغيل
Telegram:
- يستخدم تحديثات معاينة
sendMessage+editMessageTextعبر الرسائل المباشرة والمجموعات/المواضيع. - يعدّل النص النهائي المعاينة النشطة في مكانها؛ وتعيد النهايات الطويلة استخدام تلك الرسالة للجزء الأول وترسل الأجزاء المتبقية فقط.
- يحافظ وضع
progressعلى تقدم الأدوات في مسودة حالة قابلة للتحرير، ويمسح تلك المسودة عند الاكتمال، ويرسل الإجابة النهائية عبر التسليم العادي. - إذا فشل التعديل النهائي قبل تأكيد النص المكتمل، يستخدم OpenClaw التسليم النهائي العادي وينظف المعاينة القديمة.
- يُتخطى بث المعاينة عند تمكين بث كتل Telegram صراحةً (لتجنب البث المزدوج).
- يمكن لـ
/reasoning streamكتابة الاستدلال إلى معاينة عابرة تُحذف بعد التسليم النهائي.
Discord:
- يستخدم رسائل معاينة إرسال + تعديل.
- يستخدم وضع
blockتجزئة المسودة (draftChunk). - يُتخطى بث المعاينة عند تمكين بث كتل Discord صراحةً.
- تلغي حمولات الوسائط النهائية، والخطأ، والرد الصريح المعاينات المعلقة دون تفريغ مسودة جديدة، ثم تستخدم التسليم العادي.
Slack:
- يمكن لـ
partialاستخدام بث Slack الأصلي (chat.startStream/append/stop) عند توفره. - يستخدم
blockمعاينات مسودة بنمط الإلحاق. - يستخدم
progressنص معاينة حالة، ثم الإجابة النهائية. - تستخدم الرسائل المباشرة من المستوى الأعلى دون خيط رد منشورات معاينة مسودة وتعديلات بدلاً من بث Slack الأصلي.
- يمنع بث المعاينة الأصلي وبث مسودات المعاينة ردود الكتل لتلك الدورة، لذلك يُبث رد Slack عبر مسار تسليم واحد فقط.
- لا تنشئ حمولات الوسائط/الأخطاء النهائية ونهايات التقدم رسائل مسودة مؤقتة؛ فقط النهايات النصية/الكتلية التي يمكنها تعديل المعاينة تفرّغ نص المسودة المعلق.
Mattermost:
- يبث التفكير، ونشاط الأدوات، ونص الرد الجزئي في منشور معاينة مسودة واحد يكتمل في مكانه عندما تصبح الإجابة النهائية آمنة للإرسال.
- يعود إلى إرسال منشور نهائي جديد إذا حُذف منشور المعاينة أو أصبح غير متاح عند وقت الإنهاء.
- تلغي حمولات الوسائط/الأخطاء النهائية تحديثات المعاينة المعلقة قبل التسليم العادي بدلاً من تفريغ منشور معاينة مؤقت.
Matrix:
- تكتمل معاينات المسودة في مكانها عندما يستطيع النص النهائي إعادة استخدام حدث المعاينة.
- تلغي النهايات الخاصة بالوسائط فقط، والأخطاء، وعدم تطابق هدف الرد تحديثات المعاينة المعلقة قبل التسليم العادي؛ وتُنقح أي معاينة قديمة مرئية بالفعل.
تحديثات معاينة تقدم الأدوات
يمكن لبث المعاينة أيضاً تضمين تحديثات تقدم الأدوات - أسطر حالة قصيرة مثل "البحث في الويب"، أو "قراءة ملف"، أو "استدعاء أداة" - تظهر في رسالة المعاينة نفسها أثناء تشغيل الأدوات، قبل الرد النهائي. يُبقي هذا دورات الأدوات متعددة الخطوات حية بصرياً بدلاً من أن تكون صامتة بين أول معاينة تفكير والإجابة النهائية.
الأسطح المدعومة:
- يبثّ Discord وSlack وTelegram وMatrix تقدّم الأدوات إلى تعديل المعاينة المباشرة افتراضيًا عندما يكون بثّ المعاينة نشطًا. يستخدم Microsoft Teams بثّ التقدّم الأصلي الخاص به في الدردشات الشخصية.
- صدر Telegram مع تمكين تحديثات معاينة تقدّم الأدوات منذ
v2026.4.22؛ والإبقاء عليها مفعّلة يحافظ على ذلك السلوك الصادر. - يدمج Mattermost بالفعل نشاط الأدوات في منشور معاينة المسودة الوحيد الخاص به (انظر أعلاه).
- تتبع تعديلات تقدّم الأدوات وضع بثّ المعاينة النشط؛ ويتم تخطيها عندما يكون بثّ المعاينة
offأو عندما يتولى بثّ الكتل الرسالة. في Telegram، يكونstreaming.mode: "off"للنهائي فقط: يتم أيضًا كتم ثرثرة التقدّم العامة بدلًا من تسليمها كرسائل حالة مستقلة، بينما تستمر مطالبات الموافقة وحمولات الوسائط والأخطاء في التوجيه بشكل طبيعي. - للإبقاء على بثّ المعاينة مع إخفاء أسطر تقدّم الأدوات، اضبط
streaming.preview.toolProgressعلىfalseلذلك القناة. ولإبقاء أسطر تقدّم الأدوات مرئية مع إخفاء نص الأمر/التنفيذ، اضبطstreaming.preview.commandTextعلى"status"أوstreaming.progress.commandTextعلى"status"؛ القيمة الافتراضية هي"raw"للحفاظ على السلوك الصادر. تشترك في هذه السياسة قنوات المسودات/التقدّم التي تستخدم عارض التقدّم المضغوط في OpenClaw، بما في ذلك Discord وMatrix وMicrosoft Teams وMattermost ومعاينات مسودات Slack وTelegram. لتعطيل تعديلات المعاينة بالكامل، اضبطstreaming.modeعلىoff. - تُعد ردود الاقتباس المحددة في Telegram استثناءً: عندما لا يكون
replyToModeهو"off"ويكون نص اقتباس محدد موجودًا، يتخطى OpenClaw بثّ معاينة الإجابة لتلك الدورة، لذلك لا يمكن عرض أسطر معاينة تقدّم الأدوات. لا تزال ردود الرسالة الحالية من دون نص اقتباس محدد تحتفظ ببثّ المعاينة. راجع وثائق قناة Telegram للتفاصيل.
أبقِ أسطر التقدّم مرئية مع إخفاء نص الأمر/التنفيذ الخام:
{
"channels": {
"telegram": {
"streaming": {
"mode": "partial",
"preview": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
استخدم البنية نفسها ضمن مفتاح قناة تقدّم مضغوط آخر، مثل channels.discord أو channels.matrix أو channels.msteams أو channels.mattermost أو معاينات مسودات Slack. لوضع مسودة التقدّم، ضع السياسة نفسها تحت streaming.progress:
{
"channels": {
"telegram": {
"streaming": {
"mode": "progress",
"progress": {
"toolProgress": true,
"commandText": "status"
}
}
}
}
}
ذات صلة
- إعادة هيكلة دورة حياة الرسائل - تصميم مستهدف مشترك للمعاينة والتحرير والبثّ والإنهاء
- مسودات التقدّم - رسائل عمل قيد التقدّم مرئية تُحدّث أثناء الدورات الطويلة
- الرسائل - دورة حياة الرسائل وتسليمها
- إعادة المحاولة - سلوك إعادة المحاولة عند فشل التسليم
- القنوات - دعم البثّ لكل قناة