Multi-agent
توجيه متعدد الوكلاء
شغّل عدة وكلاء معزولين في عملية Gateway واحدة، لكل منهم مساحة عمل خاصة به، ودليل حالة (agentDir)، وسجل جلسات مدعوم بـ SQLite، بالإضافة إلى عدة حسابات قنوات (مثل رقمي WhatsApp). تُوجَّه الرسائل الواردة إلى الوكيل الصحيح عبر الارتباطات.
الوكيل هو النطاق الكامل لكل شخصية: ملفات مساحة العمل، وملفات تعريف المصادقة، وسجل النماذج، ومخزن الجلسات. يربط الارتباط حساب قناة (مساحة عمل Slack أو رقم WhatsApp، وما إلى ذلك) بأحد هؤلاء الوكلاء.
ما الوكيل الواحد
لكل وكيل ما يلي:
- مساحة العمل: الملفات، و
AGENTS.md/SOUL.md/USER.md، والملاحظات المحلية، وقواعد الشخصية. - دليل الحالة (
agentDir): ملفات تعريف المصادقة، وسجل النماذج، وإعدادات كل وكيل. - مخزن الجلسات: سجل المحادثات وحالة التوجيه في
~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite.
تكون ملفات تعريف المصادقة خاصة بكل وكيل، وتُقرأ من:
~/.openclaw/agents/<agentId>/agent/auth-profiles.jsonتُحمَّل Skills من مساحة عمل كل وكيل بالإضافة إلى الجذور المشتركة مثل ~/.openclaw/skills، ثم تُرشَّح وفق قائمة Skills المسموح بها فعليًا للوكيل. استخدم agents.defaults.skills لخط أساس مشترك وagents.list[].skills لاستبدال خاص بكل وكيل (تحل الإدخالات الصريحة محل الإعداد الافتراضي ولا تُدمج معه). راجع Skills: الخاصة بكل وكيل مقابل المشتركة وSkills: قوائم السماح للوكلاء.
يتبع التخزين المملوك لـ Plugin إعدادات ذلك الـ Plugin؛ وإضافة وكيل ثانٍ لا تقسّم تلقائيًا كل مخزن عام للـ Plugin. على سبيل المثال، اضبط خزائن Memory Wiki الخاصة بكل وكيل عندما يجب ألا تشارك الشخصيات معرفة الويكي المجمّعة.
المسارات
| العنصر | الافتراضي | التجاوز |
|---|---|---|
| الإعدادات | ~/.openclaw/openclaw.json |
OPENCLAW_CONFIG_PATH |
| دليل الحالة | ~/.openclaw |
OPENCLAW_STATE_DIR |
| مساحة عمل الوكيل الافتراضي | ~/.openclaw/workspace (أو workspace-<profile> عند ضبط OPENCLAW_PROFILE) |
agents.list[].workspace، ثم agents.defaults.workspace، أو OPENCLAW_WORKSPACE_DIR |
| مساحة عمل الوكلاء الآخرين | <stateDir>/workspace-<agentId> (أو <agents.defaults.workspace>/<agentId> عند ضبطه) |
agents.list[].workspace |
| دليل الوكيل | ~/.openclaw/agents/<agentId>/agent |
agents.list[].agentDir |
| الجلسات والنصوص المنسوخة | ~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite |
— |
| عناصر الجلسات القديمة/المؤرشفة | ~/.openclaw/agents/<agentId>/sessions |
— |
وضع الوكيل الواحد (الافتراضي)
إذا لم تضبط شيئًا، يشغّل OpenClaw وكيلاً واحدًا:
- تكون القيمة الافتراضية لـ
agentIdهيmain. - تستخدم الجلسات المفتاح
agent:main:<mainKey>(القيمة الافتراضية لـmainKeyهيmain). - تكون مساحة العمل افتراضيًا
~/.openclaw/workspace(أوworkspace-<profile>عندما تُضبطOPENCLAW_PROFILEعلى قيمة غيرdefault). - تكون الحالة افتراضيًا
~/.openclaw/agents/main/agent.
أداة الوكيل المساعدة
أضف وكيلاً معزولاً جديدًا:
openclaw agents add workالعلامات: --workspace <dir>، و--model <id>، و--agent-dir <dir>، و--bind <channel[:accountId]> (قابلة للتكرار)، و--non-interactive (تتطلب --workspace).
أضف bindings لتوجيه الرسائل الواردة (يعرض المعالج تنفيذ ذلك نيابةً عنك)، ثم تحقّق:
openclaw agents list --bindingsبدء سريع
إنشاء مساحة عمل لكل وكيل
openclaw agents add codingopenclaw agents add socialيحصل كل وكيل على مساحة عمل خاصة به تحتوي على SOUL.md وAGENTS.md وUSER.md اختياري، بالإضافة إلى agentDir مخصص ومخزن جلسات ضمن ~/.openclaw/agents/<agentId>.
إنشاء حسابات القنوات
أنشئ حسابًا واحدًا لكل وكيل على القنوات التي تفضّلها:
- Discord: روبوت واحد لكل وكيل، فعّل Message Content Intent، وانسخ كل رمز.
- Telegram: روبوت واحد لكل وكيل عبر BotFather، وانسخ كل رمز.
- WhatsApp: اربط كل رقم هاتف بحساب.
openclaw channels login --channel whatsapp --account workإضافة الوكلاء والحسابات والارتباطات
أضف الوكلاء ضمن agents.list، وحسابات القنوات ضمن channels.<channel>.accounts، واربط بينها باستخدام bindings (الأمثلة أدناه).
إعادة التشغيل والتحقق
openclaw gateway restartopenclaw agents list --bindingsopenclaw channels status --probeعدة وكلاء، وعدة شخصيات
يمثل كل agentId مضبوط حدًا مستقلاً للشخصية بالنسبة إلى حالة الوكيل الأساسية:
- حسابات مختلفة لكل قناة (لكل
accountId). - شخصيات مختلفة (
AGENTS.md/SOUL.mdلكل وكيل). - مصادقة وجلسات منفصلة، مع تمكين الوصول عبر الوكلاء فقط من خلال ميزات صريحة أو إعدادات Plugin.
يتيح ذلك لعدة أشخاص مشاركة Gateway واحد مع إبقاء حالة كل وكيل الأساسية منفصلة.
خزائن Memory Wiki الخاصة بكل وكيل
يستخدم Memory Wiki خزينة عامة واحدة افتراضيًا. لإبقاء
المعرفة المجمّعة لوكيل الدعم منفصلة عن معرفة وكيل التسويق، اضبط
plugins.entries.memory-wiki.config.vault.scope على agent:
{ plugins: { entries: { "memory-wiki": { enabled: true, config: { vault: { scope: "agent", path: "~/.openclaw/wiki", }, }, }, }, },}المسار المضبوط هو الدليل الأب. يضيف OpenClaw معرّف
الوكيل بعد تطبيعه، منتجًا مسارات مثل ~/.openclaw/wiki/support و
~/.openclaw/wiki/marketing. تتطلب عمليات CLI وGateway ضمن نطاق الوكيل
تحديد وكيل صراحةً عند ضبط عدة وكلاء. راجع
خزائن Memory Wiki الخاصة بكل وكيل للحصول على تفاصيل
تصفية الجسر والترحيل وحدود الثقة.
البحث في ذاكرة 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" }], // يُحل داخل مساحة العمل -> مجموعة باسم "notes-main" }, }, }, { id: "family", workspace: "~/workspaces/family" }, ], }, memory: { backend: "qmd", qmd: { includeDefaultMemory: false }, },}يمكن مشاركة مسار مجموعة إضافية بين الوكلاء، لكن تبقى قيمة name الخاصة به صريحة عندما يكون المسار خارج مساحة عمل الوكيل. وتبقى المسارات داخل مساحة العمل ضمن نطاق الوكيل، بحيث يحتفظ كل وكيل بمجموعة البحث الخاصة به في النصوص المنسوخة.
رقم 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+guildId)، فيجب أن تتطابق جميع الحقول المحددة (دلالاتAND). - الارتباط الذي يحذف
accountIdيطابق الحساب الافتراضي فقط، وليس كل الحسابات. استخدمaccountId: "*"كخيار احتياطي على مستوى القناة، أوaccountId: "<name>"لحساب واحد. تؤدي إضافة الارتباط نفسه مرة أخرى مع معرّف حساب صريح إلى ترقية الارتباط الحالي الخاص بالقناة فقط بدلاً من تكراره.
حسابات / أرقام هواتف متعددة
تستخدم القنوات التي تدعم حسابات متعددة (مثل WhatsApp) accountId لتعريف كل تسجيل دخول. يوجّه كل accountId إلى وكيله الخاص، لذا يمكن لخادم واحد استضافة عدة أرقام هواتف من دون خلط الجلسات.
عيّن channels.<channel>.defaultAccount لاختيار الحساب المستخدم عند حذف accountId. عند عدم تعيينه، يعود OpenClaw إلى default إذا كان موجودًا، وإلا فيستخدم معرّف أول حساب مُعدّ (بعد الفرز).
القنوات التي تدعم حسابات متعددة: discord، feishu، googlechat، imessage، irc، line، mattermost، matrix، nextcloud-talk، nostr، signal، slack، telegram، whatsapp، zalo، zalouser.
المفاهيم
agentId: «عقل» واحد (مساحة عمل، ومصادقة لكل وكيل، ومخزن جلسات لكل وكيل).accountId: مثيل واحد لحساب قناة (مثل حساب WhatsApp personalمقارنةً بـbiz).binding: يوجّه الرسائل الواردة إلىagentIdحسب(channel, accountId, peer)، واختياريًا حسب معرّفات النقابة/الفريق.- تُدمج المحادثات المباشرة في
agent:<agentId>:<mainKey>(الحساب «الرئيسي» لكل وكيل؛ راجعsession.mainKey).
أمثلة المنصات
روبوتات Discord لكل وكيل
يُربط كل حساب روبوت 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). - عند استخدام عدة روبوتات في مجموعة Telegram نفسها، ادعُ كل روبوت واذكر الروبوت الذي ينبغي أن يجيب.
- عطّل BotFather Privacy Mode لكل روبوت مجموعة (
/setprivacy-> Disable)، ثم أزل الروبوت وأعد إضافته لكي يطبّق Telegram الإعداد. - اسمح بالمجموعات باستخدام
channels.telegram.groups، أو استخدمgroupPolicy: "open"فقط لعمليات نشر المجموعات الموثوقة. - ضع معرّفات المستخدمين المرسلين في
groupAllowFrom. تنتمي معرّفات المجموعات والمجموعات الفائقة إلىchannels.telegram.groups، وليس إلىgroupAllowFrom. - اربط حسب
accountIdلكي يوجّه كل روبوت الرسائل إلى وكيله الخاص.
أرقام WhatsApp لكل وكيل
اربط كل حساب قبل بدء Gateway:
openclaw channels login --channel whatsapp --account personalopenclaw channels login --channel whatsapp --account biz~/.openclaw/openclaw.json (JSON5):
{ agents: { list: [ { id: "home", default: true, name: "المنزل", workspace: "~/.openclaw/workspace-home", agentDir: "~/.openclaw/agents/home/agent", }, { id: "work", name: "العمل", workspace: "~/.openclaw/workspace-work", agentDir: "~/.openclaw/agents/work/agent", }, ], }, // توجيه حتمي: يفوز أول تطابق (الأكثر تحديدًا أولًا). bindings: [ { agentId: "home", match: { channel: "whatsapp", accountId: "personal" } }, { agentId: "work", match: { channel: "whatsapp", accountId: "biz" } }, // تجاوز اختياري لكل نظير (مثال: إرسال مجموعة محددة إلى وكيل العمل). { agentId: "work", match: { channel: "whatsapp", accountId: "personal", peer: { kind: "group", id: "1203630...@g.us" }, }, }, ], // معطّل افتراضيًا: يجب تمكين المراسلة بين الوكلاء صراحةً وإضافتها إلى قائمة السماح. tools: { agentToAgent: { enabled: false, allow: ["home", "work"], }, }, channels: { whatsapp: { accounts: { personal: { // تجاوز اختياري. الافتراضي: ~/.openclaw/credentials/whatsapp/personal // authDir: "~/.openclaw/credentials/whatsapp/personal", }, biz: { // تجاوز اختياري. الافتراضي: ~/.openclaw/credentials/whatsapp/biz // authDir: "~/.openclaw/credentials/whatsapp/biz", }, }, }, },}الأنماط الشائعة
WhatsApp للاستخدام اليومي وTelegram للعمل المتعمق
قسّم حسب القناة: وجّه WhatsApp إلى وكيل يومي سريع وTelegram إلى وكيل Opus.
{ agents: { list: [ { id: "chat", name: "يومي", workspace: "~/.openclaw/workspace-chat", model: "anthropic/claude-sonnet-4-6", }, { id: "opus", name: "عمل متعمق", workspace: "~/.openclaw/workspace-opus", model: "anthropic/claude-opus-4-6", }, ], }, bindings: [ { agentId: "chat", match: { channel: "whatsapp", accountId: "*" } }, { agentId: "opus", match: { channel: "telegram", accountId: "*" } }, ],}تستخدم هذه الأمثلة accountId: "*" لكي تستمر الروابط في العمل إذا أضفت حسابات لاحقًا. لتوجيه محادثة مباشرة/مجموعة واحدة إلى Opus مع إبقاء البقية على وكيل المحادثة، أضف رابط match.peer لذلك النظير — تتغلب مطابقات النظير دائمًا على القواعد الشاملة للقناة.
القناة نفسها، ونظير واحد إلى Opus
أبقِ WhatsApp على الوكيل السريع، لكن وجّه محادثة مباشرة واحدة إلى Opus:
{ agents: { list: [ { id: "chat", name: "يومي", workspace: "~/.openclaw/workspace-chat", model: "anthropic/claude-sonnet-4-6", }, { id: "opus", name: "عمل متعمق", workspace: "~/.openclaw/workspace-opus", model: "anthropic/claude-opus-4-6", }, ], }, bindings: [ { agentId: "opus", match: { channel: "whatsapp", accountId: "*", peer: { kind: "direct", id: "+15551234567" } }, }, { agentId: "chat", match: { channel: "whatsapp", accountId: "*" } }, ],}تفوز روابط النظير دائمًا، لذا أبقها فوق القاعدة الشاملة للقناة.
وكيل عائلي مرتبط بمجموعة WhatsApp
اربط وكيلًا عائليًا مخصصًا بمجموعة WhatsApp واحدة، مع اشتراط الإشارة وسياسة أدوات أكثر تقييدًا:
{ agents: { list: [ { id: "family", name: "العائلة", workspace: "~/.openclaw/workspace-family", identity: { name: "روبوت العائلة" }, 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: "120363999999999999@g.us" }, }, }, ],}قوائم السماح/الرفض الخاصة بالأدوات هي أدوات وليست Skills. إذا احتاجت إحدى Skills إلى تشغيل ملف ثنائي، فتأكد من السماح بـ exec ومن وجود الملف الثنائي في صندوق الحماية. لفرض قيود أشد، عيّن agents.list[].groupChat.mentionPatterns وأبقِ قوائم السماح للمجموعات مفعّلة للقناة.
إعداد صندوق الحماية والأدوات لكل وكيل
يمكن أن يكون لكل وكيل قيود صندوق حماية وأدوات خاصة به:
{ agents: { list: [ { id: "personal", workspace: "~/.openclaw/workspace-personal", sandbox: { mode: "off", // لا يوجد صندوق حماية للوكيل الشخصي }, // لا توجد قيود على الأدوات - جميع الأدوات متاحة }, { id: "family", workspace: "~/.openclaw/workspace-family", sandbox: { mode: "all", // يعمل دائمًا داخل صندوق حماية scope: "agent", // حاوية واحدة لكل وكيل docker: { // إعداد اختياري لمرة واحدة بعد إنشاء الحاوية setupCommand: "apt-get update && apt-get install -y git curl", }, }, tools: { allow: ["read"], // أداة القراءة فقط deny: ["exec", "write", "edit", "apply_patch"], // رفض الأدوات الأخرى }, }, ], },}يوفّر ذلك:
- العزل الأمني: تقييد الأدوات للوكلاء غير الموثوقين.
- التحكم في الموارد: تشغيل وكلاء محددين داخل صندوق حماية مع إبقاء الآخرين على المضيف.
- سياسات مرنة: أذونات مختلفة لكل وكيل.
راجع صندوق الحماية والأدوات متعددة الوكلاء للاطلاع على أمثلة تفصيلية.
ذو صلة
- وكلاء ACP — تشغيل بيئات برمجة خارجية
- توجيه القنوات — كيفية توجيه الرسائل إلى الوكلاء
- الحضور — حضور الوكيل وتوافره
- الجلسة — عزل الجلسات وتوجيهها
- الوكلاء الفرعيون — بدء عمليات تشغيل للوكلاء في الخلفية