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 را ببینید. وقتی Plugin مربوط بهcodexفعال است، کنترل گفتوگو/رشتهٔ 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 راهاندازی مجدد شود، تایمرهای در انتظار از دست میروند.
- مهلتهای اجرای پیکربندیشده بهطور خودکار بایگانی نمیکنند؛ فقط اجرا را متوقف میکنند. نشست تا زمان بایگانی خودکار باقی میماند.
- بایگانی خودکار بهطور یکسان برای نشستهای عمق ۱ و عمق ۲ اعمال میشود.
- پاکسازی مرورگر از پاکسازی بایگانی جداست: زبانهها/فرایندهای مرورگرِ رهگیریشده، هنگام پایان اجرا در حد بهترین تلاش بسته میشوند، حتی اگر رونوشت/رکورد نشست نگه داشته شود.
زیرعاملهای تودرتو
بهطور پیشفرض، زیرعاملها نمیتوانند زیرعاملهای خودشان را ایجاد کنند
(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> |
زیرعامل (هماهنگکننده در صورت مجاز بودن عمق ۲) | فقط اگر 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 |
| شناسههای نشست | کلید/شناسه نشست فرزند |
| نوع | نوع اعلان + برچسب وظیفه |
| وضعیت | برگرفته از نتیجه زمان اجرا (ok، error، timeout یا unknown) — نه استنباطشده از متن مدل |
| محتوای نتیجه | جدیدترین متن قابلمشاهده دستیار از فرزند |
| پیگیری | دستورالعملی که زمان پاسخدادن یا سکوتکردن را توصیف میکند |
اجراهای پایانی ناموفق، وضعیت شکست را بدون بازپخش متن پاسخ ثبتشده
گزارش میکنند. خروجی tool/toolResult به متن نتیجه فرزند ارتقا نمییابد.
خط آمار
بارهای اعلان در انتها شامل یک خط آمار هستند (حتی هنگام بستهبندی):
- زمان اجرا (برای نمونه
runtime 5m12s). - میزان مصرف توکن (ورودی/خروجی/مجموع).
- هزینه تخمینی، هنگامی که قیمتگذاری مدل پیکربندی شده باشد (
models.providers.*.models[].cost). sessionKey،sessionIdو مسیر رونوشت تا عامل اصلی بتواند تاریخچه را از طریقsessions_historyدریافت کند یا فایل روی دیسک را بررسی کند.
فراداده داخلی فقط برای هماهنگسازی در نظر گرفته شده است؛ پاسخهای کاربرپسند باید با لحن عادی دستیار بازنویسی شوند.
چرا sessions_history ترجیح داده میشود
sessions_history مسیر هماهنگسازی امنتری برای خواندن رونوشت فرزند
از درون نوبت عامل است:
- متنهای شبیه اعتبارنامه/توکن را حتی هنگامی که پوشاندن عمومی گزارشها غیرفعال است، میپوشاند.
- بلوکهای متنی طولانی را کوتاه میکند (۴۰۰۰ نویسه برای هر بلوک) و امضاهای تفکر، بارهای بازپخش استدلال و دادههای تصویر درونخطی را حذف میکند.
- سقف پاسخ ۸۰ کیلوبایت را اعمال میکند؛ ردیفهای بیشازحد بزرگ با
[sessions_history omitted: message too large]جایگزین میشوند. - در صورت وجود
nextOffset، از آن برای صفحهبندی رو به عقب در پنجرههای قدیمیتر رونوشت استفاده کنید. sessions_historyبرچسبهای استدلال، داربست<relevant-memories>یا XML فراخوانی ابزار را از متن پیام حذف نمیکند — بلوکهای محتوای ساختیافته نزدیک به شکل خام رونوشت را برمیگرداند که فقط پوشانده و از نظر اندازه محدود شدهاند./subagents logپاکسازی متنی سنگینتری را اعمال میکند (برچسبهای استدلال، داربست حافظه و XML فراخوانی ابزار را حذف میکند)، زیرا بهجای بلوکهای ساختیافته، خطوط گفتوگوی ساده را نمایش میدهد.- بررسی رونوشت خام روی دیسک، زمانی که به رونوشت کامل و دقیق بایتبهبایت نیاز دارید، مسیر جایگزین است.
سیاست ابزار
زیرعاملها ابتدا از همان خط لوله پروفایل و سیاست ابزار والد یا عامل مقصد استفاده میکنند. پس از آن، OpenClaw لایه محدودیت زیرعامل را اعمال میکند.
زیرعاملها صرفنظر از عمق یا نقش، همیشه دسترسی به gateway، agents_list، session_status و
cron را از دست میدهند (ابزارهای سطح سیستم/تعاملی یا
ابزارهایی که عامل اصلی باید هماهنگ کند). زیرعاملهای نهایی (رفتار پیشفرض عمق ۱
و همیشه در عمق ۲) علاوه بر این دسترسی به subagents،
sessions_list، sessions_history و sessions_spawn را از دست میدهند. زیرعاملها هرگز
ابزار message را دریافت نمیکنند — این ابزار هنگام ایجاد غیرفعال میشود، نه اینکه توسط
این فهرست منع فیلتر شود — و sessions_send نیز ممنوع میماند تا زیرعاملها
فقط از طریق زنجیره اعلان ارتباط برقرار کنند.
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 را شامل نمیشود. برای اینکه
زیرعاملهای پروفایل کدنویسی بتوانند از خودکارسازی مرورگر استفاده کنند، مرورگر را در
مرحله پروفایل اضافه کنید:
{ 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 باقی میماند، درحالیکه فایلهای شخصیت، هویت و کاربرِ مختص والد بهصورت دستورالعملهای همکاریِ محدود به نوبت وارد میشوند تا فرزندان آنها را همانندسازی نکنند. - حداکثر عمق تودرتویی ۵ است (محدودهٔ
maxSpawnDepth: ۱ تا ۵). برای بیشتر موارد استفاده، عمق ۲ توصیه میشود. maxChildrenPerAgentتعداد فرزندان فعال در هر نشست را محدود میکند (پیشفرض5، محدودهٔ1-20).