Gateway
پیکربندی — کانالها
کلیدهای پیکربندی مخصوص هر کانال زیر channels.*. دسترسی DM و گروه،
راهاندازیهای چندحسابی، دروازهگذاری با اشاره، و کلیدهای مخصوص هر کانال برای Slack، Discord،
Telegram، WhatsApp، Matrix، iMessage، و دیگر Pluginهای کانال همراه را پوشش میدهد.
برای agentها، ابزارها، زمان اجرای Gateway، و دیگر کلیدهای سطح بالا، ببینید مرجع پیکربندی.
کانالها
هر کانال وقتی بخش پیکربندی آن وجود داشته باشد بهصورت خودکار شروع میشود (مگر اینکه enabled: false باشد).
دسترسی DM و گروه
همه کانالها از سیاستهای DM و سیاستهای گروه پشتیبانی میکنند:
| سیاست DM | رفتار |
|---|---|
pairing (پیشفرض) |
فرستندههای ناشناس یک کد جفتسازی یکبارمصرف میگیرند؛ مالک باید تأیید کند |
allowlist |
فقط فرستندههای موجود در allowFrom (یا ذخیره مجاز جفتشده) |
open |
اجازه به همه DMهای ورودی (نیازمند allowFrom: ["*"]) |
disabled |
نادیده گرفتن همه DMهای ورودی |
| سیاست گروه | رفتار |
|---|---|
allowlist (پیشفرض) |
فقط گروههایی که با فهرست مجاز پیکربندیشده مطابقت دارند |
open |
دور زدن فهرستهای مجاز گروه (دروازهگذاری با اشاره همچنان اعمال میشود) |
disabled |
مسدود کردن همه پیامهای گروه/اتاق |
بازنویسیهای مدل کانال
از channels.modelByChannel برای ثابت کردن شناسههای کانال مشخص یا همتایان پیام مستقیم به یک مدل استفاده کنید. مقدارها provider/model یا نامهای مستعار مدل پیکربندیشده را میپذیرند. نگاشت کانال زمانی اعمال میشود که یک نشست از قبل بازنویسی مدل نداشته باشد (برای مثال، تنظیمشده از طریق /model).
برای گفتگوهای گروه/رشته، کلیدها شناسههای گروه مخصوص کانال، شناسههای موضوع، یا نامهای کانال هستند. برای گفتگوهای پیام مستقیم (DM)، کلیدها شناسههای همتا هستند که از هویت فرستنده کانال مشتق شدهاند (nativeDirectUserId، origin.from، origin.to، OriginatingTo، From، یا SenderId). شکل دقیق کلید به کانال بستگی دارد:
| کانال | شکل کلید DM | مثال |
|---|---|---|
| Slack | user:U... |
user:U12345 |
| Telegram | شناسه خام کاربر | 123456789 |
| Discord | شناسه خام کاربر | 987654321 |
| شماره تلفن یا JID | 15551234567 |
|
| Matrix | شناسه کاربر Matrix | @user:matrix.org |
| Feishu | feishu:ou_... |
feishu:ou_a8b6cab7e945387de5f253775d9b4d85 |
{ channels: { modelByChannel: { discord: { "123456789012345678": "anthropic/claude-opus-4-6", }, slack: { C1234567890: "openai/gpt-5.5", "user:U12345": "openai/gpt-5.4-mini", }, telegram: { "-1001234567890": "openai/gpt-5.4-mini", "-1001234567890:topic:99": "anthropic/claude-sonnet-4-6", "123456789": "openai/gpt-4.1", }, }, },}کلیدهای مخصوص DM فقط در گفتگوهای پیام مستقیم مطابقت مییابند؛ آنها بر مسیریابی گروه/رشته اثر نمیگذارند.
پیشفرضهای کانال و Heartbeat
از channels.defaults برای رفتار مشترک سیاست گروه و Heartbeat در میان providerها استفاده کنید:
{ channels: { defaults: { groupPolicy: "allowlist", // open | allowlist | disabled contextVisibility: "all", // all | allowlist | allowlist_quote heartbeat: { showOk: false, showAlerts: true, useIndicator: true, }, }, },}channels.defaults.groupPolicy: سیاست گروه جایگزین وقتیgroupPolicyدر سطح provider تنظیم نشده باشد.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"], }, },}- ورودیهای سطح بالای
bindings[]باtype: "acp"اتصالهای پایدار ACP را برای DMها و گروههای WhatsApp پیکربندی میکنند. از یک شماره مستقیم E.164 یا JID گروه WhatsApp درmatch.peer.idاستفاده کنید. معناشناسی فیلدها در عاملهای ACP مشترک است.
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: partial) 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, suppressEmbeds: true, chunkMode: "length", // length | newline streaming: { mode: "progress", // off | partial | block | progress (Discord default: progress) progress: { label: "auto", maxLines: 8, maxLineChars: 120, 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, }, }, },}- توکن:
channels.discord.token، باDISCORD_BOT_TOKENبهعنوان جایگزین برای حساب پیشفرض. - فراخوانیهای خروجی مستقیم که یک Discord
tokenصریح ارائه میکنند از همان توکن برای فراخوانی استفاده میکنند؛ تنظیمات تلاش دوباره/سیاست حساب همچنان از حساب انتخابشده در تصویر لحظهای زمان اجرای فعال میآیند. - گزینهٔ اختیاری
channels.discord.defaultAccountوقتی با یک شناسهٔ حساب پیکربندیشده مطابق باشد، انتخاب حساب پیشفرض را بازنویسی میکند. - از
user:<id>(DM) یاchannel:<id>(کانال guild) برای مقصدهای تحویل استفاده کنید؛ شناسههای عددی تنها رد میشوند. - slugهای guild حروف کوچک دارند و فاصلهها با
-جایگزین میشوند؛ کلیدهای کانال از نام slugشده استفاده میکنند (بدون#). شناسههای guild را ترجیح دهید. - پیامهای نوشتهشده توسط ربات بهطور پیشفرض نادیده گرفته میشوند.
allowBots: trueآنها را فعال میکند؛ ازallowBots: "mentions"استفاده کنید تا فقط پیامهای رباتی پذیرفته شوند که ربات را mention میکنند (پیامهای خودی همچنان فیلتر میشوند). - کانالهایی که از پیامهای ورودی نوشتهشده توسط ربات پشتیبانی میکنند میتوانند از محافظت از حلقهٔ ربات مشترک استفاده کنند.
channels.defaults.botLoopProtectionرا برای بودجههای جفتی پایه تنظیم کنید، سپس فقط وقتی یک سطح به محدودیتهای متفاوت نیاز دارد کانال یا حساب را بازنویسی کنید. channels.discord.guilds.<id>.ignoreOtherMentions(و بازنویسیهای کانال) پیامهایی را حذف میکند که کاربر یا نقش دیگری را mention میکنند اما ربات را نه (بهجز @everyone/@here).channels.discord.mentionAliasesمتن خروجی پایدار@handleرا پیش از ارسال به شناسههای کاربری Discord نگاشت میکند، تا همتیمیهای شناختهشده حتی وقتی کش دایرکتوری گذرا خالی است بهشکل قطعی mention شوند. بازنویسیهای هر حساب زیرchannels.discord.accounts.<accountId>.mentionAliasesقرار دارند.maxLinesPerMessage(پیشفرض ۱۷) پیامهای بلند را حتی وقتی کمتر از ۲۰۰۰ نویسه هستند تقسیم میکند.- مقدار پیشفرض
channels.discord.suppressEmbedsبرابرtrueاست، بنابراین URLهای خروجی به پیشنمایش لینک Discord گسترش پیدا نمیکنند مگر اینکه غیرفعال شود. payloadهای صریحembedsهمچنان بهطور عادی ارسال میشوند؛ فراخوانیهای ابزار در سطح هر پیام میتوانند باsuppressEmbedsبازنویسی کنند. channels.discord.threadBindingsمسیریابی وابسته به thread در Discord را کنترل میکند:enabled: بازنویسی Discord برای قابلیتهای نشست وابسته به thread (/focus،/unfocus،/agents،/session idle،/session max-age، و تحویل/مسیریابی bound)idleHours: بازنویسی Discord برای auto-unfocus ناشی از بیفعالیتی بر حسب ساعت (0غیرفعال میکند)maxAgeHours: بازنویسی Discord برای حداکثر عمر سختگیرانه بر حسب ساعت (0غیرفعال میکند)spawnSessions: سوییچ برایsessions_spawn({ thread: true })و ایجاد/اتصال خودکار thread در thread-spawn مربوط به ACP (پیشفرض:true)defaultSpawnContext: زمینهٔ subagent بومی برای spawnهای وابسته به thread (بهطور پیشفرض"fork")
- ورودیهای سطح بالای
bindings[]باtype: "acp"اتصالهای پایدار ACP را برای کانالها و threadها پیکربندی میکنند (از شناسهٔ کانال/thread درmatch.peer.idاستفاده کنید). معنای فیلدها در عاملهای ACP مشترک است. channels.discord.ui.components.accentColorرنگ تاکیدی را برای کانتینرهای components v2 در Discord تنظیم میکند.channels.discord.agentComponents.ttlMsکنترل میکند callbackهای component ارسالشدهٔ Discord چه مدت ثبتشده باقی بمانند. پیشفرض1800000(۳۰ دقیقه) است، حداکثر86400000(۲۴ ساعت) است، و بازنویسیهای هر حساب زیرchannels.discord.accounts.<accountId>.agentComponents.ttlMsقرار دارند. مقادیر طولانیتر دکمهها/انتخابگرها/فرمهای قدیمی را مدت بیشتری قابل استفاده نگه میدارند، پس کوتاهترین TTL مناسب گردشکار را ترجیح دهید.channels.discord.voiceمکالمات کانال صوتی Discord و بازنویسیهای اختیاری auto-join + LLM + TTS را فعال میکند. پیکربندیهای متنی Discord بهطور پیشفرض صدا را خاموش میگذارند؛ برای فعالسازی،channels.discord.voice.enabled=trueرا تنظیم کنید.channels.discord.voice.modelبهصورت اختیاری مدل LLM استفادهشده برای پاسخهای کانال صوتی Discord را بازنویسی میکند.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کنترل میکند یک نشست صوتی قطعشده پیش از آنکه OpenClaw آن را از بین ببرد، چه مدت فرصت دارد وارد سیگنالدهی اتصال مجدد شود (بهطور پیشفرض15000).- پخش صدای Discord با رویداد شروع صحبت کاربر دیگر قطع نمیشود. برای جلوگیری از حلقههای بازخورد، OpenClaw هنگام پخش TTS ضبط صوتی جدید را نادیده میگیرد.
- OpenClaw همچنین پس از شکستهای مکرر رمزگشایی، با ترک/پیوستن دوباره به نشست صوتی برای بازیابی دریافت صدا تلاش میکند.
channels.discord.streamingکلید متعارف حالت stream است. پیشفرض Discord برابرstreaming.mode: "progress"است تا پیشرفت ابزار/کار در یک پیام پیشنمایش ویرایششده ظاهر شود؛ برای غیرفعالسازی آنstreaming.mode: "off"را تنظیم کنید. مقادیر قدیمیstreamModeوstreamingبولی همچنان aliasهای زمان اجرا هستند؛ برای بازنویسی پیکربندی پایدار،openclaw doctor --fixرا اجرا کنید.channels.discord.autoPresenceدسترسپذیری زمان اجرا را به presence ربات نگاشت میکند (healthy => online، degraded => idle، exhausted => dnd) و بازنویسیهای اختیاری متن وضعیت را مجاز میکند.channels.discord.dangerouslyAllowNameMatchingتطبیق قابلتغییر نام/tag را دوباره فعال میکند (حالت سازگاری اضطراری).channels.discord.execApprovals: تحویل تایید اجرای بومی Discord و مجوزدهی تاییدکننده.enabled:true،false، یا"auto"(پیشفرض). در حالت auto، تاییدهای exec وقتی فعال میشوند که تاییدکنندگان ازapproversیاcommands.ownerAllowFromقابل resolve باشند.approvers: شناسههای کاربری Discord که اجازهٔ تایید درخواستهای exec را دارند. اگر حذف شود بهcommands.ownerAllowFromبرمیگردد.agentFilter: allowlist اختیاری شناسهٔ عامل. برای ارسال تاییدها برای همهٔ عاملها حذف کنید.sessionFilter: الگوهای اختیاری کلید نشست (زیررشته یا regex).target: محل ارسال promptهای تایید."dm"(پیشفرض) به DMهای تاییدکننده میفرستد،"channel"به کانال مبدا میفرستد،"both"به هر دو میفرستد. وقتی target شامل"channel"باشد، دکمهها فقط توسط تاییدکنندگان resolveشده قابل استفاده هستند.cleanupAfterResolve: وقتیtrueباشد، DMهای تایید را پس از تایید، رد، یا timeout حذف میکند.
حالتهای اعلان واکنش: 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 حساب سرویس: درونخطی (
serviceAccount) یا مبتنی بر فایل (serviceAccountFile). - SecretRef حساب سرویس نیز پشتیبانی میشود (
serviceAccountRef). - جایگزینهای env:
GOOGLE_CHAT_SERVICE_ACCOUNTیاGOOGLE_CHAT_SERVICE_ACCOUNT_FILE. - از
spaces/<spaceId>یاusers/<userId>برای مقصدهای تحویل استفاده کنید. channels.googlechat.dangerouslyAllowNameMatchingتطبیق principal ایمیل قابلتغییر را دوباره فعال میکند (حالت سازگاری اضطراری).
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برای بازگشت پیشفرض محیط حساب). - حالت HTTP به
botTokenبههمراهsigningSecretنیاز دارد (در ریشه یا برای هر حساب). socketModeتنظیمات انتقال Slack SDK Socket Mode را به API عمومی گیرنده Bolt عبور میدهد. فقط هنگام بررسی timeout پینگ/پونگ یا رفتار websocket کهنه از آن استفاده کنید. مقدار پیشفرضclientPingTimeoutبرابر15000است؛serverPingTimeoutوpingPongLoggingEnabledفقط وقتی پیکربندی شده باشند عبور داده میشوند.botToken،appToken،signingSecretوuserTokenرشتههای متن ساده یا اشیای SecretRef را میپذیرند.- نماهای لحظهای حساب Slack فیلدهای منبع/وضعیت هر اعتبارنامه را آشکار میکنند، مانند
botTokenSource،botTokenStatus،appTokenStatusو، در حالت HTTP،signingSecretStatus.configured_unavailableیعنی حساب از طریق SecretRef پیکربندی شده اما مسیر دستور/زمان اجرای فعلی نتوانسته مقدار secret را resolve کند. configWrites: falseنوشتن پیکربندی آغازشده از Slack را مسدود میکند.channels.slack.defaultAccountاختیاری، وقتی با شناسه یک حساب پیکربندیشده مطابقت داشته باشد، انتخاب حساب پیشفرض را بازنویسی میکند.channels.slack.streaming.modeکلید متعارف حالت جریان Slack است.channels.slack.streaming.nativeTransportانتقال جریان بومی Slack را کنترل میکند. مقدارهای legacystreamMode، بولیstreamingوnativeStreamingهمچنان aliasهای زمان اجرا هستند؛ برای بازنویسی پیکربندی ذخیرهشده،openclaw doctor --fixرا اجرا کنید.unfurlLinksوunfurlMediaبولیهای بازکردن پیشنمایش لینک و رسانهchat.postMessageدر Slack را برای پاسخهای ربات عبور میدهند. مقدار پیشفرضunfurlLinksبرابرfalseاست تا لینکهای خروجی ربات، مگر در صورت فعالسازی، درونخطی گسترش پیدا نکنند؛unfurlMediaمگر در صورت پیکربندی حذف میشود. برای بازنویسی مقدار سطح بالا برای یک حساب، هر یک از این مقدارها را درchannels.slack.accounts.<accountId>تنظیم کنید.- برای هدفهای تحویل از
user:<id>(پیام مستقیم) یاchannel:<id>استفاده کنید.
حالتهای اعلان واکنش: off، own (پیشفرض)، all، allowlist (از reactionAllowlist).
ایزولهسازی نشست thread: thread.historyScope برای هر thread (پیشفرض) یا مشترک در سراسر channel است. thread.inheritParent رونوشت channel والد را به threadهای جدید کپی میکند.
- جریان بومی Slack بههمراه وضعیت thread به سبک دستیار Slack با متن «در حال تایپ است...» به یک هدف thread پاسخ نیاز دارد. پیامهای مستقیم سطح بالا بهطور پیشفرض خارج از thread میمانند، بنابراین همچنان میتوانند بهجای نمایش پیشنمایش جریان/وضعیت بومی به سبک thread، از طریق پیشنمایشهای پیشنویس ارسال و ویرایش Slack جریان داشته باشند.
typingReactionهنگام اجرای پاسخ، یک واکنش موقت به پیام ورودی Slack اضافه میکند و سپس پس از تکمیل آن را حذف میکند. از shortcode ایموجی Slack مانند"hourglass_flowing_sand"استفاده کنید.channels.slack.execApprovals: تحویل approval-client بومی Slack و مجوزدهی تأییدکننده exec. همان schema در Discord:enabled(true/false/"auto")،approvers(شناسههای کاربری Slack)،agentFilter،sessionFilterوtarget("dm"،"channel"یا"both"). approvalهای Plugin میتوانند برای درخواستهای منشأگرفته از Slack، وقتی تأییدکنندگان Plugin در Slack resolve میشوند، از این مسیر native-client استفاده کنند؛ تحویل approval بومی Plugin در Slack همچنین میتواند از طریقapprovals.pluginبرای نشستهای منشأگرفته از Slack یا هدفهای Slack فعال شود. approvalهای Plugin از تأییدکنندگان Plugin در Slack ازallowFromو مسیریابی پیشفرض استفاده میکنند، نه تأییدکنندگان exec.
| گروه کنش | پیشفرض | یادداشتها |
|---|---|---|
| reactions | فعال | واکنش + فهرست واکنشها |
| messages | فعال | خواندن/ارسال/ویرایش/حذف |
| pins | فعال | سنجاق کردن/برداشتن سنجاق/فهرست |
| memberInfo | فعال | اطلاعات عضو |
| emojiList | فعال | فهرست ایموجی سفارشی |
Mattermost
Mattermost در نسخههای فعلی OpenClaw بهصورت یک Plugin همراه عرضه میشود. buildهای قدیمیتر یا
سفارشی میتوانند یک بسته 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 (پیامهایی که با پیشوند trigger شروع میشوند).
وقتی دستورهای بومی Mattermost فعال باشند:
commands.callbackPathباید یک مسیر باشد (برای مثال/api/channels/mattermost/command)، نه یک URL کامل.commands.callbackUrlباید به endpoint Gateway در OpenClaw resolve شود و از سرور Mattermost قابل دسترسی باشد.- callbackهای slash بومی با tokenهای هر دستور که
Mattermost هنگام ثبت دستور slash برمیگرداند احراز هویت میشوند. اگر ثبت شکست بخورد یا هیچ
دستوری فعال نشود، OpenClaw callbackها را با
Unauthorized: invalid command token.رد میکند. - برای میزبانهای callback خصوصی/tailnet/داخلی، Mattermost ممکن است نیاز داشته باشد
ServiceSettings.AllowedUntrustedInternalConnectionsشامل میزبان/دامنه callback باشد. از مقدارهای میزبان/دامنه استفاده کنید، نه URLهای کامل. channels.mattermost.configWrites: اجازه دادن یا رد کردن نوشتن پیکربندی آغازشده از Mattermost.channels.mattermost.requireMention: الزام@mentionپیش از پاسخ دادن در channelها.channels.mattermost.groups.<channelId>.requireMention: بازنویسی mention-gating برای هر channel ("*"برای پیشفرض).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: راهاندازی channel را به یک هویت حساب Signal مشخص pin کنید.channels.signal.configWrites: اجازه دادن یا رد کردن نوشتن پیکربندی آغازشده از Signal.channels.signal.defaultAccountاختیاری، وقتی با شناسه یک حساب پیکربندیشده مطابقت داشته باشد، انتخاب حساب پیشفرض را بازنویسی میکند.
iMessage
OpenClaw، imsg rpc را اجرا میکند (JSON-RPC روی stdio). هیچ daemon یا پورتی لازم نیست. وقتی میزبان بتواند مجوزهای پایگاه داده Messages و Automation را بدهد، این مسیر ترجیحی برای راهاندازیهای جدید iMessage در OpenClaw است.
پشتیبانی BlueBubbles حذف شده است. channels.bluebubbles در OpenClaw فعلی یک سطح پیکربندی زمان اجرا پشتیبانیشده نیست. پیکربندیهای قدیمی را به channels.imessage مهاجرت دهید؛ برای نسخه کوتاه از حذف BlueBubbles و مسیر imsg iMessage و برای جدول کامل ترجمه از مهاجرت از BlueBubbles استفاده کنید.
اگر Gateway روی Mac واردشده به Messages اجرا نمیشود، channels.imessage.enabled=true را نگه دارید و channels.imessage.cliPath را به یک wrapper از نوع SSH تنظیم کنید که imsg "$@" را روی آن Mac اجرا میکند. مسیر محلی پیشفرض imsg فقط مخصوص macOS است.
پیش از تکیه بر wrapper از نوع SSH برای ارسالهای production، یک imsg send خروجی را از همان wrapper دقیق verify کنید. برخی وضعیتهای TCC در macOS، Automation مربوط به Messages را به /usr/libexec/sshd-keygen-wrapper اختصاص میدهند، که میتواند باعث شود خواندن و probeها کار کنند اما ارسالها با AppleEvents -1743 شکست بخورند؛ ارسالهای wrapper از نوع SSH با AppleEvents -1743 شکست میخورند را ببینید.
{ 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", sendTransport: "auto", region: "US", actions: { reactions: true, edit: true, unsend: true, reply: true, sendWithEffect: true, sendAttachment: true, }, }, },}-
channels.imessage.defaultAccountاختیاری، وقتی با شناسه یک حساب پیکربندیشده مطابقت داشته باشد، انتخاب حساب پیشفرض را بازنویسی میکند. -
به Full Disk Access برای DB مربوط به Messages نیاز دارد.
-
هدفهای
chat_id:<id>را ترجیح دهید. برای فهرست کردن چتها ازimsg chats --limit 20استفاده کنید. -
cliPathمیتواند به یک wrapper از نوع SSH اشاره کند؛ برای دریافت پیوست با SCP،remoteHost(hostیاuser@host) را تنظیم کنید. -
attachmentRootsوremoteAttachmentRootsمسیرهای پیوست ورودی را محدود میکنند (پیشفرض:/Users/*/Library/Messages/Attachments). -
SCP از بررسی سختگیرانه host-key استفاده میکند، بنابراین مطمئن شوید کلید میزبان relay از قبل در
~/.ssh/known_hostsوجود دارد. -
channels.imessage.configWrites: اجازه دادن یا رد کردن نوشتن پیکربندی آغازشده از iMessage. -
channels.imessage.sendTransport: انتقال ارسال RPC ترجیحیimsgبرای پاسخهای خروجی عادی.auto(پیشفرض) برای چتهای موجود وقتی bridge مربوط به IMCore در حال اجرا باشد از آن استفاده میکند، سپس به AppleScript fallback میکند؛bridgeبه تحویل private-API نیاز دارد؛applescriptمسیر عمومی automation در Messages را اجباری میکند. -
channels.imessage.actions.*: کنشهای private API را فعال کنید که همچنین توسطimsg status/openclaw channels status --probegate میشوند. -
channels.imessage.includeAttachmentsبهطور پیشفرض خاموش است؛ پیش از انتظار رسانه ورودی در نوبتهای agent، آن را رویtrueتنظیم کنید. -
بازیابی ورودی پس از restart شدن bridge/gateway خودکار است (dedupe با GUID بههمراه حصار سنی backlog کهنه). پیکربندیهای موجود
channels.imessage.catchup.enabled: trueهمچنان بهعنوان پروفایل سازگاری deprecated رعایت میشوند. -
channels.imessage.groups: registry گروه و تنظیمات هر گروه. باgroupPolicy: "allowlist"، یا کلیدهای صریحchat_idیا یک ورودی wildcard با"*"را پیکربندی کنید تا پیامهای گروه بتوانند از gate مربوط به registry عبور کنند. -
ورودیهای سطح بالای
bindings[]باtype: "acp"میتوانند مکالمات iMessage را به نشستهای پایدار ACP متصل کنند. درmatch.peer.idاز یک handle نرمالشده یا هدف چت صریح (chat_id:*،chat_guid:*،chat_identifier:*) استفاده کنید. معناشناسی فیلدهای مشترک: agentهای 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 را از طریق یک پروکسی HTTP(S) صریح عبور میدهد. حسابهای نامگذاریشده میتوانند آن را باchannels.matrix.accounts.<id>.proxyبازنویسی کنند.channels.matrix.network.dangerouslyAllowPrivateNetworkhomeserverهای خصوصی/داخلی را مجاز میکند.proxyو این اعلام موافقت شبکه، کنترلهایی مستقل هستند.channels.matrix.defaultAccountحساب ترجیحی را در تنظیمات چندحسابی انتخاب میکند.- مقدار پیشفرض
channels.matrix.autoJoinبرابرoffاست، بنابراین اتاقهای دعوتشده و دعوتهای تازه با سبک DM نادیده گرفته میشوند تا زمانی کهautoJoin: "allowlist"را همراه باautoJoinAllowlistیاautoJoin: "always"تنظیم کنید. channels.matrix.execApprovals: تحویل تأیید اجرای بومی Matrix و مجوزدهی تأییدکننده.enabled:true،false، یا"auto"(پیشفرض). در حالت auto، تأییدهای اجرا وقتی فعال میشوند که تأییدکنندهها ازapproversیاcommands.ownerAllowFromقابل حل باشند.approvers: شناسههای کاربری Matrix (مثلاً@owner:example.org) که مجاز به تأیید درخواستهای اجرا هستند.agentFilter: فهرست مجاز اختیاری برای شناسه عامل. برای ارسال تأییدها برای همه عاملها حذف کنید.sessionFilter: الگوهای اختیاری کلید نشست (زیررشته یا regex).target: محل ارسال اعلانهای تأیید."dm"(پیشفرض)،"channel"(اتاق مبدأ)، یا"both".- بازنویسیهای هر حساب:
channels.matrix.accounts.<id>.execApprovals.
channels.matrix.dm.sessionScopeکنترل میکند DMهای Matrix چگونه در نشستها گروهبندی شوند:per-user(پیشفرض) بر اساس همتای مسیریابیشده مشترک است، در حالی کهper-roomهر اتاق DM را جدا میکند.- بررسیهای وضعیت Matrix و جستوجوهای زنده فهرست از همان سیاست پروکسی ترافیک زمان اجرا استفاده میکنند.
- پیکربندی کامل 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 (اعتبارنامهها، 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 gating) در 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استفاده کنید تا هر حساب را به عامل متفاوتی مسیریابی کنید. - اگر از طریق
openclaw channels add(یا راهاندازی کانال) یک حساب غیرپیشفرض اضافه کنید در حالی که هنوز روی پیکربندی کانال سطحبالای تکحسابی هستید، 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 اعمال میشود.
پاسخهای قابلمشاهده جداگانه کنترل میشوند. درخواستهای مستقیم عادی گروه، کانال، و WebChat داخلی بهطور پیشفرض تحویل نهایی خودکار دارند: متن نهایی دستیار از مسیر پاسخ قابلمشاهده قدیمی ارسال میشود. وقتی خروجی قابلمشاهده فقط باید پس از فراخوانی message(action=send) توسط عامل ارسال شود، messages.visibleReplies: "message_tool" یا messages.groupChat.visibleReplies: "message_tool" را فعال کنید. اگر مدل در حالت فقط-ابزارِ فعالشده متن نهایی را بدون فراخوانی ابزار پیام برگرداند، آن متن نهایی خصوصی میماند و لاگ پرجزئیات gateway فراداده payload سرکوبشده را ثبت میکند.
پاسخهای قابلمشاهده فقط-ابزار به مدل/زمان اجرایی نیاز دارند که بهطور قابلاعتماد ابزارها را فراخوانی کند، و برای اتاقهای محیطی مشترک روی مدلهای نسل جدید مانند GPT 5.5 توصیه میشوند. برخی مدلهای ضعیفتر میتوانند متن نهایی را پاسخ دهند اما متوجه نمیشوند که خروجی قابلمشاهده برای منبع باید با message(action=send) فرستاده شود. برای آن مدلها، از "automatic" استفاده کنید تا نوبت نهایی دستیار مسیر پاسخ قابلمشاهده باشد. اگر لاگ نشست متن دستیار را با didSendViaMessagingTool: false نشان میدهد، مدل بهجای فراخوانی ابزار پیام، متن نهایی خصوصی تولید کرده است. برای آن کانال به یک مدل قویتر در فراخوانی ابزار تغییر دهید، لاگ پرجزئیات gateway را برای خلاصه payload سرکوبشده بررسی کنید، یا messages.groupChat.visibleReplies: "automatic" را تنظیم کنید تا برای هر درخواست گروه/کانال از پاسخهای نهایی قابلمشاهده استفاده شود.
اگر ابزار پیام تحت سیاست ابزار فعال در دسترس نباشد، OpenClaw بهجای سرکوب بیصدای پاسخ، به پاسخهای قابلمشاهده خودکار برمیگردد. openclaw doctor درباره این ناسازگاری هشدار میدهد.
این قاعده روی متن نهایی عادی عامل اعمال میشود. bindingهای مکالمه متعلق به Plugin از پاسخ برگشتی Plugin مالک بهعنوان پاسخ قابلمشاهده برای نوبتهای رشته bound ادعاشده استفاده میکنند؛ Plugin لازم نیست برای آن پاسخهای binding، message(action=send) را فراخوانی کند.
عیبیابی: group @mention نشانگر تایپ را فعال میکند و سپس سکوت میشود (بدون خطا)
نشانه: یک @mention در گروه/کانال نشانگر تایپ را نشان میدهد و لاگ gateway گزارش میکند dispatch complete (queuedFinal=false, replies=0)، اما هیچ پیامی به اتاق نمیرسد. DMها به همان عامل بهطور عادی پاسخ میدهند.
علت: حالت پاسخ قابلمشاهده گروه/کانال به "message_tool" حل میشود، بنابراین OpenClaw نوبت را اجرا میکند اما متن نهایی دستیار را سرکوب میکند مگر اینکه عامل message(action=send) را فراخوانی کند. در این حالت هیچ قرارداد NO_REPLY وجود ندارد؛ نبود فراخوانی message-tool یعنی نبود پاسخ منبع. خطایی وجود ندارد چون سرکوب، رفتار پیکربندیشده است. نوبتهای عادی گروه و کانال بهطور پیشفرض "automatic" هستند، بنابراین این نشانه فقط وقتی ظاهر میشود که messages.groupChat.visibleReplies (یا messages.visibleReplies سراسری) صراحتاً روی "message_tool" تنظیم شده باشد. defaultVisibleReplies در harness اینجا اعمال نمیشود — حلکننده گروه/کانال آن را نادیده میگیرد؛ فقط روی گفتوگوهای مستقیم/منبع اثر میگذارد (harness مربوط به Codex نهاییهای گفتوگوی مستقیم را به این شکل سرکوب میکند).
رفع: یا یک مدل قویتر در فراخوانی ابزار انتخاب کنید، بازنویسی صریح "message_tool" را حذف کنید تا به پیشفرض "automatic" برگردید، یا messages.groupChat.visibleReplies: "automatic" را تنظیم کنید تا برای هر درخواست گروه/کانال پاسخهای قابلمشاهده اجباری شوند. gateway پس از ذخیره فایل، پیکربندی messages را hot-reload میکند؛ فقط زمانی gateway را راهاندازی مجدد کنید که پایش فایل یا بارگذاری مجدد پیکربندی در استقرار غیرفعال باشد.
انواع mention:
- mentionهای فرادادهای: @-mentionهای بومی پلتفرم. در حالت خودگفتوگوی WhatsApp نادیده گرفته میشوند.
- الگوهای متنی: الگوهای regex ایمن در
agents.list[].groupChat.mentionPatterns. الگوهای نامعتبر و تکرار تودرتوی ناامن نادیده گرفته میشوند. - دروازهگذاری mention فقط وقتی اعمال میشود که تشخیص ممکن باشد (mentionهای بومی یا حداقل یک الگو).
{ messages: { visibleReplies: "automatic", // force old automatic final replies for direct/source chats groupChat: { historyLimit: 50, unmentionedInbound: "room_event", // always-on unmentioned room chatter becomes quiet context visibleReplies: "message_tool", // opt-in; require message(action=send) for visible room replies }, }, agents: { list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }], },}messages.groupChat.historyLimit پیشفرض سراسری را تنظیم میکند. کانالها میتوانند با channels.<channel>.historyLimit (یا برای هر حساب) آن را بازنویسی کنند. برای غیرفعالکردن، 0 را تنظیم کنید.
messages.groupChat.unmentionedInbound: "room_event" پیامهای همیشهفعال گروه/کانال بدون mention را در کانالهای پشتیبانیشده بهعنوان زمینه آرام اتاق ارسال میکند. پیامهای دارای mention، فرمانها، و پیامهای مستقیم همچنان درخواستهای کاربر باقی میمانند. برای نمونههای کامل Discord، Slack، و Telegram به رویدادهای محیطی اتاق مراجعه کنید.
messages.visibleReplies پیشفرض سراسری رویداد منبع است؛ messages.groupChat.visibleReplies آن را برای رویدادهای منبع گروه/کانال بازنویسی میکند. وقتی messages.visibleReplies تنظیم نشده باشد، گفتوگوهای مستقیم/منبع از پیشفرض زمان اجرا یا harness انتخابشده استفاده میکنند، اما نوبتهای مستقیم WebChat داخلی برای برابری prompt در Pi/Codex از تحویل نهایی خودکار استفاده میکنند. برای اینکه عمداً برای خروجی قابلمشاهده، message(action=send) لازم باشد، messages.visibleReplies: "message_tool" را تنظیم کنید. فهرستهای مجاز کانال و دروازهگذاری mention همچنان تعیین میکنند که یک رویداد پردازش شود یا نه.
محدودیتهای تاریخچه DM
{ channels: { telegram: { dmHistoryLimit: 30, dms: { "123456789": { historyLimit: 50 }, }, }, },}حلوفصل: بازنویسی هر DM → پیشفرض ارائهدهنده → بدون محدودیت (همه نگه داشته میشوند).
پشتیبانیشده: telegram، whatsapp، discord، slack، signal، imessage، msteams.
حالت خودگفتوگو
برای فعالکردن حالت خودگفتوگو، شماره خودتان را در allowFrom وارد کنید (mentionهای بومی @ را نادیده میگیرد و فقط به الگوهای متنی پاسخ میدهد):
{ 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 مانند QQ Bot
/bot-ping/bot-help/bot-logs، LINE/card، جفتسازی دستگاه/pair، حافظه/dreaming، کنترل تلفن/phone، و Talk/voiceدر صفحههای کانال/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را میخواند/مینویسد). برای کلاینتهای Gatewaychat.send، نوشتنهای پایدار/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
مرتبط
- مرجع پیکربندی — کلیدهای سطح بالا
- پیکربندی — عاملها
- نمای کلی کانالها