Agent coordination
เอเจนต์ย่อย
Sub-agent คือการทำงานของเอเจนต์เบื้องหลังที่เริ่มจากการทำงานของเอเจนต์ที่มีอยู่
แต่ละรายการทำงานในเซสชันของตนเอง (agent:<agentId>:subagent:<uuid>) และ
เมื่อเสร็จแล้วจะ แจ้ง ผลลัพธ์กลับไปยังช่องแชตของผู้ร้องขอ
การทำงานของ Sub-agent ทุกรายการจะถูกติดตามเป็น งานเบื้องหลัง
เป้าหมาย:
- ทำงานวิจัย งานที่ใช้เวลานาน และงานเครื่องมือที่ทำงานช้าแบบขนาน โดยไม่ขัดขวางการทำงานหลัก
- แยก Sub-agent ออกจากกันโดยค่าเริ่มต้น (แยกเซสชันและเลือกใช้แซนด์บ็อกซ์ได้)
- ทำให้ขอบเขตเครื่องมือใช้ผิดได้ยาก: โดยค่าเริ่มต้น Sub-agent จะ ไม่ได้รับ เครื่องมือเซสชันหรือการส่งข้อความ
- รองรับความลึกของการซ้อนที่กำหนดค่าได้สำหรับรูปแบบออร์เคสเตรเตอร์
คำสั่งแบบสแลช
/subagents ใช้ตรวจสอบการทำงานของ Sub-agent สำหรับ เซสชันปัจจุบัน:
/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>ลักษณะการเริ่มทำงาน
เอเจนต์เริ่ม Sub-agent เบื้องหลังด้วยเครื่องมือ sessions_spawn
ผลการทำงานจะส่งกลับมาเป็นเหตุการณ์ภายในเซสชันหลัก เอเจนต์หลัก/ผู้ร้องขอ
เป็นผู้ตัดสินใจว่าจำเป็นต้องแจ้งข้อมูลอัปเดตที่ผู้ใช้มองเห็นหรือไม่
Non-blocking, push-based completion
sessions_spawnไม่ปิดกั้นการทำงาน และส่งคืนรหัสการทำงานทันที- เมื่อเสร็จสิ้น Sub-agent จะรายงานกลับไปยังเซสชันหลัก/เซสชันของผู้ร้องขอ
- รอบการทำงานของเอเจนต์ที่ต้องใช้ผลลัพธ์จากเอเจนต์ลูกควรเรียก
sessions_yieldหลังจากเริ่มงานที่จำเป็นแล้ว การทำเช่นนี้จะสิ้นสุดรอบปัจจุบันและทำให้เหตุการณ์เสร็จสิ้นมาถึงเป็นข้อความถัดไปที่โมเดลมองเห็น - การเสร็จสิ้นใช้การส่งแบบพุช เมื่อเริ่มแล้ว ห้าม วนสำรวจ
/subagents list,sessions_listหรือsessions_historyเพียงเพื่อรอให้งานเสร็จ ให้ตรวจสอบสถานะเมื่อต้องการเท่านั้นในระหว่างการแก้จุดบกพร่อง - ผลลัพธ์จากเอเจนต์ลูกเป็นรายงาน/หลักฐานสำหรับให้เอเจนต์ผู้ร้องขอสังเคราะห์ ไม่ใช่ข้อความคำสั่งจากผู้ใช้และไม่สามารถแทนที่นโยบายระดับระบบ นักพัฒนา หรือผู้ใช้ได้
- เมื่อเสร็จสิ้น OpenClaw จะพยายามอย่างเต็มที่ในการปิดแท็บ/กระบวนการของเบราว์เซอร์ที่เซสชัน Sub-agent นั้นเปิดไว้ ก่อนที่ขั้นตอนล้างข้อมูลหลังการแจ้งจะดำเนินต่อ
Completion delivery
- OpenClaw ส่งผลการเสร็จสิ้นกลับไปยังเซสชันของผู้ร้องขอผ่านรอบการทำงาน
agentโดยใช้คีย์ไอดิมโพเทนซีที่คงที่ - หากการทำงานของผู้ร้องขอยังทำงานอยู่ OpenClaw จะพยายามปลุก/กำกับการทำงานนั้นก่อน แทนที่จะเริ่มเส้นทางตอบกลับที่ผู้ใช้มองเห็นเส้นทางที่สอง
- หากไม่สามารถปลุกผู้ร้องขอที่กำลังทำงานอยู่ได้ OpenClaw จะเปลี่ยนไปส่งต่องานให้เอเจนต์ของผู้ร้องขอพร้อมบริบทการเสร็จสิ้นเดิม แทนที่จะละทิ้งการแจ้ง
- การส่งต่อไปยังเอเจนต์หลักสำเร็จถือว่าการส่งมอบจาก Sub-agent เสร็จสมบูรณ์ แม้เอเจนต์หลักจะตัดสินใจว่าไม่จำเป็นต้องแจ้งข้อมูลอัปเดตที่ผู้ใช้มองเห็น
- Sub-agent แบบเนทีฟไม่ได้รับเครื่องมือส่งข้อความ โดยจะส่งข้อความผู้ช่วยแบบธรรมดากลับไปยังเอเจนต์หลัก/เอเจนต์ผู้ร้องขอ ส่วนการตอบกลับที่มนุษย์มองเห็นยังอยู่ภายใต้นโยบายการส่งมอบตามปกติของเอเจนต์หลัก/เอเจนต์ผู้ร้องขอ
- หากใช้การส่งต่อโดยตรงไม่ได้ การส่งมอบจะเปลี่ยนไปใช้การกำหนดเส้นทางผ่านคิว จากนั้นลองแจ้งใหม่ด้วยการหน่วงเวลาแบบเอ็กซ์โพเนนเชียลช่วงสั้น ๆ ก่อนยุติความพยายามในท้ายที่สุด
- การส่งมอบจะคงเส้นทางของผู้ร้องขอที่แก้ไขแล้ว: เส้นทางการเสร็จสิ้นที่ผูกกับเธรดหรือการสนทนาจะมีสิทธิ์ก่อนเมื่อพร้อมใช้ หากต้นทางของการเสร็จสิ้นระบุเพียงช่อง OpenClaw จะเติมปลายทาง/บัญชีที่ขาดหายจากเส้นทางที่แก้ไขแล้วของเซสชันผู้ร้องขอ (
lastChannel/lastTo/lastAccountId) เพื่อให้การส่งมอบโดยตรงยังคงทำงานได้
Completion handoff metadata
บริบทภายในสำหรับส่งต่อผลการเสร็จสิ้นไปยังเซสชันของผู้ร้องขอถูกสร้างขึ้น ระหว่างการทำงาน (ไม่ใช่ข้อความที่ผู้ใช้เขียน) และประกอบด้วย:
Result— ข้อความตอบกลับassistantล่าสุดที่มองเห็นได้จากเอเจนต์ลูก เอาต์พุตTool/toolResultจะไม่ถูกยกระดับเป็นผลลัพธ์ของเอเจนต์ลูก การทำงานที่ล้มเหลวในสถานะสิ้นสุดจะไม่นำข้อความตอบกลับที่บันทึกไว้กลับมาใช้Status—completed; ready for parent review/failed/timed out/unknown- สถิติรันไทม์/โทเค็นแบบย่อ
- คำสั่งตรวจสอบที่บอกให้เอเจนต์ผู้ร้องขอยืนยันผลลัพธ์ก่อนตัดสินใจว่างานต้นฉบับเสร็จแล้วหรือไม่
- คำแนะนำในการติดตามผลที่บอกให้เอเจนต์ผู้ร้องขอดำเนินงานต่อหรือบันทึกการติดตามผล เมื่อผลลัพธ์จากเอเจนต์ลูกยังเหลือสิ่งที่ต้องดำเนินการ
- คำสั่งสำหรับข้อมูลอัปเดตสุดท้ายในกรณีที่ไม่ต้องดำเนินการเพิ่มเติม โดยเขียนด้วยสำนวนผู้ช่วยตามปกติและไม่ส่งต่อข้อมูลเมตาภายในแบบดิบ
Modes and ACP runtime
--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"ให้ใช้รันไทม์ Sub-agent เริ่มต้นสำหรับเอเจนต์การกำหนดค่า OpenClaw ปกติจากagents_list
โหมดบริบท
Sub-agent แบบเนทีฟจะเริ่มต้นโดยแยกออกจากกัน เว้นแต่ผู้เรียกจะขอแยกสาขา จากบทสนทนาปัจจุบันอย่างชัดเจน
| โหมด | ควรใช้เมื่อ | ลักษณะการทำงาน |
|---|---|---|
isolated |
งานวิจัยใหม่ การนำไปใช้ที่เป็นอิสระ งานเครื่องมือที่ทำงานช้า หรือสิ่งใดก็ตามที่อธิบายได้ครบถ้วนในข้อความงาน | สร้างบทสนทนาเอเจนต์ลูกใหม่ที่สะอาด นี่คือค่าเริ่มต้นและช่วยลดการใช้โทเค็น |
fork |
งานที่พึ่งพาการสนทนาปัจจุบัน ผลลัพธ์จากเครื่องมือก่อนหน้า หรือคำสั่งที่มีรายละเอียดปลีกย่อยซึ่งมีอยู่แล้วในบทสนทนาของผู้ร้องขอ | แยกสาขาบทสนทนาของผู้ร้องขอไปยังเซสชันเอเจนต์ลูกก่อนที่เอเจนต์ลูกจะเริ่มทำงาน |
ใช้ fork เท่าที่จำเป็น โหมดนี้มีไว้สำหรับการมอบหมายงานที่อ่อนไหวต่อบริบท
ไม่ใช่สิ่งทดแทนการเขียนพรอมต์งานที่ชัดเจน
เครื่องมือ: sessions_spawn
เริ่มการทำงานของ Sub-agent ด้วย deliver: false บนเลน subagent ส่วนกลาง
จากนั้นดำเนินขั้นตอนการแจ้งและโพสต์คำตอบการแจ้งไปยังช่องแชตของผู้ร้องขอ
ความพร้อมใช้งานขึ้นอยู่กับนโยบายเครื่องมือที่มีผลกับผู้เรียก โปรไฟล์ coding
ที่มีมาให้รวม sessions_spawn ส่วน messaging และ minimal ไม่รวม
full อนุญาตเครื่องมือทุกชนิด เพิ่ม tools.alsoAllow: ["sessions_spawn", "sessions_yield", "subagents"] หรือใช้ tools.profile: "coding" สำหรับ
เอเจนต์ที่ใช้โปรไฟล์แคบกว่าแต่ยังควรมอบหมายงานได้
นโยบายอนุญาต/ปฏิเสธระดับช่อง/กลุ่ม ผู้ให้บริการ แซนด์บ็อกซ์ และรายเอเจนต์
ยังคงสามารถนำเครื่องมือออกได้หลังขั้นตอนโปรไฟล์ ใช้ /tools จากเซสชันเดียวกัน
เพื่อยืนยันรายการเครื่องมือที่มีผลจริง
ค่าเริ่มต้น:
- โมเดล: Sub-agent แบบเนทีฟสืบทอดค่าจากผู้เรียก เว้นแต่คุณจะกำหนด
agents.defaults.subagents.model(หรือagents.list[].subagents.modelรายเอเจนต์) การเริ่มรันไทม์ ACP ใช้โมเดล Sub-agent ที่กำหนดค่าไว้เดียวกันเมื่อมี มิฉะนั้นชุดควบคุม ACP จะคงค่าเริ่มต้นของตนเองไว้ การระบุsessions_spawn.modelอย่างชัดเจนยังคงมีสิทธิ์ก่อน - การคิด: Sub-agent แบบเนทีฟสืบทอดค่าจากผู้เรียก เว้นแต่คุณจะกำหนด
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ไม่รองรับการแทนที่เวลาหมดอายุแยกตามการเรียก - การส่งมอบงาน: Sub-agent แบบเนทีฟได้รับงานที่มอบหมายในข้อความ
[Subagent Task]แรกที่มองเห็นได้ พรอมต์ระบบของ Sub-agent มีหลักเกณฑ์รันไทม์และบริบทการกำหนดเส้นทาง ไม่ได้มีสำเนางานที่ซ่อนไว้อีกชุดหนึ่ง
การเริ่ม Sub-agent แบบเนทีฟที่ได้รับการยอมรับจะรวมข้อมูลเมตาของโมเดลเอเจนต์ลูก
ที่แก้ไขแล้วไว้ในผลลัพธ์เครื่องมือ: resolvedModel มีการอ้างอิงโมเดลที่นำไปใช้ และ
resolvedProvider มีคำนำหน้าผู้ให้บริการเมื่อการอ้างอิงนั้นมีคำนำหน้า
โหมดพรอมต์การมอบหมายงาน
agents.defaults.subagents.delegationMode ควบคุมเฉพาะคำแนะนำในพรอมต์ โดยไม่เปลี่ยนนโยบายเครื่องมือหรือบังคับการมอบหมายงาน
suggest(ค่าเริ่มต้น): คงคำแนะนำมาตรฐานให้ใช้ Sub-agent สำหรับงานขนาดใหญ่หรืองานที่ช้ากว่า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 เท่านั้น ดำเนินเซสชันของชุดเครื่องมือ ACP ที่มีอยู่ต่อเมื่อ runtime: "acp" และจะถูกละเว้นสำหรับการสร้างเอเจนต์ย่อยแบบเนทีฟ
streamTo"parent"สำหรับ ACP เท่านั้น สตรีมผลลัพธ์การทำงานของ ACP ไปยังเซสชันแม่เมื่อ runtime: "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 จะผูกกับ
การสนทนาปัจจุบัน ใช้คีย์กำหนดค่า threadBindings ของแต่ละช่องทางสำหรับ
การเปิดใช้ ระยะหมดเวลา และ spawnSessions
ขั้นตอนแบบย่อ
สร้าง
ใช้ 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 จะปฏิเสธเป้าหมาย
ที่จะทำงานนอกแซนด์บ็อกซ์
การค้นหา
ใช้ agents_list เพื่อดูว่าปัจจุบันรหัสเอเจนต์ใดได้รับอนุญาตสำหรับ
sessions_spawn การตอบกลับจะรวมโมเดลที่มีผลของเอเจนต์แต่ละรายการและ
ข้อมูลเมตารันไทม์ที่ฝังไว้ เพื่อให้ผู้เรียกแยกแยะ OpenClaw, Codex
app-server และรันไทม์แบบเนทีฟอื่น ๆ ที่กำหนดค่าไว้ได้
รายการ 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) — ไม่ได้ อนุมานจากข้อความของโมเดล |
| เนื้อหาผลลัพธ์ | ข้อความล่าสุดของผู้ช่วยที่มองเห็นได้จากเอเจนต์ลูก |
| การติดตามผล | คำสั่งที่อธิบายว่าควรตอบกลับเมื่อใดหรือควรเงียบต่อไป |
การทำงานที่ล้มเหลวในสถานะปลายทางจะรายงานสถานะความล้มเหลวโดยไม่นำข้อความตอบกลับที่บันทึกไว้มาเล่นซ้ำ เอาต์พุต tool/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)