---
read_when:
    - شرح كيفية عمل البث أو التقسيم إلى أجزاء على القنوات
    - تغيير سلوك البث على شكل كتل أو سلوك التقسيم إلى أجزاء في القناة
    - تصحيح أخطاء الردود الكتلية المكررة/المبكرة أو البث التمهيدي للقناة
summary: سلوك البث + التقسيم إلى أجزاء (الردود على شكل كتل، والبث التمهيدي للقنوات، وربط الأوضاع)
title: البث والتقسيم إلى أجزاء
x-i18n:
    generated_at: "2026-04-25T13:45:51Z"
    model: gpt-5.4
    provider: openai
    source_hash: ba308b79b12886f3a1bc36bc277e3df0e2b9c6018aa260b432ccea89a235819f
    source_path: concepts/streaming.md
    workflow: 15
---

لدى OpenClaw طبقتان منفصلتان للبث:

- **البث على شكل كتل (القنوات):** إصدار **كتل** مكتملة بينما يكتب المساعد. وهذه رسائل قنوات عادية (وليست فروقًا رمزية token deltas).
- **البث التمهيدي (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"` (الافتراضي: 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`، لذلك يمكنه إصدار عدة أجزاء في النهاية.

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

توجيهات `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` (بما في ذلك إعدادات كل حساب).
- تُرفع القيمة الافتراضية لـ coalesce `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      | ✅    | ✅        | ✅      | ✅                  |
| Mattermost | ✅    | ✅        | ✅      | ✅                  |

خاص بـ Slack:

- يبدّل `channels.slack.streaming.nativeTransport` استدعاءات Slack native streaming API عندما يكون `channels.slack.streaming.mode="partial"` (الافتراضي: `true`).
- يتطلب Slack native streaming وحالة سلسلة مساعد Slack هدف سلسلة رد؛ إذ لا تعرض الرسائل الخاصة من المستوى الأعلى تلك المعاينة ذات نمط السلسلة.

ترحيل المفاتيح القديمة:

- Telegram: يتم اكتشاف القيم القديمة `streamMode` والقيم scalar/boolean لـ `streaming` وترحيلها عبر doctor/مسارات توافق التهيئة إلى `streaming.mode`.
- Discord: يتم ترحيل `streamMode` + ‏`streaming` المنطقية تلقائيًا إلى تعداد `streaming`.
- Slack: يتم ترحيل `streamMode` تلقائيًا إلى `streaming.mode`؛ كما يتم ترحيل `streaming` المنطقية تلقائيًا إلى `streaming.mode` بالإضافة إلى `streaming.nativeTransport`؛ ويتم ترحيل `nativeStreaming` القديم تلقائيًا إلى `streaming.nativeTransport`.

### سلوك وقت التشغيل

Telegram:

- يستخدم `sendMessage` + ‏`editMessageText` لتحديثات المعاينة عبر الرسائل الخاصة والمجموعات/الموضوعات.
- يُتخطى البث التمهيدي عندما يكون البث الكتلي في Telegram مُمكّنًا صراحةً (لتجنب البث المزدوج).
- يمكن لـ `/reasoning stream` كتابة reasoning إلى المعاينة.

Discord:

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

Slack:

- يمكن لوضع `partial` استخدام Slack native streaming (`chat.startStream`/`append`/`stop`) عند توفره.
- يستخدم وضع `block` معاينات مسودات بأسلوب الإلحاق.
- يستخدم وضع `progress` نص معاينة للحالة، ثم الإجابة النهائية.
- يمنع كل من native وdraft preview streaming الردود الكتلية لتلك الدورة، بحيث يُبث رد Slack عبر مسار تسليم واحد فقط.
- لا تنشئ حمولات الوسائط/الأخطاء النهائية ونهائيات progress رسائل مسودة مؤقتة عديمة الفائدة؛ فقط النهائيات النصية/الكتلية التي يمكنها تعديل المعاينة هي التي تفرغ نص المسودة المعلق.

Mattermost:

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

Matrix:

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

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

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

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

- **Discord** و**Slack** و**Telegram** تبث تقدم الأدوات إلى تعديل المعاينة الحية افتراضيًا عندما يكون البث التمهيدي نشطًا.
- يأتي Telegram مع تمكين تحديثات معاينة تقدم الأدوات منذ الإصدار `v2026.4.22`؛ والحفاظ عليها مُمكّنة يصون هذا السلوك المُصدر.
- **Mattermost** يضمّن بالفعل نشاط الأدوات في منشور معاينة المسودة الوحيد الخاص به (انظر أعلاه).
- تتبع تعديلات تقدم الأدوات وضع البث التمهيدي النشط؛ ويتم تخطيها عندما يكون البث التمهيدي `off` أو عندما يكون البث على شكل كتل قد استحوذ على الرسالة.
- للإبقاء على البث التمهيدي مع إخفاء أسطر تقدم الأدوات، اضبط `streaming.preview.toolProgress` على `false` لتلك القناة. ولتعطيل تعديلات المعاينة بالكامل، اضبط `streaming.mode` على `off`.

مثال:

```json
{
  "channels": {
    "telegram": {
      "streaming": {
        "mode": "partial",
        "preview": {
          "toolProgress": false
        }
      }
    }
  }
}
```

## ذو صلة

- [الرسائل](/ar/concepts/messages) — دورة حياة الرسالة والتسليم
- [إعادة المحاولة](/ar/concepts/retry) — سلوك إعادة المحاولة عند فشل التسليم
- [القنوات](/ar/channels) — دعم البث لكل قناة
