Agent coordination
زیرعاملها
عاملهای فرعی، اجراهای عامل در پسزمینه هستند که از یک اجرای عامل موجود ایجاد میشوند.
آنها در نشست خودشان (agent:<agentId>:subagent:<uuid>) اجرا میشوند و،
پس از پایان، نتیجهشان را به کانال گفتوگوی درخواستکننده اعلام میکنند. هر اجرای عامل فرعی بهعنوان یک
وظیفه پسزمینه رهگیری میشود.
اهداف اصلی:
- موازیسازی کارهای «پژوهش / وظیفه طولانی / ابزار کند» بدون مسدود کردن اجرای اصلی.
- جدا نگه داشتن عاملهای فرعی بهصورت پیشفرض (جداسازی نشست + سندباکس اختیاری).
- سختکردن سوءاستفاده از سطح ابزار: عاملهای فرعی بهصورت پیشفرض ابزارهای نشست را دریافت نمیکنند.
- پشتیبانی از عمق تودرتوی قابل پیکربندی برای الگوهای هماهنگکننده.
فرمان اسلش
از /subagents برای بررسی اجراهای عامل فرعی در نشست فعلی استفاده کنید:
/subagents list/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents info فراداده اجرا را نشان میدهد (وضعیت، زمانمهرها، شناسه نشست،
مسیر رونوشت، پاکسازی). برای نمای یادآوری محدود و فیلترشده از نظر ایمنی از sessions_history استفاده کنید؛ وقتی به رونوشت کامل خام نیاز دارید، مسیر رونوشت روی دیسک را بررسی کنید.
کنترلهای اتصال رشته
این فرمانها روی کانالهایی کار میکنند که از اتصالهای رشته پایدار پشتیبانی میکنند. در ادامه کانالهای پشتیبان رشته را ببینید.
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>رفتار ایجاد
عاملها با sessions_spawn عاملهای فرعی پسزمینه را شروع میکنند. تکمیل عامل فرعی
بهصورت رویدادهای داخلی نشست والد برمیگردد؛ عامل والد/درخواستکننده تصمیم میگیرد
که آیا بهروزرسانی قابل مشاهده برای کاربر لازم است یا نه.
Non-blocking, push-based completion
sessions_spawnغیرمسدودکننده است؛ بلافاصله یک شناسه اجرا برمیگرداند.- هنگام تکمیل، عامل فرعی به نشست والد/درخواستکننده گزارش میدهد.
- نوبتهای عاملی که به نتایج فرزند نیاز دارند باید پس از ایجاد کارهای لازم،
sessions_yieldرا فراخوانی کنند. این کار نوبت فعلی را پایان میدهد و اجازه میدهد رویدادهای تکمیل بهعنوان پیام بعدی قابل مشاهده برای مدل برسند. - تکمیل بهصورت پوش انجام میشود. پس از ایجاد، صرفاً برای انتظار پایان آن،
/subagents list،sessions_listیاsessions_historyرا در حلقه نظرسنجی نکنید؛ وضعیت را فقط در صورت نیاز برای دید اشکالزدایی بررسی کنید. - خروجی فرزند، گزارش/شاهدی برای عامل درخواستکننده است تا آن را ترکیب کند. این متن دستورالعمل نوشتهشده توسط کاربر نیست و نمیتواند سیاست سیستم، توسعهدهنده یا کاربر را بازنویسی کند.
- هنگام تکمیل، OpenClaw در حد بهترین تلاش زبانهها/فرآیندهای مرورگر را که توسط آن نشست عامل فرعی باز شدهاند، پیش از ادامه جریان پاکسازی اعلان میبندد.
Completion delivery
- OpenClaw تکمیلها را از طریق یک نوبت
agentبا کلید idempotency پایدار به نشست درخواستکننده برمیگرداند. - اگر اجرای درخواستکننده هنوز فعال باشد، OpenClaw ابتدا تلاش میکند بهجای شروع یک مسیر پاسخ قابل مشاهده دوم، آن اجرا را بیدار/هدایت کند.
- اگر درخواستکننده فعال بیدار نشود، OpenClaw بهجای حذف اعلان، با همان زمینه تکمیل به تحویل به عامل درخواستکننده برمیگردد.
- تحویل موفق به والد، تحویل عامل فرعی را کامل میکند، حتی وقتی والد تصمیم بگیرد هیچ بهروزرسانی قابل مشاهدهای برای کاربر لازم نیست.
- عاملهای فرعی بومی ابزار پیام را دریافت نمیکنند. آنها متن ساده assistant را به عامل والد/درخواستکننده برمیگردانند؛ پاسخهای قابل مشاهده برای انسان در مالکیت سیاست تحویل عادی عامل والد/درخواستکننده است.
- اگر تحویل مستقیم قابل استفاده نباشد، به مسیریابی صف برمیگردد.
- اگر مسیریابی صف همچنان در دسترس نباشد، اعلان با backoff نمایی کوتاه دوباره تلاش میشود و سپس نهایی رها میشود.
- تحویل تکمیل، مسیر حلشده درخواستکننده را نگه میدارد: مسیرهای تکمیل وابسته به رشته یا وابسته به گفتوگو، در صورت دسترسبودن، برنده میشوند؛ اگر مبدأ تکمیل فقط یک کانال ارائه کند، OpenClaw هدف/حسابِ گمشده را از مسیر حلشده نشست درخواستکننده (
lastChannel/lastTo/lastAccountId) پر میکند تا تحویل مستقیم همچنان کار کند.
Completion handoff metadata
تحویل تکمیل به نشست درخواستکننده، زمینه داخلی تولیدشده در زمان اجراست (نه متن نوشتهشده توسط کاربر) و شامل این موارد است:
Result— آخرین متن پاسخ قابل مشاهدهassistantاز فرزند. خروجی Tool/toolResult به نتایج فرزند ارتقا داده نمیشود. اجراهای پایانی ناموفق از متن پاسخ ضبطشده دوباره استفاده نمیکنند.Status—completed; ready for parent review/failed/timed out/unknown.- آمار فشرده زمان اجرا/توکن.
- دستورالعمل بازبینی که به عامل درخواستکننده میگوید پیش از تصمیم درباره انجامشدن وظیفه اصلی، نتیجه را راستیآزمایی کند.
- راهنمایی پیگیری که به عامل درخواستکننده میگوید وقتی نتیجه فرزند کار بیشتری باقی میگذارد، وظیفه را ادامه دهد یا پیگیری ثبت کند.
- دستورالعمل بهروزرسانی نهایی برای مسیر بدون اقدام بیشتر، نوشتهشده با صدای عادی assistant بدون ارسال فراداده داخلی خام.
Modes and ACP runtime
--modelو--thinkingپیشفرضها را برای همان اجرای مشخص بازنویسی میکنند.- پس از تکمیل، از
info/logبرای بررسی جزئیات و خروجی استفاده کنید. - برای نشستهای پایدار وابسته به رشته، از
sessions_spawnباthread: trueوmode: "session"استفاده کنید. - اگر کانال درخواستکننده از اتصالهای رشته پشتیبانی نمیکند، بهجای تلاش دوباره برای ترکیبهای ناممکن وابسته به رشته، از
mode: "run"استفاده کنید. - برای نشستهای ACP harness (Claude Code، Gemini CLI، OpenCode، یا Codex ACP/acpx صریح)، وقتی ابزار آن زمان اجرا را اعلام میکند، از
sessions_spawnباruntime: "acp"استفاده کنید. هنگام اشکالزدایی تکمیلها یا حلقههای عاملبهعامل، مدل تحویل ACP را ببینید. وقتی Plugincodexفعال است، کنترل گفتوگو/رشته Codex باید/codex ...را بر ACP ترجیح دهد، مگر اینکه کاربر صریحاً ACP/acpx را درخواست کند. - OpenClaw تا زمانی که ACP فعال نشده، درخواستکننده سندباکس نشده، و یک Plugin پشتیبان مانند
acpxبارگذاری نشده باشد،runtime: "acp"را پنهان میکند.runtime: "acp"انتظار یک شناسه ACP harness خارجی، یا یک ورودیagents.list[]باruntime.type="acp"را دارد؛ برای عاملهای پیکربندی عادی OpenClaw ازagents_list، از زمان اجرای پیشفرض عامل فرعی استفاده کنید.
حالتهای زمینه
عاملهای فرعی بومی جدا شروع میشوند، مگر اینکه فراخواننده صریحاً درخواست کند رونوشت فعلی fork شود.
| حالت | زمان استفاده | رفتار |
|---|---|---|
isolated |
پژوهش تازه، پیادهسازی مستقل، کار ابزار کند، یا هر چیزی که بتوان در متن وظیفه خلاصهاش کرد | یک رونوشت فرزند تمیز میسازد. این پیشفرض است و مصرف توکن را پایینتر نگه میدارد. |
fork |
کاری که به گفتوگوی فعلی، نتایج ابزار قبلی، یا دستورالعملهای ظریف موجود در رونوشت درخواستکننده وابسته است | رونوشت درخواستکننده را پیش از شروع فرزند، به نشست فرزند منشعب میکند. |
از fork با احتیاط استفاده کنید. این برای واگذاری حساس به زمینه است، نه
جایگزینی برای نوشتن اعلان وظیفه روشن.
ابزار: sessions_spawn
یک اجرای عامل فرعی را با deliver: false روی مسیر جهانی subagent شروع میکند،
سپس یک مرحله اعلان اجرا میکند و پاسخ اعلان را به کانال گفتوگوی درخواستکننده
ارسال میکند.
در دسترس بودن به سیاست ابزار مؤثر فراخواننده بستگی دارد. پروفایلهای coding و
full بهصورت پیشفرض sessions_spawn را ارائه میکنند. پروفایل messaging
این کار را نمیکند؛ برای عاملهایی که باید کار را واگذار کنند، tools.alsoAllow: ["sessions_spawn", "sessions_yield", "subagents"] را اضافه کنید یا از tools.profile: "coding" استفاده کنید. سیاستهای مجاز/غیرمجاز کانال/گروه، ارائهدهنده، سندباکس و هر عامل همچنان میتوانند ابزار را پس از مرحله پروفایل حذف کنند. برای تأیید فهرست ابزار مؤثر، از همان نشست /tools را استفاده کنید.
پیشفرضها:
- مدل: عاملهای فرعی بومی از فراخواننده ارثبری میکنند، مگر اینکه
agents.defaults.subagents.model(یاagents.list[].subagents.modelبرای هر عامل) را تنظیم کنید. ایجادهای زمان اجرای ACP در صورت وجود از همان مدل پیکربندیشده عامل فرعی استفاده میکنند؛ وگرنه ACP harness پیشفرض خودش را نگه میدارد.sessions_spawn.modelصریح همچنان برنده است. - Thinking: عاملهای فرعی بومی از فراخواننده ارثبری میکنند، مگر اینکه
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 ایجاد را رد میکند مگر اینکه زمان اجرای فرزند هدف sandboxed باشد.
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، shell
sleep، یا نظرسنجی فرایند جایگزین نکنید.
فقط وقتی از sessions_yield استفاده کنید که فهرست ابزار مؤثر نشست شامل
آن باشد. برخی پروفایلهای ابزار حداقلی یا سفارشی ممکن است sessions_spawn و
subagents را بدون ارائه sessions_yield در معرض بگذارند؛ در آن صورت،
صرفا برای انتظار تکمیل، حلقه نظرسنجی ابداع نکنید.
وقتی فرزندان فعال وجود دارند، OpenClaw یک بلوک اعلان فشرده و تولیدشده توسط
زمان اجرا با نام Active Subagents را در نوبتهای عادی تزریق میکند تا
درخواستکننده بتواند نشستهای فرزند فعلی، شناسههای اجرا، وضعیتها، برچسبها،
وظیفهها، و نامهای مستعار taskName را بدون نظرسنجی ببیند. فیلدهای وظیفه و
برچسب در آن بلوک بهعنوان داده نقلقول میشوند، نه دستورالعمل، زیرا ممکن است
از آرگومانهای ایجاد ارائهشده توسط کاربر/مدل منشأ بگیرند.
ابزار: subagents
اجراهای زیرعامل ایجادشده و متعلق به نشست درخواستکننده را فهرست میکند. دامنه آن به درخواستکننده فعلی محدود است؛ یک فرزند فقط میتواند فرزندان تحت کنترل خودش را ببیند.
برای وضعیت درخواستی و اشکالزدایی از subagents استفاده کنید. برای انتظار
رویدادهای تکمیل از sessions_yield استفاده کنید.
نشستهای متصل به رشته
وقتی اتصالهای رشته برای یک کانال فعال باشند، یک زیرعامل میتواند به یک رشته متصل بماند تا پیامهای پیگیری کاربر در آن رشته همچنان به همان نشست زیرعامل مسیریابی شوند.
کانالهای پشتیبان رشته
هر کانالی که آداپتور اتصال نشست داشته باشد میتواند نشستهای پایدار زیرعامل
متصل به رشته را پشتیبانی کند (sessions_spawn با thread: true).
آداپتورهای همراه در حال حاضر شامل رشتههای Discord، رشتههای Matrix،
موضوعات انجمن Telegram، و اتصالهای مکالمه فعلی برای Feishu هستند.
برای فعالسازی، زمانسنجیها، و spawnSessions از کلیدهای پیکربندی
threadBindings ویژه هر کانال استفاده کنید.
جریان سریع
ایجاد
sessions_spawn با thread: true (و بهصورت اختیاری mode: "session").
اتصال
OpenClaw در کانال فعال، یک رشته به هدف آن نشست ایجاد یا متصل میکند.
مسیریابی پیگیریها
پاسخها و پیامهای پیگیری در آن رشته به نشست متصلشده مسیریابی میشوند.
بررسی زمانسنجیها
برای بررسی/بهروزرسانی خروج خودکار از تمرکز در اثر عدم فعالیت از /session idle و
برای کنترل سقف سخت از /session max-age استفاده کنید.
جداسازی
برای جداسازی دستی از /unfocus استفاده کنید.
کنترلهای دستی
| فرمان | اثر |
|---|---|
/focus <target> |
رشته فعلی را به یک هدف زیرعامل/نشست متصل میکند (یا یک رشته ایجاد میکند) |
/unfocus |
اتصال رشته متصل فعلی را حذف میکند |
/agents |
اجراهای فعال و وضعیت اتصال (thread:<id> یا unbound) را فهرست میکند |
/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. مقدارها میلیثانیههای عدد صحیح مثبت هستند و به بیشینه زمانسنج ایمن برای پلتفرم محدود میشوند. تلاشهای مجدد گذرا میتوانند کل انتظار اعلام را طولانیتر از یک زمانسنجی پیکربندیشده کنند.
اگر نشست درخواستکننده sandboxed باشد، sessions_spawn هدفهایی را که
بدون sandbox اجرا میشوند رد میکند.
کشف
برای دیدن اینکه کدام شناسههای عامل در حال حاضر برای 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 دوباره راهاندازی شود، زمانسنجهای معلق از دست میروند.
- زمانسنجیهای اجرای پیکربندیشده بهطور خودکار بایگانی نمیکنند؛ فقط اجرا را متوقف میکنند. نشست تا بایگانی خودکار باقی میماند.
- بایگانی خودکار بهطور یکسان برای نشستهای عمق ۱ و عمق ۲ اعمال میشود.
- پاکسازی مرورگر از پاکسازی بایگانی جداست: زبانهها/فرایندهای مرورگر ردیابیشده وقتی اجرا تمام میشود بر پایه بهترین تلاش بسته میشوند، حتی اگر رونوشت/رکورد نشست نگه داشته شود.
زیرعاملهای تودرتو
بهطور پیشفرض، زیرعاملها نمیتوانند زیرعاملهای خودشان را ایجاد کنند
(maxSpawnDepth: 1). برای فعالسازی یک سطح تودرتویی، maxSpawnDepth: 2 را تنظیم کنید
که همان الگوی هماهنگکننده است: عامل اصلی → زیرعامل هماهنگکننده →
زیر-زیرعاملهای کارگر.
{ agents: { defaults: { subagents: { maxSpawnDepth: 2, // allow sub-agents to spawn children (default: 1) maxChildrenPerAgent: 5, // max active children per agent session (default: 5) maxConcurrent: 8, // global concurrency lane cap (default: 8) runTimeoutSeconds: 900, // default timeout for sessions_spawn (0 = no timeout) announceTimeoutMs: 120000, // per-call gateway announce timeout }, }, },}سطوح عمق
| عمق | شکل کلید نشست | نقش | میتواند ایجاد کند؟ |
|---|---|---|---|
| 0 | agent:<id>:main |
عامل اصلی | همیشه |
| 1 | agent:<id>:subagent:<uuid> |
زیرعامل (هماهنگکننده وقتی عمق ۲ مجاز باشد) | فقط اگر maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> |
زیر-زیرعامل (کارگر برگ) | هرگز |
زنجیره اعلام
نتایج در زنجیره به بالا برمیگردند:
- کارگر عمق ۲ تمام میشود → به والد خود (هماهنگکننده عمق ۱) اعلام میکند.
- هماهنگکننده عمق ۱ اعلان را دریافت میکند، نتایج را ترکیب میکند، تمام میشود → به اصلی اعلام میکند.
- عامل اصلی اعلان را دریافت میکند و به کاربر تحویل میدهد.
هر سطح فقط اعلانهای فرزندان مستقیم خود را میبیند.
سیاست ابزار بر اساس عمق
- نقش و دامنه کنترل هنگام ایجاد، در فراداده نشست نوشته میشوند. این باعث میشود کلیدهای نشست تخت یا بازیابیشده بهطور تصادفی دوباره امتیازهای هماهنگکننده را به دست نیاورند.
- عمق ۱ (هماهنگکننده، وقتی
maxSpawnDepth >= 2):sessions_spawn،subagents،sessions_list،sessions_historyرا دریافت میکند تا بتواند فرزند ایجاد کند و وضعیت آنها را بررسی کند. ابزارهای دیگر نشست/سیستم همچنان رد میمانند. - عمق ۱ (برگ، وقتی
maxSpawnDepth == 1): بدون ابزار نشست (رفتار پیشفرض فعلی). - عمق ۲ (کارگر برگ): بدون ابزار نشست —
sessions_spawnهمیشه در عمق ۲ رد میشود. نمیتواند فرزندان بیشتری ایجاد کند.
محدودیت ایجاد برای هر عامل
هر نشست عامل (در هر عمقی) میتواند همزمان حداکثر maxChildrenPerAgent
(پیشفرض 5) فرزند فعال داشته باشد. این از گسترش بیمهار از یک هماهنگکننده واحد جلوگیری میکند.
توقف آبشاری
توقف یک هماهنگکننده عمق ۱ بهطور خودکار همه فرزندان عمق ۲ آن را متوقف میکند:
/stopدر گفتوگوی اصلی همه عاملهای عمق ۱ را متوقف میکند و به فرزندان عمق ۲ آنها آبشار میشود.
احراز هویت
احراز هویت زیرعامل بر اساس شناسه عامل حل میشود، نه بر اساس نوع نشست:
- کلید نشست زیرعامل
agent:<agentId>:subagent:<uuid>است. - ذخیرهگاه احراز هویت از
agentDirهمان عامل بارگذاری میشود. - پروفایلهای احراز هویت عامل اصلی بهعنوان جایگزین ادغام میشوند؛ پروفایلهای عامل در تعارضها پروفایلهای اصلی را بازنویسی میکنند.
ادغام افزایشی است، بنابراین پروفایلهای اصلی همیشه بهعنوان جایگزین در دسترس هستند. احراز هویت کاملا ایزوله برای هر عامل هنوز پشتیبانی نمیشود.
اعلان
زیرعاملها از طریق یک گام اعلان گزارش میدهند:
- گام اعلان داخل نشست زیرعامل اجرا میشود (نه نشست درخواستکننده).
- اگر زیرعامل دقیقا
ANNOUNCE_SKIPپاسخ دهد، چیزی ارسال نمیشود. - اگر آخرین متن دستیار همان توکن خاموش دقیق
NO_REPLY/no_replyباشد، خروجی اعلان سرکوب میشود، حتی اگر پیشرفت قابل مشاهده قبلی وجود داشته باشد.
تحویل به عمق درخواستکننده بستگی دارد:
- نشستهای درخواستکننده سطح بالا از یک فراخوانی پیگیری
agentبا تحویل خارجی (deliver=true) استفاده میکنند. - نشستهای زیرعاملِ درخواستکننده تودرتو یک تزریق پیگیری داخلی (
deliver=false) دریافت میکنند تا هماهنگکننده بتواند نتایج فرزند را درون نشست ترکیب کند. - اگر نشست زیرعاملِ درخواستکننده تودرتو از بین رفته باشد، OpenClaw در صورت امکان به درخواستکننده همان نشست برمیگردد.
برای نشستهای درخواستکننده سطح بالا، تحویل مستقیم در حالت تکمیل ابتدا هر مسیر گفتوگو/رشته متصل و بازنویسی قلاب را حل میکند، سپس فیلدهای کانال-هدفِ جاافتاده را از مسیر ذخیرهشده نشست درخواستکننده پر میکند. این کار تکمیلها را روی گفتوگو/موضوع درست نگه میدارد، حتی وقتی مبدا تکمیل فقط کانال را شناسایی میکند.
تجمیع تکمیل فرزند هنگام ساخت یافتههای تکمیل تودرتو به اجرای درخواستکننده فعلی محدود میشود و مانع نشت خروجیهای فرزند اجرای قبلی به اعلان فعلی میشود. پاسخهای اعلان، در صورت در دسترس بودن روی آداپتورهای کانال، مسیریابی رشته/موضوع را حفظ میکنند.
زمینه اعلان
زمینه اعلان به یک بلوک رویداد داخلی پایدار نرمالسازی میشود:
| فیلد | منبع |
|---|---|
| منبع | subagent یا cron |
| شناسههای نشست | کلید/شناسه نشست فرزند |
| نوع | نوع اعلان + برچسب وظیفه |
| وضعیت | مشتقشده از نتیجه زمان اجرا (success، error، timeout، یا unknown) — از متن مدل استنباط نمیشود |
| محتوای نتیجه | آخرین متن قابل مشاهده دستیار از فرزند |
| پیگیری | دستورالعملی که توضیح میدهد چه زمانی پاسخ داده شود و چه زمانی خاموش بماند |
اجراهای ناموفق پایانی بدون بازپخش متن پاسخ ضبطشده، وضعیت شکست را گزارش میکنند. خروجی ابزار/نتیجهابزار به متن نتیجه فرزند ارتقا داده نمیشود.
خط آمار
محمولههای اعلان در پایان شامل یک خط آمار هستند (حتی وقتی بستهبندی شده باشند):
- زمان اجرا (برای نمونه
runtime 5m12s). - مصرف توکن (ورودی/خروجی/کل).
- هزینه تخمینی وقتی قیمتگذاری مدل پیکربندی شده باشد (
models.providers.*.models[].cost). sessionKey،sessionId، و مسیر رونوشت تا عامل اصلی بتواند تاریخچه را از طریقsessions_historyواکشی کند یا فایل روی دیسک را بررسی کند.
فراداده داخلی فقط برای هماهنگسازی است؛ پاسخهای کاربرمحور باید با صدای عادی دستیار بازنویسی شوند.
چرا sessions_history را ترجیح دهیم
sessions_history مسیر هماهنگسازی امنتری است:
- یادآوری دستیار ابتدا نرمالسازی میشود: برچسبهای فکر کردن حذف میشوند؛ داربست
<relevant-memories>/<relevant_memories>حذف میشود؛ بلوکهای محموله XML فراخوانی ابزار بهصورت متن ساده (<tool_call>،<function_call>،<tool_calls>،<function_calls>) حذف میشوند، از جمله محمولههای کوتاهشدهای که هرگز تمیز بسته نمیشوند؛ داربست تنزلیافته فراخوانی/نتیجه ابزار و نشانگرهای زمینه تاریخی حذف میشوند؛ توکنهای کنترل مدل نشتکرده (<|assistant|>، دیگر<|...|>های ASCII،<|...|>تمامعرض) حذف میشوند؛ XML فراخوانی ابزار MiniMax ناقص حذف میشود. - متنهای شبیه اعتبارنامه/توکن پوشانده میشوند.
- بلوکهای طولانی میتوانند کوتاه شوند.
- تاریخچههای بسیار بزرگ میتوانند ردیفهای قدیمیتر را حذف کنند یا یک ردیف بیشازحد بزرگ را با
[sessions_history omitted: message too large]جایگزین کنند. - وقتی
nextOffsetوجود دارد، از آن برای صفحهبندی رو به عقب در پنجرههای قدیمیتر رونوشت استفاده کنید. - بررسی رونوشت خام روی دیسک جایگزین است وقتی به رونوشت کامل بایتبهبایت نیاز دارید.
سیاست ابزار
زیرعاملها ابتدا از همان خط لوله پروفایل و سیاست ابزارِ والد یا عامل هدف استفاده میکنند. پس از آن، OpenClaw لایه محدودیت زیرعامل را اعمال میکند.
بدون tools.profile محدودکننده، زیرعاملها همه ابزارها بهجز ابزار پیام، ابزارهای نشست، و ابزارهای سیستم را دریافت میکنند:
sessions_listsessions_historysessions_sendsessions_spawnmessage
sessions_history اینجا هم یک نمای یادآوری محدود و پاکسازیشده باقی میماند — ریزش خام رونوشت نیست.
وقتی maxSpawnDepth >= 2 باشد، زیرعاملهای هماهنگکننده عمق ۱ افزون بر این sessions_spawn، subagents، sessions_list، و
sessions_history را دریافت میکنند تا بتوانند فرزندان خود را مدیریت کنند.
بازنویسی از طریق پیکربندی
{ agents: { defaults: { subagents: { maxConcurrent: 1, }, }, }, tools: { subagents: { tools: { // deny wins deny: ["gateway", "cron"], // if allow is set, it becomes allow-only (deny still wins) // allow: ["read", "exec", "process"] }, }, },}tools.subagents.tools.allow یک فیلتر نهایی فقط-مجاز است. میتواند مجموعه ابزارِ از پیش حلشده را محدودتر کند، اما نمیتواند ابزاری را که توسط tools.profile حذف شده دوباره اضافه کند. برای نمونه، tools.profile: "coding" شامل
web_search/web_fetch است اما ابزار browser را شامل نمیشود. برای اینکه زیرعاملهای پروفایل کدنویسی بتوانند از خودکارسازی مرورگر استفاده کنند، browser را در مرحله پروفایل اضافه کنید:
{ tools: { profile: "coding", alsoAllow: ["browser"], },}وقتی فقط یک عامل باید خودکارسازی مرورگر بگیرد، از agents.list[].tools.alsoAllow: ["browser"] برای هر عامل استفاده کنید.
همروندی
زیرعاملها از یک مسیر صف اختصاصی درونفرایندی استفاده میکنند:
- نام مسیر:
subagent - همروندی:
agents.defaults.subagents.maxConcurrent(پیشفرض8)
زندهبودن و بازیابی
OpenClaw نبود endedAt را اثبات دائمی زنده بودن یک زیرعامل در نظر نمیگیرد. اجراهای پایاننیافته قدیمیتر از پنجره اجرای کهنه، دیگر در /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).