Agent coordination
เอเจนต์ย่อย
Sub-agent คือการทำงานของเอเจนต์เบื้องหลังที่สร้างขึ้นจากการทำงานของเอเจนต์ที่มีอยู่
แต่ละรายการทำงานในเซสชันของตนเอง (agent:<agentId>:subagent:<uuid>) และ
เมื่อเสร็จสิ้นจะ ประกาศ ผลลัพธ์กลับไปยังช่องแชตของผู้ร้องขอ
การทำงานของ Sub-agent ทุกรายการจะถูกติดตามเป็น งานเบื้องหลัง
เป้าหมาย:
- ทำงานวิจัย งานที่ใช้เวลานาน และงานเครื่องมือที่ทำงานช้าแบบขนาน โดยไม่ขัดขวางการทำงานหลัก
- แยก Sub-agent ออกจากกันโดยค่าเริ่มต้น (แยกเซสชันและเลือกใช้แซนด์บ็อกซ์ได้)
- ทำให้ชุดเครื่องมือใช้ผิดได้ยาก: โดยค่าเริ่มต้น Sub-agent จะ ไม่ได้รับ เครื่องมือเซสชันหรือการส่งข้อความ
- รองรับความลึกของการซ้อนที่กำหนดค่าได้สำหรับรูปแบบออร์เคสเตรเตอร์
คำสั่ง Slash
/subagents ใช้ตรวจสอบการทำงานของ Sub-agent สำหรับ เซสชันปัจจุบัน:
/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>ลักษณะการสร้าง
เอเจนต์เริ่ม Sub-agent เบื้องหลังด้วยเครื่องมือ sessions_spawn
ผลลัพธ์เมื่อเสร็จสิ้นจะกลับมาเป็นเหตุการณ์ภายในของเซสชันแม่ โดยเอเจนต์แม่/ผู้ร้องขอ
จะตัดสินใจว่าจำเป็นต้องแจ้งข้อมูลอัปเดตให้ผู้ใช้เห็นหรือไม่
การเสร็จสิ้นแบบไม่บล็อกและผลักข้อมูล
sessions_spawnไม่บล็อกการทำงาน และจะส่งคืนรหัสการทำงานทันที- เมื่อเสร็จสิ้น Sub-agent จะรายงานกลับไปยังเซสชันแม่/ผู้ร้องขอ
- รอบการทำงานของเอเจนต์ที่ต้องใช้ผลลัพธ์จากเอเจนต์ลูกควรเรียก
sessions_yieldหลังจากสร้างงานที่จำเป็นแล้ว การดำเนินการนี้จะจบรอบการทำงานปัจจุบันและทำให้เหตุการณ์เสร็จสิ้นเข้ามาเป็นข้อความถัดไปที่โมเดลมองเห็น - การเสร็จสิ้นทำงานแบบผลักข้อมูล เมื่อสร้างแล้ว ห้าม วนสำรวจ
/subagents list,sessions_listหรือsessions_historyเพียงเพื่อรอให้เสร็จ ให้ตรวจสอบสถานะตามความจำเป็นเฉพาะเมื่อตรวจแก้จุดบกพร่อง - ผลลัพธ์จากเอเจนต์ลูกเป็นรายงาน/หลักฐานสำหรับให้เอเจนต์ของผู้ร้องขอสังเคราะห์ ไม่ใช่ข้อความคำสั่งที่ผู้ใช้เขียน และไม่สามารถแทนที่นโยบายของระบบ นักพัฒนา หรือผู้ใช้ได้
- เมื่อเสร็จสิ้น OpenClaw จะพยายามปิดแท็บ/กระบวนการเบราว์เซอร์ที่ติดตามไว้ซึ่งเปิดโดยเซสชัน Sub-agent นั้นก่อนดำเนินขั้นตอนล้างข้อมูลของการประกาศต่อ
การส่งมอบเมื่อเสร็จสิ้น
- OpenClaw ส่งผลลัพธ์เมื่อเสร็จสิ้นกลับไปยังเซสชันของผู้ร้องขอผ่านรอบการทำงาน
agentพร้อมคีย์ป้องกันการทำซ้ำที่เสถียร - หากการทำงานของผู้ร้องขอยังคงทำงานอยู่ OpenClaw จะพยายามปลุก/กำกับการทำงานนั้นก่อน แทนที่จะเริ่มเส้นทางตอบกลับที่มองเห็นได้เส้นทางที่สอง
- หากไม่สามารถปลุกผู้ร้องขอที่กำลังทำงานอยู่ได้ OpenClaw จะส่งต่องานไปยังเอเจนต์ของผู้ร้องขอพร้อมบริบทการเสร็จสิ้นเดียวกัน แทนที่จะละทิ้งการประกาศ
- การส่งต่องานไปยังเอเจนต์แม่ที่สำเร็จถือว่าการส่งมอบจาก Sub-agent เสร็จสมบูรณ์ แม้เอเจนต์แม่จะตัดสินใจว่าไม่จำเป็นต้องแจ้งข้อมูลอัปเดตที่ผู้ใช้มองเห็น
- Sub-agent แบบเนทีฟจะไม่ได้รับเครื่องมือส่งข้อความ โดยจะส่งข้อความธรรมดาของผู้ช่วยกลับไปยังเอเจนต์แม่/ผู้ร้องขอ ส่วนการตอบกลับที่มนุษย์มองเห็นยังอยู่ภายใต้นโยบายการส่งมอบตามปกติของเอเจนต์แม่/ผู้ร้องขอ
- หากใช้การส่งต่องานโดยตรงไม่ได้ การส่งมอบจะเปลี่ยนไปใช้การกำหนดเส้นทางผ่านคิว จากนั้นลองประกาศซ้ำแบบหน่วงเวลาเพิ่มขึ้นทวีคูณช่วงสั้นๆ ก่อนยุติความพยายาม
- การส่งมอบจะรักษาเส้นทางของผู้ร้องขอที่แก้ไขแล้ว: เส้นทางการเสร็จสิ้นที่ผูกกับเธรดหรือการสนทนาจะมีลำดับความสำคัญเมื่อพร้อมใช้งาน หากต้นทางของการเสร็จสิ้นระบุเพียงช่อง 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"ให้ใช้รันไทม์ Sub-agent เริ่มต้นสำหรับเอเจนต์การกำหนดค่า OpenClaw ปกติจากagents_list
โหมดบริบท
Sub-agent แบบเนทีฟจะเริ่มต้นโดยแยกออกจากกัน เว้นแต่ผู้เรียกจะขอแยกแขนง บทสนทนาปัจจุบันอย่างชัดเจน
| โหมด | ควรใช้เมื่อ | ลักษณะการทำงาน |
|---|---|---|
isolated |
การวิจัยใหม่ การนำไปใช้ที่เป็นอิสระ งานเครื่องมือที่ทำงานช้า หรือสิ่งใดก็ตามที่สามารถอธิบายในข้อความงานได้อย่างครบถ้วน | สร้างบทสนทนาของเอเจนต์ลูกใหม่ทั้งหมด นี่คือค่าเริ่มต้นและช่วยลดการใช้โทเค็น |
fork |
งานที่ขึ้นอยู่กับการสนทนาปัจจุบัน ผลลัพธ์เครื่องมือก่อนหน้า หรือคำสั่งที่มีรายละเอียดซึ่งอยู่ในบทสนทนาของผู้ร้องขอแล้ว | แยกแขนงบทสนทนาของผู้ร้องขอไปยังเซสชันเอเจนต์ลูกก่อนที่เอเจนต์ลูกจะเริ่มทำงาน |
ใช้ fork เท่าที่จำเป็น โหมดนี้มีไว้สำหรับการมอบหมายงานที่อ่อนไหวต่อบริบท ไม่ใช่
สิ่งทดแทนการเขียนพรอมต์งานให้ชัดเจน
เครื่องมือ: sessions_spawn
เริ่มการทำงานของ Sub-agent ด้วย deliver: false บนเลน subagent ส่วนกลาง
จากนั้นดำเนินขั้นตอนประกาศและโพสต์ข้อความตอบกลับของการประกาศไปยัง
ช่องแชตของผู้ร้องขอ
ความพร้อมใช้งานขึ้นอยู่กับนโยบายเครื่องมือที่มีผลกับผู้เรียก โปรไฟล์ในตัว
coding และ messaging มี sessions_spawn,
sessions_yield และ subagents ส่วน minimal ไม่มี full อนุญาต
เครื่องมือทั้งหมด เพิ่มเครื่องมือเหล่านั้นด้วย tools.alsoAllow หรือใช้โปรไฟล์ใดโปรไฟล์หนึ่ง
ข้างต้น สำหรับเอเจนต์ที่ใช้โปรไฟล์กำหนดเองซึ่งแคบกว่าแต่ยังต้อง
มอบหมายงาน
นโยบายอนุญาต/ปฏิเสธของช่อง/กลุ่ม ผู้ให้บริการ แซนด์บ็อกซ์ และรายเอเจนต์
ยังสามารถนำเครื่องมือออกหลังขั้นตอนโปรไฟล์ได้ ใช้ /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 ของ OpenClaw ที่แยกออกมามีวงจรชีวิตการทำงานของตนเอง งานเบื้องหลังที่สร้างภายในแบ็กเอนด์ CLI ภายนอกแตกต่างออกไป โดยใช้กระบวนการย่อย CLI ร่วมกับเอเจนต์แม่และจะหยุดหากเอเจนต์แม่นั้นเข้าสู่
agents.defaults.timeoutSeconds - การส่งมอบงาน: 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แทนที่ระดับการคิดสำหรับการรันของเอเจนต์ย่อย ใช้ไม่ได้กับ visible: true
threadbooleandefault: falseเมื่อ true ให้ร้องขอการผูกเธรดของช่องทางสำหรับเซสชันเอเจนต์ย่อยนี้
mode"run" | "session"default: runหากเป็น thread: true และละเว้น mode ค่าเริ่มต้นจะกลายเป็น session โดย mode: "session" ต้องใช้ thread: true
หากช่องทางของผู้ร้องขอไม่รองรับการผูกเธรด ให้ใช้ mode: "run" แทน
เมื่อใช้ visible: true ให้ละเว้น mode; เซสชันที่มองเห็นได้จะคงอยู่ถาวรและไม่รองรับ mode: "run"
cleanup"delete" | "keep"default: keep"delete" เก็บเซสชันเข้าคลังทันทีหลังประกาศ (ยังคงเก็บทรานสคริปต์ไว้ผ่านการเปลี่ยนชื่อ)
sandbox"inherit" | "require"default: inheritrequire ปฏิเสธการสร้างเว้นแต่รันไทม์ของเอเจนต์ลูกเป้าหมายจะทำงานในแซนด์บ็อกซ์
context"isolated" | "fork"default: isolatedfork แตกแขนงทรานสคริปต์ปัจจุบันของผู้ร้องขอไปยังเซสชันลูก สำหรับเอเจนต์ย่อยแบบเนทีฟเท่านั้น การสร้างที่ผูกกับเธรดมีค่าเริ่มต้นเป็น fork; การสร้างที่ไม่ผูกกับเธรดมีค่าเริ่มต้นเป็น isolated การแตกแขนงที่มองเห็นได้ต้องกำหนดเป้าหมายเป็นเอเจนต์เดียวกับผู้ร้องขอ
visiblebooleandefault: falseสร้างเซสชันแดชบอร์ดถาวรที่ผู้ใช้สามารถเปิดใน Control UI ได้ การสร้างที่มองเห็นได้รองรับเฉพาะ runtime: "subagent" และจะเก็บเซสชันที่สร้างไว้เสมอ
worktreebooleandefault: falseจัดเตรียม git worktree ที่มีการจัดการสำหรับเซสชันแดชบอร์ดใหม่ ต้องใช้ visible: true
worktreeNamestringชื่อ worktree ที่มีการจัดการซึ่งระบุหรือไม่ก็ได้ ต้องใช้ visible: true และ worktree: true
worktreeBaseRefstringgit base ref ที่ระบุหรือไม่ก็ได้สำหรับ worktree ที่มีการจัดการ ต้องใช้ visible: true และ worktree: true
เมื่อใช้ visible: true จะรองรับ model, cwd และ context: "fork" ของเอเจนต์เดียวกัน เป้าหมายที่อยู่ในแซนด์บ็อกซ์จะจำกัด cwd ไว้ที่พื้นที่ทำงานของเอเจนต์นั้น การผูกเธรด, mode, การแทนที่การคิด, lightContext, attachments และ attachAs ใช้ไม่ได้ในเส้นทางนี้ เนื่องจากเซสชันที่มองเห็นได้เป็นเซสชันแดชบอร์ดถาวรที่สร้างผ่าน sessions.create การสร้างที่มองเห็นได้จะถูกปฏิเสธเมื่อผู้ร้องขอเองถูกสร้างโดยสืบทอดรายการอนุญาตหรือรายการปฏิเสธเครื่องมือ ข้อจำกัดนี้ถูกกำหนดตายตัว ณ เวลาที่สร้างและไม่มีการกำหนดค่าใดแทนที่ได้ การแสดงรายการและการระบุเซสชันเป็นไปตาม tools.sessions.visibility; ขอบเขตเริ่มต้น tree ครอบคลุมเซสชันปัจจุบันและแผนผังย่อยการสร้างของเซสชันนั้น ดู worktree ที่มีการจัดการ สำหรับลักษณะการตั้งชื่อ checkout การตั้งค่า การล้างข้อมูล และการกู้คืน
ชื่องานและการกำหนดเป้าหมาย
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
แสดงรายการการรันเอเจนต์ย่อยที่สร้างขึ้นและบันทึกงานเบื้องหลังซึ่งเป็นของ แผนผังเซสชันผู้ร้องขอ แถวงานครอบคลุมเอเจนต์ย่อยแบบเนทีฟ การรัน ACP งาน CLI/สื่อของ Gateway และการดำเนินการ Cron ขอบเขตจำกัดอยู่ที่ผู้ร้องขอปัจจุบัน เอเจนต์ลูกจะเห็นได้เฉพาะเอเจนต์ลูกที่ตนควบคุมเท่านั้น
ใช้ subagents สำหรับตรวจสอบสถานะและแก้ไขข้อบกพร่องตามต้องการ ใช้ sessions_yield เพื่อ
รอเหตุการณ์การทำงานเสร็จ
ใช้ action: "cancel" พร้อม taskId ที่ส่งคืนโดย action: "list" เพื่อหยุด
งาน การยกเลิกจำกัดอยู่ภายในแผนผังเซสชันที่ควบคุม เอเจนต์ย่อยปลายทาง
ไม่สามารถยกเลิกงานที่เป็นของเซสชันอื่นได้
เซสชันที่ผูกกับเธรด
เมื่อเปิดใช้การผูกเธรดสำหรับช่องทาง เอเจนต์ย่อยสามารถคงการผูก กับเธรดไว้ เพื่อให้ข้อความติดตามผลของผู้ใช้ในเธรดนั้นยังคงกำหนดเส้นทางไปยัง เซสชันเอเจนต์ย่อยเดิม
ช่องทางที่รองรับเธรด
ช่องทางรองรับเซสชันเอเจนต์ย่อยแบบถาวรที่ผูกกับเธรด
(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 - คีย์การแทนที่ของช่องทางและการผูกอัตโนมัติเมื่อสร้าง เป็นค่าเฉพาะของอะแดปเตอร์ ดู ช่องทางที่รองรับเธรด ด้านบน
ดูรายละเอียดอะแดปเตอร์ปัจจุบันที่ ข้อมูลอ้างอิงการกำหนดค่า และ คำสั่ง Slash
รายการอนุญาต
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 เพื่อล้าง
รายการ allowlist ที่ล้าสมัย หรือเพิ่มรายการ 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 รับประกาศ สังเคราะห์ผลลัพธ์ แล้วเสร็จสิ้น → ประกาศไปยังเอเจนต์หลัก
- เอเจนต์หลักรับประกาศและส่งให้ผู้ใช้
แต่ละระดับจะเห็นเฉพาะประกาศจากเอเจนต์ลูกโดยตรงของตนเท่านั้น
นโยบายเครื่องมือตามระดับความลึก
- เอเจนต์ลูกจะบันทึกสแนปช็อตนโยบายผู้ส่งที่มีผลจริงของผู้ร้องขอเมื่อถูกสร้าง การทำงานของเอเจนต์ลูกที่ไม่มีผู้ส่งและการกลับมาทำงานต่อโดยโอเปอเรเตอร์ที่ผ่านการยืนยันตัวตนจะยังใช้สแนปช็อตนั้น แม้ว่า
toolsBySenderจะเปลี่ยนแปลงในภายหลัง โดยข้อจำกัดทั่วระบบ ข้อจำกัดของเอเจนต์ ผู้ให้บริการ แซนด์บ็อกซ์ และเอเจนต์ย่อยในปัจจุบันยังคงมีผล ส่วนรอบการทำงานใหม่จากช่องทางภายนอกที่กำหนดเป้าหมายไปยังเอเจนต์ลูกจะประเมินนโยบายผู้ส่งปัจจุบันใหม่ - บทบาทและขอบเขตการควบคุมจะถูกเขียนลงในข้อมูลเมตาของเซสชัน ณ เวลาที่สร้าง วิธีนี้ป้องกันไม่ให้คีย์เซสชันแบบแบนหรือที่กู้คืนแล้วได้รับสิทธิ์ออร์เคสเตรเตอร์กลับคืนโดยไม่ตั้งใจ
- ระดับความลึก 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 wins deny: ["gateway", "cron"], // if allow is set, it becomes allow-only (deny still wins) // allow: ["read", "exec", "process"] }, }, },}tools.subagents.tools.allow เป็นตัวกรองขั้นสุดท้ายแบบอนุญาตเท่านั้น ซึ่งสามารถจำกัด
ชุดเครื่องมือที่ผ่านการกำหนดแล้วให้แคบลง แต่ไม่สามารถ เพิ่มกลับ
เครื่องมือที่ถูกนำออกโดย tools.profile ตัวอย่างเช่น tools.profile: "coding" มี
web_search/web_fetch แต่ไม่มีเครื่องมือ browser หากต้องการให้
เอเจนต์ย่อยที่ใช้โปรไฟล์การเขียนโค้ดใช้งานระบบอัตโนมัติของเบราว์เซอร์ได้ ให้เพิ่ม browser ใน
ขั้นตอนโปรไฟล์:
{ tools: { profile: "coding", alsoAllow: ["browser"], },}ใช้ agents.list[].tools.alsoAllow: ["browser"] แยกตามเอเจนต์ เมื่อควรมีเพียง
เอเจนต์เดียวที่ได้รับระบบอัตโนมัติของเบราว์เซอร์
การทำงานพร้อมกัน
เอเจนต์ย่อยใช้เลนคิวภายในโปรเซสโดยเฉพาะ:
- ชื่อเลน:
subagent - จำนวนงานพร้อมกัน:
agents.defaults.subagents.maxConcurrent(ค่าเริ่มต้น8)
การตรวจสอบการทำงานและการกู้คืน
OpenClaw ไม่ถือว่าการไม่มี endedAt เป็นหลักฐานถาวรว่า
เอเจนต์ย่อยยังทำงานอยู่ การเรียกใช้ที่ยังไม่สิ้นสุดและเก่ากว่าช่วงเวลาที่ถือว่าเก่า
(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)