---
read_when:
    - تغییر مسیریابی کانال یا رفتار صندوق ورودی
summary: قواعد مسیریابی برای هر کانال (WhatsApp، Telegram، Discord، Slack) و زمینهٔ مشترک
title: مسیریابی کانال
x-i18n:
    generated_at: "2026-07-27T13:51:59Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 32
    provider: openai
    source_hash: aa03f04a55015bf17e0fe1f3a9bc422875124bb64af5891c898a98bc6917d9e8
    source_path: channels/channel-routing.md
    workflow: 16
---

# کانال‌ها و مسیریابی

OpenClaw پاسخ‌ها را **به همان کانالی که پیام از آن آمده است** بازمی‌گرداند. مدل
کانال را انتخاب نمی‌کند؛ مسیریابی قطعی است و پیکربندی میزبان آن را کنترل می‌کند.
در محدوده پیش‌فرض پیام خصوصی، پیام‌های مستقیم همه کانال‌ها در [نشست اصلی](/concepts/main-session)
عامل همگرا می‌شوند.

## اصطلاحات کلیدی

- **کانال**: یک 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` بازنویسی کند.

حتی هنگامی که تاریخچه مکالمه پیام مستقیم با نشست اصلی به‌اشتراک گذاشته می‌شود،
سیاست sandbox و ابزار برای پیام‌های خصوصی خارجی از کلید زمان اجرای گفت‌وگوی مستقیم
مشتق‌شده مختص هر حساب استفاده می‌کند تا پیام‌های منشأگرفته از کانال مانند اجراهای محلی نشست اصلی در نظر گرفته نشوند.

گروه‌ها و کانال‌ها به‌ازای هر کانال مجزا باقی می‌مانند:

- گروه‌ها: `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` نشست اصلی را انجام نمی‌دهد.

## ثبت محافظت‌شده ورودی

pluginهای کانال می‌توانند یک رکورد نشست ورودی را با `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.entries.*.default`، در غیر این صورت نخستین ورودی فهرست، با بازگشت به `main`).

هنگامی که یک اتصال چند فیلد تطابق دارد (`peer`، `guildId`، `teamId`، `roles`)، برای اعمال آن اتصال **همه فیلدهای ارائه‌شده باید مطابقت داشته باشند**.

عامل مطابق‌شده تعیین می‌کند کدام فضای کاری و مخزن نشست استفاده شوند.

## گروه‌های پخش همگانی (اجرای چند عامل)

گروه‌های پخش همگانی امکان اجرای **چند عامل** را برای یک همتای یکسان، **هنگامی که OpenClaw در حالت عادی پاسخ می‌دهد**، فراهم می‌کنند (برای نمونه: در گروه‌های WhatsApp، پس از عبور از محدودیت اشاره/فعال‌سازی).

پیکربندی:

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

ببینید: [گروه‌های پخش همگانی](/fa/channels/broadcast-groups).

## نمای کلی پیکربندی

- `agents.entries`: تعریف‌های نام‌گذاری‌شده عامل (فضای کاری، مدل و غیره).
- `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` و توالی اعتبارسنجی
[Doctor](/fa/cli/doctor#session-sqlite-migration) استفاده کنید.
همچنان می‌توان با استفاده از `session.store` و قالب‌بندی `{agentId}`
یک مسیر مخزن قدیمی را برای گردش‌کارهای مهاجرت و نگه‌داری آفلاین انتخاب کرد.

کشف نشست Gateway و ACP همچنین مخزن‌های عامل مبتنی بر دیسک را در ریشه پیش‌فرض
`agents/` و ریشه‌های قالب‌بندی‌شده `session.store` اسکن می‌کند. مخزن‌های کشف‌شده
باید درون ریشه عامل حل‌شده باقی بمانند و از یک فایل قدیمی عادی
`sessions.json` استفاده کنند. پیوندهای نمادین و مسیرهای خارج از ریشه نادیده گرفته می‌شوند.

## رفتار WebChat

WebChat به **عامل انتخاب‌شده** متصل می‌شود و به‌طور پیش‌فرض از نشست اصلی عامل
استفاده می‌کند. به همین دلیل، WebChat امکان مشاهده زمینه میان‌کانالی آن
عامل را در یک مکان فراهم می‌کند.

## زمینه پاسخ

پاسخ‌های ورودی شامل موارد زیر هستند:

- `ReplyToId`، `ReplyToBody` و `ReplyToSender` در صورت موجود بودن.
- زمینه نقل‌قول‌شده به‌صورت یک بلوک `[Replying to ...]` به `Body` افزوده می‌شود.

این رفتار در همه کانال‌ها یکسان است.

## مرتبط

- [گروه‌ها](/fa/channels/groups)
- [گروه‌های پخش همگانی](/fa/channels/broadcast-groups)
- [جفت‌سازی](/fa/channels/pairing)
