Agent coordination
عاملهای فرعی
زیرعاملها اجراهای پسزمینهٔ عامل هستند که از یک اجرای عامل موجود ایجاد میشوند.
هرکدام در نشست خود (agent:<agentId>:subagent:<uuid>) اجرا میشود و
پس از پایان، نتیجهٔ خود را به کانال گفتوگوی درخواستکننده اعلام میکند.
هر اجرای زیرعامل بهعنوان یک وظیفهٔ پسزمینه ردیابی میشود.
اهداف:
- موازیسازی پژوهش، وظایف طولانی و کارهای کُند ابزارها، بدون مسدودکردن اجرای اصلی.
- جداسازی پیشفرض زیرعاملها (تفکیک نشستها و سندباکس اختیاری).
- دشوار نگهداشتن امکان استفادهٔ نادرست از مجموعهابزارها: زیرعاملها بهطور پیشفرض به ابزارهای نشست یا پیام دسترسی ندارند.
- پشتیبانی از عمق تودرتویی قابلپیکربندی برای الگوهای هماهنگساز.
فرمان اسلش
/subagents اجراهای زیرعامل را برای نشست فعلی بررسی میکند:
/subagents list/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents info فرادادهٔ اجرا (وضعیت، مُهرهای زمانی، شناسهٔ نشست،
مسیر رونوشت و پاکسازی) را نشان میدهد. /subagents log نوبتهای اخیر گفتوگوی یک
اجرا را چاپ میکند؛ برای افزودن پیامهای فراخوانی ابزار/نتیجه، توکن
tools را اضافه کنید (بهطور پیشفرض حذف میشوند). برای نمای
یادآوری محدود و پالایششده از نظر ایمنی درون یک نوبت عامل از sessions_history
استفاده کنید، یا برای مشاهدهٔ رونوشت خام و کامل، مسیر رونوشت روی دیسک را
بررسی کنید.
در رابط کنترل، نشستهای والد دارای اجراهای فرزند اخیر، یک ردیف بازشدنی در نوار کناری دارند. ردیفهای تودرتو وضعیت و زمان اجرای فرزند را نشان میدهند و انتخاب هرکدام، گفتوگوی آن فرزند را با حفظ سلسلهمراتب والد باز میکند.
کنترلهای مقیدسازی رشته
این فرمانها در کانالهایی با مقیدسازی پایدار رشته کار میکنند. بخش کانالهای پشتیبان رشته را در ادامه ببینید.
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>رفتار ایجاد
عاملها زیرعاملهای پسزمینه را با ابزار sessions_spawn آغاز میکنند.
نتایج تکمیل بهصورت رویدادهای داخلی نشست والد بازمیگردند؛ عامل والد/درخواستکننده
تصمیم میگیرد که آیا بهروزرسانی قابلمشاهده برای کاربر لازم است یا نه.
تکمیل غیرمسدودکننده و مبتنی بر ارسال
sessions_spawnمسدودکننده نیست؛ بلافاصله یک شناسهٔ اجرا برمیگرداند.- پس از تکمیل، زیرعامل به نشست والد/درخواستکننده گزارش میدهد.
- نوبتهای عاملی که به نتایج فرزند نیاز دارند باید پس از ایجاد کارهای لازم،
sessions_yieldرا فراخوانی کنند. این کار نوبت فعلی را پایان میدهد و اجازه میدهد رویداد تکمیل بهعنوان پیام بعدیِ قابلمشاهده برای مدل برسد. - تکمیل مبتنی بر ارسال است. پس از ایجاد، فقط برای انتظار تا پایان آن،
/subagents list،sessions_listیاsessions_historyرا در حلقه پایش نکنید؛ وضعیت را فقط هنگام اشکالزدایی و در صورت نیاز بررسی کنید. - خروجی فرزند یک گزارش/شاهد برای عامل درخواستکننده است تا آن را ترکیب کند. این خروجی متن دستور تألیفشده توسط کاربر نیست و نمیتواند سیاست سامانه، توسعهدهنده یا کاربر را لغو کند.
- پس از تکمیل، OpenClaw پیش از ادامهٔ جریان پاکسازی اعلام، در حد توان زبانهها/فرایندهای مرورگری را که نشست آن زیرعامل باز کرده است میبندد.
تحویل تکمیل
- OpenClaw تکمیلها را از طریق یک نوبت
agentبا کلید ایدمپوتنسی پایدار به نشست درخواستکننده بازمیگرداند. - اگر اجرای درخواستکننده هنوز فعال باشد، OpenClaw ابتدا تلاش میکند آن اجرا را بیدار/هدایت کند، نه اینکه مسیر پاسخ قابلمشاهدهٔ دومی را آغاز کند.
- اگر درخواستکنندهٔ فعال را نتوان بیدار کرد، OpenClaw بهجای کنارگذاشتن اعلام، به واگذاری به عامل درخواستکننده با همان زمینهٔ تکمیل بازمیگردد.
- واگذاری موفق به والد، تحویل زیرعامل را تکمیل میکند، حتی اگر والد تصمیم بگیرد هیچ بهروزرسانی قابلمشاهدهای برای کاربر لازم نیست.
- زیرعاملهای بومی ابزار پیام را دریافت نمیکنند. آنها متن سادهٔ دستیار را به عامل والد/درخواستکننده بازمیگردانند؛ پاسخهای قابلمشاهده برای انسان همچنان تحت مالکیت سیاست عادی تحویل عامل والد/درخواستکننده باقی میمانند.
- اگر نتوان از واگذاری مستقیم استفاده کرد، تحویل ابتدا به مسیریابی صف و سپس به تلاشی مجدد با پسنشینی نمایی کوتاه برای اعلام بازمیگردد و پس از آن در نهایت منصرف میشود.
- تحویل، مسیر حلشدهٔ درخواستکننده را حفظ میکند: مسیرهای تکمیل مقید به رشته یا مقید به گفتوگو، در صورت وجود، اولویت دارند. اگر مبدأ تکمیل فقط یک کانال ارائه دهد، OpenClaw مقصد/حسابِ مفقود را از مسیر حلشدهٔ نشست درخواستکننده (
lastChannel/lastTo/lastAccountId) تکمیل میکند تا تحویل مستقیم همچنان کار کند.
فرادادهٔ واگذاری تکمیل
واگذاری تکمیل به نشست درخواستکننده، زمینهٔ داخلی تولیدشده در زمان اجرا است (نه متن تألیفشده توسط کاربر) و شامل موارد زیر میشود:
Result— آخرین متن پاسخ قابلمشاهدهٔassistantاز فرزند. خروجی tool/toolResult به نتایج فرزند ارتقا داده نمیشود. اجراهای ناموفق نهایی، متن پاسخ ثبتشده را دوباره استفاده نمیکنند.Status—completed; ready for parent review/failed/timed out/unknown.- آمار فشردهٔ زمان اجرا/توکن.
- دستور بازبینی که از عامل درخواستکننده میخواهد پیش از تصمیمگیری دربارهٔ پایانیافتن وظیفهٔ اصلی، نتیجه را تأیید کند.
- راهنمای پیگیری که وقتی نتیجهٔ فرزند اقدام بیشتری باقی میگذارد، از عامل درخواستکننده میخواهد وظیفه را ادامه دهد یا یک پیگیری ثبت کند.
- دستور بهروزرسانی نهایی برای مسیرِ بدون اقدام بیشتر، نوشتهشده با لحن عادی دستیار و بدون انتقال فرادادهٔ خام داخلی.
حالتها و زمان اجرای ACP
--modelو--thinkingپیشفرضها را برای همان اجرای مشخص بازنویسی میکنند.- برای بررسی جزئیات و خروجی پس از تکمیل از
info/logاستفاده کنید. - برای نشستهای پایدارِ مقید به رشته، از
sessions_spawnهمراه باthread: trueوmode: "session"استفاده کنید. - اگر کانال درخواستکننده از مقیدسازی رشته پشتیبانی نمیکند، بهجای تلاش دوباره برای ترکیبی ناممکن و مقید به رشته، از
mode: "run"استفاده کنید. - برای نشستهای مهار ACP (Claude Code، Gemini CLI، OpenCode یا Codex ACP/acpx صریح)، هنگامی که ابزار آن زمان اجرا را اعلام میکند، از
sessions_spawnهمراه باruntime: "acp"استفاده کنید. هنگام اشکالزدایی تکمیلها یا حلقههای عاملبهعامل، مدل تحویل ACP را ببینید. وقتی Plugincodexفعال است، کنترل گفتوگو/رشتهٔ Codex باید/codex ...را به ACP ترجیح دهد، مگر اینکه کاربر صریحاً ACP/acpx را درخواست کند. - OpenClaw گزینهٔ
runtime: "acp"را تا زمانی که ACP فعال نشده، درخواستکننده در سندباکس نباشد و یک Plugin پشتیبان مانندacpxبارگیری نشده باشد، پنهان میکند.runtime: "acp"انتظار یک شناسهٔ مهار ACP خارجی یا یک ورودیagents.list[]دارایruntime.type="acp"را دارد؛ برای عاملهای پیکربندی عادی OpenClaw ازagents_list، از زمان اجرای پیشفرض زیرعامل استفاده کنید.
حالتهای زمینه
زیرعاملهای بومی بهصورت جداشده آغاز میشوند، مگر اینکه فراخواننده صریحاً درخواست انشعاب رونوشت فعلی را بدهد.
| حالت | زمان استفاده | رفتار |
|---|---|---|
isolated |
پژوهش تازه، پیادهسازی مستقل، کار کُند ابزارها یا هر کاری که بتوان آن را در متن وظیفه توضیح داد | یک رونوشت فرزند پاک ایجاد میکند. این حالت پیشفرض است و مصرف توکن را پایینتر نگه میدارد. |
fork |
کاری که به گفتوگوی فعلی، نتایج پیشین ابزارها یا دستورهای ظریف موجود در رونوشت درخواستکننده وابسته است | پیش از آغاز فرزند، رونوشت درخواستکننده را به نشست فرزند منشعب میکند. |
از fork بهندرت استفاده کنید. این گزینه برای واگذاری حساس به زمینه است، نه
جایگزینی برای نوشتن یک دستور وظیفهٔ روشن.
ابزار: sessions_spawn
یک اجرای زیرعامل را با deliver: false در مسیر سراسری subagent آغاز میکند،
سپس یک مرحلهٔ اعلام را اجرا و پاسخ اعلام را در کانال گفتوگوی درخواستکننده
ارسال میکند.
دردسترسبودن آن به سیاست مؤثر ابزارهای فراخواننده بستگی دارد. نمایهٔ داخلی
coding شامل sessions_spawn است؛ messaging و minimal شامل آن
نیستند. full همهٔ ابزارها را مجاز میکند. برای عاملهایی با نمایهٔ محدودتر
که همچنان باید بتوانند کار را واگذار کنند، tools.alsoAllow: ["sessions_spawn", "sessions_yield", "subagents"] را اضافه کنید یا از tools.profile: "coding" استفاده کنید.
سیاستهای اجازه/منع کانال/گروه، ارائهدهنده، سندباکس و ویژهٔ هر عامل
همچنان میتوانند ابزار را پس از مرحلهٔ نمایه حذف کنند. برای تأیید فهرست مؤثر ابزارها، از همان
نشست از /tools استفاده کنید.
پیشفرضها:
- مدل: زیرعاملهای بومی مدل فراخواننده را به ارث میبرند، مگر اینکه
agents.defaults.subagents.model(یاagents.list[].subagents.modelویژهٔ هر عامل) را تنظیم کنید. ایجادهای زمان اجرای ACP نیز در صورت وجود از همان مدل زیرعامل پیکربندیشده استفاده میکنند؛ در غیر این صورت، مهار ACP پیشفرض خود را حفظ میکند.sessions_spawn.modelصریح همچنان اولویت دارد. - تفکر: زیرعاملهای بومی تنظیم تفکر فراخواننده را به ارث میبرند، مگر اینکه
agents.defaults.subagents.thinking(یاagents.list[].subagents.thinkingویژهٔ هر عامل) را تنظیم کنید. ایجادهای زمان اجرای ACP نیزagents.defaults.models["provider/model"].params.thinkingرا برای مدل انتخابشده اعمال میکنند.sessions_spawn.thinkingصریح همچنان اولویت دارد. - مهلت اجرای: OpenClaw در صورت تنظیمبودن از
agents.defaults.subagents.runTimeoutSecondsاستفاده میکند؛ در غیر این صورت به0(بدون مهلت) بازمیگردد.sessions_spawnبازنویسی مهلت برای هر فراخوانی را نمیپذیرد. - تحویل وظیفه: زیرعاملهای بومی وظیفهٔ واگذارشده را در نخستین پیام قابلمشاهدهٔ
[Subagent Task]دریافت میکنند. اعلان سامانهٔ زیرعامل شامل قواعد زمان اجرا و زمینهٔ مسیریابی است، نه یک نسخهٔ تکراری و پنهان از وظیفه.
ایجادهای پذیرفتهشدهٔ زیرعامل بومی، فرادادهٔ مدل فرزندِ حلشده را
در نتیجهٔ ابزار شامل میشوند: resolvedModel شامل ارجاع مدل اعمالشده است و
resolvedProvider در صورت داشتن پیشوند، شامل پیشوند ارائهدهنده است.
حالت اعلان واگذاری
agents.defaults.subagents.delegationMode فقط راهنمای اعلان را کنترل میکند؛ سیاست ابزار را تغییر نمیدهد و واگذاری را تحمیل نمیکند.
suggest(پیشفرض): تلنگر استاندارد اعلان برای استفاده از زیرعاملها در کارهای بزرگتر یا کُندتر را حفظ میکند.prefer: به عامل اصلی میگوید پاسخگو بماند و هر کاری پیچیدهتر از یک پاسخ مستقیم را از طریقsessions_spawnواگذار کند.
بازنویسی ویژهٔ هر عامل: agents.list[].subagents.delegationMode.
{ agents: { defaults: { subagents: { delegationMode: "prefer", maxConcurrent: 4, }, }, list: [ { id: "coordinator", subagents: { delegationMode: "prefer" }, }, ], },}پارامترهای ابزار
taskstringrequiredشرح وظیفه برای زیرعامل.
taskNamestringشناسهٔ پایدار اختیاری برای شناسایی یک فرزند مشخص در خروجی وضعیت بعدی. باید با [a-z][a-z0-9_-]{0,63} مطابقت داشته باشد و نمیتواند هدف رزروشدهای مانند last یا all باشد.
labelstringبرچسب اختیاری و خوانا برای انسان.
agentIdstringدر صورت مجاز بودن توسط subagents.allowAgents، زیر شناسهٔ عامل پیکربندیشدهٔ دیگری ایجاد شود.
cwdstringپوشهٔ کاری اختیاری وظیفه برای اجرای فرزند. زیرعاملهای بومی همچنان فایلهای راهاندازی را از فضای کاری عامل هدف بارگذاری میکنند؛ cwd فقط محل انجام کار واگذارشده توسط ابزارهای زمان اجرا و چارچوبهای CLI را تغییر میدهد.
runtime"subagent" | "acp"default: subagentacp فقط برای چارچوبهای خارجی ACP (claude، droid، gemini، opencode یا Codex ACP/acpx که صراحتاً درخواست شده باشد) و برای ورودیهای agents.list[] است که runtime.type آنها acp است.
resumeSessionIdstringفقط ACP. وقتی runtime: "acp"، نشست موجود چارچوب ACP را از سر میگیرد؛ برای ایجاد زیرعامل بومی نادیده گرفته میشود.
streamTo"parent"فقط ACP. وقتی runtime: "acp"، خروجی اجرای ACP را به نشست والد جریان میدهد؛ برای ایجاد زیرعامل بومی حذف شود.
modelstringمدل زیرعامل را بازنویسی میکند. مقادیر نامعتبر نادیده گرفته میشوند و زیرعامل با مدل پیشفرض اجرا میشود؛ همراه با هشداری در نتیجهٔ ابزار.
thinkingstringسطح تفکر اجرای زیرعامل را بازنویسی میکند.
threadbooleandefault: falseوقتی true، برای این نشست زیرعامل اتصال به رشتهٔ کانال را درخواست میکند.
mode"run" | "session"default: runاگر thread: true باشد و mode حذف شده باشد، مقدار پیشفرض به session تبدیل میشود. mode: "session" به thread: true نیاز دارد.
اگر اتصال رشته برای کانال درخواستکننده در دسترس نیست، بهجای آن از mode: "run" استفاده کنید.
cleanup"delete" | "keep"default: keep"delete" نشست را بلافاصله پس از اعلام بایگانی میکند (رونوشت همچنان با تغییر نام نگه داشته میشود).
sandbox"inherit" | "require"default: inheritrequire ایجاد را رد میکند، مگر اینکه زمان اجرای فرزند هدف در محیط ایزوله باشد.
context"isolated" | "fork"default: isolatedfork رونوشت فعلی درخواستکننده را به نشست فرزند شاخهبندی میکند. فقط برای زیرعاملهای بومی. مقدار پیشفرض ایجادهای متصل به رشته fork و مقدار پیشفرض ایجادهای بدون رشته isolated است.
نامگذاری و هدفگیری وظایف
taskName یک شناسهٔ قابلاستفاده برای مدل جهت هماهنگسازی است، نه کلید نشست.
وقتی ممکن است هماهنگکننده بعداً نیاز داشته باشد آن فرزند را بررسی کند، از آن برای نامهای پایدار فرزند مانند review_subagents،
linux_validation یا docs_update استفاده کنید.
تفکیک هدف، تطابقهای دقیق taskName و پیشوندهای
بدون ابهام را میپذیرد. تطابق به همان پنجرهٔ هدف فعال/اخیر محدود میشود
که هدفهای شمارهدار /subagents از آن استفاده میکنند؛ بنابراین یک فرزند تکمیلشدهٔ قدیمی،
شناسهٔ استفادهشدهٔ مجدد را مبهم نمیکند. اگر دو فرزند فعال یا اخیر
taskName یکسانی داشته باشند، هدف مبهم است؛ بهجای آن از نمایهٔ فهرست، کلید نشست یا
شناسهٔ اجرا استفاده کنید.
هدفهای رزروشدهٔ last و all مقادیر معتبر taskName نیستند،
زیرا از قبل معانی کنترلی دارند.
ابزار: sessions_yield
نوبت فعلی مدل را پایان میدهد و منتظر میماند رویدادهای زمان اجرا، عمدتاً رویدادهای تکمیل زیرعامل، بهعنوان پیام بعدی برسند. پس از ایجاد کار فرزند موردنیاز، زمانی از آن استفاده کنید که درخواستکننده تا رسیدن نتایج تکمیل نتواند پاسخ نهایی تولید کند.
sessions_yield سازوکار انتظار است. آن را با حلقههای نظرسنجی
روی subagents، sessions_list، sessions_history، پوستهٔ
sleep یا نظرسنجی فرایند صرفاً برای تشخیص تکمیل فرزند جایگزین نکنید.
فقط زمانی از sessions_yield استفاده کنید که فهرست مؤثر ابزارهای نشست
شامل آن باشد. برخی نمایههای ابزار حداقلی یا سفارشی ممکن است sessions_spawn و
subagents را بدون sessions_yield ارائه کنند؛ در این حالت، صرفاً
برای انتظار تکمیل یک حلقهٔ نظرسنجی ابداع نکنید.
وقتی فرزندان فعال وجود دارند، OpenClaw یک بلوک اعلان فشرده و تولیدشده در زمان اجرا با نام
Active Subagents را در نوبتهای عادی تزریق میکند تا درخواستکننده بتواند
نشستهای فعلی فرزند، شناسههای اجرا، وضعیتها، برچسبها، وظایف و
نامهای مستعار taskName را بدون نظرسنجی ببیند. فیلدهای وظیفه و برچسب در آن
بلوک بهعنوان داده نقلقول میشوند، نه دستورالعمل، زیرا میتوانند
از آرگومانهای ایجاد ارائهشده توسط کاربر/مدل سرچشمه بگیرند.
ابزار: subagents
اجراهای زیرعامل ایجادشده و متعلق به نشست درخواستکننده را فهرست میکند. دامنهٔ آن به درخواستکنندهٔ فعلی محدود است؛ یک فرزند فقط میتواند فرزندان تحت کنترل خودش را ببیند.
برای وضعیت درخواستی و اشکالزدایی از subagents استفاده کنید. برای
انتظار رویدادهای تکمیل از sessions_yield استفاده کنید.
نشستهای متصل به رشته
وقتی اتصال رشته برای یک کانال فعال باشد، یک زیرعامل میتواند متصل به رشته باقی بماند تا پیامهای بعدی کاربر در آن رشته همچنان به همان نشست زیرعامل هدایت شوند.
کانالهای پشتیبان رشته
یک کانال زمانی از نشستهای پایدار زیرعامل متصل به رشته
(sessions_spawn با thread: true) پشتیبانی میکند که یک آداپتور اتصال مکالمه
ثبت کند. کانالهای همراه دارای این پشتیبانی: Discord،
iMessage، Matrix و Telegram. Discord و Matrix بهطور پیشفرض
یک رشتهٔ فرزند ایجاد میکنند؛ Telegram و iMessage بهطور پیشفرض به
مکالمهٔ فعلی متصل میشوند. برای فعالسازی، مهلتها و spawnSessions از کلیدهای پیکربندی threadBindings
مخصوص هر کانال استفاده کنید.
جریان سریع
ایجاد
sessions_spawn با thread: true (و در صورت تمایل mode: "session").
اتصال
OpenClaw در کانال فعال، رشتهای را برای آن هدف نشست ایجاد میکند یا به آن متصل میشود.
هدایت پیامهای بعدی
پاسخها و پیامهای بعدی در آن رشته به نشست متصل هدایت میشوند.
بررسی مهلتها
برای بررسی/بهروزرسانی لغو تمرکز خودکار هنگام عدم فعالیت از /session idle و
برای کنترل سقف سخت از /session max-age استفاده کنید.
جداسازی
برای جداسازی دستی از /unfocus استفاده کنید.
کنترلهای دستی
| فرمان | اثر |
|---|---|
/focus <target> |
رشتهٔ فعلی را به یک هدف زیرعامل/نشست متصل میکند (یا رشتهای ایجاد میکند) |
/unfocus |
اتصال رشتهٔ متصل فعلی را حذف میکند |
/agents |
اجراهای فعال و وضعیت اتصال را فهرست میکند (binding:<id>، unbound یا bindings unavailable) |
/session idle |
لغو تمرکز خودکار هنگام بیکاری را بررسی/بهروزرسانی میکند (فقط رشتههای متصلِ متمرکز) |
/session max-age |
سقف سخت را بررسی/بهروزرسانی میکند (فقط رشتههای متصلِ متمرکز) |
کلیدهای پیکربندی
- پیشفرض سراسری:
session.threadBindings.enabled،session.threadBindings.idleHours،session.threadBindings.maxAgeHours. - کلیدهای بازنویسی کانال و اتصال خودکار هنگام ایجاد مختص آداپتور هستند. بخش کانالهای پشتیبان رشته را در بالا ببینید.
برای جزئیات فعلی آداپتور، مرجع پیکربندی و فرمانهای اسلش را ببینید.
فهرست مجاز
agents.list[].subagents.allowAgentsstring[]فهرست شناسههای عامل پیکربندیشده که میتوان از طریق agentId صریح هدف قرار داد (["*"] هر هدف پیکربندیشدهای را مجاز میکند). پیشفرض: فقط عامل درخواستکننده. اگر فهرستی تنظیم میکنید و همچنان میخواهید درخواستکننده با agentId خودش را ایجاد کند، شناسهٔ درخواستکننده را در فهرست قرار دهید.
agents.defaults.subagents.allowAgentsstring[]فهرست مجاز پیشفرض عاملهای هدف پیکربندیشده که وقتی عامل درخواستکننده subagents.allowAgents خودش را تنظیم نکرده باشد استفاده میشود.
agents.defaults.subagents.requireAgentIdbooleandefault: falseفراخوانیهای sessions_spawn را که agentId را حذف میکنند مسدود میکند (انتخاب صریح نمایه را اجباری میکند). بازنویسی برای هر عامل: agents.list[].subagents.requireAgentId.
agents.defaults.subagents.announceTimeoutMsnumberdefault: 120000مهلت هر فراخوانی برای تلاشهای تحویل اعلام agent در Gateway. مقادیر بر حسب میلیثانیه، اعداد صحیح مثبت هستند و به حداکثر ایمن زمانسنج پلتفرم محدود میشوند. تلاشهای مجدد گذرا میتوانند زمان انتظار کلی اعلام را از یک مهلت پیکربندیشده طولانیتر کنند.
اگر نشست درخواستکننده در محیط ایزوله باشد، sessions_spawn هدفهایی را
که بدون محیط ایزوله اجرا میشوند رد میکند.
کشف
برای مشاهدهٔ شناسههای عاملی که در حال حاضر برای sessions_spawn مجاز هستند
از agents_list استفاده کنید. پاسخ شامل مدل مؤثر هر عامل فهرستشده
و فرادادهٔ تعبیهشدهٔ زمان اجرا است تا فراخوانها بتوانند OpenClaw، سرور برنامهٔ Codex
و دیگر زمانهای اجرای بومی پیکربندیشده را از یکدیگر تشخیص دهند.
ورودیهای allowAgents باید به شناسههای عامل پیکربندیشده در agents.list[] اشاره کنند.
["*"] یعنی هر عامل هدف پیکربندیشده بهعلاوهٔ درخواستکننده. اگر پیکربندی عاملی
حذف شود اما شناسهٔ آن در allowAgents باقی بماند، sessions_spawn آن شناسه را رد میکند
و agents_list آن را حذف میکند. برای پاکسازی ورودیهای قدیمی
فهرست مجاز، openclaw doctor --fix را اجرا کنید؛ یا زمانی که هدف باید
در حالی که پیشفرضها را به ارث میبرد قابل ایجاد باقی بماند، یک ورودی حداقلی agents.list[] اضافه کنید.
بایگانی خودکار
- نشستهای زیرعامل پس از
agents.defaults.subagents.archiveAfterMinutes(پیشفرض60) بهطور خودکار بایگانی میشوند. - بایگانی از
sessions.deleteاستفاده میکند و نام رونوشت را به*.deleted.<timestamp>تغییر میدهد (در همان پوشه). cleanup: "delete"بلافاصله پس از اعلام بایگانی میکند (رونوشت همچنان با تغییر نام نگه داشته میشود).- بایگانی خودکار بر مبنای بهترین تلاش است؛ اگر Gateway راهاندازی مجدد شود، زمانسنجهای در انتظار از دست میروند.
- مهلتهای اجرای پیکربندیشده بهطور خودکار بایگانی نمیکنند؛ آنها فقط اجرا را متوقف میکنند. نشست تا زمان بایگانی خودکار باقی میماند.
- بایگانی خودکار بهطور یکسان برای نشستهای عمق 1 و عمق 2 اعمال میشود.
- پاکسازی مرورگر از پاکسازی بایگانی جدا است: هنگام پایان اجرا، برگهها/فرایندهای مرورگر ردیابیشده بر مبنای بهترین تلاش بسته میشوند، حتی اگر رونوشت/رکورد نشست نگه داشته شود.
زیرعاملهای تودرتو
بهطور پیشفرض، زیرعاملها نمیتوانند زیرعاملهای خودشان را ایجاد کنند
(maxSpawnDepth: 1). برای فعالسازی یک سطح
تودرتوسازی — الگوی هماهنگکننده: اصلی ← زیرعامل هماهنگکننده ←
زیرزیرعاملهای کارگر — مقدار maxSpawnDepth: 2 را تنظیم کنید.
{ agents: { defaults: { subagents: { maxSpawnDepth: 2, // اجازه به زیرعاملها برای ایجاد فرزند (پیشفرض: 1، بازهٔ 1-5) maxChildrenPerAgent: 5, // حداکثر فرزندان فعال در هر نشست عامل (پیشفرض: 5، بازهٔ 1-20) maxConcurrent: 8, // سقف مسیر همزمانی سراسری (پیشفرض: 8) runTimeoutSeconds: 900, // مهلت پیشفرض برای sessions_spawn (0 = بدون مهلت) announceTimeoutMs: 120000, // مهلت اعلام Gateway برای هر فراخوانی }, }, },}سطوح عمق
| عمق | شکل کلید نشست | نقش | امکان ایجاد فرزند؟ |
|---|---|---|---|
| 0 | agent:<id>:main |
عامل اصلی | همیشه |
| 1 | agent:<id>:subagent:<uuid> |
زیرعامل (هماهنگکننده وقتی عمق 2 مجاز است) | فقط اگر maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> |
زیرزیرعامل (کارگر برگ) | هرگز |
زنجیره اعلام
نتایج در طول زنجیره به بالا بازمیگردند:
- کارگر عمق 2 کارش را تمام میکند ← به والد خود (هماهنگکننده عمق 1) اعلام میکند.
- هماهنگکننده عمق 1 اعلام را دریافت میکند، نتایج را ترکیب میکند و کارش را تمام میکند ← به عامل اصلی اعلام میکند.
- عامل اصلی اعلام را دریافت میکند و نتیجه را به کاربر تحویل میدهد.
هر سطح فقط اعلامهای فرزندان مستقیم خود را میبیند.
سیاست ابزار بر اساس عمق
- نقش و دامنه کنترل هنگام ایجاد، در فراداده نشست نوشته میشوند. این کار مانع میشود کلیدهای نشست تخت یا بازیابیشده بهطور تصادفی دوباره امتیازهای هماهنگکننده را به دست آورند.
- عمق 1 (هماهنگکننده، وقتی
maxSpawnDepth >= 2): بهsessions_spawn،subagents،sessions_listوsessions_historyدسترسی مییابد تا بتواند فرزند ایجاد کند و وضعیت آنها را بررسی کند. سایر ابزارهای نشست/سیستم همچنان ممنوع میمانند. - عمق 1 (برگ، وقتی
maxSpawnDepth == 1): بدون ابزار نشست (رفتار پیشفرض فعلی). - عمق 2 (کارگر برگ): بدون ابزار نشست —
sessions_spawnدر عمق 2 همیشه ممنوع است. نمیتواند فرزند دیگری ایجاد کند.
محدودیت ایجاد فرزند برای هر عامل
هر نشست عامل (در هر عمقی) میتواند در هر لحظه حداکثر maxChildrenPerAgent
(پیشفرض 5) فرزند فعال داشته باشد. این محدودیت از گسترش مهارنشدنی
از سوی یک هماهنگکننده جلوگیری میکند.
توقف آبشاری
توقف یک هماهنگکننده عمق 1، همه فرزندان عمق 2 آن را نیز بهطور خودکار متوقف میکند:
/stopدر گفتوگوی اصلی همه عاملهای عمق 1 را متوقف میکند و این توقف به فرزندان عمق 2 آنها نیز سرایت میکند.
احراز هویت
احراز هویت زیرعامل بر اساس شناسه عامل حل میشود، نه نوع نشست:
- کلید نشست زیرعامل
agent:<agentId>:subagent:<uuid>است. - ذخیرهگاه احراز هویت از
agentDirهمان عامل بارگذاری میشود. - پروفایلهای احراز هویت عامل اصلی بهعنوان راهکار جایگزین ادغام میشوند؛ در صورت تعارض، پروفایلهای عامل بر پروفایلهای اصلی اولویت دارند.
ادغام افزایشی است، بنابراین پروفایلهای اصلی همیشه بهعنوان راهکار جایگزین در دسترساند. احراز هویت کاملاً ایزوله برای هر عامل هنوز پشتیبانی نمیشود.
اعلام
زیرعاملها از طریق یک مرحله اعلام گزارش میدهند:
- مرحله اعلام درون نشست زیرعامل اجرا میشود (نه نشست درخواستکننده).
- اگر زیرعامل دقیقاً
ANNOUNCE_SKIPرا پاسخ دهد، چیزی ارسال نمیشود. - اگر آخرین متن دستیار دقیقاً توکن سکوت
NO_REPLY/no_replyباشد، خروجی اعلام سرکوب میشود، حتی اگر پیشتر پیشرفت قابلمشاهدهای وجود داشته باشد.
تحویل به عمق درخواستکننده بستگی دارد:
- نشستهای درخواستکننده سطح بالا از یک فراخوانی پیگیری
agentبا تحویل خارجی (deliver=true) استفاده میکنند. - نشستهای زیرعامل درخواستکننده تودرتو یک تزریق پیگیری داخلی (
deliver=false) دریافت میکنند تا هماهنگکننده بتواند نتایج فرزندان را درون نشست ترکیب کند. - اگر نشست زیرعامل درخواستکننده تودرتو دیگر وجود نداشته باشد، OpenClaw در صورت دسترسی به درخواستکننده آن نشست بازمیگردد.
برای نشستهای درخواستکننده سطح بالا، تحویل مستقیم در حالت تکمیل ابتدا هر مسیر گفتوگو/رشته مقید و بازنویسی قلاب را حل میکند، سپس فیلدهای کانال-مقصدِ مفقود را از مسیر ذخیرهشده نشست درخواستکننده پر میکند. این کار تکمیلها را در گفتوگو/موضوع درست نگه میدارد، حتی وقتی مبدأ تکمیل فقط کانال را مشخص میکند.
هنگام ساخت یافتههای تکمیل تودرتو، تجمیع تکمیل فرزندان به اجرای فعلی درخواستکننده محدود میشود تا خروجیهای فرزندان از اجراهای قبلی و منقضیشده به اعلام فعلی نشت نکنند. پاسخهای اعلام، مسیریابی رشته/موضوع را در صورت وجود روی سازگارکنندههای کانال حفظ میکنند.
زمینه اعلام
زمینه اعلام به یک بلوک رویداد داخلی پایدار نرمالسازی میشود:
| فیلد | منبع |
|---|---|
| منبع | subagent یا cron |
| شناسههای نشست | کلید/شناسه نشست فرزند |
| نوع | نوع اعلام + برچسب وظیفه |
| وضعیت | مشتقشده از نتیجه زمان اجرا (ok، error، timeout یا unknown) — نه استنباطشده از متن مدل |
| محتوای نتیجه | آخرین متن قابلمشاهده دستیار از فرزند |
| پیگیری | دستورالعملی که زمان پاسخدادن در برابر ساکتماندن را توضیح میدهد |
اجراهای پایانی ناموفق، وضعیت شکست را بدون بازپخش متن پاسخ ضبطشده گزارش میکنند. خروجی ابزار/toolResult به متن نتیجه فرزند ارتقا نمییابد.
خط آمار
محمولههای اعلام در انتها یک خط آمار دارند (حتی در صورت شکستهشدن خط):
- زمان اجرا (برای مثال
runtime 5m12s). - مصرف توکن (ورودی/خروجی/کل).
- هزینه تخمینی وقتی قیمتگذاری مدل پیکربندی شده باشد (
models.providers.*.models[].cost). sessionKey،sessionIdو مسیر رونوشت تا عامل اصلی بتواند تاریخچه را از طریقsessions_historyواکشی کند یا فایل روی دیسک را بررسی کند.
فراداده داخلی فقط برای هماهنگسازی در نظر گرفته شده است؛ پاسخهای روبهکاربر باید با لحن عادی دستیار بازنویسی شوند.
چرا sessions_history ترجیح داده میشود
sessions_history مسیر هماهنگسازی امنتری برای خواندن رونوشت یک فرزند
از درون نوبت عامل است:
- متنهای شبیه اعتبارنامه/توکن را حتی وقتی پوشاندن عمومی گزارشها غیرفعال است، حذف حساسیت میکند.
- بلوکهای متنی طولانی را کوتاه میکند (4000 نویسه برای هر بلوک) و امضاهای تفکر، محمولههای بازپخش استدلال و دادههای تصویر درونخطی را حذف میکند.
- سقف پاسخ 80 KB را اعمال میکند؛ ردیفهای بیشازحد بزرگ با
[sessions_history omitted: message too large]جایگزین میشوند. - در صورت وجود، از
nextOffsetبرای صفحهبندی رو به عقب در پنجرههای قدیمیتر رونوشت استفاده کنید. sessions_historyبرچسبهای استدلال، داربست<relevant-memories>یا XML فراخوانی ابزار را از متن پیام حذف نمیکند — این ابزار بلوکهای محتوای ساختیافته نزدیک به شکل خام رونوشت را بازمیگرداند که فقط حذف حساسیت شده و از نظر اندازه محدود شدهاند./subagents logپاکسازی سنگینتر نثر را اعمال میکند (برچسبهای استدلال، داربست حافظه و XML فراخوانی ابزار را حذف میکند)، زیرا بهجای بلوکهای ساختیافته، خطوط ساده گفتوگو را رندر میکند.- وقتی به رونوشت کامل و بایتبهبایت نیاز دارید، بررسی رونوشت خام روی دیسک راهکار جایگزین است.
سیاست ابزار
زیرعاملها ابتدا از همان خط لوله پروفایل و سیاست ابزار عامل والد یا عامل مقصد استفاده میکنند. پس از آن، OpenClaw لایه محدودیت زیرعامل را اعمال میکند.
زیرعاملها صرفنظر از عمق یا نقش، همیشه دسترسی به gateway، agents_list، session_status و
cron را از دست میدهند (ابزارهای سطح سیستم/تعاملی یا
ابزارهایی که عامل اصلی باید هماهنگ کند). زیرعاملهای برگ (رفتار پیشفرض عمق 1
و همیشه در عمق 2) افزون بر این، دسترسی به subagents،
sessions_list، sessions_history و sessions_spawn را از دست میدهند. زیرعاملها هرگز
ابزار message را دریافت نمیکنند — این ابزار هنگام ایجاد غیرفعال میشود و با
این فهرست منع فیلتر نمیشود — و sessions_send همچنان ممنوع میماند تا زیرعاملها
فقط از طریق زنجیره اعلام ارتباط برقرار کنند.
sessions_history در اینجا نیز یک نمای یادآوری محدود و پاکسازیشده باقی میماند —
نه یک تخلیه خام رونوشت.
وقتی maxSpawnDepth >= 2، زیرعاملهای هماهنگکننده عمق 1 افزون بر این
sessions_spawn، subagents، sessions_list و
sessions_history را دریافت میکنند تا بتوانند فرزندان خود را مدیریت کنند.
بازنویسی از طریق پیکربندی
{ agents: { defaults: { subagents: { maxConcurrent: 1, }, }, }, tools: { subagents: { tools: { // منع اولویت دارد deny: ["gateway", "cron"], // اگر allow تنظیم شود، فقط موارد مجاز را میپذیرد (منع همچنان اولویت دارد) // allow: ["read", "exec", "process"] }, }, },}tools.subagents.tools.allow یک فیلتر نهاییِ فقطمجاز است. این فیلتر میتواند
مجموعه ابزار ازپیشحلشده را محدودتر کند، اما نمیتواند ابزاری را که
tools.profile حذف کرده است بازگرداند. برای مثال، tools.profile: "coding" شامل
web_search/web_fetch است، اما ابزار browser را شامل نمیشود. برای اینکه
زیرعاملهای پروفایل کدنویسی بتوانند از خودکارسازی مرورگر استفاده کنند، مرورگر را در
مرحله پروفایل اضافه کنید:
{ tools: { profile: "coding", alsoAllow: ["browser"], },}وقتی فقط یک عامل باید به خودکارسازی مرورگر دسترسی داشته باشد، از agents.list[].tools.alsoAllow: ["browser"] مختص هر عامل استفاده کنید.
همزمانی
زیرعاملها از یک مسیر صف اختصاصی درونفرایندی استفاده میکنند:
- نام مسیر:
subagent - همزمانی:
agents.defaults.subagents.maxConcurrent(پیشفرض8)
زندهبودن و بازیابی
OpenClaw نبود endedAt را مدرک دائمی زندهبودن یک
زیرعامل تلقی نمیکند. اجراهای پایاننیافتهای که از پنجره اجرای منقضیشده
قدیمیترند (2 ساعت، یا مهلت اجرای پیکربندیشده بهاضافه یک دوره مهلت کوتاه،
هرکدام طولانیتر باشد) دیگر در /subagents list،
خلاصههای وضعیت، دروازه تکمیل نوادگان و بررسیهای همزمانی هر نشست،
فعال/در انتظار شمرده نمیشوند.
پس از راهاندازی مجدد Gateway، اجراهای بازیابیشده پایاننیافته و منقضیشده حذف میشوند، مگر اینکه
نشست فرزند آنها با abortedLastRun: true علامتگذاری شده باشد. اجراهایی که بر اثر راهاندازی مجدد
متوقف شدهاند برای جریان بازیابی زیرعامل یتیم ثبتشده باقی میمانند: اجراهای منقضیشده
بدون ازسرگیری نهایی میشوند، درحالیکه نشستهای فرزند تازه پیش از پاکشدن نشانگر توقف،
یک پیام ازسرگیری مصنوعی دریافت میکنند.
بازیابی خودکار پس از راهاندازی مجدد برای هر نشست فرزند محدود است. اگر همان
فرزند زیرعامل درون پنجره گیرکردن مجدد سریع، بارها برای بازیابی یتیم پذیرفته شود،
OpenClaw یک سنگقبر بازیابی روی آن نشست ذخیره میکند و در راهاندازیهای مجدد بعدی،
ازسرگیری خودکار آن را متوقف میکند. برای تطبیق رکورد وظیفه،
openclaw tasks maintenance --apply را اجرا کنید، یا برای پاککردن پرچمهای بازیابی متوقفشده منقضیشده در
نشستهای دارای سنگقبر، openclaw doctor --fix را اجرا کنید.
متوقفکردن
- ارسال
/stopدر گفتوگوی درخواستکننده، نشست درخواستکننده را لغو میکند و هر اجرای فعال زیرعامل را که از آن راهاندازی شده است متوقف میکند؛ این توقف به فرزندان تودرتو نیز سرایت میکند.
محدودیتها
- اعلان زیرعامل بر پایه حداکثر تلاش است. اگر Gateway دوباره راهاندازی شود، کارهای در انتظار «اعلان بازگشت» از دست میروند.
- زیرعاملها همچنان منابع یکسان فرایند Gateway را به اشتراک میگذارند؛
maxConcurrentرا بهعنوان یک سازوکار ایمنی در نظر بگیرید. sessions_spawnهمیشه نامسدودکننده است: بلافاصله{ status: "accepted", runId, childSessionKey }را برمیگرداند.- بستر زیرعامل فقط
AGENTS.mdوTOOLS.mdرا تزریق میکند (بدونSOUL.md،IDENTITY.md،USER.md،MEMORY.md،HEARTBEAT.mdیاBOOTSTRAP.md). زیرعاملهای بومی Codex نیز از همین مرز پیروی میکنند:TOOLS.mdدر دستورالعملهای بهارثرسیده رشته Codex باقی میماند، درحالیکه پرسونای مختص والد، هویت و فایلهای کاربر بهصورت دستورالعملهای همکاری محدود به نوبت تزریق میشوند تا فرزندان آنها را شبیهسازی نکنند. - حداکثر عمق تودرتویی 5 است (بازه
maxSpawnDepth: 1-5). عمق 2 برای بیشتر موارد استفاده توصیه میشود. maxChildrenPerAgentتعداد فرزندان فعال در هر نشست را محدود میکند (مقدار پیشفرض5، بازه1-20).