Agent coordination

เอเจนต์ย่อย

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

เป้าหมาย:

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

คำสั่งแบบสแลช

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

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

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

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

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

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

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

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

    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 หากต้องการให้เอเจนต์ย่อยในโปรไฟล์การเขียนโค้ดใช้ระบบอัตโนมัติของเบราว์เซอร์ ให้เพิ่มเบราว์เซอร์ในขั้นตอนโปรไฟล์:

    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 เริ่มทำงานใหม่ งาน "ประกาศกลับ" ที่รอดำเนินการจะสูญหาย
    • เอเจนต์ย่อยยังคงใช้ทรัพยากรกระบวนการ 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