Gateway
پیکربندی — کانالها
کلیدهای پیکربندی مخصوص هر کانال زیر channels.*. دسترسی DM و گروه،
راهاندازیهای چندحسابی، دروازهبانی با منشن، و کلیدهای مخصوص هر کانال برای Slack، Discord،
Telegram، WhatsApp، Matrix، iMessage، و دیگر پلاگینهای کانال همراه را پوشش میدهد.
برای عاملها، ابزارها، زمان اجرای Gateway، و دیگر کلیدهای سطح بالا، ببینید مرجع پیکربندی.
کانالها
هر کانال وقتی بخش پیکربندی آن وجود داشته باشد، بهصورت خودکار شروع میشود (مگر اینکه enabled: false باشد).
دسترسی DM و گروه
همه کانالها از خطمشیهای DM و خطمشیهای گروه پشتیبانی میکنند:
| خطمشی DM | رفتار |
|---|---|
pairing (default) |
فرستندههای ناشناس یک کد جفتسازی یکبارمصرف دریافت میکنند؛ مالک باید تأیید کند |
allowlist |
فقط فرستندههای موجود در allowFrom (یا مخزن مجاز جفتشده) |
open |
اجازه دادن به همه DMهای ورودی (نیازمند allowFrom: ["*"]) |
disabled |
نادیده گرفتن همه DMهای ورودی |
| خطمشی گروه | رفتار |
|---|---|
allowlist (default) |
فقط گروههایی که با فهرست مجاز پیکربندیشده مطابقت دارند |
open |
دور زدن فهرستهای مجاز گروه (دروازهبانی با منشن همچنان اعمال میشود) |
disabled |
مسدود کردن همه پیامهای گروه/اتاق |
بازنویسیهای مدل کانال
از channels.modelByChannel برای سنجاق کردن شناسههای مشخص کانال به یک مدل استفاده کنید. مقادیر provider/model یا نامهای مستعار مدل پیکربندیشده را میپذیرند. نگاشت کانال زمانی اعمال میشود که یک نشست از قبل بازنویسی مدل نداشته باشد (برای مثال، از طریق /model تنظیم شده باشد).
{ channels: { modelByChannel: { discord: { "123456789012345678": "anthropic/claude-opus-4-6", }, slack: { C1234567890: "openai/gpt-4.1", }, telegram: { "-1001234567890": "openai/gpt-4.1-mini", "-1001234567890:topic:99": "anthropic/claude-sonnet-4-6", }, }, },}پیشفرضهای کانال و Heartbeat
از channels.defaults برای رفتار مشترک خطمشی گروه و Heartbeat در میان ارائهدهندهها استفاده کنید:
{ channels: { defaults: { groupPolicy: "allowlist", // open | allowlist | disabled contextVisibility: "all", // all | allowlist | allowlist_quote heartbeat: { showOk: false, showAlerts: true, useIndicator: true, }, }, },}channels.defaults.groupPolicy: خطمشی گروه جایگزین وقتیgroupPolicyدر سطح ارائهدهنده تنظیم نشده باشد.channels.defaults.contextVisibility: حالت پیشفرض نمایانی زمینه تکمیلی برای همه کانالها. مقادیر:all(پیشفرض، شامل همه زمینههای نقلقول/رشته/تاریخچه)،allowlist(فقط شامل زمینه از فرستندههای موجود در فهرست مجاز)،allowlist_quote(همانند allowlist اما زمینه نقلقول/پاسخ صریح را نگه میدارد). بازنویسی مخصوص کانال:channels.<channel>.contextVisibility.channels.defaults.heartbeat.showOk: شامل کردن وضعیتهای سالم کانال در خروجی Heartbeat.channels.defaults.heartbeat.showAlerts: شامل کردن وضعیتهای تضعیفشده/خطا در خروجی Heartbeat.channels.defaults.heartbeat.useIndicator: نمایش خروجی Heartbeat به سبک نشانگر فشرده.
WhatsApp از طریق کانال وب Gateway (Baileys Web) اجرا میشود. وقتی یک نشست پیوندشده وجود داشته باشد، بهصورت خودکار شروع میشود.
{ web: { enabled: true, heartbeatSeconds: 60, whatsapp: { keepAliveIntervalMs: 25000, connectTimeoutMs: 60000, defaultQueryTimeoutMs: 60000, }, reconnect: { initialMs: 2000, maxMs: 120000, factor: 1.4, jitter: 0.2, maxAttempts: 0, }, }, channels: { whatsapp: { dmPolicy: "pairing", // pairing | allowlist | open | disabled allowFrom: ["+15555550123", "+447700900123"], textChunkLimit: 4000, chunkMode: "length", // length | newline mediaMaxMb: 50, sendReadReceipts: true, // blue ticks (false in self-chat mode) groups: { "*": { requireMention: true }, }, groupPolicy: "allowlist", groupAllowFrom: ["+15551234567"], }, },}WhatsApp چندحسابی
{channels: { whatsapp: { accounts: { default: {}, personal: {}, biz: { // authDir: "~/.openclaw/credentials/whatsapp/biz", }, }, },},}- فرمانهای خروجی در صورت وجود، بهصورت پیشفرض از حساب
defaultاستفاده میکنند؛ در غیر این صورت از نخستین شناسه حساب پیکربندیشده (مرتبشده). - گزینه اختیاری
channels.whatsapp.defaultAccountوقتی با یک شناسه حساب پیکربندیشده مطابقت داشته باشد، آن انتخاب حساب پیشفرض جایگزین را بازنویسی میکند. - پوشه احراز هویت تکحسابی قدیمی Baileys توسط
openclaw doctorبهwhatsapp/defaultمهاجرت داده میشود. - بازنویسیهای مخصوص هر حساب:
channels.whatsapp.accounts.<id>.sendReadReceipts،channels.whatsapp.accounts.<id>.dmPolicy،channels.whatsapp.accounts.<id>.allowFrom.
Telegram
{ channels: { telegram: { enabled: true, botToken: "your-bot-token", dmPolicy: "pairing", allowFrom: ["tg:123456789"], groups: { "*": { requireMention: true }, "-1001234567890": { allowFrom: ["@admin"], systemPrompt: "Keep answers brief.", topics: { "99": { requireMention: false, skills: ["search"], systemPrompt: "Stay on topic.", }, }, }, }, customCommands: [ { command: "backup", description: "Git backup" }, { command: "generate", description: "Create an image" }, ], historyLimit: 50, replyToMode: "first", // off | first | all | batched linkPreview: true, streaming: "partial", // off | partial | block | progress (default: off; opt in explicitly to avoid preview-edit rate limits) actions: { reactions: true, sendMessage: true }, reactionNotifications: "own", // off | own | all mediaMaxMb: 100, retry: { attempts: 3, minDelayMs: 400, maxDelayMs: 30000, jitter: 0.1, }, network: { autoSelectFamily: true, dnsResultOrder: "ipv4first", }, apiRoot: "https://api.telegram.org", proxy: "socks5://localhost:9050", webhookUrl: "https://example.com/telegram-webhook", webhookSecret: "secret", webhookPath: "/telegram-webhook", }, },}- توکن ربات:
channels.telegram.botTokenیاchannels.telegram.tokenFile(فقط فایل معمولی؛ پیوندهای نمادین رد میشوند)، باTELEGRAM_BOT_TOKENبهعنوان جایگزین برای حساب پیشفرض. apiRootفقط ریشه Telegram Bot API است. ازhttps://api.telegram.orgیا ریشه خودمیزبان/پراکسی خود استفاده کنید، نهhttps://api.telegram.org/bot<TOKEN>؛openclaw doctor --fixپسوند تصادفی انتهایی/bot<TOKEN>را حذف میکند.- گزینه اختیاری
channels.telegram.defaultAccountوقتی با یک شناسه حساب پیکربندیشده مطابقت داشته باشد، انتخاب حساب پیشفرض را بازنویسی میکند. - در راهاندازیهای چندحسابی (۲ شناسه حساب یا بیشتر)، یک پیشفرض صریح تنظیم کنید (
channels.telegram.defaultAccountیاchannels.telegram.accounts.default) تا از مسیریابی جایگزین جلوگیری شود؛openclaw doctorوقتی این مورد وجود نداشته باشد یا نامعتبر باشد هشدار میدهد. configWrites: falseنوشتنهای پیکربندی آغازشده توسط Telegram را مسدود میکند (مهاجرتهای شناسه سوپرگروه،/config set|unset).- ورودیهای سطح بالای
bindings[]باtype: "acp"اتصالهای پایدار ACP را برای موضوعات انجمن پیکربندی میکنند (ازchatId:topic:topicIdاستاندارد درmatch.peer.idاستفاده کنید). معناشناسی فیلدها در عاملهای ACP مشترک است. - پیشنمایشهای جریان Telegram از
sendMessage+editMessageTextاستفاده میکنند (در گفتوگوهای مستقیم و گروهی کار میکند). - خطمشی تلاش مجدد: ببینید خطمشی تلاش مجدد.
Discord
{ channels: { discord: { enabled: true, token: "your-bot-token", mediaMaxMb: 100, allowBots: false, actions: { reactions: true, stickers: true, polls: true, permissions: true, messages: true, threads: true, pins: true, search: true, memberInfo: true, roleInfo: true, roles: false, channelInfo: true, voiceStatus: true, events: true, moderation: false, }, replyToMode: "off", // off | first | all | batched dmPolicy: "pairing", allowFrom: ["1234567890", "123456789012345678"], dm: { enabled: true, groupEnabled: false, groupChannels: ["openclaw-dm"] }, guilds: { "123456789012345678": { slug: "friends-of-openclaw", requireMention: false, ignoreOtherMentions: true, reactionNotifications: "own", users: ["987654321098765432"], channels: { general: { allow: true }, help: { allow: true, requireMention: true, users: ["987654321098765432"], skills: ["docs"], systemPrompt: "Short answers only.", }, }, }, }, historyLimit: 20, textChunkLimit: 2000, chunkMode: "length", // length | newline streaming: { mode: "progress", // off | partial | block | progress (Discord default: progress) progress: { label: "auto", maxLines: 8, toolProgress: true, }, }, maxLinesPerMessage: 17, ui: { components: { accentColor: "#5865F2", }, }, threadBindings: { enabled: true, idleHours: 24, maxAgeHours: 0, spawnSessions: true, defaultSpawnContext: "fork", }, voice: { enabled: true, autoJoin: [ { guildId: "123456789012345678", channelId: "234567890123456789", }, ], daveEncryption: true, decryptionFailureTolerance: 24, connectTimeoutMs: 30000, reconnectGraceMs: 15000, tts: { provider: "openai", openai: { voice: "alloy" }, }, }, execApprovals: { enabled: "auto", // true | false | "auto" approvers: ["987654321098765432"], agentFilter: ["default"], sessionFilter: ["discord:"], target: "dm", // dm | channel | both cleanupAfterResolve: false, }, retry: { attempts: 3, minDelayMs: 500, maxDelayMs: 30000, jitter: 0.1, }, }, },}- Token:
channels.discord.token، باDISCORD_BOT_TOKENبهعنوان fallback برای حساب پیشفرض. - فراخوانیهای خروجی مستقیم که یک Discord
tokenصریح ارائه میکنند، از همان token برای فراخوانی استفاده میکنند؛ تنظیمات تلاش دوباره/سیاست حساب همچنان از حساب انتخابشده در snapshot زمان اجرای فعال گرفته میشوند. channels.discord.defaultAccountاختیاری، وقتی با شناسهٔ یک حساب پیکربندیشده مطابقت داشته باشد، انتخاب حساب پیشفرض را override میکند.- برای هدفهای ارسال از
user:<id>(DM) یاchannel:<id>(کانال guild) استفاده کنید؛ شناسههای عددی بدون پیشوند رد میشوند. - slugهای guild با حروف کوچک هستند و فاصلهها با
-جایگزین میشوند؛ کلیدهای کانال از نام slugشده استفاده میکنند (بدون#). شناسههای guild ترجیح داده میشوند. - پیامهایی که توسط ربات نوشته شدهاند بهصورت پیشفرض نادیده گرفته میشوند.
allowBots: trueآنها را فعال میکند؛ ازallowBots: "mentions"استفاده کنید تا فقط پیامهای رباتی پذیرفته شوند که ربات را mention میکنند (پیامهای خود ربات همچنان فیلتر میشوند). channels.discord.guilds.<id>.ignoreOtherMentions(و overrideهای کانال) پیامهایی را حذف میکند که کاربر یا نقش دیگری را mention میکنند اما ربات را mention نمیکنند (بهاستثنای @everyone/@here).channels.discord.mentionAliasesمتن پایدار خروجی@handleرا پیش از ارسال به شناسههای کاربری Discord نگاشت میکند، تا همتیمیهای شناختهشده حتی وقتی cache گذرای directory خالی است بهصورت قطعی mention شوند. overrideهای هر حساب زیرchannels.discord.accounts.<accountId>.mentionAliasesقرار دارند.maxLinesPerMessage(پیشفرض 17) پیامهای بلند را حتی وقتی زیر 2000 نویسه هستند تقسیم میکند.channels.discord.threadBindingsمسیریابی وابسته به thread در Discord را کنترل میکند:enabled: override مربوط به Discord برای قابلیتهای session وابسته به thread (/focus،/unfocus،/agents،/session idle،/session max-age، و ارسال/مسیریابی bound)idleHours: override مربوط به Discord برای auto-unfocus بر اثر بیفعالیتی، بر حسب ساعت (0غیرفعال میکند)maxAgeHours: override مربوط به Discord برای سقف سختگیرانهٔ عمر، بر حسب ساعت (0غیرفعال میکند)spawnSessions: کلید فعالسازی برایsessions_spawn({ thread: true })و ساخت/اتصال خودکار thread توسط ACP thread-spawn (پیشفرض:true)defaultSpawnContext: زمینهٔ native subagent برای spawnهای وابسته به thread (بهصورت پیشفرض"fork")
- ورودیهای سطح بالایی
bindings[]باtype: "acp"، bindingهای پایدار ACP را برای کانالها و threadها پیکربندی میکنند (از شناسهٔ کانال/thread درmatch.peer.idاستفاده کنید). معناشناسی فیلدها در ACP Agents مشترک است. channels.discord.ui.components.accentColorرنگ accent را برای containerهای Discord components v2 تنظیم میکند.channels.discord.voiceمکالمههای کانال صوتی Discord و overrideهای اختیاری auto-join + LLM + TTS را فعال میکند. پیکربندیهای فقط متنی Discord بهصورت پیشفرض voice را خاموش میگذارند؛ برای فعالسازی،channels.discord.voice.enabled=trueرا تنظیم کنید.channels.discord.voice.modelدر صورت نیاز، model LLM استفادهشده برای پاسخهای کانال صوتی Discord را override میکند.channels.discord.voice.daveEncryptionوchannels.discord.voice.decryptionFailureToleranceبه گزینههای DAVE در@discordjs/voiceمنتقل میشوند (بهصورت پیشفرضtrueو24).channels.discord.voice.connectTimeoutMsانتظار اولیهٔ Ready در@discordjs/voiceرا برای/vc joinو تلاشهای auto-join کنترل میکند (بهصورت پیشفرض30000).channels.discord.voice.reconnectGraceMsکنترل میکند یک session صوتی قطعشده چه مدت فرصت دارد وارد signalling اتصال دوباره شود، پیش از آنکه OpenClaw آن را نابود کند (بهصورت پیشفرض15000).- پخش صوتی Discord با رویداد شروع صحبت کاربر دیگر قطع نمیشود. برای جلوگیری از حلقههای بازخورد، OpenClaw هنگام پخش TTS، capture صوتی جدید را نادیده میگیرد.
- OpenClaw همچنین پس از شکستهای تکرارشوندهٔ decrypt، با ترک کردن و پیوستن دوباره به یک session صوتی، برای بازیابی دریافت صوت تلاش میکند.
channels.discord.streamingکلید canonical حالت stream است. Discord بهصورت پیشفرض ازstreaming.mode: "progress"استفاده میکند تا پیشرفت tool/work در یک پیام preview ویرایششده نمایش داده شود؛ برای غیرفعالکردن آن،streaming.mode: "off"را تنظیم کنید. مقادیر legacystreamModeو booleanstreamingهمچنان aliasهای زمان اجرا هستند؛ برای بازنویسی config ذخیرهشده،openclaw doctor --fixرا اجرا کنید.channels.discord.autoPresenceavailability زمان اجرا را به presence ربات نگاشت میکند (healthy => online، degraded => idle، exhausted => dnd) و اجازهٔ overrideهای اختیاری متن status را میدهد.channels.discord.dangerouslyAllowNameMatchingتطبیق mutable نام/tag را دوباره فعال میکند (حالت سازگاری break-glass).channels.discord.execApprovals: ارسال تأیید exec بهصورت native در Discord و مجوزدهی approver.enabled:true،false، یا"auto"(پیشفرض). در حالت auto، تأییدهای exec وقتی approverها ازapproversیاcommands.ownerAllowFromقابل resolve باشند فعال میشوند.approvers: شناسههای کاربری Discord که مجاز به تأیید درخواستهای exec هستند. وقتی حذف شود، بهcommands.ownerAllowFromfallback میکند.agentFilter: allowlist اختیاری شناسهٔ agent. برای forward کردن تأییدها برای همهٔ agentها حذف کنید.sessionFilter: الگوهای اختیاری کلید session (substring یا regex).target: محل ارسال promptهای تأیید."dm"(پیشفرض) به DMهای approver ارسال میکند،"channel"به کانال مبدأ ارسال میکند،"both"به هر دو ارسال میکند. وقتی target شامل"channel"باشد، دکمهها فقط توسط approverهای resolveشده قابل استفادهاند.cleanupAfterResolve: وقتیtrueباشد، پس از تأیید، رد، یا timeout، DMهای تأیید را حذف میکند.
حالتهای اعلان واکنش: off (هیچکدام)، own (پیامهای ربات، پیشفرض)، all (همهٔ پیامها)، allowlist (از guilds.<id>.users روی همهٔ پیامها).
Google Chat
{ channels: { googlechat: { enabled: true, serviceAccountFile: "/path/to/service-account.json", audienceType: "app-url", // app-url | project-number audience: "https://gateway.example.com/googlechat", webhookPath: "/googlechat", botUser: "users/1234567890", dm: { enabled: true, policy: "pairing", allowFrom: ["users/1234567890"], }, groupPolicy: "allowlist", groups: { "spaces/AAAA": { allow: true, requireMention: true }, }, actions: { reactions: true }, typingIndicator: "message", mediaMaxMb: 20, }, },}- JSON حساب service: inline (
serviceAccount) یا مبتنی بر فایل (serviceAccountFile). - SecretRef حساب service نیز پشتیبانی میشود (
serviceAccountRef). - fallbackهای env:
GOOGLE_CHAT_SERVICE_ACCOUNTیاGOOGLE_CHAT_SERVICE_ACCOUNT_FILE. - برای هدفهای ارسال از
spaces/<spaceId>یاusers/<userId>استفاده کنید. channels.googlechat.dangerouslyAllowNameMatchingتطبیق mutable principal ایمیل را دوباره فعال میکند (حالت سازگاری break-glass).
Slack
{ channels: { slack: { enabled: true, botToken: "xoxb-...", appToken: "xapp-...", socketMode: { clientPingTimeout: 15000, serverPingTimeout: 30000, pingPongLoggingEnabled: false, }, dmPolicy: "pairing", allowFrom: ["U123", "U456", "*"], dm: { enabled: true, groupEnabled: false, groupChannels: ["G123"] }, channels: { C123: { allow: true, requireMention: true, allowBots: false }, "#general": { allow: true, requireMention: true, allowBots: false, users: ["U123"], skills: ["docs"], systemPrompt: "Short answers only.", }, }, historyLimit: 50, allowBots: false, reactionNotifications: "own", reactionAllowlist: ["U123"], replyToMode: "off", // off | first | all | batched thread: { historyScope: "thread", // thread | channel inheritParent: false, }, actions: { reactions: true, messages: true, pins: true, memberInfo: true, emojiList: true, }, slashCommand: { enabled: true, name: "openclaw", sessionPrefix: "slack:slash", ephemeral: true, }, typingReaction: "hourglass_flowing_sand", unfurlLinks: false, unfurlMedia: false, textChunkLimit: 4000, chunkMode: "length", streaming: { mode: "partial", // off | partial | block | progress nativeTransport: true, // use Slack native streaming API when mode=partial }, mediaMaxMb: 20, execApprovals: { enabled: "auto", // true | false | "auto" approvers: ["U123"], agentFilter: ["default"], sessionFilter: ["slack:"], target: "dm", // dm | channel | both }, }, },}- حالت Socket به هر دو
botTokenوappTokenنیاز دارد (SLACK_BOT_TOKEN+SLACK_APP_TOKENبرای env fallback حساب پیشفرض). - حالت HTTP به
botTokenبههمراهsigningSecretنیاز دارد (در root یا برای هر حساب). socketModeتنظیمات transport مربوط به Slack SDK Socket Mode را به API عمومی Bolt receiver منتقل میکند. فقط هنگام بررسی timeoutهای ping/pong یا رفتار websocket stale از آن استفاده کنید.botToken،appToken،signingSecret، وuserTokenرشتههای plaintext یا objectهای SecretRef را میپذیرند.- snapshotهای حساب Slack فیلدهای source/status مربوط به هر credential مانند
botTokenSource،botTokenStatus،appTokenStatus، و در حالت HTTP،signingSecretStatusرا expose میکنند.configured_unavailableیعنی حساب از طریق SecretRef پیکربندی شده اما مسیر فرمان/زمان اجرای فعلی نتوانسته مقدار secret را resolve کند. configWrites: falseنوشتن config آغازشده توسط Slack را مسدود میکند.channels.slack.defaultAccountاختیاری، وقتی با شناسهٔ یک حساب پیکربندیشده مطابقت داشته باشد، انتخاب حساب پیشفرض را override میکند.channels.slack.streaming.modeکلید canonical حالت stream در Slack است.channels.slack.streaming.nativeTransporttransport streaming native در Slack را کنترل میکند. مقادیر legacystreamMode، booleanstreaming، وnativeStreamingهمچنان aliasهای زمان اجرا هستند؛ برای بازنویسی config ذخیرهشده،openclaw doctor --fixرا اجرا کنید.unfurlLinksوunfurlMediabooleanهای link و media unfurl مربوط بهchat.postMessageدر Slack را برای پاسخهای ربات منتقل میکنند. برای حفظ رفتار پیشفرض Slack آنها را حذف کنید؛ برای override کردن پیشفرض سطح بالا برای یک حساب، آنها را درchannels.slack.accounts.<accountId>تنظیم کنید.- برای هدفهای ارسال از
user:<id>(DM) یاchannel:<id>استفاده کنید.
حالتهای اعلان واکنش: off، own (پیشفرض)، all، allowlist (از reactionAllowlist).
جداسازی session در thread: thread.historyScope برای هر thread جداگانه است (پیشفرض) یا در کل کانال مشترک است. thread.inheritParent transcript کانال والد را به threadهای جدید کپی میکند.
- streaming native در Slack بههمراه وضعیت thread به سبک assistant در Slack با متن «is typing...» به هدف thread برای پاسخ نیاز دارد. DMهای سطح بالا بهصورت پیشفرض بیرون از thread میمانند، بنابراین همچنان میتوانند بهجای نمایش preview مربوط به native stream/status به سبک thread، از طریق previewهای draft post-and-edit در Slack stream شوند.
typingReactionهنگام اجرای پاسخ، یک واکنش موقت به پیام ورودی Slack اضافه میکند و سپس در پایان آن را حذف میکند. از shortcode ایموجی Slack مانند"hourglass_flowing_sand"استفاده کنید.channels.slack.execApprovals: ارسال تأیید exec بهصورت native در Slack و مجوزدهی approver. همان schema مربوط به Discord را دارد:enabled(true/false/"auto")،approvers(شناسههای کاربری Slack)،agentFilter،sessionFilter، وtarget("dm"،"channel"، یا"both").
| گروه Action | پیشفرض | یادداشتها |
|---|---|---|
| reactions | فعال | واکنش + فهرست واکنشها |
| messages | فعال | خواندن/ارسال/ویرایش/حذف |
| pins | فعال | پین کردن/برداشتن پین/فهرست |
| memberInfo | فعال | اطلاعات عضو |
| emojiList | فعال | فهرست ایموجی سفارشی |
Mattermost
Mattermost در releaseهای فعلی OpenClaw بهصورت Plugin bundled ارائه میشود. buildهای قدیمیتر یا
سفارشی میتوانند package فعلی npm را با
openclaw plugins install @openclaw/mattermost نصب کنند. پیش از pin کردن یک نسخه،
npmjs.com/package/@openclaw/mattermost
را برای dist-tagهای فعلی بررسی کنید.
{ channels: { mattermost: { enabled: true, botToken: "mm-token", baseUrl: "https://chat.example.com", dmPolicy: "pairing", chatmode: "oncall", // oncall | onmessage | onchar oncharPrefixes: [">", "!"], groups: { "*": { requireMention: true }, "team-channel-id": { requireMention: false }, }, commands: { native: true, // opt-in nativeSkills: true, callbackPath: "/api/channels/mattermost/command", // Optional explicit URL for reverse-proxy/public deployments callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, textChunkLimit: 4000, chunkMode: "length", }, },}حالتهای گفتگو: oncall (پاسخ هنگام @-mention، پیشفرض)، onmessage (هر پیام)، onchar (پیامهایی که با پیشوند فعالساز شروع میشوند).
وقتی فرمانهای بومی Mattermost فعال باشند:
commands.callbackPathباید یک مسیر باشد (برای مثال/api/channels/mattermost/command)، نه یک URL کامل.commands.callbackUrlباید به نقطهٔ پایانی Gateway در OpenClaw حل شود و از سرور Mattermost قابل دسترسی باشد.- فراخوانیهای بومی اسلش با توکنهای هر فرمان که
Mattermost هنگام ثبت فرمان اسلش برمیگرداند احراز هویت میشوند. اگر ثبت ناموفق باشد یا هیچ
فرمانی فعال نشود، OpenClaw فراخوانیها را با
Unauthorized: invalid command token.رد میکند. - برای میزبانهای callback خصوصی/tailnet/داخلی، ممکن است Mattermost نیاز داشته باشد
ServiceSettings.AllowedUntrustedInternalConnectionsشامل میزبان/دامنهٔ callback باشد. از مقادیر میزبان/دامنه استفاده کنید، نه URLهای کامل. channels.mattermost.configWrites: نوشتن پیکربندی آغازشده از Mattermost را مجاز یا رد میکند.channels.mattermost.requireMention: پیش از پاسخدادن در کانالها،@mentionرا الزامی میکند.channels.mattermost.groups.<channelId>.requireMention: بازنویسی دروازهگذاری mention برای هر کانال ("*"برای پیشفرض).channels.mattermost.defaultAccountاختیاری، انتخاب حساب پیشفرض را وقتی با یک شناسهٔ حساب پیکربندیشده مطابقت داشته باشد بازنویسی میکند.
Signal
{ channels: { signal: { enabled: true, account: "+15555550123", // optional account binding dmPolicy: "pairing", allowFrom: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"], configWrites: true, reactionNotifications: "own", // off | own | all | allowlist reactionAllowlist: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"], historyLimit: 50, }, },}حالتهای اعلان واکنش: off، own (پیشفرض)، all، allowlist (از reactionAllowlist).
channels.signal.account: راهاندازی کانال را به یک هویت حساب Signal مشخص سنجاق میکند.channels.signal.configWrites: نوشتن پیکربندی آغازشده از Signal را مجاز یا رد میکند.channels.signal.defaultAccountاختیاری، انتخاب حساب پیشفرض را وقتی با یک شناسهٔ حساب پیکربندیشده مطابقت داشته باشد بازنویسی میکند.
iMessage
OpenClaw دستور imsg rpc را اجرا میکند (JSON-RPC روی stdio). هیچ daemon یا پورتی لازم نیست. این مسیر ترجیحی برای راهاندازیهای جدید iMessage در OpenClaw است، وقتی میزبان بتواند مجوزهای پایگاهدادهٔ Messages و Automation را بدهد.
پشتیبانی BlueBubbles حذف شده است. channels.bluebubbles در OpenClaw فعلی یک سطح پیکربندی runtime پشتیبانیشده نیست. پیکربندیهای قدیمی را به channels.imessage منتقل کنید؛ برای نسخهٔ کوتاه از حذف BlueBubbles و مسیر imsg برای iMessage و برای جدول ترجمهٔ کامل از مهاجرت از BlueBubbles استفاده کنید.
اگر Gateway روی Mac واردشده به Messages اجرا نمیشود، channels.imessage.enabled=true را نگه دارید و channels.imessage.cliPath را روی یک wrapper SSH تنظیم کنید که imsg "$@" را روی همان Mac اجرا میکند. مسیر محلی پیشفرض imsg فقط مخصوص macOS است.
{ channels: { imessage: { enabled: true, cliPath: "imsg", dbPath: "~/Library/Messages/chat.db", remoteHost: "user@gateway-host", dmPolicy: "pairing", allowFrom: ["+15555550123", "user@example.com", "chat_id:123"], historyLimit: 50, includeAttachments: false, attachmentRoots: ["/Users/*/Library/Messages/Attachments"], remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"], mediaMaxMb: 16, service: "auto", region: "US", actions: { reactions: true, edit: true, unsend: true, reply: true, sendWithEffect: true, sendAttachment: true, }, catchup: { enabled: false, }, }, },}-
channels.imessage.defaultAccountاختیاری، انتخاب حساب پیشفرض را وقتی با یک شناسهٔ حساب پیکربندیشده مطابقت داشته باشد بازنویسی میکند. -
به Full Disk Access برای پایگاهدادهٔ Messages نیاز دارد.
-
هدفهای
chat_id:<id>را ترجیح دهید. برای فهرستکردن گفتگوها ازimsg chats --limit 20استفاده کنید. -
cliPathمیتواند به یک wrapper SSH اشاره کند؛ برای واکشی پیوستها با SCP،remoteHost(hostیاuser@host) را تنظیم کنید. -
attachmentRootsوremoteAttachmentRootsمسیرهای پیوست ورودی را محدود میکنند (پیشفرض:/Users/*/Library/Messages/Attachments). -
SCP از بررسی سختگیرانهٔ کلید میزبان استفاده میکند، پس مطمئن شوید کلید میزبان relay از قبل در
~/.ssh/known_hostsوجود دارد. -
channels.imessage.configWrites: نوشتن پیکربندی آغازشده از iMessage را مجاز یا رد میکند. -
channels.imessage.actions.*: اقدامهای API خصوصی را فعال میکند که باimsg status/openclaw channels status --probeنیز دروازهگذاری میشوند. -
channels.imessage.includeAttachmentsبهطور پیشفرض خاموش است؛ پیش از انتظار رسانهٔ ورودی در نوبتهای agent، آن را رویtrueتنظیم کنید. -
channels.imessage.catchup.enabled: بازپخش پیامهای ورودیای را که هنگام پایینبودن Gateway رسیدهاند، فعال میکند. -
channels.imessage.groups: رجیستری گروه و تنظیمات هر گروه. باgroupPolicy: "allowlist"، کلیدهای صریحchat_idیا یک ورودی wildcard با"*"را پیکربندی کنید تا پیامهای گروهی بتوانند از دروازهٔ رجیستری عبور کنند. -
ورودیهای سطح بالای
bindings[]باtype: "acp"میتوانند گفتگوهای iMessage را به نشستهای پایدار ACP متصل کنند. درmatch.peer.idاز یک handle نرمالسازیشده یا هدف گفتگوی صریح (chat_id:*،chat_guid:*،chat_identifier:*) استفاده کنید. معنای فیلدهای مشترک: عاملهای ACP.
نمونهٔ wrapper SSH برای iMessage
#!/usr/bin/env bashexec ssh -T gateway-host imsg "$@"Matrix
Matrix با Plugin پشتیبانی میشود و زیر channels.matrix پیکربندی میشود.
{ channels: { matrix: { enabled: true, homeserver: "https://matrix.example.org", accessToken: "syt_bot_xxx", proxy: "http://127.0.0.1:7890", encryption: true, initialSyncLimit: 20, defaultAccount: "ops", accounts: { ops: { name: "Ops", userId: "@ops:example.org", accessToken: "syt_ops_xxx", }, alerts: { userId: "@alerts:example.org", password: "secret", proxy: "http://127.0.0.1:7891", }, }, }, },}- احراز هویت با توکن از
accessTokenاستفاده میکند؛ احراز هویت با گذرواژه ازuserId+passwordاستفاده میکند. channels.matrix.proxyترافیک HTTP مربوط به Matrix را از یک proxy صریح HTTP(S) عبور میدهد. حسابهای نامدار میتوانند آن را باchannels.matrix.accounts.<id>.proxyبازنویسی کنند.channels.matrix.network.dangerouslyAllowPrivateNetworkhomeserverهای خصوصی/داخلی را مجاز میکند.proxyو این opt-in شبکه کنترلهای مستقلی هستند.channels.matrix.defaultAccountحساب ترجیحی را در راهاندازیهای چندحسابی انتخاب میکند.channels.matrix.autoJoinبهطور پیشفرضoffاست، بنابراین roomهای دعوتشده و دعوتهای تازهٔ سبک DM نادیده گرفته میشوند تا وقتیautoJoin: "allowlist"را همراه باautoJoinAllowlistیاautoJoin: "always"تنظیم کنید.channels.matrix.execApprovals: تحویل تأیید اجرای بومی Matrix و مجوزدهی تأییدکننده.enabled:true،false، یا"auto"(پیشفرض). در حالت auto، وقتی تأییدکنندهها بتوانند ازapproversیاcommands.ownerAllowFromحل شوند، تأییدهای اجرا فعال میشوند.approvers: شناسههای کاربر Matrix (مثلاً@owner:example.org) که مجاز به تأیید درخواستهای اجرا هستند.agentFilter: allowlist اختیاری شناسهٔ agent. برای ارسال تأییدها برای همهٔ agentها حذف کنید.sessionFilter: الگوهای اختیاری کلید نشست (زیررشته یا regex).target: محل ارسال promptهای تأیید."dm"(پیشفرض)،"channel"(room مبدأ)، یا"both".- بازنویسیهای هر حساب:
channels.matrix.accounts.<id>.execApprovals.
channels.matrix.dm.sessionScopeکنترل میکند DMهای Matrix چگونه در نشستها گروهبندی شوند:per-user(پیشفرض) بر اساس همتای مسیریابیشده مشترک است، در حالی کهper-roomهر room مربوط به DM را جدا میکند.- probeهای وضعیت Matrix و جستوجوهای زندهٔ directory از همان سیاست proxy استفاده میکنند که ترافیک runtime استفاده میکند.
- پیکربندی کامل Matrix، قواعد هدفگیری، و نمونههای راهاندازی در Matrix مستند شدهاند.
Microsoft Teams
Microsoft Teams با Plugin پشتیبانی میشود و زیر channels.msteams پیکربندی میشود.
{ channels: { msteams: { enabled: true, configWrites: true, // appId, appPassword, tenantId, webhook, team/channel policies: // see /channels/msteams }, },}- مسیرهای کلید اصلی پوششدادهشده در اینجا:
channels.msteams،channels.msteams.configWrites. - پیکربندی کامل Teams (credentials، webhook، سیاست DM/گروه، بازنویسیهای هر تیم/هر کانال) در Microsoft Teams مستند شده است.
IRC
IRC با Plugin پشتیبانی میشود و زیر channels.irc پیکربندی میشود.
{ channels: { irc: { enabled: true, dmPolicy: "pairing", configWrites: true, nickserv: { enabled: true, service: "NickServ", password: "${IRC_NICKSERV_PASSWORD}", register: false, registerEmail: "bot@example.com", }, }, },}- مسیرهای کلید اصلی پوششدادهشده در اینجا:
channels.irc،channels.irc.dmPolicy،channels.irc.configWrites،channels.irc.nickserv.*. channels.irc.defaultAccountاختیاری، انتخاب حساب پیشفرض را وقتی با یک شناسهٔ حساب پیکربندیشده مطابقت داشته باشد بازنویسی میکند.- پیکربندی کامل کانال IRC (host/port/TLS/channels/allowlists/دروازهگذاری mention) در IRC مستند شده است.
چندحسابی (همهٔ کانالها)
چند حساب را برای هر کانال اجرا کنید (هر کدام با accountId خودش):
{ channels: { telegram: { accounts: { default: { name: "Primary bot", botToken: "123456:ABC...", }, alerts: { name: "Alerts bot", botToken: "987654:XYZ...", }, }, }, },}- وقتی
accountIdحذف شود، ازdefaultاستفاده میشود (CLI + مسیریابی). - توکنهای env فقط روی حساب پیشفرض اعمال میشوند.
- تنظیمات پایهٔ کانال برای همهٔ حسابها اعمال میشوند مگر اینکه برای هر حساب بازنویسی شوند.
- از
bindings[].match.accountIdبرای مسیریابی هر حساب به یک agent متفاوت استفاده کنید. - اگر در حالیکه هنوز روی پیکربندی کانال سطحبالای تکحسابی هستید، یک حساب غیرپیشفرض را با
openclaw channels add(یا onboarding کانال) اضافه کنید، OpenClaw ابتدا مقدارهای تکحسابی سطحبالای دارای دامنهٔ حساب را به نگاشت حساب کانال ارتقا میدهد تا حساب اصلی همچنان کار کند. بیشتر کانالها آنها را بهchannels.<channel>.accounts.defaultمنتقل میکنند؛ Matrix میتواند بهجای آن یک هدف نامدار/پیشفرض موجود و مطابق را حفظ کند. - bindingهای موجود فقط-کانال (بدون
accountId) همچنان با حساب پیشفرض مطابقت دارند؛ bindingهای دارای دامنهٔ حساب اختیاری میمانند. openclaw doctor --fixنیز شکلهای ترکیبی را با انتقال مقدارهای تکحسابی سطحبالای دارای دامنهٔ حساب به حساب ارتقایافتهٔ انتخابشده برای آن کانال تعمیر میکند. بیشتر کانالها ازaccounts.defaultاستفاده میکنند؛ Matrix میتواند بهجای آن یک هدف نامدار/پیشفرض موجود و مطابق را حفظ کند.
کانالهای Plugin دیگر
بسیاری از کانالهای Plugin بهشکل channels.<id> پیکربندی میشوند و در صفحههای اختصاصی کانال خودشان مستند شدهاند (برای مثال Feishu، Matrix، LINE، Nostr، Zalo، Nextcloud Talk، Synology Chat و Twitch).
نمایهٔ کامل کانالها را ببینید: کانالها.
دروازهگذاری mention در گفتگوی گروهی
پیامهای گروهی بهطور پیشفرض نیازمند mention هستند (mention فراداده یا الگوهای امن regex). برای گفتگوهای گروهی WhatsApp، Telegram، Discord، Google Chat و iMessage اعمال میشود.
پاسخهای قابل مشاهده جداگانه کنترل میشوند. اتاقهای گروه/کانال بهطور پیشفرض از messages.groupChat.visibleReplies: "message_tool" استفاده میکنند: OpenClaw همچنان نوبت را پردازش میکند، اما پاسخهای نهایی معمولی خصوصی میمانند و خروجی قابل مشاهده در اتاق به message(action=send) نیاز دارد. فقط وقتی "automatic" را تنظیم کنید که رفتار قدیمی را میخواهید؛ رفتاری که در آن پاسخهای معمولی دوباره در اتاق ارسال میشوند. برای اعمال همین رفتار پاسخ قابل مشاهده فقط-ابزار به چتهای مستقیم نیز، messages.visibleReplies: "message_tool" را تنظیم کنید؛ هارنس Codex نیز از همین رفتار فقط-ابزار بهعنوان پیشفرض تنظیمنشده چت مستقیم استفاده میکند.
پاسخهای قابل مشاهده فقط-ابزار به مدل/زماناجرایی نیاز دارند که ابزارها را با اطمینان فراخوانی کند. اگر
گزارش نشست متن دستیار را با didSendViaMessagingTool: false نشان میدهد،
مدل بهجای فراخوانی ابزار پیام، یک پاسخ نهایی خصوصی تولید کرده است.
برای آن کانال به یک مدل قویتر در فراخوانی ابزار تغییر دهید، یا
messages.groupChat.visibleReplies: "automatic" را تنظیم کنید تا پاسخهای نهایی قابل مشاهده قدیمی
بازگردانده شوند.
اگر ابزار پیام تحت سیاست ابزار فعال در دسترس نباشد، OpenClaw بهجای سرکوب بیصدای پاسخ، به پاسخهای قابل مشاهده خودکار بازمیگردد. openclaw doctor درباره این ناسازگاری هشدار میدهد.
Gateway پیکربندی messages را پس از ذخیره فایل بهصورت hot-reload بارگذاری میکند. فقط زمانی راهاندازی مجدد کنید که پایش فایل یا بارگذاری مجدد پیکربندی در استقرار غیرفعال باشد.
انواع اشاره:
- اشارههای فرادادهای: @-mentionهای بومی پلتفرم. در حالت خود-چت WhatsApp نادیده گرفته میشوند.
- الگوهای متنی: الگوهای regex امن در
agents.list[].groupChat.mentionPatterns. الگوهای نامعتبر و تکرار تودرتوی ناامن نادیده گرفته میشوند. - دروازهگذاری اشاره فقط وقتی اعمال میشود که تشخیص ممکن باشد (اشارههای بومی یا دستکم یک الگو).
{ messages: { visibleReplies: "automatic", // global default for direct/source chats; Codex harness defaults unset direct chats to message_tool groupChat: { historyLimit: 50, visibleReplies: "message_tool", // default; use "automatic" for legacy final replies }, }, agents: { list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }], },}messages.groupChat.historyLimit پیشفرض سراسری را تنظیم میکند. کانالها میتوانند با channels.<channel>.historyLimit (یا بهازای هر حساب) آن را بازنویسی کنند. برای غیرفعالسازی، 0 را تنظیم کنید.
messages.visibleReplies پیشفرض سراسری نوبت منبع است؛ messages.groupChat.visibleReplies آن را برای نوبتهای منبع گروه/کانال بازنویسی میکند. وقتی messages.visibleReplies تنظیم نشده باشد، یک هارنس میتواند پیشفرض مستقیم/منبع خودش را ارائه کند؛ هارنس Codex بهطور پیشفرض از message_tool استفاده میکند. فهرستهای مجاز کانال و دروازهگذاری اشاره همچنان تعیین میکنند که یک نوبت پردازش شود یا نه.
محدودیتهای تاریخچه DM
{ channels: { telegram: { dmHistoryLimit: 30, dms: { "123456789": { historyLimit: 50 }, }, }, },}تفکیک: بازنویسی بهازای هر DM → پیشفرض ارائهدهنده → بدون محدودیت (همه نگهداری میشوند).
پشتیبانیشده: telegram, whatsapp, discord, slack, signal, imessage, msteams.
حالت خود-چت
برای فعالسازی حالت خود-چت شماره خودتان را در allowFrom وارد کنید (اشارههای @ بومی را نادیده میگیرد و فقط به الگوهای متنی پاسخ میدهد):
{ channels: { whatsapp: { allowFrom: ["+15555550123"], groups: { "*": { requireMention: true } }, }, }, agents: { list: [ { id: "main", groupChat: { mentionPatterns: ["reisponde", "@openclaw"] }, }, ], },}فرمانها (رسیدگی به فرمان چت)
{ commands: { native: "auto", // register native commands when supported nativeSkills: "auto", // register native skill commands when supported text: true, // parse /commands in chat messages bash: false, // allow ! (alias: /bash) bashForegroundMs: 2000, config: false, // allow /config mcp: false, // allow /mcp plugins: false, // allow /plugins debug: false, // allow /debug restart: true, // allow /restart + gateway restart tool ownerAllowFrom: ["discord:123456789012345678"], ownerDisplay: "raw", // raw | hash ownerDisplaySecret: "${OWNER_ID_HASH_SECRET}", allowFrom: { "*": ["user1"], discord: ["user:123"], }, useAccessGroups: true, },}جزئیات فرمان
- این بلوک سطحهای فرمان را پیکربندی میکند. برای کاتالوگ فعلی فرمانهای داخلی + بستهشده، فرمانهای اسلش را ببینید.
- این صفحه یک مرجع کلید پیکربندی است، نه کاتالوگ کامل فرمانها. فرمانهای متعلق به کانال/Plugin مانند
/bot-ping/bot-help/bot-logsدر QQ Bot، /cardدر LINE، /pairبرای جفتسازی دستگاه، /dreamingبرای حافظه، /phoneبرای کنترل تلفن، و /voiceدر Talk در صفحههای کانال/Plugin مربوطه بههمراه فرمانهای اسلش مستند شدهاند. - فرمانهای متنی باید پیامهای مستقل با
/در ابتدا باشند. native: "auto"فرمانهای بومی را برای Discord/Telegram روشن میکند و Slack را خاموش نگه میدارد.nativeSkills: "auto"فرمانهای بومی Skills را برای Discord/Telegram روشن میکند و Slack را خاموش نگه میدارد.- بازنویسی بهازای هر کانال:
channels.discord.commands.native(بولی یا"auto"). برای Discord، مقدارfalseثبت فرمان بومی و پاکسازی هنگام راهاندازی را رد میکند. - ثبت Skills بومی را بهازای هر کانال با
channels.<provider>.commands.nativeSkillsبازنویسی کنید. channels.telegram.customCommandsورودیهای اضافی منوی ربات Telegram را اضافه میکند.bash: true، ! <cmd>را برای شل میزبان فعال میکند. بهtools.elevated.enabledو قرار داشتن فرستنده درtools.elevated.allowFrom.<channel>نیاز دارد.config: true، /configرا فعال میکند (openclaw.jsonرا میخواند/مینویسد). برای کلاینتهایchat.sendمتعلق به Gateway، نوشتنهای پایدار/config set|unsetهمچنین بهoperator.adminنیاز دارند؛/config showفقط-خواندنی برای کلاینتهای اپراتور معمولی با دامنه نوشتن همچنان در دسترس میماند.mcp: true، /mcpرا برای پیکربندی سرور MCP مدیریتشده توسط OpenClaw زیرmcp.serversفعال میکند.plugins: true، /pluginsرا برای کشف، نصب، و کنترلهای فعال/غیرفعالسازی Plugin فعال میکند.channels.<provider>.configWritesجهشهای پیکربندی را بهازای هر کانال کنترل میکند (پیشفرض: true).- برای کانالهای چندحسابی،
channels.<provider>.accounts.<id>.configWritesهمچنین نوشتنهایی را کنترل میکند که آن حساب را هدف میگیرند (برای مثال/allowlist --config --account <id>یا/config set channels.<provider>.accounts.<id>...). restart: false، /restartو کنشهای ابزار راهاندازی مجدد Gateway را غیرفعال میکند. پیشفرض:true.ownerAllowFromفهرست مجاز صریح مالک برای فرمانها/ابزارهای فقط-مالک است. این مورد جدا ازallowFromاست.ownerDisplay: "hash"شناسههای مالک را در اعلان سیستم هش میکند. برای کنترل هشسازی،ownerDisplaySecretرا تنظیم کنید.allowFromبهازای هر ارائهدهنده است. وقتی تنظیم شود، تنها منبع مجوزدهی است (فهرستهای مجاز/جفتسازی کانال وuseAccessGroupsنادیده گرفته میشوند).useAccessGroups: falseبه فرمانها اجازه میدهد وقتیallowFromتنظیم نشده است، سیاستهای گروه دسترسی را دور بزنند.- نقشه مستندات فرمان:
- کاتالوگ داخلی + بستهشده: فرمانهای اسلش
- سطحهای فرمان ویژه کانال: کانالها
- فرمانهای QQ Bot: QQ Bot
- فرمانهای جفتسازی: جفتسازی
- فرمان کارت LINE: LINE
- Dreaming حافظه: Dreaming
مرتبط
- مرجع پیکربندی — کلیدهای سطح بالا
- پیکربندی — عاملها
- نمای کلی کانالها