الانتقال إلى المحتوى الرئيسي

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

يحتوي 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: بث الكتل بمجرد أن يصدرها chunker؛ وتفريغها عند كل text_end.
  • message_end: الانتظار حتى تكتمل رسالة المساعد، ثم تفريغ المخرجات المخزنة مؤقتًا.
يظل message_end يستخدم chunker إذا تجاوز النص المخزن مؤقتًا maxChars، لذلك يمكنه إصدار عدة أجزاء في النهاية.

خوارزمية التقسيم إلى أجزاء (الحدود الدنيا/العليا)

يتم تنفيذ تقسيم الكتل إلى أجزاء بواسطة 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: معاينة للتقدم/الحالة أثناء الإنشاء، ثم الإجابة النهائية عند الاكتمال.

تعيين القنوات

القناةoffpartialblockprogress
Telegramيُعيَّن إلى partial
Discordيُعيَّن إلى partial
Slack
خاصة بـ 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 كتابة الاستدلال إلى المعاينة.
Discord:
  • يستخدم رسائل المعاينة بالإرسال ثم التعديل.
  • يستخدم وضع block تقسيم المسودة إلى أجزاء (draftChunk).
  • يتم تخطي بث المعاينة عندما يكون بث الكتل في Discord مفعّلًا صراحةً.
Slack:
  • يمكن لوضع partial استخدام البث الأصلي في Slack (chat.startStream/append/stop) عند توفره.
  • يستخدم وضع block معاينات مسودة بنمط الإلحاق.
  • يستخدم وضع progress نص معاينة الحالة، ثم الإجابة النهائية.

ذو صلة