Agent coordination
Sub-agen
Sub-agen adalah proses agen latar belakang yang dibuat dari proses agen yang sudah ada.
Masing-masing berjalan dalam sesinya sendiri (agent:<agentId>:subagent:<uuid>) dan,
setelah selesai, mengumumkan hasilnya kembali ke kanal chat peminta.
Setiap proses sub-agen dilacak sebagai tugas latar belakang.
Tujuan:
- Memparalelkan riset, tugas panjang, dan pekerjaan alat yang lambat tanpa memblokir proses utama.
- Menjaga sub-agen tetap terisolasi secara default (pemisahan sesi, sandbox opsional).
- Menjaga permukaan alat agar sulit disalahgunakan: secara default, sub-agen tidak mendapatkan alat sesi atau pesan.
- Mendukung kedalaman penyarangan yang dapat dikonfigurasi untuk pola orkestrator.
Perintah garis miring
/subagents memeriksa proses sub-agen untuk sesi saat ini:
/subagents list/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents info menampilkan metadata proses (status, stempel waktu, id sesi,
jalur transkrip, pembersihan). /subagents log mencetak giliran chat terbaru untuk suatu
proses; tambahkan token tools untuk menyertakan pesan pemanggilan/hasil alat (secara default
dihilangkan). Gunakan sessions_history untuk tampilan pengingatan kembali
yang dibatasi dan difilter demi keamanan dari dalam giliran agen, atau periksa jalur transkrip pada disk untuk
transkrip lengkap mentah.
Di UI Kontrol, sesi induk dengan proses anak terbaru memiliki baris bilah samping yang dapat diperluas. Baris bersarang menampilkan status dan waktu proses anak, dan memilih salah satunya akan membuka chat anak tersebut sambil mempertahankan hierarki induk.
Kontrol pengikatan utas
Perintah ini berfungsi pada kanal dengan pengikatan utas persisten. Lihat Kanal yang mendukung utas di bawah.
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>Perilaku pembuatan
Agen memulai sub-agen latar belakang dengan alat sessions_spawn.
Penyelesaian dikembalikan sebagai peristiwa internal sesi induk; agen induk/peminta
memutuskan apakah pembaruan yang terlihat oleh pengguna diperlukan.
Penyelesaian berbasis push yang tidak memblokir
sessions_spawntidak memblokir; alat ini segera mengembalikan id proses.- Saat selesai, sub-agen melaporkan kembali ke sesi induk/peminta.
- Giliran agen yang memerlukan hasil agen anak harus memanggil
sessions_yieldsetelah membuat pekerjaan yang diperlukan. Tindakan ini mengakhiri giliran saat ini dan memungkinkan peristiwa penyelesaian tiba sebagai pesan berikutnya yang terlihat oleh model. - Penyelesaian berbasis push. Setelah dibuat, jangan melakukan polling
/subagents list,sessions_list, atausessions_historysecara berulang hanya untuk menunggunya selesai; periksa status sesuai kebutuhan hanya saat melakukan debug. - Keluaran agen anak adalah laporan/bukti yang harus disintesis oleh agen peminta. Keluaran tersebut bukan teks instruksi buatan pengguna dan tidak dapat mengesampingkan kebijakan sistem, pengembang, atau pengguna.
- Saat selesai, OpenClaw berupaya sebaik mungkin menutup tab/proses browser terlacak yang dibuka oleh sesi sub-agen tersebut sebelum alur pembersihan pengumuman berlanjut.
Pengiriman penyelesaian
- OpenClaw mengembalikan penyelesaian ke sesi peminta melalui giliran
agentdengan kunci idempotensi yang stabil. - Jika proses peminta masih aktif, OpenClaw terlebih dahulu mencoba membangunkan/mengarahkan proses tersebut alih-alih memulai jalur balasan kedua yang terlihat.
- Jika peminta aktif tidak dapat dibangunkan, OpenClaw beralih ke serah terima agen peminta dengan konteks penyelesaian yang sama, bukan membuang pengumuman.
- Serah terima induk yang berhasil menyelesaikan pengiriman sub-agen meskipun induk memutuskan bahwa pembaruan yang terlihat oleh pengguna tidak diperlukan.
- Sub-agen native tidak mendapatkan alat pesan. Sub-agen mengembalikan teks asisten biasa kepada agen induk/peminta; balasan yang terlihat oleh manusia tetap diatur oleh kebijakan pengiriman normal agen induk/peminta.
- Jika serah terima langsung tidak dapat digunakan, pengiriman beralih ke perutean antrean, kemudian ke percobaan ulang pengumuman singkat dengan backoff eksponensial sebelum akhirnya menyerah.
- Pengiriman mempertahankan rute peminta yang telah ditetapkan: rute penyelesaian yang terikat utas atau terikat percakapan diutamakan jika tersedia. Jika asal penyelesaian hanya menyediakan kanal, OpenClaw mengisi target/akun yang hilang dari rute sesi peminta yang telah ditetapkan (
lastChannel/lastTo/lastAccountId) agar pengiriman langsung tetap berfungsi.
Metadata serah terima penyelesaian
Serah terima penyelesaian ke sesi peminta merupakan konteks internal yang dihasilkan saat runtime (bukan teks buatan pengguna) dan mencakup:
Result— teks balasanassistantterbaru yang terlihat dari agen anak. Keluaran alat/toolResult tidak dipromosikan menjadi hasil agen anak. Proses yang gagal secara terminal tidak menggunakan kembali teks balasan yang tertangkap.Status—completed; ready for parent review/failed/timed out/unknown.- Statistik runtime/token ringkas.
- Instruksi review yang memberi tahu agen peminta untuk memverifikasi hasil sebelum memutuskan apakah tugas asli sudah selesai.
- Panduan tindak lanjut yang memberi tahu agen peminta untuk melanjutkan tugas atau mencatat tindak lanjut saat hasil agen anak masih menyisakan tindakan.
- Instruksi pembaruan akhir untuk jalur tanpa tindakan lebih lanjut, ditulis dengan gaya asisten normal tanpa meneruskan metadata internal mentah.
Mode dan runtime ACP
--modeldan--thinkingmenggantikan default untuk proses tertentu tersebut.- Gunakan
info/loguntuk memeriksa detail dan keluaran setelah selesai. - Untuk sesi persisten yang terikat utas, gunakan
sessions_spawndenganthread: truedanmode: "session". - Jika kanal peminta tidak mendukung pengikatan utas, gunakan
mode: "run"alih-alih mencoba ulang kombinasi terikat utas yang mustahil. - Untuk sesi harness ACP (Claude Code, Gemini CLI, OpenCode, atau Codex ACP/acpx eksplisit), gunakan
sessions_spawndenganruntime: "acp"saat alat mengiklankan runtime tersebut. Lihat Model pengiriman ACP saat melakukan debug penyelesaian atau perulangan antaragen. Saat Plugincodexdiaktifkan, kontrol chat/utas Codex sebaiknya mengutamakan/codex ...daripada ACP, kecuali pengguna secara eksplisit meminta ACP/acpx. - OpenClaw menyembunyikan
runtime: "acp"hingga ACP diaktifkan, peminta tidak berada dalam sandbox, dan Plugin backend sepertiacpxdimuat.runtime: "acp"mengharapkan id harness ACP eksternal, atau entriagents.list[]denganruntime.type="acp"; gunakan runtime sub-agen default untuk agen konfigurasi OpenClaw normal dariagents_list.
Mode konteks
Sub-agen native dimulai secara terisolasi kecuali pemanggil secara eksplisit meminta untuk mencabangkan transkrip saat ini.
| Mode | Kapan menggunakannya | Perilaku |
|---|---|---|
isolated |
Riset baru, implementasi independen, pekerjaan alat yang lambat, atau apa pun yang dapat dijelaskan secara ringkas dalam teks tugas | Membuat transkrip agen anak yang bersih. Ini adalah default dan menjaga penggunaan token tetap lebih rendah. |
fork |
Pekerjaan yang bergantung pada percakapan saat ini, hasil alat sebelumnya, atau instruksi bernuansa yang sudah ada dalam transkrip peminta | Mencabangkan transkrip peminta ke sesi anak sebelum agen anak dimulai. |
Gunakan fork seperlunya. Mode ini ditujukan untuk delegasi yang sensitif terhadap konteks, bukan
sebagai pengganti penulisan prompt tugas yang jelas.
Alat: sessions_spawn
Memulai proses sub-agen dengan deliver: false pada jalur subagent global,
kemudian menjalankan langkah pengumuman dan memposting balasan pengumuman ke kanal
chat peminta.
Ketersediaannya bergantung pada kebijakan alat efektif pemanggil. Profil bawaan
coding dan messaging mencakup sessions_spawn,
sessions_yield, dan subagents; minimal tidak. full mengizinkan semua
alat. Tambahkan alat tersebut dengan tools.alsoAllow, atau gunakan salah satu profil
di atas, untuk agen dengan profil khusus yang lebih terbatas tetapi tetap harus
mendelegasikan pekerjaan.
Kebijakan izinkan/tolak kanal/grup, penyedia, sandbox, dan per agen
masih dapat menghapus alat setelah tahap profil. Gunakan /tools dari sesi yang sama
untuk mengonfirmasi daftar alat efektif.
Default:
- Model: sub-agen native mewarisi model pemanggil kecuali Anda menetapkan
agents.defaults.subagents.model(atauagents.list[].subagents.modelper agen). Pembuatan runtime ACP menggunakan model sub-agen terkonfigurasi yang sama jika tersedia; jika tidak, harness ACP mempertahankan defaultnya sendiri.sessions_spawn.modeleksplisit tetap diutamakan. - Pemikiran: sub-agen native mewarisi pemikiran pemanggil kecuali Anda menetapkan
agents.defaults.subagents.thinking(atauagents.list[].subagents.thinkingper agen). Pembuatan runtime ACP juga menerapkanagents.defaults.models["provider/model"].params.thinkinguntuk model yang dipilih.sessions_spawn.thinkingeksplisit tetap diutamakan. - Batas waktu proses: OpenClaw menggunakan
agents.defaults.subagents.runTimeoutSecondsjika ditetapkan; jika tidak, OpenClaw beralih ke0(tanpa batas waktu).sessions_spawntidak menerima penggantian batas waktu per panggilan. - Masa hidup proses: sub-agen OpenClaw yang dilepas memiliki siklus hidup prosesnya sendiri. Tugas latar belakang yang dibuat di dalam backend CLI eksternal berbeda: tugas tersebut berbagi subproses CLI induk dan berhenti jika induk mencapai
agents.defaults.timeoutSeconds. - Pengiriman tugas: sub-agen native menerima tugas yang didelegasikan dalam pesan
[Subagent Task]pertama yang terlihat. Prompt sistem sub-agen membawa aturan runtime dan konteks perutean, bukan duplikat tersembunyi dari tugas tersebut.
Pembuatan sub-agen native yang diterima menyertakan metadata model anak yang telah ditetapkan
dalam hasil alat: resolvedModel berisi referensi model yang diterapkan dan
resolvedProvider berisi awalan penyedia jika referensi memilikinya.
Mode prompt delegasi
agents.defaults.subagents.delegationMode hanya mengontrol panduan prompt; pengaturan ini tidak mengubah kebijakan alat atau memberlakukan delegasi.
suggest(default): pertahankan dorongan prompt standar untuk menggunakan sub-agen bagi pekerjaan yang lebih besar atau lebih lambat.prefer: beri tahu agen utama agar tetap responsif dan mendelegasikan apa pun yang lebih kompleks daripada balasan langsung melaluisessions_spawn.
Penggantian per agen: agents.list[].subagents.delegationMode.
{ agents: { defaults: { subagents: { delegationMode: "prefer", maxConcurrent: 4, }, }, list: [ { id: "coordinator", subagents: { delegationMode: "prefer" }, }, ], },}Parameter alat
taskstringrequiredDeskripsi tugas untuk sub-agent.
taskNamestringPenanda stabil opsional untuk mengidentifikasi child tertentu dalam keluaran status berikutnya. Harus cocok dengan [a-z][a-z0-9_-]{0,63} dan tidak boleh berupa target yang dicadangkan seperti last atau all.
labelstringLabel opsional yang mudah dibaca manusia.
agentIdstringLakukan spawn di bawah id agen lain yang dikonfigurasi jika diizinkan oleh subagents.allowAgents.
cwdstringDirektori kerja tugas opsional untuk proses child. Sub-agent native tetap memuat file bootstrap dari ruang kerja agen target; cwd hanya mengubah lokasi tempat alat runtime dan harness CLI melakukan pekerjaan yang didelegasikan.
runtime"subagent" | "acp"default: subagentacp hanya untuk harness ACP eksternal (claude, droid, gemini, opencode, atau Codex ACP/acpx yang diminta secara eksplisit) dan untuk entri agents.list[] yang runtime.type-nya adalah acp.
resumeSessionIdstringKhusus ACP. Melanjutkan sesi harness ACP yang sudah ada ketika runtime: "acp"; diabaikan untuk spawn sub-agent native.
streamTo"parent"Khusus ACP. Mengalirkan keluaran proses ACP ke sesi induk ketika runtime: "acp"; hilangkan untuk spawn sub-agent native.
modelstringGanti model sub-agent. Nilai yang tidak valid dilewati dan sub-agent berjalan pada model default dengan peringatan dalam hasil alat.
thinkingstringGanti tingkat penalaran untuk proses sub-agent. Tidak tersedia dengan visible: true.
threadbooleandefault: falseKetika true, meminta pengikatan utas kanal untuk sesi sub-agent ini.
mode"run" | "session"default: runJika thread: true dan mode dihilangkan, nilai default menjadi session. mode: "session" memerlukan thread: true.
Jika pengikatan utas tidak tersedia untuk kanal peminta, gunakan mode: "run" sebagai gantinya.
Dengan visible: true, hilangkan mode; sesi yang terlihat bersifat persisten dan tidak mendukung mode: "run".
cleanup"delete" | "keep"default: keep"delete" mengarsipkan sesi segera setelah pengumuman (transkrip tetap disimpan melalui penggantian nama).
sandbox"inherit" | "require"default: inheritrequire menolak spawn kecuali runtime child target berada dalam sandbox.
context"isolated" | "fork"default: isolatedfork mencabangkan transkrip peminta saat ini ke sesi child. Khusus sub-agent native. Spawn yang terikat utas secara default menggunakan fork; spawn yang tidak terikat utas secara default menggunakan isolated. Fork yang terlihat harus menargetkan agen yang sama dengan peminta.
visiblebooleandefault: falseBuat sesi dasbor persisten yang dapat dibuka pengguna di UI Kontrol. Spawn yang terlihat hanya mendukung runtime: "subagent" dan selalu mempertahankan sesi yang dibuat.
worktreebooleandefault: falseSediakan worktree git terkelola untuk sesi dasbor baru. Memerlukan visible: true.
worktreeNamestringNama worktree terkelola opsional. Memerlukan visible: true dan worktree: true.
worktreeBaseRefstringReferensi dasar git opsional untuk worktree terkelola. Memerlukan visible: true dan worktree: true.
Dengan visible: true, model, cwd, dan context: "fork" dengan agen yang sama didukung. Target dalam sandbox membatasi cwd ke ruang kerja agen tersebut. Pengikatan utas, mode, penggantian tingkat penalaran, lightContext, attachments, dan attachAs tidak tersedia pada jalur ini karena sesi yang terlihat merupakan sesi dasbor persisten yang dibuat melalui sessions.create. Spawn yang terlihat ditolak jika peminta itu sendiri di-spawn dengan daftar izin atau daftar penolakan alat yang diwariskan; pembatasan tersebut ditetapkan saat spawn dan tidak memiliki penggantian konfigurasi. Pencantuman dan pengalamatan sesi mematuhi tools.sessions.visibility; cakupan default tree mencakup sesi saat ini dan subtree spawn miliknya sendiri. Lihat Worktree terkelola untuk perilaku penamaan checkout, penyiapan, pembersihan, dan pemulihan.
Nama tugas dan penargetan
taskName adalah penanda untuk orkestrasi yang ditujukan bagi model, bukan kunci sesi.
Gunakan untuk nama child yang stabil seperti review_subagents,
linux_validation, atau docs_update ketika koordinator mungkin perlu memeriksa
child tersebut nanti.
Resolusi target menerima kecocokan persis taskName dan prefiks yang
tidak ambigu. Pencocokan dibatasi pada jendela target aktif/terbaru yang sama dengan yang digunakan
oleh target bernomor /subagents, sehingga child lama yang telah selesai tidak membuat
penanda yang digunakan kembali menjadi ambigu. Jika dua child aktif atau terbaru memiliki
taskName yang sama, target tersebut ambigu; gunakan indeks daftar, kunci sesi, atau
id proses sebagai gantinya.
Target yang dicadangkan last dan all bukan nilai taskName yang valid
karena keduanya telah memiliki makna kontrol.
Alat: sessions_yield
Mengakhiri giliran model saat ini dan menunggu peristiwa runtime, terutama peristiwa penyelesaian sub-agent, tiba sebagai pesan berikutnya. Gunakan setelah melakukan spawn pekerjaan child yang diperlukan ketika peminta tidak dapat menghasilkan jawaban akhir hingga penyelesaian tersebut tiba.
sessions_yield adalah primitif penantian. Jangan menggantinya dengan perulangan polling
terhadap subagents, sessions_list, sessions_history, shell
sleep, atau polling proses hanya untuk mendeteksi penyelesaian child.
Gunakan sessions_yield hanya ketika daftar alat efektif sesi menyertakannya.
Beberapa profil alat minimal atau khusus mungkin mengekspos sessions_spawn dan
subagents tanpa mengekspos sessions_yield; dalam hal tersebut, jangan membuat
perulangan polling hanya untuk menunggu penyelesaian.
Ketika terdapat child aktif, OpenClaw menyisipkan blok prompt ringkas yang dihasilkan runtime
Active Subagents ke dalam giliran normal agar peminta dapat melihat
sesi child saat ini, id proses, status, label, tugas, dan
alias taskName tanpa polling. Bidang tugas dan label dalam blok tersebut
dikutip sebagai data, bukan instruksi, karena dapat berasal
dari argumen spawn yang diberikan pengguna/model.
Alat: subagents
Mencantumkan proses sub-agent yang di-spawn dan catatan tugas latar belakang yang dimiliki oleh pohon sesi peminta. Baris tugas mencakup sub-agent native, proses ACP, pekerjaan CLI/media Gateway, dan eksekusi cron. Cakupannya terbatas pada peminta saat ini; sebuah child hanya dapat melihat child yang dikendalikannya sendiri.
Gunakan subagents untuk status sesuai permintaan dan debugging. Gunakan sessions_yield untuk
menunggu peristiwa penyelesaian.
Gunakan action: "cancel" dengan taskId yang dikembalikan oleh action: "list" untuk menghentikan
tugas. Pembatalan dibatasi pada pohon sesi yang dikendalikan; sub-agent leaf
tidak dapat membatalkan pekerjaan yang dimiliki sesi lain.
Sesi terikat utas
Ketika pengikatan utas diaktifkan untuk sebuah kanal, sub-agent dapat tetap terikat ke sebuah utas sehingga pesan pengguna lanjutan dalam utas tersebut terus dirutekan ke sesi sub-agent yang sama.
Kanal yang mendukung utas
Sebuah kanal mendukung sesi sub-agent persisten yang terikat utas
(sessions_spawn dengan thread: true) ketika mendaftarkan adaptor pengikatan
percakapan. Kanal bawaan dengan dukungan tersebut: Discord,
iMessage, Matrix, dan Telegram. Discord dan Matrix secara default
membuat utas child; Telegram dan iMessage secara default mengikat
percakapan saat ini. Gunakan kunci konfigurasi threadBindings per kanal untuk
pengaktifan, batas waktu, dan spawnSessions.
Alur singkat
Spawn
sessions_spawn dengan thread: true (dan secara opsional mode: "session").
Ikat
OpenClaw membuat atau mengikat utas ke target sesi tersebut di kanal aktif.
Rutekan tindak lanjut
Balasan dan pesan lanjutan dalam utas tersebut dirutekan ke sesi yang terikat.
Periksa batas waktu
Gunakan /session idle untuk memeriksa/memperbarui penghilangan fokus otomatis saat tidak aktif dan
/session max-age untuk mengendalikan batas maksimum.
Lepaskan
Gunakan /unfocus untuk melepaskan secara manual.
Kontrol manual
| Perintah | Efek |
|---|---|
/focus <target> |
Ikat utas saat ini (atau buat utas) ke target sub-agent/sesi |
/unfocus |
Hapus pengikatan untuk utas terikat saat ini |
/agents |
Cantumkan proses aktif dan status pengikatan (binding:<id>, unbound, atau bindings unavailable) |
/session idle |
Periksa/perbarui penghilangan fokus otomatis saat tidak aktif (khusus utas terikat yang sedang difokuskan) |
/session max-age |
Periksa/perbarui batas maksimum (khusus utas terikat yang sedang difokuskan) |
Sakelar konfigurasi
- Default global:
session.threadBindings.enabled,session.threadBindings.idleHours,session.threadBindings.maxAgeHours. - Kunci penggantian kanal dan pengikatan otomatis saat spawn bersifat khusus adaptor. Lihat Kanal yang mendukung utas di atas.
Lihat Referensi konfigurasi dan Perintah slash untuk detail adaptor terkini.
Daftar izin
agents.list[].subagents.allowAgentsstring[]Daftar id agen yang dikonfigurasi dan dapat ditargetkan melalui agentId eksplisit (["*"] mengizinkan target apa pun yang dikonfigurasi). Default: hanya agen peminta. Jika Anda menetapkan daftar dan tetap ingin peminta melakukan spawn dirinya sendiri dengan agentId, sertakan id peminta dalam daftar.
agents.defaults.subagents.allowAgentsstring[]Daftar izin agen target terkonfigurasi default yang digunakan ketika agen peminta tidak menetapkan subagents.allowAgents miliknya sendiri.
agents.defaults.subagents.requireAgentIdbooleandefault: falseBlokir panggilan sessions_spawn yang menghilangkan agentId (memaksa pemilihan profil eksplisit). Penggantian per agen: agents.list[].subagents.requireAgentId.
agents.defaults.subagents.announceTimeoutMsnumberdefault: 120000Batas waktu per panggilan untuk upaya pengiriman pengumuman agent Gateway. Nilai berupa milidetik bilangan bulat positif dan dibatasi hingga maksimum timer yang aman bagi platform. Percobaan ulang sementara dapat membuat total waktu tunggu pengumuman lebih lama daripada satu batas waktu yang dikonfigurasi.
Jika sesi peminta berada dalam sandbox, sessions_spawn menolak target
yang akan berjalan di luar sandbox.
Penemuan
Gunakan agents_list untuk melihat id agen mana yang saat ini diizinkan untuk
sessions_spawn. Respons mencakup model efektif dan metadata runtime tertanam
setiap agen yang tercantum sehingga pemanggil dapat membedakan OpenClaw, app-server Codex,
dan runtime native lain yang dikonfigurasi.
Entri allowAgents harus merujuk ke id agen yang dikonfigurasi dalam agents.list[].
["*"] berarti agen target apa pun yang dikonfigurasi beserta peminta. Jika konfigurasi agen
dihapus tetapi id-nya tetap ada dalam allowAgents, sessions_spawn menolak id tersebut
dan agents_list mengabaikannya. Jalankan openclaw doctor --fix untuk membersihkan
entri daftar izin yang usang, atau tambahkan entri agents.list[] minimal jika target harus
tetap dapat dibuat sambil mewarisi nilai default.
Pengarsipan otomatis
- Sesi subagen secara otomatis diarsipkan setelah
agents.defaults.subagents.archiveAfterMinutes(default60). - Pengarsipan menggunakan
sessions.deletedan mengganti nama transkrip menjadi*.deleted.<timestamp>(folder yang sama). cleanup: "delete"langsung mengarsipkan setelah pengumuman (tetap menyimpan transkrip melalui penggantian nama).- Pengarsipan otomatis dilakukan sebisa mungkin; pewaktu yang tertunda akan hilang jika Gateway dimulai ulang.
- Batas waktu eksekusi yang dikonfigurasi tidak melakukan pengarsipan otomatis; batas tersebut hanya menghentikan eksekusi. Sesi tetap ada hingga pengarsipan otomatis.
- Pengarsipan otomatis berlaku sama untuk sesi kedalaman 1 dan kedalaman 2.
- Pembersihan browser terpisah dari pembersihan arsip: tab/proses browser yang dilacak ditutup sebisa mungkin ketika eksekusi selesai, meskipun catatan transkrip/sesi dipertahankan.
Subagen bertingkat
Secara default, subagen tidak dapat membuat subagen mereka sendiri
(maxSpawnDepth: 1). Atur maxSpawnDepth: 2 untuk mengaktifkan satu tingkat
penyarangan — pola orkestrator: utama → subagen orkestrator →
sub-subagen pekerja.
{ agents: { defaults: { subagents: { maxSpawnDepth: 2, // izinkan subagen membuat turunan (default: 1, rentang 1-5) maxChildrenPerAgent: 5, // maksimum turunan aktif per sesi agen (default: 5, rentang 1-20) maxConcurrent: 8, // batas jalur konkurensi global (default: 8) runTimeoutSeconds: 900, // batas waktu default untuk sessions_spawn (0 = tanpa batas waktu) announceTimeoutMs: 120000, // batas waktu pengumuman Gateway per panggilan }, }, },}Tingkat kedalaman
| Kedalaman | Bentuk kunci sesi | Peran | Dapat membuat? |
|---|---|---|---|
| 0 | agent:<id>:main |
Agen utama | Selalu |
| 1 | agent:<id>:subagent:<uuid> |
Subagen (orkestrator saat kedalaman 2 diizinkan) | Hanya jika maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> |
Sub-subagen (pekerja daun) | Tidak pernah |
Rantai pengumuman
Hasil mengalir kembali ke atas melalui rantai:
- Pekerja kedalaman 2 selesai → mengumumkan kepada induknya (orkestrator kedalaman 1).
- Orkestrator kedalaman 1 menerima pengumuman, menyintesis hasil, selesai → mengumumkan kepada agen utama.
- Agen utama menerima pengumuman dan menyampaikannya kepada pengguna.
Setiap tingkat hanya melihat pengumuman dari turunan langsungnya.
Kebijakan alat berdasarkan kedalaman
- Turunan menangkap kebijakan pengirim efektif milik peminta saat dibuat. Eksekusi turunan tanpa pengirim dan kelanjutan operator terautentikasi mempertahankan snapshot tersebut meskipun
toolsBySenderberubah kemudian; pembatasan global, agen, penyedia, sandbox, dan subagen saat ini tetap berlaku. Giliran kanal eksternal baru yang menargetkan turunan akan menyelesaikan ulang kebijakan pengirim saat ini. - Peran dan cakupan kendali ditulis ke metadata sesi saat pembuatan. Hal ini mencegah kunci sesi datar atau yang dipulihkan memperoleh kembali hak istimewa orkestrator secara tidak sengaja.
- Kedalaman 1 (orkestrator, saat
maxSpawnDepth >= 2): mendapatkansessions_spawn,subagents,sessions_list,sessions_historyagar dapat membuat turunan dan memeriksa statusnya. Alat sesi/sistem lainnya tetap ditolak. - Kedalaman 1 (daun, saat
maxSpawnDepth == 1): tanpa alat sesi (perilaku default saat ini). - Kedalaman 2 (pekerja daun): tanpa alat sesi —
sessions_spawnselalu ditolak pada kedalaman 2. Tidak dapat membuat turunan lebih lanjut.
Batas pembuatan per agen
Setiap sesi agen (pada kedalaman apa pun) dapat memiliki paling banyak maxChildrenPerAgent
(default 5) turunan aktif pada satu waktu. Hal ini mencegah fan-out tak terkendali
dari satu orkestrator.
Penghentian berantai
Menghentikan orkestrator kedalaman 1 secara otomatis menghentikan semua turunan kedalaman 2-nya:
/stopdalam obrolan utama menghentikan semua agen kedalaman 1 dan meneruskan penghentian ke turunan kedalaman 2 mereka.
Autentikasi
Autentikasi subagen ditentukan berdasarkan id agen, bukan berdasarkan jenis sesi:
- Kunci sesi subagen adalah
agent:<agentId>:subagent:<uuid>. - Penyimpanan autentikasi dimuat dari
agentDirmilik agen tersebut. - Profil autentikasi agen utama digabungkan sebagai fallback; profil agen menimpa profil utama jika terjadi konflik.
Penggabungan bersifat aditif, sehingga profil utama selalu tersedia sebagai fallback. Autentikasi yang sepenuhnya terisolasi untuk setiap agen belum didukung.
Pengumuman
Subagen melaporkan kembali melalui langkah pengumuman:
- Langkah pengumuman berjalan di dalam sesi subagen (bukan sesi peminta).
- Jika subagen membalas persis
ANNOUNCE_SKIP, tidak ada yang diposting. - Jika teks asisten terbaru adalah token diam persis
NO_REPLY/no_reply, keluaran pengumuman ditekan meskipun sebelumnya ada progres yang terlihat.
Pengiriman bergantung pada kedalaman peminta:
- Sesi peminta tingkat teratas menggunakan panggilan tindak lanjut
agentdengan pengiriman eksternal (deliver=true). - Sesi subagen peminta bertingkat menerima injeksi tindak lanjut internal (
deliver=false) agar orkestrator dapat menyintesis hasil turunan di dalam sesi. - Jika sesi subagen peminta bertingkat sudah tidak ada, OpenClaw beralih ke peminta sesi tersebut jika tersedia.
Untuk sesi peminta tingkat teratas, pengiriman langsung mode penyelesaian terlebih dahulu menentukan rute percakapan/utas terikat dan override hook, lalu mengisi bidang target kanal yang hilang dari rute tersimpan milik sesi peminta. Hal ini menjaga penyelesaian tetap berada pada obrolan/topik yang tepat meskipun asal penyelesaian hanya mengidentifikasi kanal.
Agregasi penyelesaian turunan dibatasi pada eksekusi peminta saat ini ketika membangun temuan penyelesaian bertingkat, sehingga mencegah keluaran turunan dari eksekusi sebelumnya yang usang bocor ke pengumuman saat ini. Balasan pengumuman mempertahankan perutean utas/topik jika tersedia pada adaptor kanal.
Konteks pengumuman
Konteks pengumuman dinormalisasi menjadi blok peristiwa internal yang stabil:
| Bidang | Sumber |
|---|---|
| Sumber | subagent atau cron |
| Id sesi | Kunci/id sesi turunan |
| Jenis | Jenis pengumuman + label tugas |
| Status | Diturunkan dari hasil runtime (ok, error, timeout, atau unknown) — bukan disimpulkan dari teks model |
| Isi hasil | Teks asisten terbaru yang terlihat dari turunan |
| Tindak lanjut | Instruksi yang menjelaskan kapan harus membalas atau tetap diam |
Eksekusi terminal yang gagal melaporkan status kegagalan tanpa memutar ulang teks balasan yang ditangkap. Keluaran alat/toolResult tidak dipromosikan menjadi teks hasil turunan.
Baris statistik
Payload pengumuman menyertakan baris statistik di bagian akhir (bahkan saat dibungkus):
- Runtime (misalnya
runtime 5m12s). - Penggunaan token (masukan/keluaran/total).
- Perkiraan biaya saat harga model dikonfigurasi (
models.providers.*.models[].cost). sessionKey,sessionId, dan jalur transkrip agar agen utama dapat mengambil riwayat melaluisessions_historyatau memeriksa berkas pada disk.
Metadata internal hanya ditujukan untuk orkestrasi; balasan yang ditampilkan kepada pengguna harus ditulis ulang dengan gaya asisten normal.
Mengapa memilih sessions_history
sessions_history adalah jalur orkestrasi yang lebih aman untuk membaca transkrip
turunan dari dalam giliran agen:
- Menyunting teks yang menyerupai kredensial/token meskipun penyuntingan log umum dinonaktifkan.
- Memotong blok teks panjang (4000 karakter per blok) dan membuang tanda tangan pemikiran, payload pemutaran ulang penalaran, serta data gambar sebaris.
- Memberlakukan batas respons 80 KB; baris yang terlalu besar diganti dengan
[sessions_history omitted: message too large]. - Gunakan
nextOffsetjika tersedia untuk menelusuri mundur jendela transkrip yang lebih lama. sessions_historytidak menghapus tag penalaran, kerangka<relevant-memories>, atau XML panggilan alat dari teks pesan — ini mengembalikan blok konten terstruktur yang mendekati bentuk transkrip mentah, hanya saja telah disunting dan dibatasi ukurannya./subagents logmenerapkan pembersih prosa yang lebih menyeluruh (menghapus tag penalaran, kerangka memori, dan XML panggilan alat) karena alat tersebut merender baris obrolan biasa, bukan blok terstruktur.- Pemeriksaan transkrip mentah pada disk adalah fallback ketika Anda memerlukan transkrip lengkap byte demi byte.
Kebijakan alat
Subagen terlebih dahulu menggunakan profil dan pipeline kebijakan alat yang sama dengan agen induk atau target. Setelah itu, OpenClaw menerapkan lapisan pembatasan subagen.
Subagen selalu kehilangan gateway, agents_list, session_status, dan
cron terlepas dari kedalaman atau perannya (alat tingkat sistem/interaktif, atau
alat yang harus dikoordinasikan oleh agen utama). Subagen daun (perilaku default kedalaman 1,
dan selalu pada kedalaman 2) juga kehilangan subagents,
sessions_list, sessions_history, dan sessions_spawn. Subagen tidak pernah
mendapatkan alat message — alat tersebut dinonaktifkan saat pembuatan, bukan difilter oleh
daftar penolakan ini — dan sessions_send tetap ditolak agar subagen
berkomunikasi hanya melalui rantai pengumuman.
sessions_history juga tetap menjadi tampilan pengingatan kembali yang terbatas dan dibersihkan di sini —
bukan dump transkrip mentah.
Saat maxSpawnDepth >= 2, subagen orkestrator kedalaman 1 juga
menerima sessions_spawn, subagents, sessions_list, dan
sessions_history agar dapat mengelola turunannya.
Override melalui konfigurasi
{ agents: { defaults: { subagents: { maxConcurrent: 1, }, }, }, tools: { subagents: { tools: { // penolakan berlaku deny: ["gateway", "cron"], // jika allow ditetapkan, ini menjadi hanya-izinkan (penolakan tetap berlaku) // allow: ["read", "exec", "process"] }, }, },}tools.subagents.tools.allow adalah filter akhir hanya-izinkan. Filter ini dapat mempersempit
kumpulan alat yang telah ditetapkan, tetapi tidak dapat menambahkan kembali alat yang dihapus
oleh tools.profile. Misalnya, tools.profile: "coding" mencakup
web_search/web_fetch, tetapi tidak mencakup alat browser. Agar
subagen berprofil coding dapat menggunakan otomatisasi browser, tambahkan browser pada
tahap profil:
{ tools: { profile: "coding", alsoAllow: ["browser"], },}Gunakan agents.list[].tools.alsoAllow: ["browser"] per agen jika hanya satu
agen yang boleh mendapatkan otomatisasi browser.
Konkurensi
Subagen menggunakan jalur antrean khusus dalam proses:
- Nama jalur:
subagent - Konkurensi:
agents.defaults.subagents.maxConcurrent(default8)
Keaktifan dan pemulihan
OpenClaw tidak menganggap ketiadaan endedAt sebagai bukti permanen bahwa
subagen masih aktif. Proses yang belum berakhir dan lebih lama daripada jendela proses kedaluwarsa
(2 jam, atau batas waktu proses yang dikonfigurasi ditambah masa tenggang singkat,
mana pun yang lebih lama) tidak lagi dihitung sebagai aktif/tertunda dalam /subagents list,
ringkasan status, penghalangan penyelesaian turunan, dan pemeriksaan
konkurensi per sesi.
Setelah Gateway dimulai ulang, proses hasil pemulihan yang belum berakhir dan telah kedaluwarsa akan dibersihkan kecuali
sesi turunannya ditandai abortedLastRun: true. Proses yang dibatalkan
akibat mulai ulang tetap terdaftar untuk alur pemulihan subagen yatim: proses
kedaluwarsa diselesaikan tanpa pelanjutan, sedangkan sesi turunan yang masih baru menerima
pesan pelanjutan sintetis sebelum penanda dibatalkan dihapus.
Pemulihan otomatis setelah mulai ulang dibatasi per sesi turunan. Jika turunan
subagen yang sama diterima berulang kali untuk pemulihan yatim di dalam
jendela kemacetan ulang cepat, OpenClaw menyimpan penanda pemulihan permanen pada
sesi tersebut dan berhenti melanjutkannya secara otomatis pada mulai ulang berikutnya. Jalankan
openclaw tasks maintenance --apply untuk merekonsiliasi catatan tugas, atau
openclaw doctor --fix untuk menghapus tanda pemulihan dibatalkan yang kedaluwarsa pada
sesi yang memiliki penanda permanen.
Menghentikan
- Mengirim
/stopdalam percakapan pemohon akan membatalkan sesi pemohon dan menghentikan semua proses subagen aktif yang dibuat darinya, yang diteruskan ke turunan bertingkat.
Batasan
- Pengumuman subagen bersifat upaya terbaik. Jika Gateway dimulai ulang, pekerjaan "umumkan kembali" yang tertunda akan hilang.
- Subagen tetap berbagi sumber daya proses Gateway yang sama; perlakukan
maxConcurrentsebagai katup pengaman. sessions_spawnselalu tidak memblokir: ini segera mengembalikan{ status: "accepted", runId, childSessionKey }.- Konteks subagen hanya menyuntikkan
AGENTS.mddanTOOLS.md(tanpaSOUL.md,IDENTITY.md,USER.md,MEMORY.md,HEARTBEAT.md, atauBOOTSTRAP.md). Subagen bawaan Codex mengikuti batas yang sama:TOOLS.mdtetap berada dalam instruksi utas Codex yang diwarisi, sedangkan persona khusus induk, identitas, dan berkas pengguna disuntikkan sebagai instruksi kolaborasi yang dicakup per giliran agar turunan tidak mengkloningnya. - Kedalaman bertingkat maksimum adalah 5 (rentang
maxSpawnDepth: 1-5). Kedalaman 2 direkomendasikan untuk sebagian besar kasus penggunaan. maxChildrenPerAgentmembatasi turunan aktif per sesi (default5, rentang1-20).