Agent coordination

เอเจนต์ย่อย

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

เป้าหมาย:

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

คำสั่ง Slash

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

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>

ลักษณะการสร้าง

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

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

แทนที่ระดับการคิดสำหรับการรันของเอเจนต์ย่อย ใช้ไม่ได้กับ 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: inherit

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

context"isolated" | "fork"default: isolated

fork แตกแขนงทรานสคริปต์ปัจจุบันของผู้ร้องขอไปยังเซสชันลูก สำหรับเอเจนต์ย่อยแบบเนทีฟเท่านั้น การสร้างที่ผูกกับเธรดมีค่าเริ่มต้นเป็น fork; การสร้างที่ไม่ผูกกับเธรดมีค่าเริ่มต้นเป็น isolated การแตกแขนงที่มองเห็นได้ต้องกำหนดเป้าหมายเป็นเอเจนต์เดียวกับผู้ร้องขอ

visiblebooleandefault: false

สร้างเซสชันแดชบอร์ดถาวรที่ผู้ใช้สามารถเปิดใน Control UI ได้ การสร้างที่มองเห็นได้รองรับเฉพาะ runtime: "subagent" และจะเก็บเซสชันที่สร้างไว้เสมอ

worktreebooleandefault: false

จัดเตรียม git worktree ที่มีการจัดการสำหรับเซสชันแดชบอร์ดใหม่ ต้องใช้ visible: true

worktreeNamestring

ชื่อ worktree ที่มีการจัดการซึ่งระบุหรือไม่ก็ได้ ต้องใช้ visible: true และ worktree: true

worktreeBaseRefstring

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

    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. เอเจนต์หลักรับประกาศและส่งให้ผู้ใช้

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

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

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

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

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

    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