Multi-agent
توجيه متعدد الوكلاء
شغّل عدة وكلاء معزولين، لكل منهم مساحة عمل خاصة به، ودليل حالة (agentDir)، وسجل جلسة، إلى جانب حسابات قناة متعددة (مثل حسابي WhatsApp) داخل Gateway واحد قيد التشغيل. تُوجَّه الرسائل الواردة إلى الوكيل الصحيح عبر عمليات الربط.
الـ وكيل هنا هو النطاق الكامل لكل شخصية: ملفات مساحة العمل، وملفات تعريف المصادقة، وسجل النماذج، ومخزن الجلسات. agentDir هو دليل الحالة على القرص الذي يحتوي على هذا الإعداد الخاص بكل وكيل في ~/.openclaw/agents/<agentId>/. يربط الربط حساب قناة (مثل مساحة عمل Slack أو رقم WhatsApp) بأحد هؤلاء الوكلاء.
ما هو "وكيل واحد"؟
الـ وكيل هو عقل محدد النطاق بالكامل وله ما يلي:
- مساحة العمل (الملفات، وAGENTS.md/SOUL.md/USER.md، والملاحظات المحلية، وقواعد الشخصية).
- دليل الحالة (
agentDir) لملفات تعريف المصادقة، وسجل النماذج، وإعدادات كل وكيل. - مخزن الجلسات (سجل المحادثة + حالة التوجيه) تحت
~/.openclaw/agents/<agentId>/sessions.
ملفات تعريف المصادقة خاصة بكل وكيل. يقرأ كل وكيل من ملفه الخاص:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json
تُحمَّل Skills من مساحة عمل كل وكيل إضافة إلى الجذور المشتركة مثل ~/.openclaw/skills، ثم تُرشَّح حسب قائمة السماح الفعالة لمهارات الوكيل عند إعدادها. استخدم agents.defaults.skills لخط أساس مشترك وagents.list[].skills لاستبدال خاص بكل وكيل. راجع Skills: لكل وكيل مقابل مشتركة وSkills: قوائم سماح مهارات الوكيل.
يمكن لـ Gateway استضافة وكيل واحد (افتراضيا) أو عدة وكلاء جنبا إلى جنب.
المسارات (خريطة سريعة)
- الإعداد:
~/.openclaw/openclaw.json(أوOPENCLAW_CONFIG_PATH) - دليل الحالة:
~/.openclaw(أوOPENCLAW_STATE_DIR) - مساحة العمل:
~/.openclaw/workspace(أو~/.openclaw/workspace-<agentId>) - دليل الوكيل:
~/.openclaw/agents/<agentId>/agent(أوagents.list[].agentDir) - الجلسات:
~/.openclaw/agents/<agentId>/sessions
وضع الوكيل الواحد (افتراضي)
إذا لم تفعل شيئا، يشغل OpenClaw وكيلا واحدا:
- تكون القيمة الافتراضية لـ
agentIdهيmain. - تُفهرس الجلسات بصيغة
agent:main:<mainKey>. - تكون مساحة العمل افتراضيا
~/.openclaw/workspace(أو~/.openclaw/workspace-<profile>عند ضبطOPENCLAW_PROFILE). - تكون الحالة افتراضيا
~/.openclaw/agents/main/agent.
مساعد الوكيل
استخدم معالج الوكيل لإضافة وكيل معزول جديد:
openclaw agents add work
ثم أضف bindings (أو دع المعالج يفعل ذلك) لتوجيه الرسائل الواردة.
تحقق باستخدام:
openclaw agents list --bindings
البدء السريع
Create each agent workspace
استخدم المعالج أو أنشئ مساحات العمل يدويا:
openclaw agents add coding
openclaw agents add social
يحصل كل وكيل على مساحة عمل خاصة به تحتوي على SOUL.md وAGENTS.md وUSER.md اختياري، إضافة إلى agentDir مخصص ومخزن جلسات تحت ~/.openclaw/agents/<agentId>.
Create channel accounts
أنشئ حسابا واحدا لكل وكيل على قنواتك المفضلة:
- Discord: روبوت واحد لكل وكيل، فعّل Message Content Intent، وانسخ كل رمز.
- Telegram: روبوت واحد لكل وكيل عبر BotFather، وانسخ كل رمز.
- WhatsApp: اربط كل رقم هاتف بكل حساب.
openclaw channels login --channel whatsapp --account work
Add agents, accounts, and bindings
أضف الوكلاء تحت agents.list، وحسابات القنوات تحت channels.<channel>.accounts، واربطها باستخدام bindings (الأمثلة أدناه).
Restart and verify
openclaw gateway restart
openclaw agents list --bindings
openclaw channels status --probe
عدة وكلاء = عدة أشخاص، عدة شخصيات
مع عدة وكلاء، يصبح كل agentId شخصية معزولة بالكامل:
- أرقام هاتف/حسابات مختلفة (لكل قناة
accountId). - شخصيات مختلفة (ملفات مساحة عمل خاصة بكل وكيل مثل
AGENTS.mdوSOUL.md). - مصادقة + جلسات منفصلة (لا تداخل ما لم يُفعّل صراحة).
يتيح هذا لـ عدة أشخاص مشاركة خادم Gateway واحد مع إبقاء "عقول" الذكاء الاصطناعي وبياناتهم معزولة.
بحث ذاكرة QMD عبر الوكلاء
إذا كان يجب على وكيل البحث في نصوص جلسات QMD لوكيل آخر، فأضف مجموعات إضافية تحت agents.list[].memorySearch.qmd.extraCollections. استخدم agents.defaults.memorySearch.qmd.extraCollections فقط عندما يجب أن يرث كل وكيل مجموعات النصوص المشتركة نفسها.
{
agents: {
defaults: {
workspace: "~/workspaces/main",
memorySearch: {
qmd: {
extraCollections: [{ path: "~/agents/family/sessions", name: "family-sessions" }],
},
},
},
list: [
{
id: "main",
workspace: "~/workspaces/main",
memorySearch: {
qmd: {
extraCollections: [{ path: "notes" }], // resolves inside workspace -> collection named "notes-main"
},
},
},
{ id: "family", workspace: "~/workspaces/family" },
],
},
memory: {
backend: "qmd",
qmd: { includeDefaultMemory: false },
},
}
يمكن مشاركة مسار المجموعة الإضافية عبر الوكلاء، لكن يبقى اسم المجموعة صريحا عندما يكون المسار خارج مساحة عمل الوكيل. تظل المسارات داخل مساحة العمل محددة النطاق للوكيل كي يحتفظ كل وكيل بمجموعة بحث النصوص الخاصة به.
رقم WhatsApp واحد، عدة أشخاص (تقسيم الرسائل المباشرة)
يمكنك توجيه رسائل WhatsApp مباشرة مختلفة إلى وكلاء مختلفين مع البقاء على حساب WhatsApp واحد. طابق حسب مرسل E.164 (مثل +15551234567) مع peer.kind: "direct". ستظل الردود صادرة من رقم WhatsApp نفسه (لا توجد هوية مرسل خاصة بكل وكيل).
مثال:
{
agents: {
list: [
{ id: "alex", workspace: "~/.openclaw/workspace-alex" },
{ id: "mia", workspace: "~/.openclaw/workspace-mia" },
],
},
bindings: [
{
agentId: "alex",
match: { channel: "whatsapp", peer: { kind: "direct", id: "+15551230001" } },
},
{
agentId: "mia",
match: { channel: "whatsapp", peer: { kind: "direct", id: "+15551230002" } },
},
],
channels: {
whatsapp: {
dmPolicy: "allowlist",
allowFrom: ["+15551230001", "+15551230002"],
},
},
}
ملاحظات:
- التحكم في الوصول إلى الرسائل المباشرة عام لكل حساب WhatsApp (الاقتران/قائمة السماح)، وليس لكل وكيل.
- للمجموعات المشتركة، اربط المجموعة بوكيل واحد أو استخدم مجموعات البث.
قواعد التوجيه (كيف تختار الرسائل وكيلا)
عمليات الربط حتمية والأكثر تحديدا يفوز:
peer match
معرّف رسالة مباشرة/مجموعة/قناة مطابق تماما.
parentPeer match
وراثة الخيط.
guildId + roles
توجيه أدوار Discord.
guildId
Discord.
teamId
Slack.
accountId match for a channel
مسار احتياطي لكل حساب.
Channel-level match
accountId: "*".
Default agent
مسار احتياطي إلى agents.list[].default، وإلا أول إدخال في القائمة، الافتراضي: main.
Tie-breaking and AND semantics
- إذا طابقت عدة عمليات ربط في المستوى نفسه، تفوز أول واحدة حسب ترتيب الإعداد.
- إذا ضبط ربط عدة حقول مطابقة (مثلا
peer+guildId)، فكل الحقول المحددة مطلوبة (دلالاتAND).
Account-scope detail
- الربط الذي يحذف
accountIdيطابق الحساب الافتراضي فقط. - استخدم
accountId: "*"لمسار احتياطي على مستوى القناة عبر كل الحسابات. - إذا أضفت لاحقا الربط نفسه للوكيل نفسه مع معرّف حساب صريح، يرقي OpenClaw الربط الحالي الخاص بالقناة فقط إلى ربط محدد النطاق بالحساب بدلا من تكراره.
حسابات / أرقام هاتف متعددة
تستخدم القنوات التي تدعم حسابات متعددة (مثل WhatsApp) accountId لتحديد كل تسجيل دخول. يمكن توجيه كل accountId إلى وكيل مختلف، لذلك يمكن لخادم واحد استضافة أرقام هاتف متعددة دون خلط الجلسات.
إذا أردت حسابا افتراضيا على مستوى القناة عند حذف accountId، فاضبط channels.<channel>.defaultAccount (اختياري). عند عدم ضبطه، يعود OpenClaw إلى default إذا كان موجودا، وإلا إلى أول معرّف حساب مضبوط (مرتّب).
تشمل القنوات الشائعة التي تدعم هذا النمط:
whatsapp,telegram,discord,slack,signal,imessageirc,line,googlechat,mattermost,matrix,nextcloud-talkbluebubbles,zalo,zalouser,nostr,feishu
المفاهيم
agentId: "عقل" واحد (مساحة عمل، مصادقة خاصة بكل وكيل، مخزن جلسات خاص بكل وكيل).accountId: نسخة حساب قناة واحدة (مثلا حساب WhatsApp"personal"مقابل"biz").binding: يوجه الرسائل الواردة إلىagentIdحسب(channel, accountId, peer)واختياريا معرّفات النقابة/الفريق.- تنهار المحادثات المباشرة إلى
agent:<agentId>:<mainKey>("الرئيسية" لكل وكيل؛session.mainKey).
أمثلة المنصات
Discord bots per agent
يرتبط كل حساب روبوت Discord بـ accountId فريد. اربط كل حساب بوكيل، واحتفظ بقوائم السماح لكل روبوت.
{
agents: {
list: [
{ id: "main", workspace: "~/.openclaw/workspace-main" },
{ id: "coding", workspace: "~/.openclaw/workspace-coding" },
],
},
bindings: [
{ agentId: "main", match: { channel: "discord", accountId: "default" } },
{ agentId: "coding", match: { channel: "discord", accountId: "coding" } },
],
channels: {
discord: {
groupPolicy: "allowlist",
accounts: {
default: {
token: "DISCORD_BOT_TOKEN_MAIN",
guilds: {
"123456789012345678": {
channels: {
"222222222222222222": { allow: true, requireMention: false },
},
},
},
},
coding: {
token: "DISCORD_BOT_TOKEN_CODING",
guilds: {
"123456789012345678": {
channels: {
"333333333333333333": { allow: true, requireMention: false },
},
},
},
},
},
},
},
}
- ادعُ كل بوت إلى الخادم وفعّل Message Content Intent.
- توجد الرموز المميزة في
channels.discord.accounts.<id>.token(يمكن للحساب الافتراضي استخدامDISCORD_BOT_TOKEN).
بوتات Telegram لكل وكيل
{
agents: {
list: [
{ id: "main", workspace: "~/.openclaw/workspace-main" },
{ id: "alerts", workspace: "~/.openclaw/workspace-alerts" },
],
},
bindings: [
{ agentId: "main", match: { channel: "telegram", accountId: "default" } },
{ agentId: "alerts", match: { channel: "telegram", accountId: "alerts" } },
],
channels: {
telegram: {
accounts: {
default: {
botToken: "123456:ABC...",
dmPolicy: "pairing",
},
alerts: {
botToken: "987654:XYZ...",
dmPolicy: "allowlist",
allowFrom: ["tg:123456789"],
},
},
},
},
}
- أنشئ بوتًا واحدًا لكل وكيل باستخدام BotFather وانسخ كل رمز مميز.
- توجد الرموز المميزة في
channels.telegram.accounts.<id>.botToken(يمكن للحساب الافتراضي استخدامTELEGRAM_BOT_TOKEN).
أرقام WhatsApp لكل وكيل
اربط كل حساب قبل بدء Gateway:
openclaw channels login --channel whatsapp --account personal
openclaw channels login --channel whatsapp --account biz
~/.openclaw/openclaw.json (JSON5):
{
agents: {
list: [
{
id: "home",
default: true,
name: "Home",
workspace: "~/.openclaw/workspace-home",
agentDir: "~/.openclaw/agents/home/agent",
},
{
id: "work",
name: "Work",
workspace: "~/.openclaw/workspace-work",
agentDir: "~/.openclaw/agents/work/agent",
},
],
},
// Deterministic routing: first match wins (most-specific first).
bindings: [
{ agentId: "home", match: { channel: "whatsapp", accountId: "personal" } },
{ agentId: "work", match: { channel: "whatsapp", accountId: "biz" } },
// Optional per-peer override (example: send a specific group to work agent).
{
agentId: "work",
match: {
channel: "whatsapp",
accountId: "personal",
peer: { kind: "group", id: "[email protected]" },
},
},
],
// Off by default: agent-to-agent messaging must be explicitly enabled + allowlisted.
tools: {
agentToAgent: {
enabled: false,
allow: ["home", "work"],
},
},
channels: {
whatsapp: {
accounts: {
personal: {
// Optional override. Default: ~/.openclaw/credentials/whatsapp/personal
// authDir: "~/.openclaw/credentials/whatsapp/personal",
},
biz: {
// Optional override. Default: ~/.openclaw/credentials/whatsapp/biz
// authDir: "~/.openclaw/credentials/whatsapp/biz",
},
},
},
},
}
الأنماط الشائعة
WhatsApp يومي + عمل معمّق عبر Telegram
قسّم حسب القناة: وجّه WhatsApp إلى وكيل يومي سريع وTelegram إلى وكيل Opus.
{
agents: {
list: [
{
id: "chat",
name: "Everyday",
workspace: "~/.openclaw/workspace-chat",
model: "anthropic/claude-sonnet-4-6",
},
{
id: "opus",
name: "Deep Work",
workspace: "~/.openclaw/workspace-opus",
model: "anthropic/claude-opus-4-6",
},
],
},
bindings: [
{ agentId: "chat", match: { channel: "whatsapp" } },
{ agentId: "opus", match: { channel: "telegram" } },
],
}
ملاحظات:
- إذا كانت لديك حسابات متعددة لقناة ما، فأضف
accountIdإلى الربط (على سبيل المثال{ channel: "whatsapp", accountId: "personal" }). - لتوجيه رسالة مباشرة/مجموعة واحدة إلى Opus مع إبقاء البقية على وكيل المحادثة، أضف ربط
match.peerلذلك النظير؛ تطابقات النظير تفوز دائمًا على القواعد الشاملة للقناة.
القناة نفسها، نظير واحد إلى Opus
أبقِ WhatsApp على الوكيل السريع، لكن وجّه رسالة مباشرة واحدة إلى Opus:
{
agents: {
list: [
{
id: "chat",
name: "Everyday",
workspace: "~/.openclaw/workspace-chat",
model: "anthropic/claude-sonnet-4-6",
},
{
id: "opus",
name: "Deep Work",
workspace: "~/.openclaw/workspace-opus",
model: "anthropic/claude-opus-4-6",
},
],
},
bindings: [
{
agentId: "opus",
match: { channel: "whatsapp", peer: { kind: "direct", id: "+15551234567" } },
},
{ agentId: "chat", match: { channel: "whatsapp" } },
],
}
تفوز روابط النظير دائمًا، لذلك أبقِها فوق القاعدة الشاملة للقناة.
وكيل العائلة المرتبط بمجموعة WhatsApp
اربط وكيلًا مخصصًا للعائلة بمجموعة WhatsApp واحدة، مع بوابة الإشارات وسياسة أدوات أكثر تشددًا:
{
agents: {
list: [
{
id: "family",
name: "Family",
workspace: "~/.openclaw/workspace-family",
identity: { name: "Family Bot" },
groupChat: {
mentionPatterns: ["@family", "@familybot", "@Family Bot"],
},
sandbox: {
mode: "all",
scope: "agent",
},
tools: {
allow: [
"exec",
"read",
"sessions_list",
"sessions_history",
"sessions_send",
"sessions_spawn",
"session_status",
],
deny: ["write", "edit", "apply_patch", "browser", "canvas", "nodes", "cron"],
},
},
],
},
bindings: [
{
agentId: "family",
match: {
channel: "whatsapp",
peer: { kind: "group", id: "[email protected]" },
},
},
],
}
ملاحظات:
- قوائم السماح/الرفض للأدوات هي أدوات، وليست Skills. إذا احتاجت Skill إلى تشغيل ملف ثنائي، فتأكد من السماح بـ
execومن وجود الملف الثنائي في صندوق العزل. - لبوابة أكثر تشددًا، اضبط
agents.list[].groupChat.mentionPatternsوأبقِ قوائم السماح للمجموعات مفعّلة للقناة.
صندوق العزل وتكوين الأدوات لكل وكيل
يمكن أن يكون لكل وكيل صندوق عزل وقيود أدوات خاصة به:
{
agents: {
list: [
{
id: "personal",
workspace: "~/.openclaw/workspace-personal",
sandbox: {
mode: "off", // No sandbox for personal agent
},
// No tool restrictions - all tools available
},
{
id: "family",
workspace: "~/.openclaw/workspace-family",
sandbox: {
mode: "all", // Always sandboxed
scope: "agent", // One container per agent
docker: {
// Optional one-time setup after container creation
setupCommand: "apt-get update && apt-get install -y git curl",
},
},
tools: {
allow: ["read"], // Only read tool
deny: ["exec", "write", "edit", "apply_patch"], // Deny others
},
},
],
},
}
الفوائد:
- عزل أمني: قيّد الأدوات للوكلاء غير الموثوقين.
- التحكم في الموارد: اعزل وكلاء محددين مع إبقاء آخرين على المضيف.
- سياسات مرنة: أذونات مختلفة لكل وكيل.
راجع صندوق العزل والأدوات متعددة الوكلاء للحصول على أمثلة تفصيلية.
ذات صلة
- وكلاء ACP — تشغيل أدوات ترميز خارجية
- توجيه القنوات — كيفية توجيه الرسائل إلى الوكلاء
- الحضور — حضور الوكيل وتوفره
- الجلسة — عزل الجلسات وتوجيهها
- الوكلاء الفرعيون — إنشاء تشغيلات وكلاء في الخلفية