---
read_when:
    - تغيير توجيه القنوات أو سلوك صندوق الوارد
summary: قواعد التوجيه لكل قناة (WhatsApp وTelegram وDiscord وSlack) والسياق المشترك
title: توجيه القنوات
x-i18n:
    generated_at: "2026-07-16T13:39:52Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 32
    provider: openai
    source_hash: 4836671840e8c7919e7def8140d4a54fdeea17ddbe8c7a348ab5a23ff8b4213c
    source_path: channels/channel-routing.md
    workflow: 16
---

# القنوات والتوجيه

يوجّه OpenClaw الردود **إلى القناة التي وردت منها الرسالة**. لا يختار
النموذج قناة؛ فالتوجيه حتمي وتتحكم فيه
تهيئة المضيف.

## المصطلحات الأساسية

- **القناة**: Plugin قناة مضمّن مثل `discord` أو `googlechat` أو `imessage` أو `irc` أو `line` أو `signal` أو `slack` أو `telegram` أو `whatsapp`، بالإضافة إلى قنوات Plugin المثبّتة. تمثّل `webchat` قناة واجهة WebChat الداخلية، وليست قناة صادرة قابلة للتهيئة.
- **AccountId**: مثيل حساب لكل قناة (عند دعمه).
- حساب القناة الافتراضي الاختياري: تحدد `channels.<channel>.defaultAccount`
  الحساب المستخدم عندما لا يحدد مسار صادر `accountId`.
  - في إعدادات الحسابات المتعددة، عيّن حسابًا افتراضيًا صريحًا (`defaultAccount` أو حسابًا باسم `default`) عند تهيئة حسابين أو أكثر. من دونه، قد يختار التوجيه الاحتياطي أول معرّف حساب مطبّع.
- **AgentId**: مساحة عمل معزولة + مخزن جلسات ("العقل").
- **SessionKey**: مفتاح الحاوية المستخدم لتخزين السياق والتحكم في التزامن.

## بادئات الوجهات الصادرة

قد تتضمن الوجهات الصادرة الصريحة بادئة موفّر، مثل `telegram:123` أو `tg:123`. لا تتعامل النواة مع هذه البادئة كتلميح لاختيار القناة إلا عندما تكون القناة المحددة هي `last` أو لم تُحسم بطريقة أخرى، وفقط عندما يعلن Plugin المحمّل دعمه لتلك البادئة. إذا كان المستدعي قد اختار قناة صريحة بالفعل، فيجب أن تطابق بادئة الموفّر تلك القناة؛ وتفشل التركيبات العابرة للقنوات، مثل تسليم WhatsApp إلى `telegram:123`، قبل تطبيع الوجهة الخاص بـ Plugin.

تبقى بادئات نوع الوجهة والخدمة، مثل `channel:<id>` و`user:<id>` و`room:<id>` و`thread:<id>` و`imessage:<handle>` و`sms:<number>`، ضمن قواعد القناة المحددة. وهي لا تختار الموفّر بذاتها.

## صيغ مفاتيح الجلسات (أمثلة)

تُدمج الرسائل المباشرة افتراضيًا في جلسة الوكيل **الرئيسية**:

- `agent:<agentId>:<mainKey>` (الافتراضي: `agent:main:main`)

تتحكم `session.dmScope` في دمج الرسائل المباشرة: تشارك `main` (الافتراضية) جلسة رئيسية
واحدة، بينما تُبقي `per-peer` و`per-channel-peer` و`per-account-channel-peer`
الرسائل المباشرة في جلسات منفصلة. ويمكن لربط توجيه تجاوز النطاق للنظراء
المطابقين عبر `bindings[].session.dmScope`.

حتى عندما يكون سجل محادثات الرسائل المباشرة مشتركًا مع الجلسة الرئيسية، تستخدم سياسات
وضع الحماية والأدوات مفتاح تشغيل مشتقًا للمحادثات المباشرة لكل حساب بالنسبة إلى الرسائل المباشرة الخارجية،
بحيث لا تُعامل الرسائل الواردة من القنوات مثل عمليات تشغيل الجلسة الرئيسية المحلية.

تظل المجموعات والقنوات معزولة لكل قناة:

- المجموعات: `agent:<agentId>:<channel>:group:<id>`
- القنوات/الغرف: `agent:<agentId>:<channel>:channel:<id>`

سلاسل المحادثات:

- تلحق سلاسل محادثات Slack/Discord ‏`:thread:<threadId>` بالمفتاح الأساسي.
- تضمّن موضوعات منتديات Telegram ‏`:topic:<topicId>` في مفتاح المجموعة.

أمثلة:

- `agent:main:telegram:group:-1001234567890:topic:42`
- `agent:main:discord:channel:123456:thread:987654`

## تثبيت مسار الرسائل المباشرة الرئيسية

عندما تكون `session.dmScope` هي `main`، قد تشترك الرسائل المباشرة في جلسة رئيسية واحدة.
لمنع الكتابة فوق `lastRoute` الخاصة بالجلسة بواسطة رسائل مباشرة من غير المالك،
يستنتج OpenClaw مالكًا مثبّتًا من `allowFrom` عندما تتحقق جميع الشروط الآتية:

- تحتوي `allowFrom` على مُدخل واحد بالضبط ليس حرف بدل.
- يمكن تطبيع المُدخل إلى معرّف مرسل محدد لتلك القناة.
- لا يطابق مرسل الرسالة المباشرة الواردة ذلك المالك المثبّت.

في حالة عدم التطابق هذه، يواصل OpenClaw تسجيل البيانات الوصفية للجلسة الواردة، لكنه
يتخطى تحديث `lastRoute` الخاصة بالجلسة الرئيسية.

## تسجيل الرسائل الواردة المحمي

يمكن لـ Plugins القنوات وسم سجل جلسة واردة بأنه `createIfMissing: false`
عندما يجب ألا ينشئ مسار محمي جلسة OpenClaw جديدة. في هذا الوضع،
قد يحدّث OpenClaw البيانات الوصفية و`lastRoute` لجلسة موجودة، لكنه
لا ينشئ مُدخل جلسة مخصصًا للمسار لمجرد رصد رسالة.

## قواعد التوجيه (كيفية اختيار وكيل)

يختار التوجيه **وكيلًا واحدًا** لكل رسالة واردة:

1. **مطابقة النظير التامة** (`bindings` مع `peer.kind` + `peer.id`).
2. **مطابقة النظير الأصل** (وراثة سلسلة المحادثة).
3. **مطابقة النظير بحرف بدل** (`peer.id: "*"` لنوع نظير).
4. **مطابقة الخادم + الأدوار** (Discord) عبر `guildId` + `roles`.
5. **مطابقة الخادم** (Discord) عبر `guildId`.
6. **مطابقة الفريق** (Slack) عبر `teamId`.
7. **مطابقة الحساب** (`accountId` على القناة).
8. **مطابقة القناة** (أي حساب على تلك القناة، `accountId: "*"`).
9. **الوكيل الافتراضي** (`agents.list[].default`، وإلا فأول مُدخل في القائمة، مع الرجوع إلى `main`).

عندما يتضمن الربط حقول مطابقة متعددة (`peer` و`guildId` و`teamId` و`roles`)، **يجب أن تتطابق جميع الحقول المقدمة** لكي ينطبق ذلك الربط.

يحدد الوكيل المطابق مساحة العمل ومخزن الجلسات المستخدمين.

## مجموعات البث (تشغيل عدة وكلاء)

تتيح لك مجموعات البث تشغيل **عدة وكلاء** للنظير نفسه **عندما يرد OpenClaw عادةً** (على سبيل المثال: في مجموعات WhatsApp، بعد بوابة الإشارة/التفعيل).

التهيئة:

```json5
{
  broadcast: {
    strategy: "parallel",
    "120363403215116621@g.us": ["alfred", "baerbel"],
    "+15555550123": ["support", "logger"],
  },
}
```

راجع: [مجموعات البث](/ar/channels/broadcast-groups).

## نظرة عامة على التهيئة

- `agents.list`: تعريفات الوكلاء المسماة (مساحة العمل، النموذج، وما إلى ذلك).
- `bindings`: ربط القنوات/الحسابات/النظراء الواردين بالوكلاء.

مثال:

```json5
{
  agents: {
    list: [{ id: "support", name: "Support", workspace: "~/.openclaw/workspace-support" }],
  },
  bindings: [
    { match: { channel: "slack", teamId: "T123" }, agentId: "support" },
    { match: { channel: "telegram", peer: { kind: "group", id: "-100123" } }, agentId: "support" },
  ],
}
```

## تخزين الجلسات

توجد صفوف جلسات وقت التشغيل في قاعدة بيانات SQLite الخاصة بكل وكيل ضمن دليل
الحالة (الافتراضي `~/.openclaw`):

- `~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite`

قد تحتوي عمليات التثبيت الأقدم على ملفات JSONL قديمة لنصوص الجلسات ومخزن صفوف
`sessions.json` ضمن `~/.openclaw/agents/<agentId>/sessions/`. تستورد عملية بدء Gateway و
`openclaw doctor --fix` الصفوف/السجلات القديمة النشطة إلى SQLite
تلقائيًا. استخدم `openclaw doctor --session-sqlite inspect
--session-sqlite-all-agents` وتسلسل التحقق الخاص بـ
[أداة التشخيص](/ar/cli/doctor#session-sqlite-migration) عندما تحتاج إلى
دليل صريح على الترحيل.
لا يزال بإمكانك تحديد مسار مخزن قديم عبر قالبَي `session.store` و`{agentId}`
لسير عمل الترحيل والصيانة دون اتصال.

يفحص اكتشاف جلسات Gateway وACP أيضًا مخازن الوكلاء المدعومة بالقرص ضمن
جذر `agents/` الافتراضي وضمن جذور `session.store` المقولبة. يجب أن تبقى
المخازن المكتشفة داخل جذر الوكيل المحسوم وأن تستخدم ملف `sessions.json`
قديمًا عاديًا. تُتجاهل الروابط الرمزية والمسارات الواقعة خارج الجذر.

## سلوك WebChat

يتصل WebChat بـ **الوكيل المحدد** ويستخدم افتراضيًا الجلسة الرئيسية
للوكيل. ولهذا يتيح لك WebChat رؤية السياق العابر للقنوات لذلك
الوكيل في مكان واحد.

## سياق الرد

تتضمن الردود الواردة:

- `ReplyToId` و`ReplyToBody` و`ReplyToSender` عند توفرها.
- يُلحَق السياق المقتبس بـ `Body` على هيئة كتلة `[Replying to ...]`.

يكون ذلك متسقًا عبر القنوات.

## ذو صلة

- [المجموعات](/ar/channels/groups)
- [مجموعات البث](/ar/channels/broadcast-groups)
- [الاقتران](/ar/channels/pairing)
