Gateway
پیکربندی — کانالها
کلیدهای پیکربندی مختص هر کانال زیر channels.*: دسترسی پیام خصوصی و گروه، راهاندازیهای چندحسابی، دروازهگذاری اشاره، و کلیدهای مختص هر کانال برای Slack، Discord، Telegram، WhatsApp، Matrix، iMessage و دیگر Pluginهای کانال.
برای عاملها، ابزارها، زمان اجرای Gateway و دیگر کلیدهای سطحبالا، به مرجع پیکربندی مراجعه کنید.
کانالها
هر کانال با وجود بخش پیکربندیاش بهطور خودکار راهاندازی میشود (مگر اینکه enabled: false). Telegram و iMessage درون بستهٔ اصلی openclaw ارائه میشوند. دیگر کانالهای رسمی (Discord، Slack، WhatsApp، Matrix، Microsoft Teams، IRC، Google Chat، Signal، Mattermost و موارد بیشتر) بهصورت Pluginهای جداگانه با openclaw plugins install <spec> نصب میشوند؛ برای فهرست کامل و مشخصات نصب، به کانالها مراجعه کنید.
دسترسی پیام خصوصی و گروه
همهٔ کانالها از خطمشیهای پیام خصوصی و گروه پشتیبانی میکنند:
| خطمشی پیام خصوصی | رفتار |
|---|---|
pairing (پیشفرض) |
فرستندگان ناشناس یک کد جفتسازی یکبارمصرف دریافت میکنند؛ مالک باید تأیید کند |
allowlist |
فقط فرستندگان موجود در allowFrom (یا مخزن مجاز جفتشده) |
open |
اجازه به همهٔ پیامهای خصوصی ورودی (نیازمند allowFrom: ["*"]) |
disabled |
نادیدهگرفتن همهٔ پیامهای خصوصی ورودی |
| خطمشی گروه | رفتار |
|---|---|
allowlist (پیشفرض) |
فقط گروههای منطبق با فهرست مجاز پیکربندیشده |
open |
نادیدهگرفتن فهرستهای مجاز گروه (دروازهگذاری اشاره همچنان اعمال میشود) |
disabled |
مسدودکردن همهٔ پیامهای گروه/اتاق |
بازنویسی مدل کانال
از channels.modelByChannel برای سنجاقکردن شناسههای کانال یا همتایان پیام خصوصی مشخص به یک مدل استفاده کنید. مقادیر، provider/model یا نامهای مستعار مدل پیکربندیشده را میپذیرند. نگاشت کانال فقط زمانی اعمال میشود که نشست از قبل بازنویسی مدل فعالی نداشته باشد (برای مثال، موردی که از طریق /model تنظیم شده است).
برای گفتوگوهای گروهی/رشتهای، کلیدها شناسههای گروه، شناسههای موضوع یا نامهای کانال مختص همان کانال هستند. برای گفتوگوهای پیام خصوصی (DM)، کلیدها شناسههای همتا هستند که از هویت فرستندهٔ کانال (nativeDirectUserId، origin.from، origin.to، OriginatingTo، From یا SenderId) بهدست میآیند. شکل دقیق کلید به کانال بستگی دارد:
| کانال | شکل کلید پیام خصوصی | نمونه |
|---|---|---|
| Discord | شناسهٔ خام کاربر | 987654321 |
| Feishu | feishu:ou_... |
feishu:ou_a8b6cab7e945387de5f253775d9b4d85 |
| Matrix | شناسهٔ کاربر Matrix | @user:matrix.org |
| Slack | user:U... |
user:U12345 |
| Telegram | شناسهٔ خام کاربر | 123456789 |
| شماره تلفن یا JID | 15551234567 |
{ channels: { modelByChannel: { discord: { "123456789012345678": "anthropic/claude-opus-4-6", }, slack: { C1234567890: "openai/gpt-5.6-sol", "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", }, }, },}کلیدهای مختص پیام خصوصی فقط در گفتوگوهای پیام خصوصی تطبیق داده میشوند؛ آنها بر مسیریابی گروه/رشته تأثیری ندارند.
پیشفرضهای کانال و Heartbeat
از channels.defaults برای رفتار مشترک خطمشی گروه، اشارهٔ ضمنی و Heartbeat میان ارائهدهندگان استفاده کنید:
{ channels: { defaults: { groupPolicy: "allowlist", // open | allowlist | disabled contextVisibility: "all", // all | allowlist | allowlist_quote implicitMentions: { replyToBot: true, quotedBot: true, threadParticipation: true, }, heartbeat: { showOk: false, showAlerts: true, useIndicator: true, }, }, },}channels.defaults.groupPolicy: خطمشی گروه جایگزین هنگامی کهgroupPolicyدر سطح ارائهدهنده تنظیم نشده باشد.channels.defaults.contextVisibility: حالت پیشفرض مشاهدهپذیری زمینهٔ تکمیلی برای همهٔ کانالها. مقادیر:all(پیشفرض، شامل همهٔ زمینههای نقلقول/رشته/تاریخچه)،allowlist(فقط شامل زمینهٔ فرستندگان موجود در فهرست مجاز)،allowlist_quote(همانند فهرست مجاز، اما با حفظ زمینهٔ صریح نقلقول/پاسخ). بازنویسی مختص هر کانال:channels.<channel>.contextVisibility.channels.defaults.implicitMentions: کنترل میکند کدام واقعیتهای ورودیِ پشتیبانیشده بهعنوان اشاره محسوب شوند. هر یک ازreplyToBot،quotedBotوthreadParticipationبهطور پیشفرضtrueهستند و رفتار فعلی را حفظ میکنند. برای هر کانال باchannels.<channel>.implicitMentionsیا برای هر حساب باchannels.<channel>.accounts.<id>.implicitMentionsبازنویسی کنید؛ هر پرچم بهطور مستقل با ترتیب حساب -> کانال -> پیشفرضها حل میشود. نامها مثبت هستند: برای جلوگیری از اینکه آن واقعیت دروازهگذاری اشاره را دور بزند، پرچم را رویfalseتنظیم کنید. اشارههای صریح بومی همیشه مجازند و اگر کانال آن واقعیت را تولید نکند، پرچم اثری ندارد. برای ماتریس فعلی تولیدکنندگان، به دروازهگذاری اشاره مراجعه کنید. این تنظیمات حالتهای پاسخ/رشتهٔ خروجی یا رسیدگی به فرمانهای مجاز را تغییر نمیدهند.channels.defaults.heartbeat.showOk: وضعیتهای سالم کانال را در خروجی Heartbeat لحاظ میکند (پیشفرضfalse).channels.defaults.heartbeat.showAlerts: وضعیتهای افتکرده/خطا را در خروجی Heartbeat لحاظ میکند (پیشفرضtrue).channels.defaults.heartbeat.useIndicator: خروجی فشردهٔ Heartbeat بهسبک نشانگر را رندر میکند (پیشفرضtrue).
WhatsApp از طریق کانال وب Gateway (Baileys Web) اجرا میشود. وقتی یک نشست پیوندخورده وجود داشته باشد، بهطور خودکار راهاندازی میشود.
{ web: { enabled: true, }, channels: { whatsapp: { dmPolicy: "pairing", // pairing | allowlist | open | disabled allowFrom: ["+15555550123", "+447700900123"], textChunkLimit: 4000, streaming: { 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 را برای پیامهای خصوصی و گروههای WhatsApp پیکربندی میکنند. درmatch.peer.idاز یک شمارهٔ مستقیم E.164 یا JID گروه WhatsApp استفاده کنید. معنای فیلدها در عاملهای 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: { mode: "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", trustedLocalFileRoots: ["/srv/telegram-bot-api-data"], 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>را حذف میکند.- برای سرور Bot API خودمیزبان در حالت
--local،trustedLocalFileRootsمسیرهای میزبان قابل خواندن توسط OpenClaw را فهرست میکند. حجم دادهٔ سرور را روی میزبان OpenClaw سوار کنید و ریشهٔ داده یا دایرکتوری مختص هر توکن آن را پیکربندی کنید؛ مسیرهای کانتینر زیر/var/lib/telegram-bot-apiبه آن ریشهها نگاشت میشوند. دیگر مسیرهای مطلق همچنان رد میشوند. channels.telegram.defaultAccountاختیاری، هنگامی که با یک شناسهٔ حساب پیکربندیشده مطابقت داشته باشد، انتخاب حساب پیشفرض را بازنویسی میکند.- در راهاندازیهای چندحسابی (2+ شناسهٔ حساب)، برای جلوگیری از مسیریابی جایگزین یک پیشفرض صریح (
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استفاده میکنند (در گفتوگوهای خصوصی و گروهی کار میکند). network.dnsResultOrderبرای جلوگیری از خطاهای رایج واکشی IPv6 بهطور پیشفرض"ipv4first"است.- خطمشی تلاش مجدد: به خطمشی تلاش مجدد مراجعه کنید.
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, streaming: { mode: "progress", // off | partial | block | progress (پیشفرض Discord: progress) chunkMode: "length", // length | newline 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بهعنوان گزینهٔ جایگزین برای حساب پیشفرض. - فراخوانیهای خروجی مستقیم که یک
tokenصریح Discord ارائه میکنند، از همان توکن برای فراخوانی استفاده میکنند؛ تنظیمات تلاش مجدد/سیاست حساب همچنان از حساب انتخابشده در تصویر لحظهای زمان اجرای فعال دریافت میشوند. channels.discord.defaultAccountاختیاری، هنگامی که با شناسهٔ یک حساب پیکربندیشده مطابقت داشته باشد، انتخاب حساب پیشفرض را لغو میکند.- برای مقصدهای تحویل از
user:<id>(پیام مستقیم) یاchannel:<id>(کانال انجمن) استفاده کنید؛ شناسههای صرفاً عددی رد میشوند. - نامکهای انجمن با حروف کوچک هستند و فاصلهها در آنها با
-جایگزین میشوند؛ کلیدهای کانال از نام نامکشده استفاده میکنند (بدون#). شناسههای انجمن را ترجیح دهید. - پیامهای ایجادشده توسط ربات بهطور پیشفرض نادیده گرفته میشوند.
allowBots: trueآنها را فعال میکند؛ برای پذیرش فقط پیامهای رباتی که ربات را منشن میکنند ازallowBots: "mentions"استفاده کنید (پیامهای خود ربات همچنان فیلتر میشوند). - کانالهایی که از پیامهای ورودی ایجادشده توسط ربات پشتیبانی میکنند، میتوانند از محافظت مشترک در برابر حلقهٔ ربات استفاده کنند.
channels.defaults.botLoopProtectionرا برای بودجههای پایهٔ جفت تنظیم کنید، سپس فقط هنگامی کانال یا حساب را بازنویسی کنید که یک سطح به محدودیتهای متفاوتی نیاز دارد. channels.discord.guilds.<id>.ignoreOtherMentions(و بازنویسیهای کانال) پیامهایی را حذف میکند که کاربر یا نقش دیگری را منشن میکنند اما ربات را منشن نمیکنند (بهاستثنای @everyone/@here).channels.discord.mentionAliasesپیش از ارسال، متن پایدار خروجی@handleرا به شناسههای کاربری Discord نگاشت میکند تا همتیمیهای شناختهشده حتی زمانی که حافظهٔ نهان گذرای فهرست خالی است، بهشکلی قطعی منشن شوند. بازنویسیهای مختص هر حساب زیرchannels.discord.accounts.<accountId>.mentionAliasesقرار دارند.maxLinesPerMessage(پیشفرض17) پیامهای بلند را حتی در صورت کمتر بودن از 2000 نویسه تقسیم میکند.channels.discord.suppressEmbedsبهطور پیشفرضtrueاست؛ بنابراین URLهای خروجی، مگر اینکه این گزینه غیرفعال شود، به پیشنمایش پیوند Discord گسترش نمییابند. بارهای صریحembedsهمچنان بهطور عادی ارسال میشوند؛ فراخوانیهای ابزار برای هر پیام میتوانند این رفتار را باsuppressEmbedsبازنویسی کنند.channels.discord.threadBindingsمسیریابی متصل به رشتهٔ Discord را کنترل میکند:enabled: بازنویسی Discord برای قابلیتهای نشست متصل به رشته (/focus،/unfocus،/agents،/session idle،/session max-ageو تحویل/مسیریابی متصل)idleHours: بازنویسی Discord برای لغو تمرکز خودکار بر اثر عدم فعالیت، برحسب ساعت (0آن را غیرفعال میکند)maxAgeHours: بازنویسی Discord برای حداکثر سن قطعی، برحسب ساعت (0آن را غیرفعال میکند)spawnSessions: کلید ایجاد/اتصال خودکار رشته برایsessions_spawn({ thread: true })و ایجاد رشتهٔ ACP (پیشفرض:true)defaultSpawnContext: زمینهٔ بومی زیرعامل برای ایجادهای متصل به رشته (بهطور پیشفرض"fork")
- مدخلهای سطحبالای
bindings[]دارایtype: "acp"، اتصالهای پایدار ACP را برای کانالها و رشتهها پیکربندی میکنند (از شناسهٔ کانال/رشته درmatch.peer.idاستفاده کنید). معنای فیلدها در عاملهای ACP مشترک است. channels.discord.ui.components.accentColorرنگ تأکیدی محفظههای مؤلفههای نسخهٔ 2 Discord را تنظیم میکند.channels.discord.agentComponents.ttlMsمدت ثبتماندن فراخوانیهای بازگشتی مؤلفههای ارسالشدهٔ Discord را کنترل میکند. پیشفرض1800000(30 دقیقه)، حداکثر86400000(24 ساعت). بازنویسیهای مختص هر حساب زیرchannels.discord.accounts.<accountId>.agentComponents.ttlMsقرار دارند. کوتاهترین TTL متناسب با گردش کار را ترجیح دهید.channels.discord.voiceمکالمات کانال صوتی Discord و بازنویسیهای اختیاری پیوستن خودکار + LLM + TTS را فعال میکند. پیکربندیهای صرفاً متنی Discord بهطور پیشفرض صدا را غیرفعال نگه میدارند؛ برای فعالسازی آن،channels.discord.voice.enabled=trueرا تنظیم کنید.channels.discord.voice.modelبهصورت اختیاری مدل LLM مورداستفاده برای پاسخهای کانال صوتی Discord را بازنویسی میکند.channels.discord.voice.daveEncryption(پیشفرضtrue) وchannels.discord.voice.decryptionFailureTolerance(پیشفرض24) مستقیماً به گزینههای DAVE در@discordjs/voiceمنتقل میشوند.channels.discord.voice.connectTimeoutMsانتظار اولیه برای Ready در@discordjs/voiceرا برای/vc joinو تلاشهای پیوستن خودکار کنترل میکند (پیشفرض30000).channels.discord.voice.reconnectGraceMsکنترل میکند یک نشست صوتی قطعشده چه مدت فرصت دارد پیش از آنکه OpenClaw آن را نابود کند، وارد سیگنالدهی اتصال مجدد شود (پیشفرض15000).- پخش صوتی Discord با رویداد آغاز صحبت کاربر دیگری قطع نمیشود. برای جلوگیری از حلقههای بازخورد، OpenClaw هنگام پخش TTS دریافت صدای جدید را نادیده میگیرد.
- OpenClaw همچنین پس از شکستهای مکرر رمزگشایی، با ترک و پیوستن مجدد به نشست صوتی برای بازیابی دریافت صدا تلاش میکند.
channels.discord.streamingکلید متعارف حالت جریان است. پیشفرض Discord برابرstreaming.mode: "progress"است تا پیشرفت ابزار/کار در یک پیام پیشنمایش ویرایششونده نمایش داده شود؛ برای غیرفعالسازی آن،streaming.mode: "off"را تنظیم کنید. کلیدهای تخت قدیمی (streamMode،chunkMode،blockStreaming،draftChunk،blockStreamingCoalesce) دیگر هنگام اجرا خوانده نمیشوند؛ برای مهاجرت پیکربندی ذخیرهشده،openclaw doctor --fixرا اجرا کنید.channels.discord.autoPresenceدسترسپذیری زمان اجرا را به وضعیت حضور ربات نگاشت میکند (سالم => آنلاین، افتکرده => بیکار، تمامشده => مزاحم نشوید) و بازنویسی اختیاری متن وضعیت را امکانپذیر میکند.channels.discord.guilds.<id>.presenceEventsورودهای دسترسپذیری انسانها را بهصورت رویدادهای سیستمی عامل به یک کانال پیکربندیشدهٔ Discord هدایت میکند. اعضای واجد شرایط باید بتوانندchannelIdرا مشاهده کنند؛ رشتههای عمومی قابلیت مشاهده را از والد به ارث میبرند، درحالیکه رشتههای خصوصی علاوهبر آن به عضویت یا Manage Threads نیاز دارند.usersمیتواند این مخاطبان را محدودتر کند. این قابلیت اعضای آنلاین فعلی را از تصاویر لحظهای کاملGUILD_CREATEمقداردهی اولیه میکند، گذارهای مشاهدهشده از آفلاین به آنلاین را هدایت میکند و نخستین سیگنال آنلاین بعدی برای عضوی دیدهنشده را بهعنوان دسترسپذیرشدن جدید در نظر میگیرد، بدون اینکه ادعا کند آن عضو آنلاین شده یا پس از تصویر لحظهای پیوسته است. انجمنهای فراتر از محدودیت تصویر لحظهای 75,000 عضوی Discord ابتدا به یک بهروزرسانی صریح آفلاین نیاز دارند. کنترلهای محدودسازی:reconnectSuppressSeconds(پنجرهٔ سکوت پس از یک نشست جدید Gateway، هنگام بازسازی وضعیت حضور انجمن؛ پیشفرض 300،0آن را غیرفعال میکند) وburstLimit/burstWindowSeconds(محدودیت نرخ رویدادهای با موفقیت در صف قرارگرفته برای هر انجمن؛ پیشفرض 8 رویداد در هر پنجرهٔ لغزان 60s). نشستهای ازسرگرفتهشده پنجرهٔ سرکوب اتصال مجدد را آغاز نمیکنند. دورهٔ انتظار موجود برای خوشامدگویی مجدد به هر کاربر همچنان هشت ساعت است. این قابلیت بهchannels.discord.intents.presence=true، مجوز ممتاز Presence Intent در Developer Portal متعلق به Discord و Heartbeat فعال عامل نیاز دارد.channels.discord.dangerouslyAllowNameMatchingتطبیق تغییرپذیر نام/برچسب را دوباره فعال میکند (حالت سازگاری اضطراری).channels.discord.execApprovals: تحویل بومی تأیید اجرای Discord و مجوزدهی تأییدکننده.enabled:true،falseیا"auto"(پیشفرض). در حالت خودکار، هنگامی که تأییدکنندگان ازapproversیاcommands.ownerAllowFromقابل شناسایی باشند، تأییدهای اجرا فعال میشوند.approvers: شناسههای کاربری Discord که مجاز به تأیید درخواستهای اجرا هستند. در صورت حذف، بهcommands.ownerAllowFromبازمیگردد.agentFilter: فهرست مجاز اختیاری شناسههای عامل. برای ارسال تأییدها برای همهٔ عاملها، آن را حذف کنید.sessionFilter: الگوهای اختیاری کلید نشست (زیررشته یا عبارت منظم).target: محل ارسال درخواستهای تأیید."dm"(پیشفرض) به پیامهای مستقیم تأییدکنندگان ارسال میکند،"channel"به کانال مبدأ ارسال میکند و"both"به هر دو ارسال میکند. وقتی مقصد شامل"channel"باشد، دکمهها فقط برای تأییدکنندگان شناساییشده قابل استفادهاند.cleanupAfterResolve: هنگامی کهtrueباشد، پیامهای مستقیم تأیید را پس از تأیید، رد یا پایان مهلت حذف میکند.
حالتهای اعلان واکنش: 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", dmPolicy: "pairing", allowFrom: ["users/1234567890"], groupPolicy: "allowlist", groups: { "spaces/AAAA": { allow: true, requireMention: true }, }, actions: { reactions: true }, typingIndicator: "message", mediaMaxMb: 20, }, },}- JSON حساب سرویس: درونخطی (
serviceAccount) یا مبتنی بر فایل (serviceAccountFile). serviceAccountیک SecretRef را مستقیماً میپذیرد.- گزینههای جایگزین محیطی:
GOOGLE_CHAT_SERVICE_ACCOUNTیاGOOGLE_CHAT_SERVICE_ACCOUNT_FILE(فقط حساب پیشفرض). - برای مقصدهای تحویل از
spaces/<spaceId>یاusers/<userId>استفاده کنید. channels.googlechat.dangerouslyAllowNameMatchingتطبیق تغییرپذیر اصل ایمیل را دوباره فعال میکند (حالت سازگاری اضطراری).
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: { enabled: true, requireMention: true, allowBots: false }, "#general": { enabled: true, requireMention: true, allowBots: false, users: ["U123"], skills: ["docs"], systemPrompt: "فقط پاسخهای کوتاه.", }, }, historyLimit: 50, allowBots: false, reactionNotifications: "own", reactionAllowlist: ["U123"], replyToMode: "off", // off | first | all | batched thread: { historyScope: "thread", // thread | channel inheritParent: false, initialHistoryLimit: 20, }, 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, streaming: { mode: "partial", // off | partial | block | progress chunkMode: "length", // length | newline nativeTransport: true, // وقتی mode=partial است، از API استریم بومی Slack استفاده میکند }, 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نیاز دارد (در ریشه یا برای هر حساب). - هویت کاربر (
identity: "user") بهعنوان انسانِ مجوزدهنده مطلب ارسال میکند و میخواند. این قابلیت در حالت Socket بهuserTokenبههمراهappToken، یا در حالت HTTP بهuserTokenبههمراهsigningSecretنیاز دارد. هیچ توکن ربات یا کاربر رباتی لازم نیست. برای محدودههای دسترسی کاربر و اشتراکهای رویداد، به هویت کاربر مراجعه کنید. enterpriseOrgInstall: trueیک حساب را در مسیر رویداد سراسری سازمانی Slack Enterprise Grid وارد میکند. هنگام راهاندازی، توکن ربات باauth.testبررسی میشود و اگر حالت پیکربندیشده با هویت نصب Slack مطابقت نداشته باشد، راهاندازی شکست میخورد. پیامهای مستقیم سازمانی باید غیرفعال باشند یا ازdmPolicy: "open"با یکallowFrom: ["*"]مؤثر استفاده کنند. سیاستهای کانال و کاربر باید از شناسههای پایدار Slack استفاده کنند؛ نامهای تغییرپذیر و پیشوندهای کانال پشتیبانینشده باعث شکست راهاندازی میشوند. V1 فقط رویدادهای مستقیم Socket Mode یا HTTPmessageوapp_mentionرا با پاسخهای فوری مدیریت میکند؛ رله، فرمانها، تعاملات، App Home، شنوندههای رویداد واکنش، سنجاقها، ابزارهای کنش، تأییدهای بومی، اتصالها، تحویل با تأخیر و ارسالهای پیشدستانه در دسترس نیستند. تأیید دریافت، نشانگر تایپ و واکنشهای وضعیتِ متعلق به شنونده باreactions:writeهمچنان در دسترساند؛ اعلانهای واکنش ورودی و ابزارهای کنش واکنش در دسترس نیستند. برای مانیفست با کمترین سطح دسترسی، گردشکار راهاندازی و محدودیتهای کامل، به نصبهای سراسری سازمانی Enterprise Grid مراجعه کنید.socketModeتنظیمات انتقال Socket Mode در Slack SDK را به API عمومی گیرنده Bolt منتقل میکند. فقط هنگام بررسی مهلت زمانی ping/pong یا رفتار websocket منقضی از آن استفاده کنید. مقدار پیشفرضclientPingTimeoutبرابر15000است؛serverPingTimeoutوpingPongLoggingEnabledفقط در صورت پیکربندی منتقل میشوند.botToken،appToken،signingSecretوuserTokenرشتههای متن ساده یا اشیای SecretRef را میپذیرند.- تصاویر لحظهای حساب Slack، فیلدهای منبع/وضعیت هر اعتبارنامه مانند
botTokenSource،botTokenStatus،userTokenSource،userTokenStatus،appTokenStatusو در حالت HTTP،signingSecretStatusرا ارائه میکنند.configured_unavailableیعنی حساب از طریق SecretRef پیکربندی شده، اما مسیر فعلی فرمان/زمان اجرا نتوانسته است مقدار محرمانه را رفع کند. configWrites: falseنوشتن پیکربندی آغازشده از سوی Slack را مسدود میکند.channels.slack.defaultAccountاختیاری، وقتی با شناسه یک حساب پیکربندیشده مطابقت داشته باشد، انتخاب حساب پیشفرض را بازنویسی میکند.channels.slack.streaming.modeکلید متعارف حالت استریم Slack است (پیشفرض"partial").channels.slack.streaming.nativeTransportانتقال استریم بومی Slack را کنترل میکند (پیشفرضtrue). مقادیر قدیمیstreamMode، مقدار بولیstreaming،chunkMode،blockStreaming،blockStreamingCoalesceوnativeStreamingدیگر هنگام اجرا خوانده نمیشوند؛ برای مهاجرت پیکربندی ذخیرهشده بهstreaming.{mode,chunkMode,block.enabled,block.coalesce,nativeTransport}، فرمان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.historyScope برای هر رشته جداگانه (پیشفرض) یا در سراسر کانال مشترک است. thread.inheritParent رونوشت کانال والد را در رشتههای جدید کپی میکند. thread.initialHistoryLimit (پیشفرض 20) حداکثر تعداد پیامهای موجود رشته را که هنگام آغاز یک نشست رشته جدید دریافت میشوند محدود میکند؛ 0 دریافت تاریخچه رشته را غیرفعال میکند.
- استریم بومی Slack بههمراه وضعیت رشته به سبک دستیار Slack یعنی «در حال تایپ...» به یک مقصد پاسخ در رشته نیاز دارد. پیامهای مستقیم سطح بالا بهطور پیشفرض خارج از رشته باقی میمانند، بنابراین همچنان میتوانند بهجای نمایش پیشنمایش استریم/وضعیت بومی به سبک رشته، از طریق پیشنمایشهای پیشنویسِ ارسال و ویرایش Slack استریم شوند.
typingReactionهنگام اجرای پاسخ، یک واکنش موقت به پیام ورودی Slack اضافه میکند و پس از تکمیل آن را حذف میکند. از یک کد کوتاه ایموجی Slack مانند"hourglass_flowing_sand"استفاده کنید.channels.slack.execApprovals: تحویل کلاینت تأیید بومی Slack و مجوزدهی تأییدکننده اجرای فرمان. طرحواره همان Discord است:enabled(true/false/"auto")،approvers(شناسههای کاربر Slack)،agentFilter،sessionFilterوtarget("dm"،"channel"یا"both"). وقتی تأییدکنندگان Plugin در Slack رفع شوند، تأییدهای Plugin میتوانند برای درخواستهای منشأگرفته از Slack از این مسیر کلاینت بومی استفاده کنند؛ تحویل تأیید بومی Plugin در Slack نیز میتواند از طریقapprovals.pluginبرای نشستهای منشأگرفته از Slack یا مقصدهای Slack فعال شود. تأییدهای Plugin از تأییدکنندگان Plugin در Slack ازallowFromو مسیریابی پیشفرض استفاده میکنند، نه تأییدکنندگان اجرا.
| گروه کنش | پیشفرض | یادداشتها |
|---|---|---|
| واکنشها | فعال | افزودن واکنش + فهرست واکنشها |
| پیامها | فعال | خواندن/ارسال/ویرایش/حذف |
| سنجاقها | فعال | سنجاقکردن/برداشتن سنجاق/فهرست |
| اطلاعات عضو | فعال | اطلاعات عضو |
| فهرست ایموجی | فعال | فهرست ایموجیهای سفارشی |
Mattermost
Mattermost همانند Discord، Slack و WhatsApp بهصورت یک Plugin جداگانه نصب میشود:
openclaw plugins install @openclaw/mattermostپیش از ثابتکردن یک نسخه، برچسبهای توزیع فعلی را در npmjs.com/package/@openclaw/mattermost بررسی کنید.
{ 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, // نیازمند فعالسازی nativeSkills: true, callbackPath: "/api/channels/mattermost/command", // نشانی اینترنتی صریح و اختیاری برای استقرارهای پروکسی معکوس/عمومی callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, textChunkLimit: 4000, streaming: { chunkMode: "length" }, }, },}حالتهای گفتوگو: oncall (پاسخ در صورت اشاره با @، پیشفرض)، onmessage (هر پیام)، onchar (پیامهایی که با پیشوند محرک آغاز میشوند).
وقتی فرمانهای بومی Mattermost فعال باشند:
commands.callbackPathباید یک مسیر باشد (برای نمونه/api/channels/mattermost/command)، نه یک URL کامل.commands.callbackUrlباید به نقطه پایانی Gateway در OpenClaw رفع شود و از سرور Mattermost قابل دسترسی باشد.- فراخوانیهای بازگشتی اسلش بومی با توکنهای مختص هر فرمان که
Mattermost هنگام ثبت فرمان اسلش بازمیگرداند احراز هویت میشوند. اگر ثبت شکست بخورد یا هیچ
فرمانی فعال نشود، OpenClaw فراخوانیهای بازگشتی را با
Unauthorized: invalid command token.رد میکند. - برای میزبانهای فراخوانی بازگشتی خصوصی/tailnet/داخلی، ممکن است Mattermost نیاز داشته باشد که
ServiceSettings.AllowedUntrustedInternalConnectionsشامل میزبان/دامنه فراخوانی بازگشتی باشد. از مقادیر میزبان/دامنه استفاده کنید، نه URLهای کامل. channels.mattermost.configWrites: نوشتن پیکربندی آغازشده از سوی Mattermost را مجاز یا ممنوع میکند.channels.mattermost.requireMention: پیش از پاسخدادن در کانالها،@mentionرا الزامی میکند.channels.mattermost.groups.<channelId>.requireMention: بازنویسی الزام اشاره برای هر کانال ("*"برای پیشفرض).channels.mattermost.defaultAccountاختیاری، وقتی با شناسه یک حساب پیکربندیشده مطابقت داشته باشد، انتخاب حساب پیشفرض را بازنویسی میکند.
Signal
{ channels: { signal: { enabled: true, account: "+15555550123", // اتصال اختیاری حساب 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). هیچ دیمون یا پورتی لازم نیست. وقتی میزبان بتواند مجوزهای پایگاه داده Messages و Automation را اعطا کند، این مسیر ترجیحی برای راهاندازیهای جدید iMessage در OpenClaw است.
پشتیبانی BlueBubbles حذف شده است. channels.bluebubbles در نسخه فعلی OpenClaw یک سطح پیکربندی زمان اجرای پشتیبانیشده نیست. پیکربندیهای قدیمی را به channels.imessage مهاجرت دهید؛ برای نسخه کوتاه از حذف BlueBubbles و مسیر imsg برای iMessage و برای جدول تبدیل کامل از مهاجرت از BlueBubbles استفاده کنید.
اگر Gateway روی Mac واردشده به Messages اجرا نمیشود، channels.imessage.enabled=true را حفظ کنید و channels.imessage.cliPath را روی یک پوشش SSH تنظیم کنید که imsg "$@" را روی آن Mac اجرا کند. مسیر محلی پیشفرض imsg فقط مخصوص macOS است.
پیش از تکیه بر یک پوشش SSH برای ارسالهای محیط عملیاتی، یک imsg send خروجی را از طریق همان پوشش دقیق بررسی کنید. برخی وضعیتهای TCC در macOS، خودکارسازی Messages را به /usr/libexec/sshd-keygen-wrapper اختصاص میدهند؛ در نتیجه ممکن است خواندنها و کاوشها کار کنند، اما ارسالها با AppleEvents -1743 ناموفق شوند؛ بخش عیبیابی پوشش SSH در iMessage را ببینید.
{ 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اختیاری، هنگامیکه با شناسه یک حساب پیکربندیشده مطابقت داشته باشد، انتخاب پیشفرض حساب را بازنویسی میکند.- به دسترسی کامل به دیسک برای پایگاه داده Messages نیاز دارد.
- مقصدهای
chat_id:<id>را ترجیح دهید. برای فهرستکردن گفتوگوها ازimsg chats --limit 20استفاده کنید. cliPathمیتواند به یک پوشش SSH اشاره کند؛ برای دریافت پیوستها با SCP،remoteHostرا رویhostیاuser@hostتنظیم کنید.attachmentRootsوremoteAttachmentRootsمسیرهای پیوست ورودی را محدود میکنند (پیشفرض:/Users/*/Library/Messages/Attachments).- SCP از بررسی سختگیرانه کلید میزبان استفاده میکند؛ بنابراین مطمئن شوید کلید میزبان رله از قبل در
~/.ssh/known_hostsوجود دارد. channels.imessage.configWrites: نوشتن پیکربندی آغازشده از iMessage را مجاز یا رد میکند.channels.imessage.sendTransport: روش انتقال ترجیحی ارسال RPC درimsgبرای پاسخهای خروجی عادی.auto(پیشفرض)، هنگامیکه پل IMCore در حال اجرا باشد، برای گفتوگوهای موجود از آن استفاده میکند و سپس به AppleScript بازمیگردد؛bridgeبه تحویل از طریق API خصوصی نیاز دارد؛applescriptمسیر عمومی خودکارسازی Messages را اجباری میکند.channels.imessage.actions.*: کنشهای API خصوصی را فعال میکند که علاوه بر آن باimsg status/openclaw channels status --probeنیز محدود میشوند.channels.imessage.includeAttachmentsبهطور پیشفرض خاموش است؛ پیش از انتظار رسانه ورودی در نوبتهای عامل، آن را رویtrueتنظیم کنید.- بازیابی ورودی پس از راهاندازی مجدد پل/Gateway خودکار است (حذف موارد تکراری بر اساس GUID، بهعلاوه محدودیت سنی برای صف عقبافتاده قدیمی). پیکربندیهای موجود
channels.imessage.catchup.enabled: trueهمچنان بهعنوان نمایه سازگاری منسوخشده رعایت میشوند؛catchupبهطور پیشفرض غیرفعال است. channels.imessage.groups: دفتر ثبت گروه و تنظیمات هر گروه. باgroupPolicy: "allowlist"، کلیدهای صریحchat_idیا یک ورودی عام"*"را پیکربندی کنید تا پیامهای گروهی بتوانند از دروازه دفتر ثبت عبور کنند.- ورودیهای سطحبالای
bindings[]باtype: "acp"میتوانند مکالمههای iMessage را به نشستهای پایدار ACP متصل کنند. درmatch.peer.idاز یک شناسه تماس نرمالشده یا مقصد صریح گفتوگو (chat_id:*،chat_guid:*،chat_identifier:*) استفاده کنید. معنای فیلدهای مشترک: عاملهای ACP.
نمونه پوشش 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.dangerouslyAllowPrivateNetworkسرورهای خانگی خصوصی/داخلی را مجاز میکند.proxyو این پذیرش صریح شبکه، کنترلهایی مستقل هستند.channels.matrix.defaultAccountحساب ترجیحی را در پیکربندیهای چندحسابی انتخاب میکند.channels.matrix.autoJoinبهطور پیشفرض"off"است؛ بنابراین اتاقهای دعوتشده و دعوتهای تازه شبیه پیام مستقیم نادیده گرفته میشوند تا زمانی کهautoJoin: "allowlist"را باautoJoinAllowlistیاautoJoin: "always"تنظیم کنید.channels.matrix.execApprovals: تحویل تأیید اجرای بومی Matrix و مجوزدهی تأییدکننده.enabled:true،falseیا"auto"(پیشفرض). در حالت خودکار، تأییدهای اجرا هنگامی فعال میشوند که تأییدکنندگان ازapproversیاcommands.ownerAllowFromقابل شناسایی باشند.approvers: شناسههای کاربری Matrix (برای مثال@owner:example.org) که مجاز به تأیید درخواستهای اجرا هستند.agentFilter: فهرست مجاز اختیاری شناسههای عامل. برای ارسال تأییدها برای همه عاملها، آن را حذف کنید.sessionFilter: الگوهای اختیاری کلید نشست (زیررشته یا عبارت منظم).target: محل ارسال درخواستهای تأیید."dm"(پیشفرض)،"channel"(اتاق مبدأ) یا"both".- بازنویسیهای هر حساب:
channels.matrix.accounts.<id>.execApprovals.
channels.matrix.dm.sessionScopeنحوه گروهبندی پیامهای مستقیم Matrix در نشستها را کنترل میکند:per-user(پیشفرض) نشست را بر اساس همتای مسیردهیشده مشترک میکند، درحالیکهper-roomهر اتاق پیام مستقیم را جدا میکند.- کاوشهای وضعیت 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، سیاست پیام مستقیم/گروه و بازنویسیهای هر تیم/هر کانال) در 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 (میزبان/درگاه/TLS/کانالها/فهرستهای مجاز/محدودسازی بر اساس اشاره) در IRC مستند شده است.
چندحسابی (همه کانالها)
چند حساب را در هر کانال اجرا کنید (هرکدام با accountId اختصاصی خود):
{ channels: { telegram: { accounts: { default: { name: "Primary bot", botToken: "123456:ABC...", }, alerts: { name: "Alerts bot", botToken: "987654:XYZ...", }, }, }, },}- هنگامیکه
accountIdحذف شده باشد، ازdefaultاستفاده میشود (CLI + مسیردهی). - توکنهای محیطی فقط برای حساب پیشفرض اعمال میشوند.
- تنظیمات پایه کانال برای همه حسابها اعمال میشوند، مگر اینکه برای هر حساب بازنویسی شوند.
- برای هدایت هر حساب به یک عامل متفاوت، از
bindings[].match.accountIdاستفاده کنید. - اگر درحالیکه هنوز از پیکربندی سطحبالای تکحسابی کانال استفاده میکنید، حسابی غیرپیشفرض را از طریق
openclaw channels add(یا راهاندازی اولیه کانال) اضافه کنید، OpenClaw ابتدا مقادیر تکحسابی سطحبالای مختص حساب را به نگاشت حسابهای کانال منتقل میکند تا حساب اصلی همچنان کار کند. بیشتر کانالها آنها را بهchannels.<channel>.accounts.defaultمنتقل میکنند؛ Matrix میتواند در عوض مقصد نامگذاریشده/پیشفرض موجود و منطبق را حفظ کند. - اتصالهای موجودِ فقط مختص کانال (بدون
accountId) همچنان با حساب پیشفرض مطابقت دارند؛ اتصالهای مختص حساب اختیاری باقی میمانند. openclaw doctor --fixهمچنین با انتقال مقادیر تکحسابی سطحبالای مختص حساب به حساب ارتقایافتهای که برای آن کانال انتخاب شده است، شکلهای ترکیبی را ترمیم میکند. بیشتر کانالها ازaccounts.defaultاستفاده میکنند؛ Matrix میتواند در عوض مقصد نامگذاریشده/پیشفرض موجود و منطبق را حفظ کند.
سایر کانالهای Plugin
بسیاری از کانالهای Plugin بهشکل channels.<id> پیکربندی میشوند و در صفحههای اختصاصی کانال خود مستند شدهاند (برای مثال Feishu، LINE، Nextcloud Talk، Nostr، QQ Bot، Synology Chat، Twitch و Zalo).
نمایه کامل کانالها را ببینید: کانالها.
محدودسازی گفتوگوی گروهی بر اساس اشاره
پیامهای گروهی بهطور پیشفرض به اشاره نیاز دارند (اشاره در فراداده یا الگوهای امن عبارت منظم). این مورد برای گفتوگوهای گروهی WhatsApp، Telegram، Discord، Google Chat و iMessage اعمال میشود.
پاسخهای قابلمشاهده جداگانه کنترل میشوند. درخواستهای مستقیم عادی در گروه، کانال و WebChat داخلی بهطور پیشفرض تحویل نهایی خودکار دارند: متن نهایی دستیار از طریق مسیر قدیمی پاسخ قابلمشاهده ارسال میشود. هنگامیکه پاسخهای مبدأ نوشتهشده توسط مدل باید تنها پس از فراخوانی message(action=send) توسط عامل ارسال شوند، messages.visibleReplies: "message_tool" یا messages.groupChat.visibleReplies: "message_tool" را فعال کنید. اگر مدل در حالت ابزارمحور فعالشده، بدون فراخوانی ابزار پیام، پاسخی نهایی و دارای محتوای معنادار برگرداند، آن متن نهایی خصوصی باقی میماند، گزارش تفصیلی Gateway فراداده محموله سرکوبشده را ثبت میکند و OpenClaw یک تلاش مجدد بازیابی را در صف قرار میدهد و از مدل میخواهد همان پاسخ را از طریق message(action=send) تحویل دهد.
سیاست ابزارمحور بر پاسخهای مبدأ دستیار و رسانه عمومی ابزار حاکم است. این سیاست خروجی پایانی متعلق به زمان اجرا، مانند پاسخهای فرمان مجاز، اعلانهای پایدار تکمیل یا مصنوعات بومی ارائهدهنده را که مهارکننده مالک صراحتاً متعلق به میزبان طبقهبندی میکند، سرکوب نمیکند. مصنوعات متعلق به میزبان از طریق مسیر عادی ارسال کانال تحویل داده میشوند و همچنان رد خروجی sendPolicy را رعایت میکنند. نوبتهای محیطی room_event، حتی هنگامیکه خروجی زمان اجرا متعلق به میزبان علامتگذاری شده باشد، مگر اینکه فرمانهایی صریح باشند، بیصدا باقی میمانند.
پاسخهای قابلمشاهده ابزارمحور به مدل/زمان اجرایی نیاز دارند که ابزارها را با اطمینان فراخوانی کند و برای اتاقهای محیطی مشترک روی مدلهای نسل جدید مانند GPT-5.6 Sol توصیه میشوند. برخی مدلهای ضعیفتر میتوانند متن نهایی را پاسخ دهند، اما در درک اینکه خروجی قابلمشاهده در مبدأ باید با message(action=send) ارسال شود، ناموفقاند. OpenClaw بهطور پیشفرض مورد رایج نهاییِ تحویلنشده را تنها هنگامی بازیابی میکند که پاسخ نهایی دارای محتوای معنادار باشد، نوبت مبدأ رویداد اتاق نباشد، سیاست ارسال تحویل را رد نکرده باشد و قبلاً هیچ پاسخ مبدئی ارسال نشده باشد. بازیابی به یک تلاش مجدد محدود است؛ ماندگاری را برای درخواست مصنوعی تلاش مجدد سرکوب میکند و آن تلاش مجدد را از دستهبندی گردآوری خارج نگه میدارد تا نتواند با درخواستهای نامرتبط موجود در صف ادغام شود. اگر تلاش مجدد نیز تحویلنشده بماند یا نتوان آن را در صف قرار داد، OpenClaw فقط یک پیام تشخیصی پاکسازیشده مانند «پاسخی تولید کردم، اما نتوانستم آن را به این گفتوگو تحویل دهم. لطفاً دوباره تلاش کنید.» تحویل میدهد. متن نهایی خصوصی اصلی هرگز برای تحویل خودکار به مبدأ علامتگذاری نمیشود. برای مدلهایی که مکرراً پاسخها را تحویلنشده باقی میگذارند، از "automatic" استفاده کنید تا نوبت نهایی دستیار مسیر پاسخ قابلمشاهده باشد، به یک مدل قویتر در فراخوانی ابزار تغییر دهید، گزارش تفصیلی Gateway را برای خلاصه محموله سرکوبشده بررسی کنید، یا messages.groupChat.visibleReplies: "automatic" را تنظیم کنید تا برای هر درخواست گروهی/کانالی از پاسخهای نهایی قابلمشاهده استفاده شود.
اگر ابزار پیام تحت خطمشی فعال ابزار در دسترس نباشد، OpenClaw بهجای سرکوب بیسروصدای پاسخ، از پاسخهای قابلمشاهده خودکار استفاده میکند. openclaw doctor درباره این ناهماهنگی هشدار میدهد.
این قاعده درباره متن نهایی عادی عامل اعمال میشود. اتصالهای مکالمه متعلق به Plugin، برای نوبتهای ادعاشده رشته متصل، پاسخ بازگرداندهشده Plugin مالک را بهعنوان پاسخ قابلمشاهده استفاده میکنند؛ Plugin برای این پاسخهای اتصال نیازی به فراخوانی message(action=send) ندارد.
عیبیابی: @اشاره در گروه، نشانگر تایپ را فعال میکند و سپس سکوت رخ میدهد (بدون خطا)
نشانه: یک @اشاره در گروه/کانال، نشانگر تایپ را نمایش میدهد و گزارش Gateway حاوی dispatch complete (queuedFinal=false, replies=0) است، اما هیچ پیامی به اتاق نمیرسد. پیامهای مستقیم به همان عامل بهطور عادی پاسخ میگیرند.
علت: حالت پاسخ قابلمشاهده گروه/کانال به "message_tool" تبدیل میشود؛ بنابراین OpenClaw نوبت را اجرا میکند، اما متن نهایی دستیار را سرکوب میکند، مگر اینکه عامل message(action=send) را فراخوانی کند. در این حالت هیچ قرارداد NO_REPLY وجود ندارد؛ نبود فراخوانی ابزار پیام یعنی متن نهایی اصلی خصوصی است. اکنون OpenClaw برای نوبتهای منبعِ دارای محتوای قابلتوجه، یک تلاش مجدد بازیابیِ محافظتشده انجام میدهد؛ یادداشتهای کوتاه، سکوت صریح، رویدادهای اتاق، نوبتهای ردشده توسط خطمشی ارسال و نوبتهایی که قبلاً تحویل شدهاند دوباره امتحان نمیشوند. نوبتهای عادی گروه و کانال بهطور پیشفرض از "automatic" استفاده میکنند، بنابراین این نشانه فقط زمانی ظاهر میشود که messages.groupChat.visibleReplies (یا messages.visibleReplies سراسری) صریحاً روی "message_tool" تنظیم شده باشد. defaultVisibleReplies در هارنس اینجا اعمال نمیشود — تفکیککننده گروه/کانال آن را نادیده میگیرد؛ این گزینه فقط بر گفتوگوهای مستقیم/منبع اثر میگذارد (هارنس Codex متنهای نهایی گفتوگوی مستقیم را به این روش سرکوب میکند).
راهحل: یا مدلی با توانایی قویتر در فراخوانی ابزار انتخاب کنید، یا بازنویسی صریح "message_tool" را حذف کنید تا از مقدار پیشفرض "automatic" استفاده شود، یا messages.groupChat.visibleReplies: "automatic" را تنظیم کنید تا برای هر درخواست گروه/کانال، پاسخ قابلمشاهده اجباری شود. یک متن نهاییِ قابلتوجه که تحویل نشده است، دیگر نباید با موفقیت خاموش پایان یابد؛ باید یا با یک تلاش مجدد message(action=send) بازیابی شود یا پیام تشخیصی پاکسازیشده خطای تحویل را نشان دهد. Gateway پس از ذخیره فایل، پیکربندی messages را بهصورت گرم بارگذاری مجدد میکند؛ فقط زمانی Gateway را راهاندازی مجدد کنید که پایش فایل یا بارگذاری مجدد پیکربندی در استقرار غیرفعال باشد.
انواع اشاره:
- اشارههای فرادادهای: @اشارههای بومی پلتفرم. در حالت گفتوگوی شخصی WhatsApp نادیده گرفته میشوند.
- الگوهای متنی: الگوهای عبارت منظم ایمن در
agents.entries.*.groupChat.mentionPatterns. الگوهای نامعتبر و تکرار تودرتوی ناامن نادیده گرفته میشوند. - محدودسازی بر اساس اشاره فقط زمانی اعمال میشود که تشخیص ممکن باشد (اشارههای بومی یا دستکم یک الگو).
{ messages: { visibleReplies: "automatic", // پاسخهای نهایی خودکار قدیمی را برای گفتوگوهای مستقیم/منبع اجباری میکند groupChat: { historyLimit: 50, unmentionedInbound: "room_event", // گفتوگوی همیشگی و بدون اشاره اتاق را به زمینهای آرام تبدیل میکند visibleReplies: "message_tool", // انتخابی؛ برای پاسخهای قابلمشاهده اتاق به message(action=send) نیاز دارد }, }, agents: { list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }], },}messages.groupChat.historyLimit مقدار پیشفرض سراسری را تنظیم میکند. کانالها میتوانند آن را با channels.<channel>.historyLimit (یا بهازای هر حساب) بازنویسی کنند. برای غیرفعالکردن، 0 را تنظیم کنید.
messages.groupChat.unmentionedInbound: "room_event" پیامهای همیشگی و بدون اشاره گروه/کانال را در کانالهای پشتیبانیشده، بهعنوان زمینه آرام اتاق ارسال میکند. پیامهای دارای اشاره، فرمانها و پیامهای مستقیم همچنان درخواست کاربر باقی میمانند. برای نمونههای کامل Discord، Slack و Telegram، به رویدادهای محیطی اتاق مراجعه کنید.
messages.visibleReplies مقدار پیشفرض سراسری رویداد منبع است؛ messages.groupChat.visibleReplies آن را برای رویدادهای منبع گروه/کانال بازنویسی میکند. وقتی messages.visibleReplies تنظیم نشده باشد، گفتوگوهای مستقیم/منبع از مقدار پیشفرض زماناجرا یا هارنس انتخابشده استفاده میکنند، اما نوبتهای مستقیم داخلی WebChat برای همترازی پرامپت Pi/Codex از تحویل خودکار متن نهایی استفاده میکنند. برای اینکه خروجی قابلمشاهده عمداً به message(action=send) نیاز داشته باشد، messages.visibleReplies: "message_tool" را تنظیم کنید. فهرستهای مجاز کانال و محدودسازی بر اساس اشاره همچنان تعیین میکنند که آیا یک رویداد پردازش شود یا نه.
محدودیتهای تاریخچه پیام مستقیم
{ channels: { telegram: { dmHistoryLimit: 30, dms: { "123456789": { historyLimit: 50 }, }, }, },}ترتیب تفکیک: بازنویسی بهازای هر پیام مستقیم ← مقدار پیشفرض ارائهدهنده ← بدون محدودیت (همه حفظ میشوند).
این تفکیککننده channels.<provider>.dmHistoryLimit و channels.<provider>.dms.<id>.historyLimit را برای هر کانالی میخواند که کلید نشست آن از قالب استاندارد provider:direct:<id> (یا قالب قدیمی provider:dm:<id>) پیروی کند؛ بنابراین در کانالهای همراه و کانالهای Plugin به یکسان کار میکند و به یک فهرست ثابت محدود نیست.
حالت گفتوگوی شخصی
برای فعالکردن حالت گفتوگوی شخصی، شماره خود را در allowFrom قرار دهید (در این حالت @اشارههای بومی نادیده گرفته میشوند و فقط به الگوهای متنی پاسخ داده میشود):
{ channels: { whatsapp: { allowFrom: ["+15555550123"], groups: { "*": { requireMention: true } }, }, }, agents: { list: [ { id: "main", groupChat: { mentionPatterns: ["reisponde", "@openclaw"] }, }, ], },}فرمانها (مدیریت فرمانهای گفتوگو)
{ commands: { native: "auto", // در صورت پشتیبانی، فرمانهای بومی را ثبت میکند nativeSkills: "auto", // در صورت پشتیبانی، فرمانهای بومی Skills را ثبت میکند text: true, // /commands را در پیامهای گفتوگو تجزیه میکند bash: false, // اجازه استفاده از ! (نام مستعار: /bash) bashForegroundMs: 2000, config: false, // اجازه استفاده از /config mcp: false, // اجازه استفاده از /mcp plugins: false, // اجازه استفاده از /plugins debug: false, // اجازه استفاده از /debug restart: true, // اجازه استفاده از /restart و درخواستهای خارجی راهاندازی مجدد SIGUSR1 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را میخواند/مینویسد). برای کلاینتهای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و درخواستهای خارجی راهاندازی مجددSIGUSR1را غیرفعال میکند. پیشفرض:true.ownerAllowFromفهرست مجاز صریح مالک برای فرمانهای مختص مالک و کنشهای کانالی محدودشده به مالک است. این فهرست ازallowFromجداست.ownerDisplay: "hash"شناسههای مالک را در پرامپت سیستم هش میکند. برای کنترل هشکردن،ownerDisplaySecretرا تنظیم کنید.allowFromبهازای هر ارائهدهنده است. وقتی تنظیم شود، تنها منبع مجوزدهی است (فهرستهای مجاز کانال/جفتسازی وuseAccessGroupsنادیده گرفته میشوند).useAccessGroups: falseبه فرمانها اجازه میدهد وقتیallowFromتنظیم نشده است، خطمشیهای گروه دسترسی را دور بزنند.- نقشه مستندات فرمانها:
- فهرست داخلی و همراه: فرمانهای اسلش
- سطوح فرمان مختص کانال: کانالها
- فرمانهای QQ Bot: QQ Bot
- فرمانهای جفتسازی: جفتسازی
- فرمان کارت LINE: LINE
- Dreaming حافظه: Dreaming
مرتبط
- مرجع پیکربندی — کلیدهای سطح بالا
- پیکربندی — عاملها
- نمای کلی کانالها