Agent coordination
เอเจนต์ย่อย
เอเจนต์ย่อยคือการทำงานของเอเจนต์เบื้องหลังที่เริ่มจากการทำงานของเอเจนต์ที่มีอยู่
แต่ละรายการทำงานในเซสชันของตนเอง (agent:<agentId>:subagent:<uuid>) และ
เมื่อเสร็จสิ้นจะ ประกาศ ผลลัพธ์กลับไปยังช่องแชตของผู้ร้องขอ
การทำงานของเอเจนต์ย่อยทุกครั้งจะได้รับการติดตามเป็น งานเบื้องหลัง
เป้าหมาย:
- ทำงานวิจัย งานที่ใช้เวลานาน และงานเครื่องมือที่ทำงานช้าแบบขนาน โดยไม่ปิดกั้นการทำงานหลัก
- แยกเอเจนต์ย่อยออกจากกันโดยค่าเริ่มต้น (แยกเซสชัน และเลือกใช้แซนด์บ็อกซ์ได้)
- ทำให้ชุดเครื่องมือใช้งานผิดได้ยาก: โดยค่าเริ่มต้น เอเจนต์ย่อยจะ ไม่ได้รับ เครื่องมือเซสชันหรือข้อความ
- รองรับความลึกของการซ้อนที่กำหนดค่าได้สำหรับรูปแบบตัวประสานงาน
คำสั่งแบบเครื่องหมายทับ
/subagents ใช้ตรวจสอบการทำงานของเอเจนต์ย่อยสำหรับ เซสชันปัจจุบัน:
/subagents list/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents info แสดงข้อมูลเมตาของการทำงาน (สถานะ การประทับเวลา รหัสเซสชัน
พาธบทสนทนา การล้างข้อมูล) /subagents log แสดงรอบแชตล่าสุดของ
การทำงาน เพิ่มโทเค็น tools เพื่อรวมข้อความการเรียกเครื่องมือ/ผลลัพธ์ (ละไว้
โดยค่าเริ่มต้น) ใช้ sessions_history สำหรับมุมมองเรียกคืนข้อมูลแบบจำกัดขอบเขตและกรองเพื่อความปลอดภัย
จากภายในรอบการทำงานของเอเจนต์ หรือตรวจสอบพาธบทสนทนาบนดิสก์เพื่อดู
บทสนทนาดิบฉบับเต็ม
ใน Control UI เซสชันแม่ที่มีการทำงานของเอเจนต์ลูกล่าสุดจะมีแถวแถบด้านข้าง ที่ขยายได้ แถวที่ซ้อนกันจะแสดงสถานะและระยะเวลาทำงานของเอเจนต์ลูก และเมื่อเลือกแถวใด จะเปิดแชตของเอเจนต์ลูกนั้นโดยยังคงลำดับชั้นของเซสชันแม่ไว้
การควบคุมการผูกเธรด
คำสั่งเหล่านี้ทำงานในช่องที่รองรับการผูกเธรดแบบถาวร ดู ช่องที่รองรับเธรด ด้านล่าง
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>ลักษณะการเริ่มทำงาน
เอเจนต์เริ่มเอเจนต์ย่อยเบื้องหลังด้วยเครื่องมือ sessions_spawn
ผลการทำงานจะส่งกลับเป็นเหตุการณ์ภายในเซสชันแม่ โดยเอเจนต์แม่/ผู้ร้องขอ
จะตัดสินใจว่าจำเป็นต้องแจ้งข้อมูลอัปเดตแก่ผู้ใช้หรือไม่
การเสร็จสิ้นแบบพุชที่ไม่ปิดกั้น
sessions_spawnไม่ปิดกั้น โดยจะส่งคืนรหัสการทำงานทันที- เมื่อเสร็จสิ้น เอเจนต์ย่อยจะรายงานกลับไปยังเซสชันแม่/ผู้ร้องขอ
- รอบการทำงานของเอเจนต์ที่ต้องใช้ผลลัพธ์จากเอเจนต์ลูกควรเรียก
sessions_yieldหลังจากเริ่มงานที่จำเป็นแล้ว การดำเนินการนี้จะสิ้นสุดรอบปัจจุบันและทำให้เหตุการณ์การเสร็จสิ้นมาถึงเป็นข้อความถัดไปที่โมเดลมองเห็น - การเสร็จสิ้นใช้รูปแบบพุช เมื่อเริ่มแล้ว อย่า สำรวจ
/subagents list,sessions_listหรือsessions_historyวนซ้ำเพียงเพื่อรอให้งานเสร็จ ให้ตรวจสอบสถานะตามต้องการเฉพาะเมื่อตรวจแก้จุดบกพร่องเท่านั้น - ผลลัพธ์จากเอเจนต์ลูกคือรายงาน/หลักฐานสำหรับให้เอเจนต์ผู้ร้องขอสังเคราะห์ ไม่ใช่ข้อความคำสั่งที่ผู้ใช้เขียน และไม่สามารถลบล้างนโยบายของระบบ นักพัฒนา หรือผู้ใช้ได้
- เมื่อเสร็จสิ้น OpenClaw จะพยายามปิดแท็บ/กระบวนการเบราว์เซอร์ที่ติดตามไว้ซึ่งเปิดโดยเซสชันเอเจนต์ย่อยนั้น ก่อนที่โฟลว์ล้างข้อมูลหลังการประกาศจะดำเนินต่อไป
การส่งมอบเมื่อเสร็จสิ้น
- OpenClaw ส่งมอบผลการเสร็จสิ้นกลับไปยังเซสชันผู้ร้องขอผ่านรอบ
agentพร้อมคีย์ป้องกันการทำซ้ำที่คงที่ - หากการทำงานของผู้ร้องขอยังคงทำงานอยู่ OpenClaw จะพยายามปลุก/กำกับการทำงานนั้นก่อน แทนที่จะเริ่มเส้นทางตอบกลับที่มองเห็นได้เส้นทางที่สอง
- หากไม่สามารถปลุกผู้ร้องขอที่กำลังทำงานอยู่ได้ OpenClaw จะใช้การส่งมอบต่อไปยังเอเจนต์ผู้ร้องขอพร้อมบริบทการเสร็จสิ้นเดียวกัน แทนที่จะทิ้งการประกาศ
- การส่งมอบต่อไปยังเซสชันแม่ที่สำเร็จถือว่าการส่งมอบของเอเจนต์ย่อยเสร็จสมบูรณ์ แม้เซสชันแม่จะตัดสินใจว่าไม่จำเป็นต้องแจ้งข้อมูลอัปเดตที่ผู้ใช้มองเห็นก็ตาม
- เอเจนต์ย่อยแบบเนทีฟไม่ได้รับเครื่องมือข้อความ โดยจะส่งข้อความธรรมดาของผู้ช่วยกลับไปยังเอเจนต์แม่/ผู้ร้องขอ ส่วนคำตอบที่มนุษย์มองเห็นยังคงอยู่ภายใต้นโยบายการส่งมอบตามปกติของเอเจนต์แม่/ผู้ร้องขอ
- หากไม่สามารถใช้การส่งมอบโดยตรงได้ ระบบจะย้อนกลับไปใช้การกำหนดเส้นทางผ่านคิว แล้วลองประกาศใหม่ด้วยการหน่วงเวลาแบบเลขชี้กำลังระยะสั้น ก่อนยุติความพยายามในท้ายที่สุด
- การส่งมอบจะคงเส้นทางผู้ร้องขอที่แก้ไขแล้วไว้ โดยเส้นทางการเสร็จสิ้นที่ผูกกับเธรดหรือบทสนทนาจะมีลำดับความสำคัญเมื่อพร้อมใช้งาน หากต้นทางการเสร็จสิ้นระบุเพียงช่อง OpenClaw จะเติมเป้าหมาย/บัญชีที่ขาดหายไปจากเส้นทางที่แก้ไขแล้วของเซสชันผู้ร้องขอ (
lastChannel/lastTo/lastAccountId) เพื่อให้การส่งมอบโดยตรงยังคงทำงานได้
ข้อมูลเมตาการส่งมอบต่อเมื่อเสร็จสิ้น
การส่งมอบต่อเมื่อเสร็จสิ้นไปยังเซสชันผู้ร้องขอคือบริบทภายในที่สร้างโดยรันไทม์ (ไม่ใช่ข้อความที่ผู้ใช้เขียน) และประกอบด้วย:
Result— ข้อความตอบกลับassistantล่าสุดที่มองเห็นได้จากเอเจนต์ลูก ผลลัพธ์ tool/toolResult จะไม่ถูกยกระดับเป็นผลลัพธ์ของเอเจนต์ลูก การทำงานที่ล้มเหลวในขั้นสุดท้ายจะไม่นำข้อความตอบกลับที่บันทึกไว้กลับมาใช้ซ้ำStatus—completed; ready for parent review/failed/timed out/unknown- สถิติรันไทม์/โทเค็นแบบกระชับ
- คำสั่งให้ตรวจทาน ซึ่งบอกให้เอเจนต์ผู้ร้องขอตรวจสอบผลลัพธ์ก่อนตัดสินใจว่างานเดิมเสร็จสิ้นแล้วหรือไม่
- คำแนะนำในการติดตามผล ซึ่งบอกให้เอเจนต์ผู้ร้องขอดำเนินงานต่อหรือบันทึกการติดตามผล เมื่อผลลัพธ์จากเอเจนต์ลูกยังเหลือสิ่งที่ต้องดำเนินการ
- คำสั่งสำหรับข้อมูลอัปเดตสุดท้ายในกรณีที่ไม่มีสิ่งที่ต้องดำเนินการเพิ่มเติม เขียนด้วยภาษาปกติของผู้ช่วยโดยไม่ส่งต่อข้อมูลเมตาภายในดิบ
โหมดและรันไทม์ ACP
--modelและ--thinkingกำหนดทับค่าเริ่มต้นสำหรับการทำงานเฉพาะครั้งนั้น- ใช้
info/logเพื่อตรวจสอบรายละเอียดและผลลัพธ์หลังเสร็จสิ้น - สำหรับเซสชันถาวรที่ผูกกับเธรด ให้ใช้
sessions_spawnร่วมกับthread: trueและmode: "session" - หากช่องของผู้ร้องขอไม่รองรับการผูกเธรด ให้ใช้
mode: "run"แทนการลองใช้ชุดค่าที่ผูกกับเธรดซึ่งเป็นไปไม่ได้ซ้ำอีก - สำหรับเซสชันชุดควบคุม ACP (Claude Code, Gemini CLI, OpenCode หรือ Codex ACP/acpx ที่ระบุชัดเจน) ให้ใช้
sessions_spawnร่วมกับruntime: "acp"เมื่อเครื่องมือประกาศรันไทม์นั้น ดู โมเดลการส่งมอบ ACP เมื่อตรวจแก้ปัญหาการเสร็จสิ้นหรือลูประหว่างเอเจนต์ เมื่อเปิดใช้ Plugincodexการควบคุมแชต/เธรด Codex ควรเลือกใช้/codex ...แทน ACP เว้นแต่ผู้ใช้จะขอ ACP/acpx อย่างชัดเจน - OpenClaw ซ่อน
runtime: "acp"ไว้จนกว่าจะเปิดใช้ ACP ผู้ร้องขอไม่ได้อยู่ในแซนด์บ็อกซ์ และโหลด Plugin แบ็กเอนด์ เช่นacpxแล้วruntime: "acp"ต้องการรหัสชุดควบคุม ACP ภายนอก หรือรายการagents.list[]ที่มีruntime.type="acp"ให้ใช้รันไทม์เอเจนต์ย่อยเริ่มต้นสำหรับเอเจนต์การกำหนดค่า OpenClaw ปกติจากagents_list
โหมดบริบท
เอเจนต์ย่อยแบบเนทีฟจะเริ่มโดยแยกออกจากกัน เว้นแต่ผู้เรียกจะขอให้แยกแขนง บทสนทนาปัจจุบันอย่างชัดเจน
| โหมด | ควรใช้เมื่อ | ลักษณะการทำงาน |
|---|---|---|
isolated |
งานวิจัยใหม่ การนำไปใช้ที่เป็นอิสระ งานเครื่องมือที่ทำงานช้า หรือสิ่งใดก็ตามที่อธิบายได้ครบถ้วนในข้อความงาน | สร้างบทสนทนาเอเจนต์ลูกใหม่ที่สะอาด นี่คือค่าเริ่มต้นและช่วยลดการใช้โทเค็น |
fork |
งานที่ขึ้นอยู่กับบทสนทนาปัจจุบัน ผลลัพธ์เครื่องมือก่อนหน้า หรือคำสั่งที่มีรายละเอียดปลีกย่อยซึ่งมีอยู่แล้วในบทสนทนาของผู้ร้องขอ | แยกแขนงบทสนทนาของผู้ร้องขอไปยังเซสชันเอเจนต์ลูกก่อนที่เอเจนต์ลูกจะเริ่มทำงาน |
ใช้ fork เท่าที่จำเป็น ซึ่งมีไว้สำหรับการมอบหมายงานที่ไวต่อบริบท ไม่ใช่
สิ่งทดแทนการเขียนพรอมต์งานที่ชัดเจน
เครื่องมือ: sessions_spawn
เริ่มการทำงานของเอเจนต์ย่อยด้วย deliver: false บนเลน subagent ส่วนกลาง
จากนั้นเรียกขั้นตอนประกาศและโพสต์คำตอบประกาศไปยัง
ช่องแชตของผู้ร้องขอ
ความพร้อมใช้งานขึ้นอยู่กับนโยบายเครื่องมือที่มีผลของผู้เรียก โปรไฟล์
coding ในตัวประกอบด้วย sessions_spawn แต่ messaging และ minimal ไม่มี
full อนุญาตเครื่องมือทุกชนิด เพิ่ม tools.alsoAllow: ["sessions_spawn", "sessions_yield", "subagents"] หรือใช้ tools.profile: "coding" สำหรับ
เอเจนต์ที่ใช้โปรไฟล์แคบกว่าแต่ยังควรมอบหมายงานได้
นโยบายอนุญาต/ปฏิเสธระดับช่อง/กลุ่ม ผู้ให้บริการ แซนด์บ็อกซ์ และรายเอเจนต์
ยังสามารถนำเครื่องมือออกหลังขั้นตอนโปรไฟล์ได้ ใช้ /tools จาก
เซสชันเดียวกันเพื่อยืนยันรายการเครื่องมือที่มีผล
ค่าเริ่มต้น:
- โมเดล: เอเจนต์ย่อยแบบเนทีฟจะสืบทอดจากผู้เรียก เว้นแต่จะกำหนด
agents.defaults.subagents.model(หรือagents.list[].subagents.modelรายเอเจนต์) การเริ่มรันไทม์ ACP จะใช้โมเดลเอเจนต์ย่อยที่กำหนดค่าไว้เช่นกันเมื่อมี มิฉะนั้นชุดควบคุม ACP จะคงค่าเริ่มต้นของตนเองไว้ โดยsessions_spawn.modelที่ระบุชัดเจนจะมีลำดับความสำคัญเสมอ - การคิด: เอเจนต์ย่อยแบบเนทีฟจะสืบทอดจากผู้เรียก เว้นแต่จะกำหนด
agents.defaults.subagents.thinking(หรือagents.list[].subagents.thinkingรายเอเจนต์) การเริ่มรันไทม์ ACP จะใช้agents.defaults.models["provider/model"].params.thinkingกับโมเดลที่เลือกด้วย โดยsessions_spawn.thinkingที่ระบุชัดเจนจะมีลำดับความสำคัญเสมอ - ระยะหมดเวลาการทำงาน: OpenClaw ใช้
agents.defaults.subagents.runTimeoutSecondsเมื่อกำหนดไว้ มิฉะนั้นจะย้อนกลับไปใช้0(ไม่หมดเวลา)sessions_spawnไม่รองรับการกำหนดระยะหมดเวลาทับในแต่ละครั้ง - การส่งมอบงาน: เอเจนต์ย่อยแบบเนทีฟจะได้รับงานที่มอบหมายในข้อความ
[Subagent Task]แรกที่มองเห็นได้ พรอมต์ระบบของเอเจนต์ย่อยมีข้อกำหนดรันไทม์และบริบทการกำหนดเส้นทาง ไม่ใช่สำเนางานที่ซ่อนไว้และซ้ำกัน
การเริ่มเอเจนต์ย่อยแบบเนทีฟที่ยอมรับแล้วจะรวมข้อมูลเมตาของโมเดลเอเจนต์ลูกที่แก้ไขแล้ว
ไว้ในผลลัพธ์เครื่องมือ: resolvedModel มีการอ้างอิงโมเดลที่ใช้ และ
resolvedProvider มีคำนำหน้าผู้ให้บริการเมื่อการอ้างอิงนั้นมีคำนำหน้า
โหมดพรอมต์การมอบหมายงาน
agents.defaults.subagents.delegationMode ควบคุมเฉพาะคำแนะนำในพรอมต์ โดยไม่เปลี่ยนนโยบายเครื่องมือหรือบังคับใช้การมอบหมายงาน
suggest(ค่าเริ่มต้น): คงคำแนะนำมาตรฐานในพรอมต์ให้ใช้เอเจนต์ย่อยสำหรับงานที่ใหญ่ขึ้นหรือช้าลงprefer: บอกเอเจนต์หลักให้พร้อมตอบสนอง และมอบหมายสิ่งที่ซับซ้อนกว่าการตอบโดยตรงผ่านsessions_spawn
การกำหนดทับรายเอเจนต์: agents.list[].subagents.delegationMode
{ agents: { defaults: { subagents: { delegationMode: "prefer", maxConcurrent: 4, }, }, list: [ { id: "coordinator", subagents: { delegationMode: "prefer" }, }, ], },}พารามิเตอร์ของเครื่องมือ
taskstringrequiredคำอธิบายงานสำหรับเอเจนต์ย่อย
taskNamestringชื่ออ้างอิงแบบคงที่ซึ่งกำหนดหรือไม่ก็ได้ สำหรับระบุเอเจนต์ลูกที่เจาะจงในผลลัพธ์สถานะภายหลัง ต้องตรงกับ [a-z][a-z0-9_-]{0,63} และต้องไม่เป็นเป้าหมายสงวน เช่น last หรือ all
labelstringป้ายกำกับที่มนุษย์อ่านได้ซึ่งกำหนดหรือไม่ก็ได้
agentIdstringสร้างภายใต้รหัสเอเจนต์อื่นที่กำหนดค่าไว้ เมื่อ subagents.allowAgents อนุญาต
cwdstringไดเรกทอรีทำงานของงานซึ่งกำหนดหรือไม่ก็ได้สำหรับการทำงานของเอเจนต์ลูก เอเจนต์ย่อยแบบเนทีฟยังคงโหลดไฟล์บูตสแตรปจากพื้นที่ทำงานของเอเจนต์เป้าหมาย ส่วน cwd เปลี่ยนเฉพาะตำแหน่งที่เครื่องมือรันไทม์และชุดควบคุม CLI ทำงานที่มอบหมาย
runtime"subagent" | "acp"default: subagentacp ใช้เฉพาะกับชุดควบคุม ACP ภายนอก (claude, droid, gemini, opencode หรือ Codex ACP/acpx ที่ร้องขออย่างชัดเจน) และกับรายการ agents.list[] ซึ่งมี runtime.type เป็น acp เท่านั้น
resumeSessionIdstringสำหรับ ACP เท่านั้น ดำเนินเซสชันชุดควบคุม 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การหมดเวลาต่อการเรียกสำหรับความพยายามส่งประกาศของ Gateway agent ค่าเป็นจำนวนเต็มบวกหน่วยมิลลิวินาทีและจะถูกจำกัดไว้ที่ค่าสูงสุดของตัวจับเวลาที่ปลอดภัยสำหรับแพลตฟอร์ม การลองใหม่จากข้อผิดพลาดชั่วคราวอาจทำให้เวลารอประกาศรวมยาวนานกว่าค่าหมดเวลาที่กำหนดไว้หนึ่งรอบ
หากเซสชันผู้ร้องขอทำงานในแซนด์บ็อกซ์ 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 หากต้องการให้
เอเจนต์ย่อยโปรไฟล์การเขียนโค้ดใช้ระบบอัตโนมัติของเบราว์เซอร์ ให้เพิ่ม 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 เริ่มทำงานใหม่ งาน "announce back" ที่รอดำเนินการจะสูญหาย
- เอเจนต์ย่อยยังคงใช้ทรัพยากรโพรเซส 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)