Agent coordination

เอเจนต์ย่อย

เอเจนต์ย่อยคือการทำงานของเอเจนต์เบื้องหลังที่เริ่มจากการทำงานของเอเจนต์ที่มีอยู่ แต่ละรายการทำงานในเซสชันของตนเอง (agent:<agentId>:subagent:<uuid>) และ เมื่อเสร็จสิ้นจะ ประกาศ ผลลัพธ์กลับไปยังช่องแชตของผู้ร้องขอ การทำงานของเอเจนต์ย่อยทุกครั้งจะได้รับการติดตามเป็น งานเบื้องหลัง

เป้าหมาย:

  • ทำงานวิจัย งานที่ใช้เวลานาน และงานเครื่องมือที่ทำงานช้าแบบขนาน โดยไม่ปิดกั้นการทำงานหลัก
  • แยกเอเจนต์ย่อยออกจากกันโดยค่าเริ่มต้น (แยกเซสชัน และเลือกใช้แซนด์บ็อกซ์ได้)
  • ทำให้ชุดเครื่องมือใช้งานผิดได้ยาก: โดยค่าเริ่มต้น เอเจนต์ย่อยจะ ไม่ได้รับ เครื่องมือเซสชันหรือข้อความ
  • รองรับความลึกของการซ้อนที่กำหนดค่าได้สำหรับรูปแบบตัวประสานงาน

คำสั่งแบบเครื่องหมายทับ

/subagents ใช้ตรวจสอบการทำงานของเอเจนต์ย่อยสำหรับ เซสชันปัจจุบัน:

text
/subagents list/subagents log <id|#> [limit] [tools]/subagents info <id|#>

/subagents info แสดงข้อมูลเมตาของการทำงาน (สถานะ การประทับเวลา รหัสเซสชัน พาธบทสนทนา การล้างข้อมูล) /subagents log แสดงรอบแชตล่าสุดของ การทำงาน เพิ่มโทเค็น tools เพื่อรวมข้อความการเรียกเครื่องมือ/ผลลัพธ์ (ละไว้ โดยค่าเริ่มต้น) ใช้ sessions_history สำหรับมุมมองเรียกคืนข้อมูลแบบจำกัดขอบเขตและกรองเพื่อความปลอดภัย จากภายในรอบการทำงานของเอเจนต์ หรือตรวจสอบพาธบทสนทนาบนดิสก์เพื่อดู บทสนทนาดิบฉบับเต็ม

ใน Control UI เซสชันแม่ที่มีการทำงานของเอเจนต์ลูกล่าสุดจะมีแถวแถบด้านข้าง ที่ขยายได้ แถวที่ซ้อนกันจะแสดงสถานะและระยะเวลาทำงานของเอเจนต์ลูก และเมื่อเลือกแถวใด จะเปิดแชตของเอเจนต์ลูกนั้นโดยยังคงลำดับชั้นของเซสชันแม่ไว้

การควบคุมการผูกเธรด

คำสั่งเหล่านี้ทำงานในช่องที่รองรับการผูกเธรดแบบถาวร ดู ช่องที่รองรับเธรด ด้านล่าง

text
/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 จะไม่ถูกยกระดับเป็นผลลัพธ์ของเอเจนต์ลูก การทำงานที่ล้มเหลวในขั้นสุดท้ายจะไม่นำข้อความตอบกลับที่บันทึกไว้กลับมาใช้ซ้ำ
  • Statuscompleted; ready for parent review / failed / timed out / unknown
  • สถิติรันไทม์/โทเค็นแบบกระชับ
  • คำสั่งให้ตรวจทาน ซึ่งบอกให้เอเจนต์ผู้ร้องขอตรวจสอบผลลัพธ์ก่อนตัดสินใจว่างานเดิมเสร็จสิ้นแล้วหรือไม่
  • คำแนะนำในการติดตามผล ซึ่งบอกให้เอเจนต์ผู้ร้องขอดำเนินงานต่อหรือบันทึกการติดตามผล เมื่อผลลัพธ์จากเอเจนต์ลูกยังเหลือสิ่งที่ต้องดำเนินการ
  • คำสั่งสำหรับข้อมูลอัปเดตสุดท้ายในกรณีที่ไม่มีสิ่งที่ต้องดำเนินการเพิ่มเติม เขียนด้วยภาษาปกติของผู้ช่วยโดยไม่ส่งต่อข้อมูลเมตาภายในดิบ
โหมดและรันไทม์ ACP
  • --model และ --thinking กำหนดทับค่าเริ่มต้นสำหรับการทำงานเฉพาะครั้งนั้น
  • ใช้ info/log เพื่อตรวจสอบรายละเอียดและผลลัพธ์หลังเสร็จสิ้น
  • สำหรับเซสชันถาวรที่ผูกกับเธรด ให้ใช้ sessions_spawn ร่วมกับ thread: true และ mode: "session"
  • หากช่องของผู้ร้องขอไม่รองรับการผูกเธรด ให้ใช้ mode: "run" แทนการลองใช้ชุดค่าที่ผูกกับเธรดซึ่งเป็นไปไม่ได้ซ้ำอีก
  • สำหรับเซสชันชุดควบคุม ACP (Claude Code, Gemini CLI, OpenCode หรือ Codex ACP/acpx ที่ระบุชัดเจน) ให้ใช้ sessions_spawn ร่วมกับ runtime: "acp" เมื่อเครื่องมือประกาศรันไทม์นั้น ดู โมเดลการส่งมอบ ACP เมื่อตรวจแก้ปัญหาการเสร็จสิ้นหรือลูประหว่างเอเจนต์ เมื่อเปิดใช้ Plugin codex การควบคุมแชต/เธรด Codex ควรเลือกใช้ /codex ... แทน ACP เว้นแต่ผู้ใช้จะขอ ACP/acpx อย่างชัดเจน
  • OpenClaw ซ่อน runtime: "acp" ไว้จนกว่าจะเปิดใช้ ACP ผู้ร้องขอไม่ได้อยู่ในแซนด์บ็อกซ์ และโหลด Plugin แบ็กเอนด์ เช่น acpx แล้ว runtime: "acp" ต้องการรหัสชุดควบคุม ACP ภายนอก หรือรายการ agents.list[] ที่มี runtime.type="acp" ให้ใช้รันไทม์เอเจนต์ย่อยเริ่มต้นสำหรับเอเจนต์การกำหนดค่า OpenClaw ปกติจาก agents_list

โหมดบริบท

เอเจนต์ย่อยแบบเนทีฟจะเริ่มโดยแยกออกจากกัน เว้นแต่ผู้เรียกจะขอให้แยกแขนง บทสนทนาปัจจุบันอย่างชัดเจน

โหมด ควรใช้เมื่อ ลักษณะการทำงาน
isolated งานวิจัยใหม่ การนำไปใช้ที่เป็นอิสระ งานเครื่องมือที่ทำงานช้า หรือสิ่งใดก็ตามที่อธิบายได้ครบถ้วนในข้อความงาน สร้างบทสนทนาเอเจนต์ลูกใหม่ที่สะอาด นี่คือค่าเริ่มต้นและช่วยลดการใช้โทเค็น
fork งานที่ขึ้นอยู่กับบทสนทนาปัจจุบัน ผลลัพธ์เครื่องมือก่อนหน้า หรือคำสั่งที่มีรายละเอียดปลีกย่อยซึ่งมีอยู่แล้วในบทสนทนาของผู้ร้องขอ แยกแขนงบทสนทนาของผู้ร้องขอไปยังเซสชันเอเจนต์ลูกก่อนที่เอเจนต์ลูกจะเริ่มทำงาน

ใช้ fork เท่าที่จำเป็น ซึ่งมีไว้สำหรับการมอบหมายงานที่ไวต่อบริบท ไม่ใช่ สิ่งทดแทนการเขียนพรอมต์งานที่ชัดเจน

เครื่องมือ: sessions_spawn

เริ่มการทำงานของเอเจนต์ย่อยด้วย deliver: false บนเลน subagent ส่วนกลาง จากนั้นเรียกขั้นตอนประกาศและโพสต์คำตอบประกาศไปยัง ช่องแชตของผู้ร้องขอ

ความพร้อมใช้งานขึ้นอยู่กับนโยบายเครื่องมือที่มีผลของผู้เรียก โปรไฟล์ coding ในตัวประกอบด้วย sessions_spawn แต่ messaging และ minimal ไม่มี full อนุญาตเครื่องมือทุกชนิด เพิ่ม tools.alsoAllow: ["sessions_spawn", "sessions_yield", "subagents"] หรือใช้ tools.profile: "coding" สำหรับ เอเจนต์ที่ใช้โปรไฟล์แคบกว่าแต่ยังควรมอบหมายงานได้ นโยบายอนุญาต/ปฏิเสธระดับช่อง/กลุ่ม ผู้ให้บริการ แซนด์บ็อกซ์ และรายเอเจนต์ ยังสามารถนำเครื่องมือออกหลังขั้นตอนโปรไฟล์ได้ ใช้ /tools จาก เซสชันเดียวกันเพื่อยืนยันรายการเครื่องมือที่มีผล

ค่าเริ่มต้น:

  • โมเดล: เอเจนต์ย่อยแบบเนทีฟจะสืบทอดจากผู้เรียก เว้นแต่จะกำหนด agents.defaults.subagents.model (หรือ agents.list[].subagents.model รายเอเจนต์) การเริ่มรันไทม์ ACP จะใช้โมเดลเอเจนต์ย่อยที่กำหนดค่าไว้เช่นกันเมื่อมี มิฉะนั้นชุดควบคุม ACP จะคงค่าเริ่มต้นของตนเองไว้ โดย sessions_spawn.model ที่ระบุชัดเจนจะมีลำดับความสำคัญเสมอ
  • การคิด: เอเจนต์ย่อยแบบเนทีฟจะสืบทอดจากผู้เรียก เว้นแต่จะกำหนด agents.defaults.subagents.thinking (หรือ agents.list[].subagents.thinking รายเอเจนต์) การเริ่มรันไทม์ ACP จะใช้ agents.defaults.models["provider/model"].params.thinking กับโมเดลที่เลือกด้วย โดย sessions_spawn.thinking ที่ระบุชัดเจนจะมีลำดับความสำคัญเสมอ
  • ระยะหมดเวลาการทำงาน: OpenClaw ใช้ agents.defaults.subagents.runTimeoutSeconds เมื่อกำหนดไว้ มิฉะนั้นจะย้อนกลับไปใช้ 0 (ไม่หมดเวลา) sessions_spawn ไม่รองรับการกำหนดระยะหมดเวลาทับในแต่ละครั้ง
  • การส่งมอบงาน: เอเจนต์ย่อยแบบเนทีฟจะได้รับงานที่มอบหมายในข้อความ [Subagent Task] แรกที่มองเห็นได้ พรอมต์ระบบของเอเจนต์ย่อยมีข้อกำหนดรันไทม์และบริบทการกำหนดเส้นทาง ไม่ใช่สำเนางานที่ซ่อนไว้และซ้ำกัน

การเริ่มเอเจนต์ย่อยแบบเนทีฟที่ยอมรับแล้วจะรวมข้อมูลเมตาของโมเดลเอเจนต์ลูกที่แก้ไขแล้ว ไว้ในผลลัพธ์เครื่องมือ: resolvedModel มีการอ้างอิงโมเดลที่ใช้ และ resolvedProvider มีคำนำหน้าผู้ให้บริการเมื่อการอ้างอิงนั้นมีคำนำหน้า

โหมดพรอมต์การมอบหมายงาน

agents.defaults.subagents.delegationMode ควบคุมเฉพาะคำแนะนำในพรอมต์ โดยไม่เปลี่ยนนโยบายเครื่องมือหรือบังคับใช้การมอบหมายงาน

  • suggest (ค่าเริ่มต้น): คงคำแนะนำมาตรฐานในพรอมต์ให้ใช้เอเจนต์ย่อยสำหรับงานที่ใหญ่ขึ้นหรือช้าลง
  • prefer: บอกเอเจนต์หลักให้พร้อมตอบสนอง และมอบหมายสิ่งที่ซับซ้อนกว่าการตอบโดยตรงผ่าน sessions_spawn

การกำหนดทับรายเอเจนต์: agents.list[].subagents.delegationMode

json5
{  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: subagent

acp ใช้เฉพาะกับชุดควบคุม 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: inherit

require ปฏิเสธการสร้าง เว้นแต่รันไทม์ของเอเจนต์ลูกเป้าหมายจะทำงานในแซนด์บ็อกซ์

context"isolated" | "fork"default: isolated

fork แตกแขนงทรานสคริปต์ปัจจุบันของผู้ร้องขอไปยังเซสชันของเอเจนต์ลูก ใช้กับเอเจนต์ย่อยแบบเนทีฟเท่านั้น การสร้างที่ผูกกับเธรดมีค่าเริ่มต้นเป็น 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 เพื่อเปิดใช้การซ้อนหนึ่งระดับ ซึ่งเป็น รูปแบบผู้ประสานงาน: หลัก → เอเจนต์ย่อยผู้ประสานงาน → เอเจนต์ย่อยระดับลูกที่ปฏิบัติงาน

    json5
    {  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> เอเจนต์ย่อยระดับสอง (ผู้ปฏิบัติงานปลายทาง) ไม่ได้

    ลำดับการประกาศผล

    ผลลัพธ์จะไหลย้อนกลับขึ้นไปตามลำดับ:

    1. ผู้ปฏิบัติงานความลึก 2 ทำงานเสร็จ → ประกาศผลไปยังเอเจนต์แม่ (ตัวประสานงานความลึก 1)
    2. ตัวประสานงานความลึก 1 รับการประกาศผล สังเคราะห์ผลลัพธ์ และทำงานเสร็จ → ประกาศผลไปยังเอเจนต์หลัก
    3. เอเจนต์หลักรับการประกาศผลและส่งมอบให้ผู้ใช้

    แต่ละระดับจะเห็นเฉพาะการประกาศผลจากเอเจนต์ลูกโดยตรงเท่านั้น

    นโยบายเครื่องมือตามความลึก

    • บทบาทและขอบเขตการควบคุมจะถูกเขียนลงในข้อมูลเมตาของเซสชันขณะสร้าง ซึ่งป้องกันไม่ให้คีย์เซสชันแบบแบนหรือที่กู้คืนมากลับได้รับสิทธิ์ตัวประสานงานโดยไม่ตั้งใจ
    • ความลึก 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 เพิ่มเติม เพื่อให้จัดการเอเจนต์ลูกของตนได้

    แทนที่ผ่านการกำหนดค่า

    json5
    {  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 ใน ขั้นตอนโปรไฟล์:

    json5
    {  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)

    ที่เกี่ยวข้อง

    Was this useful?
    On this page

    On this page