Messages and delivery

البث والتقسيم إلى أجزاء

يحتوي OpenClaw على طبقتي بث منفصلتين:

  • بث الكتل (القنوات): يصدر كتلًا مكتملة أثناء كتابة المساعد. هذه رسائل قناة عادية (وليست فروق رموز).
  • بث المعاينة (Telegram/Discord/Slack): يحدّث رسالة معاينة مؤقتة أثناء التوليد.

لا يوجد اليوم بث حقيقي لفروق الرموز إلى رسائل القنوات. بث المعاينة قائم على الرسائل (إرسال + تعديلات/إلحاقات).

بث الكتل (رسائل القنوات)

يرسل بث الكتل مخرجات المساعد في أجزاء خشنة عند توفرها.

Code
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، لذلك يمكنه إصدار عدة أجزاء في النهاية.

تسليم الوسائط مع بث الكتل

يجب أن تستخدم وسائط البث حقول حمولة منظمة مثل mediaUrl أو mediaUrls؛ لا يُحلّل النص المبثوث كأمر مرفق. عندما يرسل بث الكتل وسائط مبكرًا، يتذكر OpenClaw ذلك التسليم للدورة. إذا كررت حمولة المساعد النهائية عنوان URL نفسه للوسائط، يزيل التسليم النهائي الوسائط المكررة بدلًا من إرسال المرفق مرة أخرى.

تُمنع الحمولات النهائية المتطابقة تمامًا. إذا أضافت الحمولة النهائية نصًا مميزًا حول وسائط سبق بثها، لا يزال OpenClaw يرسل النص الجديد مع إبقاء الوسائط بتسليم واحد. يمنع هذا تكرار الملاحظات الصوتية أو الملفات على قنوات مثل Telegram.

خوارزمية التقطيع (الحدود الدنيا/العليا)

ينفذ EmbeddedBlockChunker تقطيع الكتل:

  • الحد الأدنى: لا تصدر حتى يكون المخزن المؤقت >= minChars (ما لم يُفرض ذلك).
  • الحد الأعلى: تفضيل التقسيم قبل maxChars؛ وإذا كان مفروضًا، قسّم عند maxChars.
  • تفضيل الفاصل: paragraphnewlinesentencewhitespace → فاصل صارم.
  • أسوار الكود: لا تقسّم أبدًا داخل الأسوار؛ وعند الفرض عند 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: يكتشف doctor/مسارات توافق الإعدادات قيم 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 عبر الرسائل المباشرة والمجموعات/المواضيع.
  • لا تزال المعاينات الأولية القصيرة مؤجلة بإزالة الارتداد لتحسين تجربة إشعارات الدفع، لكن Telegram يجسدها الآن بعد تأخير محدود حتى لا تبقى التشغيلات النشطة صامتة بصريًا.
  • يعدل النص النهائي المعاينة النشطة في مكانها؛ وتعيد النهايات الطويلة استخدام تلك الرسالة للجزء الأول وترسل الأجزاء المتبقية فقط.
  • يدير وضع block المعاينة إلى رسالة جديدة عند streaming.preview.chunk.maxChars (الافتراضي 800، مقيّد بحد تحرير Telegram البالغ 4096)؛ أما الأوضاع الأخرى فتنمّي معاينة واحدة حتى 4096 حرفًا.
  • يبقي وضع progress تقدم الأدوات في مسودة حالة قابلة للتحرير، ويجسد تسمية الحالة عندما يكون بث الإجابة نشطًا لكن لا يتوفر سطر أداة بعد، ويمسح تلك المسودة عند الاكتمال، ويرسل الإجابة النهائية عبر التسليم العادي.
  • إذا فشل التعديل النهائي قبل تأكيد النص المكتمل، يستخدم OpenClaw التسليم النهائي العادي وينظف المعاينة القديمة.
  • يُتخطى بث المعاينة عندما يكون بث كتل Telegram ممكّنًا صراحة (لتجنب البث المزدوج).
  • يمكن لـ /reasoning stream كتابة الاستدلال إلى معاينة عابرة تُحذف بعد التسليم النهائي.

Discord:

  • يستخدم رسائل معاينة بإرسال + تعديل.
  • يستخدم وضع block تقطيع المسودة (draftChunk).
  • يُتخطى بث المعاينة عندما يكون بث كتل Discord ممكّنًا صراحة.
  • تلغي حمولات الوسائط النهائية والخطأ والرد الصريح المعاينات المعلقة بدون تفريغ مسودة جديدة، ثم تستخدم التسليم العادي.

Slack:

  • يمكن لـ partial استخدام بث Slack الأصلي (chat.startStream/append/stop) عند توفره.
  • يستخدم block معاينات مسودة بأسلوب الإلحاق.
  • يستخدم progress نص معاينة الحالة، ثم الإجابة النهائية.
  • تستخدم الرسائل المباشرة على المستوى الأعلى بدون سلسلة رد منشورات معاينة مسودة وتعديلات بدلًا من بث Slack الأصلي.
  • يمنع بث المعاينة الأصلي والمسودة ردود الكتل لتلك الدورة، لذلك يُبث رد Slack عبر مسار تسليم واحد فقط.
  • لا تنشئ حمولات الوسائط/الأخطاء النهائية ونهايات التقدم رسائل مسودة مؤقتة؛ وحدها النهايات النصية/الكتلية التي يمكنها تعديل المعاينة تفرّغ نص المسودة المعلق.

Mattermost:

  • يبث التفكير ونشاط الأدوات ونص الرد الجزئي في منشور معاينة مسودة واحد يُنهى في مكانه عندما يكون إرسال الإجابة النهائية آمنًا.
  • يعود إلى إرسال منشور نهائي جديد إذا حُذف منشور المعاينة أو أصبح غير متاح عند وقت الإنهاء.
  • تلغي حمولات الوسائط/الأخطاء النهائية تحديثات المعاينة المعلقة قبل التسليم العادي بدلًا من تفريغ منشور معاينة مؤقت.

Matrix:

  • تُنهى معاينات المسودة في مكانها عندما يستطيع النص النهائي إعادة استخدام حدث المعاينة.
  • تلغي النهايات الخاصة بالوسائط فقط، والخطأ، وعدم تطابق هدف الرد تحديثات المعاينة المعلقة قبل التسليم العادي؛ وتُنقّح المعاينة القديمة الظاهرة بالفعل.

تحديثات معاينة تقدم الأدوات

يمكن أن يتضمن بث المعاينة أيضًا تحديثات تقدم الأدوات - أسطر حالة قصيرة مثل "البحث في الويب"، أو "قراءة ملف"، أو "استدعاء أداة" - تظهر في رسالة المعاينة نفسها أثناء تشغيل الأدوات، قبل الرد النهائي. في وضع خادم تطبيق Codex، تستخدم رسائل التمهيد/التعليق في Codex مسار المعاينة نفسه، لذلك يمكن لملاحظات تقدم قصيرة مثل "أتحقق..." أن تُبث إلى المسودة القابلة للتحرير دون أن تصبح جزءًا من الإجابة النهائية. يحافظ هذا على حيوية بصرية لدورات الأدوات متعددة الخطوات بدلًا من الصمت بين أول معاينة تفكير والإجابة النهائية.

قد تصدر الأدوات طويلة التشغيل تقدمًا نمطيًا قبل أن تعود. على سبيل المثال، يجهز web_fetch مؤقتًا مدته خمس ثوانٍ عند بدئه: إذا كان الجلب لا يزال معلقًا، يمكن للمعاينة عرض Fetching page content...؛ وإذا انتهى الجلب أو أُلغي قبل ذلك، فلا يصدر أي سطر تقدم. لا تزال نتيجة الأداة النهائية اللاحقة تُسلّم بشكل عادي إلى النموذج.

الأسطح المدعومة:

  • يبث Discord وSlack وTelegram وMatrix تقدّم الأدوات وتحديثات تمهيد Codex إلى تعديل المعاينة المباشرة افتراضياً عندما يكون بث المعاينة نشطاً. يستخدم 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 لمعرفة التفاصيل.

مسار تقدّم التعليقات

إلى جانب تقدّم الأدوات، يمكن لعارض التقدّم المدمج إظهار مسار إضافي واحد في المسودة:

  • streaming.progress.commentary — اعرض تعليقات النموذج قبل الأداة (💬) — سرداً قصيراً من نوع "سأتحقق… ثم…" — متداخلاً مع أسطر الأدوات في مسودة التقدّم.
json
{  "channels": {    "discord": {      "streaming": { "mode": "progress", "progress": { "commentary": true } }    }  }}

أبقِ أسطر التقدّم مرئية لكن أخفِ نص الأوامر/التنفيذ الخام:

json
{  "channels": {    "telegram": {      "streaming": {        "mode": "partial",        "preview": {          "toolProgress": true,          "commandText": "status"        }      }    }  }}

استخدم الشكل نفسه تحت مفتاح قناة تقدّم مدمج آخر، على سبيل المثال channels.discord أو channels.matrix أو channels.msteams أو channels.mattermost أو معاينات مسودات Slack. في وضع مسودة التقدّم، ضع السياسة نفسها تحت streaming.progress:

json
{  "channels": {    "telegram": {      "streaming": {        "mode": "progress",        "progress": {          "toolProgress": true,          "commandText": "status"        }      }    }  }}

ذات صلة

Was this useful?
On this page

On this page