Gateway
التكوين — القنوات
مفاتيح تكوين لكل قناة ضمن channels.*. يغطي الوصول إلى الرسائل المباشرة والمجموعات،
وإعدادات الحسابات المتعددة، وبوابة الإشارات، والمفاتيح الخاصة بكل قناة لـ Slack وDiscord وTelegram وWhatsApp وMatrix وiMessage وPlugins القنوات المضمّنة الأخرى.
للوكلاء والأدوات ووقت تشغيل Gateway والمفاتيح الأخرى ذات المستوى الأعلى، راجع مرجع التكوين.
القنوات
تبدأ كل قناة تلقائيًا عند وجود قسم التكوين الخاص بها (ما لم يكن enabled: false).
الوصول إلى الرسائل المباشرة والمجموعات
تدعم جميع القنوات سياسات الرسائل المباشرة وسياسات المجموعات:
| سياسة الرسائل المباشرة | السلوك |
|---|---|
pairing (الافتراضي) |
يحصل المرسلون غير المعروفين على رمز إقران لمرة واحدة؛ يجب أن يوافق المالك |
allowlist |
المرسلون الموجودون في allowFrom فقط (أو مخزن السماح المقترن) |
open |
السماح بكل الرسائل المباشرة الواردة (يتطلب allowFrom: ["*"]) |
disabled |
تجاهل كل الرسائل المباشرة الواردة |
| سياسة المجموعة | السلوك |
|---|---|
allowlist (الافتراضي) |
المجموعات المطابقة لقائمة السماح المكوّنة فقط |
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(مثل قائمة السماح ولكن مع الاحتفاظ بسياق الاقتباس/الرد الصريح). تجاوز لكل قناة: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,
},
},
},
}
- الرمز المميز:
channels.discord.token، معDISCORD_BOT_TOKENكخيار احتياطي للحساب الافتراضي. - تستخدم الاستدعاءات الصادرة المباشرة التي توفر
tokenصريحا لـ Discord ذلك الرمز المميز للاستدعاء؛ بينما تظل إعدادات إعادة محاولة الحساب والسياسات مأخوذة من الحساب المحدد في لقطة وقت التشغيل النشطة. - يتجاوز
channels.discord.defaultAccountالاختياري اختيار الحساب الافتراضي عندما يطابق معرف حساب مهيأ. - استخدم
user:<id>(رسالة مباشرة) أوchannel:<id>(قناة خادم) لأهداف التسليم؛ يتم رفض المعرفات الرقمية المجردة. - تكون الأسماء المختصرة للخوادم بأحرف صغيرة مع استبدال المسافات بـ
-؛ وتستخدم مفاتيح القنوات الاسم المختصر (بدون#). يفضل استخدام معرفات الخوادم. - يتم تجاهل الرسائل التي أنشأها البوت افتراضيا. يفعّل
allowBots: trueهذه الرسائل؛ استخدمallowBots: "mentions"لقبول رسائل البوت التي تذكر البوت فقط (تظل الرسائل الذاتية مرشحة). - يسقط
channels.discord.guilds.<id>.ignoreOtherMentions(وتجاوزات القنوات) الرسائل التي تذكر مستخدما آخر أو دورا آخر ولكن لا تذكر البوت (باستثناء @everyone/@here). - يربط
channels.discord.mentionAliasesنص@handleالصادر المستقر بمعرفات مستخدمي Discord قبل الإرسال، بحيث يمكن ذكر أعضاء الفريق المعروفين بشكل حتمي حتى عندما تكون ذاكرة التخزين المؤقتة المؤقتة للدليل فارغة. تعيش التجاوزات لكل حساب تحتchannels.discord.accounts.<accountId>.mentionAliases. - يقسم
maxLinesPerMessage(الافتراضي 17) الرسائل الطويلة حتى عندما تكون دون 2000 حرف. - يتحكم
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لون التمييز لحاويات مكونات Discord v2. - يفعّل
channels.discord.voiceمحادثات قنوات Discord الصوتية والتجاوزات الاختيارية للانضمام التلقائي + 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والانضمام التلقائي (30000افتراضيا). - يتحكم
channels.discord.voice.reconnectGraceMsفي المدة التي يمكن أن تستغرقها جلسة صوتية منقطعة لدخول إشارات إعادة الاتصال قبل أن يتلفها OpenClaw (15000افتراضيا). - لا تتم مقاطعة تشغيل صوت Discord بحدث بدء تحدث مستخدم آخر. لتجنب حلقات التغذية الراجعة، يتجاهل OpenClaw التقاط الصوت الجديد أثناء تشغيل TTS.
- يحاول OpenClaw أيضا استرداد استقبال الصوت عبر مغادرة/إعادة الانضمام إلى جلسة صوتية بعد تكرار فشل فك التشفير.
channels.discord.streamingهو مفتاح وضع البث القانوني. يستخدم Discord افتراضياstreaming.mode: "progress"بحيث يظهر تقدم الأدوات/العمل في رسالة معاينة واحدة محررة؛ عيّنstreaming.mode: "off"لتعطيله. تظل قيمstreamModeالقديمة وقيمstreamingالمنطقية أسماء بديلة وقت التشغيل؛ شغّلopenclaw doctor --fixلإعادة كتابة الإعدادات المستمرة.- يربط
channels.discord.autoPresenceتوفر وقت التشغيل بحضور البوت (سليم => متصل، متدهور => خامل، مستنفد => عدم الإزعاج) ويسمح بتجاوزات نص الحالة الاختيارية. - يعيد
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",
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). - خيارات البيئة الاحتياطية:
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: { 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",
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. استخدمه فقط عند التحقيق في مهلة ping/pong أو سلوك websocket قديم. - يقبل
botTokenوappTokenوsigningSecretوuserTokenسلاسل نصية عادية أو كائنات SecretRef. - تعرض لقطات حساب Slack حقول المصدر/الحالة لكل اعتماد، مثل
botTokenSourceوbotTokenStatusوappTokenStatus، وفي وضع HTTP،signingSecretStatus. يعنيconfigured_unavailableأن الحساب مهيأ عبر SecretRef لكن مسار الأمر/وقت التشغيل الحالي لم يتمكن من حل قيمة السر. - يمنع
configWrites: falseعمليات كتابة الإعدادات التي تبدأ من Slack. - يتجاوز
channels.slack.defaultAccountالاختياري اختيار الحساب الافتراضي عندما يطابق معرف حساب مهيأ. channels.slack.streaming.modeهو مفتاح وضع بث Slack القانوني. يتحكمchannels.slack.streaming.nativeTransportفي نقل البث الأصلي في Slack. تظل قيمstreamModeالقديمة وstreamingالمنطقية وnativeStreamingأسماء بديلة وقت التشغيل؛ شغّلopenclaw doctor --fixلإعادة كتابة الإعدادات المستمرة.- استخدم
user:<id>(رسالة مباشرة) أوchannel:<id>لأهداف التسليم.
أوضاع إشعارات التفاعلات: off، own (الافتراضي)، all، allowlist (من reactionAllowlist).
عزل جلسات السلاسل: يكون thread.historyScope لكل سلسلة (الافتراضي) أو مشتركا عبر القناة. ينسخ thread.inheritParent نص قناة الأصل إلى السلاسل الجديدة.
- يتطلب بث Slack الأصلي بالإضافة إلى حالة السلسلة بنمط مساعد Slack "is typing..." هدف سلسلة رد. تبقى الرسائل المباشرة ذات المستوى الأعلى خارج السلاسل افتراضيا، ولذلك يمكنها الاستمرار في البث عبر معاينات مسودات Slack التي تنشر ثم تعدل بدلا من إظهار معاينة البث/الحالة الأصلية بنمط السلاسل.
- يضيف
typingReactionتفاعلا مؤقتا إلى رسالة Slack الواردة أثناء تشغيل الرد، ثم يزيله عند الاكتمال. استخدم رمز Slack emoji مختصرا مثل"hourglass_flowing_sand". channels.slack.execApprovals: تسليم موافقات التنفيذ الأصلي في Slack وتخويل الموافقين. نفس مخطط Discord:enabled(true/false/"auto")، وapprovers(معرفات مستخدمي Slack)، وagentFilter، وsessionFilter، وtarget("dm"أو"channel"أو"both").
| مجموعة الإجراءات | الافتراضي | ملاحظات |
|---|---|---|
| reactions | مفعّل | التفاعل + سرد التفاعلات |
| messages | مفعّل | قراءة/إرسال/تحرير/حذف |
| pins | مفعّل | تثبيت/إلغاء تثبيت/سرد |
| memberInfo | مفعّل | معلومات العضو |
| emojiList | مفعّل | قائمة emoji المخصصة |
Mattermost
يشحن Mattermost كـ Plugin مضمن في إصدارات OpenClaw الحالية. يمكن للإصدارات الأقدم أو
البنى المخصصة تثبيت حزمة npm حالية باستخدام
openclaw plugins install @openclaw/mattermost. تحقق من
npmjs.com/package/@openclaw/mattermost
للاطلاع على dist-tags الحالية قبل تثبيت إصدار معين.
{
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. - بالنسبة لمضيفي الاستدعاء الخاصين/ضمن tailnet/الداخليين، قد يتطلب Mattermost أن يتضمن
ServiceSettings.AllowedUntrustedInternalConnectionsمضيف/نطاق الاستدعاء. استخدم قيم المضيف/النطاق، وليس URLs كاملة. channels.mattermost.configWrites: السماح بكتابات الإعدادات التي يبدأها Mattermost أو رفضها.channels.mattermost.requireMention: اشتراط@mentionقبل الرد في القنوات.channels.mattermost.groups.<channelId>.requireMention: تجاوز بوابة الذكر لكل قناة ("*"للافتراضي).- يتجاوز
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الاختياري اختيار الحساب الافتراضي عندما يطابق معرف حساب مكوّنا.
BlueBubbles
BlueBubbles هو جسر iMessage القديم (مدعوم بـ Plugin، ومكوّن ضمن channels.bluebubbles). تظل الإعدادات الحالية مدعومة، لكن يجب أن تفضل عمليات نشر OpenClaw الجديدة لـ iMessage استخدام channels.imessage عندما يمكن تشغيل imsg على مضيف Messages.
{
channels: {
bluebubbles: {
enabled: true,
dmPolicy: "pairing",
// serverUrl, password, webhookPath, group controls, and advanced actions:
// see /channels/bluebubbles
},
},
}
- مسارات المفاتيح الأساسية المشمولة هنا:
channels.bluebubbles، وchannels.bluebubbles.dmPolicy. - يتجاوز
channels.bluebubbles.defaultAccountالاختياري اختيار الحساب الافتراضي عندما يطابق معرف حساب مكوّنا. - يمكن لإدخالات
bindings[]ذات المستوى الأعلى معtype: "acp"ربط محادثات BlueBubbles بجلسات ACP دائمة. استخدم معالج BlueBubbles أو سلسلة هدف (chat_id:*، وchat_guid:*، وchat_identifier:*) فيmatch.peer.id. دلالات الحقول المشتركة: وكلاء ACP. - تم توثيق إعداد قناة BlueBubbles الكامل ومسوغ الإيقاف التدريجي في BlueBubbles.
iMessage
يشغل OpenClaw الأمر imsg rpc (JSON-RPC عبر stdio). لا حاجة إلى daemon أو منفذ. هذا هو المسار المفضل لإعدادات OpenClaw الجديدة لـ iMessage عندما يمكن للمضيف منح أذونات قاعدة بيانات Messages وAutomation.
{
channels: {
imessage: {
enabled: true,
cliPath: "imsg",
dbPath: "~/Library/Messages/chat.db",
remoteHost: "user@gateway-host",
dmPolicy: "pairing",
allowFrom: ["+15555550123", "[email protected]", "chat_id:123"],
historyLimit: 50,
includeAttachments: false,
attachmentRoots: ["/Users/*/Library/Messages/Attachments"],
remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],
mediaMaxMb: 16,
service: "auto",
region: "US",
},
},
}
-
يتجاوز
channels.imessage.defaultAccountالاختياري اختيار الحساب الافتراضي عندما يطابق معرف حساب مكوّنا. -
يتطلب Full Disk Access إلى قاعدة بيانات Messages.
-
فضّل أهداف
chat_id:<id>. استخدمimsg chats --limit 20لسرد الدردشات. -
يمكن أن يشير
cliPathإلى مغلف SSH؛ اضبطremoteHost(hostأوuser@host) لجلب مرفقات SCP. -
يقيّد
attachmentRootsوremoteAttachmentRootsمسارات المرفقات الواردة (الافتراضي:/Users/*/Library/Messages/Attachments). -
يستخدم SCP التحقق الصارم من مفتاح المضيف، لذا تأكد من أن مفتاح مضيف الترحيل موجود مسبقا في
~/.ssh/known_hosts. -
channels.imessage.configWrites: السماح بكتابات الإعدادات التي يبدأها iMessage أو رفضها. -
يمكن لإدخالات
bindings[]ذات المستوى الأعلى معtype: "acp"ربط محادثات iMessage بجلسات ACP دائمة. استخدم معالجا موحّدا أو هدف دردشة صريحا (chat_id:*، وchat_guid:*، وchat_identifier:*) فيmatch.peer.id. دلالات الحقول المشتركة: وكلاء ACP.
مثال مغلف SSH لـ iMessage
#!/usr/bin/env bash
exec 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حركة مرور Matrix HTTP عبر وكيل HTTP(S) صريح. يمكن للحسابات المسماة تجاوزه باستخدامchannels.matrix.accounts.<id>.proxy. - يسمح
channels.matrix.network.dangerouslyAllowPrivateNetworkبخوادم homeserver الخاصة/الداخلية.proxyوخيار الشبكة هذا عنصران مستقلان للتحكم. - يحدد
channels.matrix.defaultAccountالحساب المفضل في إعدادات الحسابات المتعددة. - القيمة الافتراضية لـ
channels.matrix.autoJoinهيoff، لذلك يتم تجاهل الغرف المدعو إليها والدعوات الجديدة بنمط DM حتى تضبطautoJoin: "allowlist"معautoJoinAllowlistأوautoJoin: "always". channels.matrix.execApprovals: تسليم موافقات التنفيذ الأصلية في Matrix وتفويض الموافقين.enabled:trueأوfalseأو"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في كيفية تجميع رسائل Matrix DM ضمن جلسات: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: "[email protected]",
},
},
},
}
- مسارات المفاتيح الأساسية المشمولة هنا:
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...",
},
},
},
},
}
- يُستخدم
defaultعندما يتم حذفaccountId(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 وMatrix وLINE وNostr وZalo وNextcloud Talk وSynology Chat وTwitch).
راجع فهرس القنوات الكامل: القنوات.
بوابة الذكر في دردشة المجموعات
تكون رسائل المجموعات افتراضيا تتطلب ذكرا (ذكر عبر البيانات الوصفية أو أنماط 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 فور حفظ الملف. أعد التشغيل فقط عندما تكون مراقبة الملفات أو إعادة تحميل الإعدادات معطّلة في النشر.
أنواع الإشارات:
- إشارات البيانات الوصفية: إشارات @ أصلية من المنصة. تُتجاهل في وضع المحادثة الذاتية في 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. لا تزال قوائم السماح للقنوات وبوابة الإشارات تقرر ما إذا كان الدور سيُعالج.
حدود سجل الرسائل المباشرة
{
channels: {
telegram: {
dmHistoryLimit: 30,
dms: {
"123456789": { historyLimit: 50 },
},
},
},
}
آلية الحل: تجاوز لكل رسالة مباشرة → افتراضي المزوّد → بلا حد (يُحتفظ بكل شيء).
مدعوم: 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,
},
}
تفاصيل الأوامر
- تضبط هذه الكتلة أسطح الأوامر. للاطلاع على كتالوج الأوامر المدمجة + المرفقة الحالي، راجع أوامر Slash.
- هذه الصفحة هي مرجع لمفاتيح الإعدادات، وليست كتالوج الأوامر الكامل. أوامر القنوات/Plugin مثل QQ Bot
/bot-ping/bot-help/bot-logs، وLINE/card، واقتران الأجهزة/pair، والذاكرة/dreaming، والتحكم بالهاتف/phone، وTalk/voiceموثقة في صفحات القنوات/Plugin الخاصة بها بالإضافة إلى أوامر Slash. - يجب أن تكون الأوامر النصية رسائل مستقلة تبدأ بـ
/. - يفعّل
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معيّنًا. - خريطة مستندات الأوامر:
- الكتالوج المدمج + المرفق: أوامر Slash
- أسطح الأوامر الخاصة بالقنوات: القنوات
- أوامر QQ Bot: QQ Bot
- أوامر الاقتران: الاقتران
- أمر بطاقة LINE: LINE
- Dreaming الذاكرة: Dreaming
ذو صلة
- مرجع الإعدادات — مفاتيح المستوى الأعلى
- الإعدادات — الوكلاء
- نظرة عامة على القنوات