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.
  • تفضيل الفاصل: 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: تُكتشف قيم 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"
        }
      }
    }
  }
}

ذات صلة