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

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

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

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

| القناة | `off` | `partial` | `block` | `progress`        |
| ------ | ----- | --------- | ------- | ----------------- |
| 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` نص معاينة الحالة، ثم الإجابة النهائية.

## ذو صلة

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