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.jsonSkills از فضای کاری هر عامل و ریشههای مشترکی مانند ~/.openclaw/skills بارگیری میشوند، سپس بر اساس فهرست مجاز مؤثر Skills عامل فیلتر میشوند. برای خطپایه مشترک از agents.defaults.skills و برای جایگزینی مختص هر عامل از agents.entries.*.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.entries.*.workspace، سپس agents.defaults.workspace، یا OPENCLAW_WORKSPACE_DIR |
| فضای کاری سایر عاملها | <stateDir>/workspace-<agentId> (یا <agents.defaults.workspace>/<agentId> هنگامیکه تنظیم شده باشد) |
agents.entries.*.workspace |
| دایرکتوری عامل | ~/.openclaw/agents/<agentId>/agent |
agents.entries.*.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.entries، حسابهای کانال را زیر 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.entries.*.memory.search.qmd.extraCollections اضافه کنید. هنگامیکه همه عاملها باید مجموعههای یکسانی را بهاشتراک بگذارند، از memory.search.qmd.extraCollections استفاده کنید.
{ agents: { defaults: { workspace: "~/workspaces/main", }, entries: { main: { workspace: "~/workspaces/main", memory: { search: { qmd: { extraCollections: [{ path: "notes" }], // درون فضای کاری تفکیک میشود -> مجموعهای با نام "notes-main" }, }, }, }, family: { workspace: "~/workspaces/family" }, }, }, memory: { backend: "qmd", search: { qmd: { extraCollections: [{ path: "~/agents/family/sessions", name: "family-sessions" }], }, }, qmd: { includeDefaultMemory: false }, },}مسیر یک مجموعه اضافی میتواند بین عاملها مشترک باشد، اما هنگامیکه مسیر خارج از فضای کاری عامل است، name آن همچنان صریح باقی میماند. مسیرهای درون فضای کاری در محدوده عامل باقی میمانند تا هر عامل مجموعه جستوجوی رونوشت مختص خود را حفظ کند.
یک شماره WhatsApp، چندین نفر (تفکیک پیام مستقیم)
با تطبیق فرستنده E.164 (+15551234567) با peer.kind: "direct"، پیامهای مستقیم متفاوت WhatsApp را در یک حساب WhatsApp به عاملهای متفاوت هدایت کنید. پاسخها همچنان از همان شماره 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 به عامل مختص خود هدایت میشود، بنابراین یک سرور میتواند بدون ترکیب نشستها میزبان چندین شماره تلفن باشد.
برای انتخاب حسابی که هنگام حذف accountId استفاده میشود، channels.<channel>.defaultAccount را تنظیم کنید. اگر تنظیم نشده باشد، 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: پیامهای ورودی را بر اساس(channel, accountId, peer)و در صورت نیاز، شناسههای انجمن/تیم، به یکagentIdهدایت میکند.- گفتوگوهای مستقیم به
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، هر بات را دعوت کنید و باتی را که باید پاسخ دهد منشن کنید.
- Privacy Mode در BotFather را برای هر بات گروه غیرفعال کنید (
/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: "Home", workspace: "~/.openclaw/workspace-home", agentDir: "~/.openclaw/agents/home/agent", }, { id: "work", name: "Work", 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: "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", accountId: "*" } }, { agentId: "opus", match: { channel: "telegram", accountId: "*" } }, ],}این نمونهها از accountId: "*" استفاده میکنند تا اگر بعداً حسابهایی اضافه کردید، اتصالها همچنان کار کنند. برای هدایت یک پیام مستقیم/گروه مشخص به 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", accountId: "*", peer: { kind: "direct", id: "+15551234567" } }, }, { agentId: "chat", match: { channel: "whatsapp", accountId: "*" } }, ],}اتصالهای همتا همیشه اولویت دارند، بنابراین آنها را بالاتر از قاعده سراسری کانال نگه دارید.
عامل خانواده متصل به یک گروه 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: "120363999999999999@g.us" }, }, }, ],}فهرستهای مجاز/ممنوع ابزار، ابزار هستند نه مهارت. اگر مهارتی نیاز به اجرای یک فایل دودویی دارد، مطمئن شوید exec مجاز است و فایل دودویی در سندباکس وجود دارد. برای کنترل سختگیرانهتر، agents.entries.*.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 — اجرای مهارهای کدنویسی خارجی
- مسیریابی کانال — نحوهٔ مسیریابی پیامها به عاملها
- حضور — حضور و دسترسپذیری عامل
- نشست — جداسازی و مسیریابی نشست
- زیرعاملها — راهاندازی اجراهای پسزمینهٔ عامل