Agent coordination
เอเจนต์ ACP
Agent Client Protocol (ACP) ช่วยให้เซสชัน OpenClaw เรียกใช้เครื่องมือควบคุมการเขียนโค้ดภายนอก (Claude Code, Cursor, Copilot, Droid, OpenClaw ACP, OpenCode, Gemini CLI และเครื่องมือ ACPX อื่นๆ ที่รองรับ) ผ่าน Plugin แบ็กเอนด์ ACP โดยแต่ละการเรียกใช้จะถูกติดตามเป็น งานเบื้องหลัง
ควรใช้หน้าใด?
| สิ่งที่ต้องการทำ | ให้ใช้ | หมายเหตุ |
|---|---|---|
| ผูกหรือควบคุม Codex ในการสนทนาปัจจุบัน | /codex bind, /codex threads |
เส้นทางเซิร์ฟเวอร์แอป Codex แบบเนทีฟเมื่อเปิดใช้ Plugin codex: การตอบกลับแชตที่ผูกไว้ การส่งต่อรูปภาพ โมเดล/โหมดเร็ว/สิทธิ์ การหยุด และการชี้นำ ACP เป็นทางเลือกสำรองที่ต้องระบุอย่างชัดเจน |
| เรียกใช้ Claude Code, Gemini CLI, Codex ACP ที่ระบุอย่างชัดเจน หรือเครื่องมือภายนอกอื่น ผ่าน OpenClaw | หน้านี้ | เซสชันที่ผูกกับแชต, /acp spawn, sessions_spawn({ runtime: "acp" }), งานเบื้องหลัง, ส่วนควบคุมรันไทม์ |
| เปิดเผยเซสชัน Gateway ของ OpenClaw เป็น เซิร์ฟเวอร์ ACP สำหรับเอดิเตอร์หรือไคลเอนต์ | openclaw acp |
โหมดบริดจ์: IDE/ไคลเอนต์สื่อสารด้วย ACP กับ OpenClaw ผ่าน stdio/WebSocket |
| ใช้ AI CLI ภายในเครื่องซ้ำเป็นโมเดลสำรองแบบข้อความเท่านั้น | แบ็กเอนด์ CLI | ไม่ใช่ ACP: ไม่มีเครื่องมือ OpenClaw ไม่มีส่วนควบคุม ACP และไม่มีรันไทม์ของเครื่องมือ |
ใช้งานได้ทันทีหรือไม่?
ได้ หลังจากติดตั้ง Plugin รันไทม์ ACP อย่างเป็นทางการ:
openclaw plugins install @openclaw/acpxopenclaw config set plugins.entries.acpx.enabled trueเช็กเอาต์ซอร์สสามารถใช้ Plugin เวิร์กสเปซ extensions/acpx ภายในเครื่องหลังจาก
pnpm install เรียกใช้ /acp doctor เพื่อตรวจสอบความพร้อม
OpenClaw จะแจ้งเอเจนต์เกี่ยวกับการสร้าง ACP เฉพาะเมื่อ ACP พร้อมใช้งานจริง เท่านั้น:
ต้องเปิดใช้ ACP, ต้องไม่ปิดใช้การส่งงาน, เซสชันปัจจุบันต้องไม่ถูกแซนด์บ็อกซ์บล็อก
และต้องโหลดแบ็กเอนด์รันไทม์ที่พร้อมทำงานแล้ว หากเงื่อนไขใดไม่ผ่าน Skills ของ ACP
และคำแนะนำ ACP ใน sessions_spawn จะยังคงถูกซ่อน
เพื่อไม่ให้เอเจนต์แนะนำแบ็กเอนด์ที่ใช้งานไม่ได้
ข้อควรระวังในการเรียกใช้ครั้งแรก
- หากตั้งค่า
plugins.allowไว้ ค่านี้จะเป็นรายการ Plugin แบบจำกัดและ ต้อง รวมacpxมิฉะนั้นแบ็กเอนด์ ACP ที่ติดตั้งจะถูกบล็อกโดยเจตนา (/acp doctorจะรายงานรายการที่ขาดหายไปในรายการอนุญาต) - อะแดปเตอร์ Codex ACP มาพร้อมกับ Plugin
acpxและจะเปิดใช้ภายในเครื่องเมื่อเป็นไปได้ - Codex ACP ทำงานด้วย
CODEX_HOMEที่แยกออกจากกัน OpenClaw จะคัดลอกรายการความเชื่อถือของโปรเจกต์ที่เชื่อถือได้ พร้อมการกำหนดค่าเส้นทางโมเดล/ผู้ให้บริการที่ปลอดภัย (model,model_provider,model_reasoning_effort,sandbox_modeและฟิลด์model_providers.<name>ที่ปลอดภัย) จากการกำหนดค่า Codex ของโฮสต์ ส่วนการยืนยันตัวตน การแจ้งเตือน และฮุกจะคงอยู่ในการกำหนดค่าของโฮสต์เท่านั้น - อะแดปเตอร์ของเครื่องมือเป้าหมายอื่นอาจถูกดึงเมื่อต้องการด้วย
npxในการใช้งานครั้งแรก - การยืนยันตัวตนกับผู้จำหน่ายสำหรับเครื่องมือนั้นต้องมีอยู่บนโฮสต์แล้ว
- หากโฮสต์ไม่มี npm หรือสิทธิ์เข้าถึงเครือข่าย การดึงอะแดปเตอร์ในการเรียกใช้ครั้งแรกจะล้มเหลวจนกว่าจะมีการเตรียมแคชไว้ล่วงหน้าหรือติดตั้งอะแดปเตอร์ด้วยวิธีอื่น
ข้อกำหนดเบื้องต้นของรันไทม์
ACP เปิดใช้กระบวนการเครื่องมือภายนอกจริง OpenClaw เป็นเจ้าของการกำหนดเส้นทาง สถานะงานเบื้องหลัง การส่งมอบ การผูก และนโยบาย ส่วนเครื่องมือเป็นเจ้าของ การเข้าสู่ระบบผู้ให้บริการ แค็ตตาล็อกโมเดล พฤติกรรมระบบไฟล์ และเครื่องมือเนทีฟของตน
ก่อนสรุปว่าเป็นปัญหาของ OpenClaw ให้ตรวจสอบว่า:
/acp doctorรายงานแบ็กเอนด์ที่เปิดใช้และพร้อมทำงาน- รายการอนุญาต
acp.allowedAgentsอนุญาตรหัสเป้าหมาย เมื่อมีการตั้งค่ารายการอนุญาตนั้น - คำสั่งของเครื่องมือสามารถเริ่มทำงานบนโฮสต์ Gateway ได้
- มีการยืนยันตัวตนกับผู้ให้บริการสำหรับเครื่องมือนั้น (
claude,codex,gemini,opencode,droidเป็นต้น) - โมเดลที่เลือกมีอยู่สำหรับเครื่องมือนั้น - รหัสโมเดลไม่สามารถใช้ข้ามเครื่องมือได้
cwdที่ร้องขอมีอยู่และเข้าถึงได้ หรือไม่ระบุcwdเพื่อให้แบ็กเอนด์ใช้ค่าเริ่มต้น- โหมดสิทธิ์ตรงกับงาน เซสชันแบบไม่โต้ตอบไม่สามารถคลิกข้อความแจ้งสิทธิ์แบบเนทีฟได้ ดังนั้นการเขียนโค้ดที่ใช้การเขียน/เรียกใช้คำสั่งจำนวนมากโดยทั่วไปจึงต้องใช้โปรไฟล์สิทธิ์ ACPX ที่ดำเนินการต่อแบบไร้ส่วนติดต่อได้
โดยค่าเริ่มต้น เครื่องมือของ Plugin OpenClaw และเครื่องมือในตัวของ OpenClaw จะ ไม่ ถูกเปิดเผยต่อเครื่องมือ ACP เปิดใช้บริดจ์ MCP อย่างชัดเจนใน เอเจนต์ ACP - การตั้งค่า เฉพาะเมื่อเครื่องมือควร เรียกใช้เครื่องมือเหล่านั้นโดยตรง
เป้าหมายเครื่องมือที่รองรับ
เมื่อใช้แบ็กเอนด์ acpx ให้ใช้รหัสเหล่านี้เป็นเป้าหมาย /acp spawn <id> หรือ
sessions_spawn({ runtime: "acp", agentId: "<id>" }):
| รหัสเครื่องมือ | แบ็กเอนด์ทั่วไป | หมายเหตุ |
|---|---|---|
claude |
อะแดปเตอร์ ACP ของ Claude Code | ต้องมีการยืนยันตัวตนของ Claude Code บนโฮสต์ |
codex |
อะแดปเตอร์ Codex ACP | เป็นทางเลือก ACP สำรองที่ต้องระบุอย่างชัดเจน เฉพาะเมื่อ /codex แบบเนทีฟใช้งานไม่ได้หรือมีการร้องขอ ACP |
copilot |
อะแดปเตอร์ ACP ของ GitHub Copilot | ต้องมีการยืนยันตัวตนของ Copilot CLI/รันไทม์ |
cursor |
Cursor CLI ACP (cursor-agent acp) |
แทนที่คำสั่ง acpx หากการติดตั้งภายในเครื่องเปิดเผยจุดเข้าใช้งาน ACP ที่ต่างออกไป |
droid |
Factory Droid CLI | ต้องมีการยืนยันตัวตนของ Factory/Droid หรือ FACTORY_API_KEY ในสภาพแวดล้อมของเครื่องมือ |
fast-agent |
อะแดปเตอร์ ACP ของ fast-agent-mcp | ดึงเมื่อต้องการด้วย uvx |
gemini |
อะแดปเตอร์ ACP ของ Gemini CLI | ต้องมีการยืนยันตัวตนของ Gemini CLI หรือการตั้งค่าคีย์ API |
iflow |
iFlow CLI | ความพร้อมใช้งานของอะแดปเตอร์และการควบคุมโมเดลขึ้นอยู่กับ CLI ที่ติดตั้ง |
kilocode |
Kilo Code CLI | ความพร้อมใช้งานของอะแดปเตอร์และการควบคุมโมเดลขึ้นอยู่กับ CLI ที่ติดตั้ง |
kimi |
Kimi/Moonshot CLI | ต้องมีการยืนยันตัวตนของ Kimi/Moonshot บนโฮสต์ |
kiro |
Kiro CLI | ความพร้อมใช้งานของอะแดปเตอร์และการควบคุมโมเดลขึ้นอยู่กับ CLI ที่ติดตั้ง |
mux |
อะแดปเตอร์ Mux CLI ACP | ดึงเมื่อต้องการด้วย npx |
opencode |
อะแดปเตอร์ OpenCode ACP | ต้องมีการยืนยันตัวตนของ OpenCode CLI/ผู้ให้บริการ |
openclaw |
บริดจ์ Gateway ของ OpenClaw ผ่าน openclaw acp |
ช่วยให้เครื่องมือที่รองรับ ACP สื่อสารกลับไปยังเซสชัน Gateway ของ OpenClaw ได้ |
qoder |
Qoder CLI | ความพร้อมใช้งานของอะแดปเตอร์และการควบคุมโมเดลขึ้นอยู่กับ CLI ที่ติดตั้ง |
qwen |
Qwen Code / Qwen CLI | ต้องมีการยืนยันตัวตนที่เข้ากันได้กับ Qwen บนโฮสต์ |
trae |
อะแดปเตอร์ Trae CLI ACP | ความพร้อมใช้งานของอะแดปเตอร์และการควบคุมโมเดลขึ้นอยู่กับ CLI ที่ติดตั้ง |
pi (pi-acp) ได้รับการลงทะเบียนในแบ็กเอนด์ acpx เช่นกัน แต่ไม่ใช่เครื่องมือเขียนโค้ด
ในลักษณะเดียวกับรายการอื่นด้านบน
สามารถกำหนดค่านามแฝงเอเจนต์ acpx แบบกำหนดเองใน acpx ได้ แต่
นโยบาย OpenClaw ยังคงตรวจสอบ acp.allowedAgents และการแมป
agents.list[].runtime.acp.agent ใดๆ ก่อนส่งงาน
คู่มือการปฏิบัติงานสำหรับผู้ดูแลระบบ
ขั้นตอน /acp แบบรวดเร็วจากแชต:
สร้าง
/acp spawn claude --bind here,
/acp spawn gemini --mode persistent --thread auto หรือ
/acp spawn codex --bind here ที่ระบุอย่างชัดเจน
ทำงาน
ดำเนินการต่อในการสนทนาหรือเธรดที่ผูกไว้ (หรือระบุคีย์เซสชัน อย่างชัดเจน)
ตรวจสอบสถานะ
/acp status
ปรับแต่ง
/acp model <provider/model>, /acp permissions <profile>,
/acp timeout <seconds>
ชี้นำ
โดยไม่แทนที่บริบท: /acp steer tighten logging and continue
หยุด
/acp cancel (รอบปัจจุบัน) หรือ /acp close (เซสชัน + การผูก)
รายละเอียดวงจรชีวิต
- การสร้างจะสร้างหรือดำเนินเซสชันรันไทม์ ACP ต่อ บันทึกข้อมูลเมตา ACP ไว้ในที่เก็บเซสชันของ OpenClaw และอาจสร้างงานเบื้องหลังเมื่อการรันมีงานแม่เป็นเจ้าของ
- เซสชัน ACP ที่มีงานแม่เป็นเจ้าของจะถือเป็นงานเบื้องหลัง แม้ว่าเซสชันรันไทม์จะเป็นแบบถาวรก็ตาม การเสร็จสิ้นและการส่งข้ามพื้นผิวจะดำเนินการผ่านตัวแจ้งเตือนงานแม่ แทนที่จะทำงานเหมือนเซสชันแชตปกติที่ผู้ใช้มองเห็น
- การบำรุงรักษางานจะปิดเซสชัน ACP แบบครั้งเดียวที่มีงานแม่เป็นเจ้าของและอยู่ในสถานะสิ้นสุดหรือกำพร้า เซสชัน ACP แบบถาวรจะยังคงอยู่ตราบใดที่ยังมีการผูกการสนทนาที่ใช้งานอยู่ ส่วนเซสชันถาวรที่เก่าและไม่มีการผูกที่ใช้งานอยู่จะถูกปิด เพื่อไม่ให้ดำเนินต่อโดยไม่มีการแจ้งเตือนหลังจากงานเจ้าของเสร็จสิ้นหรือระเบียนงานหายไปแล้ว
- ข้อความติดตามผลที่ผูกไว้จะส่งตรงไปยังเซสชัน ACP จนกว่าการผูกจะถูกปิด เลิกโฟกัส รีเซ็ต หรือหมดอายุ
- คำสั่ง Gateway จะยังคงประมวลผลภายในเครื่อง
/acp ...,/statusและ/unfocusจะไม่ถูกส่งเป็นข้อความพรอมต์ปกติไปยัง ACP harness ที่ผูกไว้ cancelจะยกเลิกรอบที่ทำงานอยู่เมื่อแบ็กเอนด์รองรับการยกเลิก โดยจะไม่ลบการผูกหรือข้อมูลเมตาของเซสชันcloseจะสิ้นสุดเซสชัน ACP จากมุมมองของ OpenClaw และนำการผูกออก แต่ harness อาจยังเก็บประวัติต้นทางของตนเองไว้หากรองรับการดำเนินต่อ- Plugin acpx จะล้างแผนผังกระบวนการ wrapper และ adapter ที่ OpenClaw เป็นเจ้าของหลังจาก
closeและเก็บกวาดกระบวนการกำพร้า ACPX ที่เก่าและ OpenClaw เป็นเจ้าของระหว่างการเริ่มต้น Gateway - ตัวทำงานรันไทม์ที่ไม่ได้ใช้งานมีสิทธิ์ถูกล้างหลังจากพ้นช่วงเวลาว่างในตัว ส่วนข้อมูลเมตาของเซสชันที่จัดเก็บไว้ยังคงพร้อมใช้งานสำหรับ
/acp sessions
กฎการกำหนดเส้นทาง Codex แบบเนทีฟ
ทริกเกอร์ภาษาธรรมชาติที่ควรกำหนดเส้นทางไปยัง Plugin Codex แบบเนทีฟ เมื่อเปิดใช้งาน:
- "ผูกช่อง Discord นี้กับ Codex"
- "แนบแชตนี้กับเธรด Codex
<id>" - "แสดงเธรด Codex แล้วผูกเธรดนี้"
การผูกการสนทนา Codex แบบเนทีฟเป็นเส้นทางควบคุมแชตเริ่มต้น
เครื่องมือแบบไดนามิกของ OpenClaw ยังคงทำงานผ่าน OpenClaw ส่วนเครื่องมือเนทีฟของ Codex
เช่น shell/apply-patch จะทำงานภายใน Codex สำหรับเหตุการณ์เครื่องมือเนทีฟของ Codex
OpenClaw จะแทรกรีเลย์ hook แบบเนทีฟต่อรอบ เพื่อให้ hook ของ Plugin
สามารถบล็อก before_tool_call, สังเกต after_tool_call และกำหนดเส้นทางเหตุการณ์ Codex
PermissionRequest ผ่านการอนุมัติของ OpenClaw ส่วน hook Stop ของ Codex
จะถูกรีเลย์ไปยัง before_agent_finalize ของ OpenClaw ซึ่ง Plugin สามารถขอ
ให้โมเดลทำงานเพิ่มอีกหนึ่งรอบก่อนที่ Codex จะสรุปคำตอบ รีเลย์นี้จงใจ
ทำงานอย่างระมัดระวัง โดยจะไม่แก้ไขอาร์กิวเมนต์ของเครื่องมือเนทีฟ Codex
หรือเขียนระเบียนเธรด Codex ใหม่ ใช้ ACP อย่างชัดเจนเฉพาะเมื่อต้องการ
โมเดลรันไทม์/เซสชันของ ACP ขอบเขตการรองรับ Codex แบบฝังตัว
มีการระบุไว้ใน
สัญญาการรองรับ Codex harness v1
สรุปย่อการเลือกโมเดล / ผู้ให้บริการ / รันไทม์
- การอ้างอิงโมเดล Codex แบบเดิม - เส้นทางโมเดล OAuth/การสมัครใช้บริการ Codex แบบเดิมที่ doctor ซ่อมแซม
openai/*- รันไทม์แบบฝังตัวของ app-server Codex แบบเนทีฟสำหรับรอบเอเจนต์ OpenAI/codex ...- การควบคุมการสนทนา Codex แบบเนทีฟ/acp ...หรือruntime: "acp"- การควบคุม ACP/acpx อย่างชัดเจน
ทริกเกอร์ภาษาธรรมชาติสำหรับการกำหนดเส้นทาง ACP
ทริกเกอร์ที่ควรกำหนดเส้นทางไปยังรันไทม์ ACP:
- "เรียกใช้งานนี้เป็นเซสชัน Claude Code ACP แบบครั้งเดียวและสรุปผลลัพธ์"
- "ใช้ Gemini CLI สำหรับงานนี้ในเธรด แล้วเก็บข้อความติดตามผลไว้ในเธรดเดิม"
- "เรียกใช้ Codex ผ่าน ACP ในเธรดเบื้องหลัง"
OpenClaw เลือก runtime: "acp", แก้ไข harness agentId, ผูกกับ
การสนทนาหรือเธรดปัจจุบันเมื่อรองรับ และกำหนดเส้นทางข้อความติดตามผล
ไปยังเซสชันนั้นจนกว่าจะปิด/หมดอายุ Codex จะใช้เส้นทางนี้เฉพาะเมื่อ
ระบุ ACP/acpx อย่างชัดเจน หรือ Plugin Codex แบบเนทีฟไม่พร้อมใช้งานสำหรับ
การดำเนินการที่ร้องขอ
สำหรับ sessions_spawn จะประกาศ runtime: "acp" เฉพาะเมื่อเปิดใช้งาน ACP
ผู้ร้องขอไม่ได้อยู่ในแซนด์บ็อกซ์ และโหลดแบ็กเอนด์รันไทม์ ACP แล้ว
acp.dispatch.enabled=false จะหยุดการส่งเธรด ACP อัตโนมัติชั่วคราว
แต่จะไม่ซ่อนหรือบล็อกการเรียก sessions_spawn({ runtime: "acp" }) อย่างชัดเจน
โดยกำหนดเป้าหมายไปยังรหัส ACP harness เช่น codex, claude, droid,
gemini หรือ opencode อย่าส่งรหัสเอเจนต์การกำหนดค่า OpenClaw ปกติ
จาก agents_list เว้นแต่รายการนั้นจะกำหนดค่าไว้อย่างชัดเจนด้วย
agents.list[].runtime.type="acp" มิฉะนั้นให้ใช้รันไทม์ซับเอเจนต์
เริ่มต้น เมื่อกำหนดค่าเอเจนต์ OpenClaw ด้วย
runtime.type="acp" OpenClaw จะใช้ runtime.acp.agent เป็นรหัส
harness เบื้องหลัง
ACP เทียบกับซับเอเจนต์
ใช้ ACP เมื่อต้องการรันไทม์ harness ภายนอก ใช้ Codex
app-server แบบเนทีฟ สำหรับการผูก/ควบคุมการสนทนา Codex เมื่อเปิดใช้งาน Plugin
codex ใช้ ซับเอเจนต์ เมื่อต้องการการรันแบบมอบหมายงานที่เป็นเนทีฟของ OpenClaw
| พื้นที่ | เซสชัน ACP | การรันซับเอเจนต์ |
|---|---|---|
| รันไทม์ | Plugin แบ็กเอนด์ ACP (ตัวอย่างเช่น acpx) | รันไทม์ซับเอเจนต์แบบเนทีฟของ OpenClaw |
| คีย์เซสชัน | agent:<agentId>:acp:<uuid> |
agent:<agentId>:subagent:<uuid> |
| คำสั่งหลัก | /acp ... |
/subagents ... |
| เครื่องมือสร้าง | sessions_spawn พร้อม runtime:"acp" |
sessions_spawn (รันไทม์เริ่มต้น) |
ดูเพิ่มเติมที่ ซับเอเจนต์
วิธีที่ ACP เรียกใช้ Claude Code
สำหรับ Claude Code ผ่าน ACP สแต็กประกอบด้วย:
- ระนาบควบคุมเซสชัน ACP ของ OpenClaw
- Plugin รันไทม์
@openclaw/acpxอย่างเป็นทางการ - adapter ACP ของ Claude
- กลไกรันไทม์/เซสชันฝั่ง Claude
ACP Claude คือ เซสชัน harness ที่มีการควบคุม ACP การดำเนินเซสชันต่อ การติดตามงานเบื้องหลัง และการผูกการสนทนา/เธรดที่เลือกใช้ได้
แบ็กเอนด์ CLI เป็นรันไทม์สำรองภายในเครื่องแบบข้อความเท่านั้นที่แยกต่างหาก - ดู แบ็กเอนด์ CLI
สำหรับผู้ดูแลระบบ กฎในทางปฏิบัติคือ:
- ต้องการ
/acp spawn, เซสชันที่ผูกได้, การควบคุมรันไทม์ หรืองาน harness แบบถาวรหรือไม่ ใช้ ACP - ต้องการการสำรองข้อความภายในเครื่องแบบง่ายผ่าน CLI โดยตรงหรือไม่ ใช้แบ็กเอนด์ CLI
เซสชันที่ผูกไว้
แบบจำลองแนวคิด
- พื้นผิวแชต - จุดที่ผู้คนสนทนาต่อ (ช่อง Discord, หัวข้อ Telegram, แชต iMessage)
- เซสชัน ACP - สถานะรันไทม์ Codex/Claude/Gemini แบบคงทนที่ OpenClaw กำหนดเส้นทางไปให้
- เธรด/หัวข้อลูก - พื้นผิวการรับส่งข้อความเพิ่มเติมที่เลือกใช้ได้ ซึ่งสร้างโดย
--thread ...เท่านั้น - พื้นที่ทำงานรันไทม์ - ตำแหน่งระบบไฟล์ (
cwd, การเช็กเอาต์ repo, พื้นที่ทำงานของแบ็กเอนด์) ที่ harness ทำงาน โดยเป็นอิสระจากพื้นผิวแชต
การผูกกับการสนทนาปัจจุบัน
/acp spawn <harness> --bind here จะตรึงการสนทนาปัจจุบันไว้กับ
เซสชัน ACP ที่สร้างขึ้น โดยไม่มีเธรดลูกและใช้พื้นผิวแชตเดิม OpenClaw ยังคง
เป็นเจ้าของการขนส่ง การยืนยันตัวตน ความปลอดภัย และการส่งมอบ ข้อความติดตามผลใน
การสนทนานั้นจะถูกกำหนดเส้นทางไปยังเซสชันเดิม /new และ /reset จะรีเซ็ตเซสชัน
ในตำแหน่งเดิม ส่วน /acp close จะนำการผูกออก
ตัวอย่าง:
/codex bind # ผูก Codex แบบเนทีฟ กำหนดเส้นทางข้อความในอนาคตมาที่นี่/codex model gpt-5.4 # ปรับแต่งเธรด Codex แบบเนทีฟที่ผูกไว้/codex stop # ควบคุมรอบ Codex แบบเนทีฟที่ทำงานอยู่/acp spawn codex --bind here # การสำรอง ACP อย่างชัดเจนสำหรับ Codex/acp spawn codex --thread auto # อาจสร้างเธรด/หัวข้อลูกและผูกไว้ที่นั่น/acp spawn codex --bind here --cwd /workspace/repo # การผูกแชตเดิม โดย Codex ทำงานใน /workspace/repoกฎการผูกและการใช้ร่วมกันไม่ได้
--bind hereและ--thread ...ใช้ร่วมกันไม่ได้--bind hereใช้งานได้เฉพาะในช่องที่ประกาศว่ารองรับการผูกกับการสนทนาปัจจุบัน มิฉะนั้น OpenClaw จะส่งคืนข้อความที่ชัดเจนว่าไม่รองรับ การผูกจะคงอยู่แม้ Gateway เริ่มต้นใหม่- ใน Discord
spawnSessionsควบคุมการสร้างเธรดลูกสำหรับ--thread auto|hereไม่ใช่--bind here - หากสร้างไปยังเอเจนต์ ACP อื่นโดยไม่มี
--cwdOpenClaw จะสืบทอดพื้นที่ทำงานของ เอเจนต์เป้าหมาย ตามค่าเริ่มต้น พาธที่สืบทอดมาแต่ไม่มีอยู่ (ENOENT/ENOTDIR) จะย้อนกลับไปใช้ค่าเริ่มต้นของแบ็กเอนด์ ส่วนข้อผิดพลาดการเข้าถึงอื่น (เช่นEACCES) จะแสดงเป็นข้อผิดพลาดในการสร้าง - คำสั่งจัดการ Gateway จะยังคงประมวลผลภายในเครื่องในการสนทนาที่ผูกไว้ กล่าวคือคำสั่ง
/acp ...จะได้รับการจัดการโดย OpenClaw แม้ว่าข้อความติดตามผลปกติจะถูกกำหนดเส้นทางไปยังเซสชัน ACP ที่ผูกไว้ และ/statusกับ/unfocusจะยังคงประมวลผลภายในเครื่องด้วยเสมอ เมื่อเปิดใช้งานการจัดการคำสั่งสำหรับพื้นผิวนั้น
เซสชันที่ผูกกับเธรด
เมื่อเปิดใช้งานการผูกเธรดสำหรับ adapter ของช่อง:
- OpenClaw ผูกเธรดกับเซสชัน ACP เป้าหมาย
- ข้อความติดตามผลในเธรดนั้นจะถูกกำหนดเส้นทางไปยังเซสชัน ACP ที่ผูกไว้
- เอาต์พุต ACP จะถูกส่งกลับไปยังเธรดเดิม
- การเลิกโฟกัส/ปิด/เก็บถาวร/หมดเวลาว่าง หรือหมดอายุสูงสุดจะนำการผูกออก
/acp close,/acp cancel,/acp status,/statusและ/unfocusเป็นคำสั่ง Gateway ไม่ใช่พรอมต์สำหรับ ACP harness
แฟล็กคุณลักษณะที่จำเป็นสำหรับ ACP ที่ผูกกับเธรด:
acp.enabled=trueacp.dispatch.enabledเปิดอยู่ตามค่าเริ่มต้น (ตั้งค่าfalseเพื่อหยุดการส่งเธรด ACP อัตโนมัติชั่วคราว การเรียกsessions_spawn({ runtime: "acp" })อย่างชัดเจนยังคงทำงาน)- เปิดใช้งานการสร้างเซสชันเธรดของ adapter ช่อง (ค่าเริ่มต้น:
true):- Discord:
channels.discord.threadBindings.spawnSessions=true - Telegram:
channels.telegram.threadBindings.spawnSessions=true
- Discord:
การรองรับการผูกเธรดขึ้นอยู่กับ adapter หาก adapter ของช่องที่ใช้งานอยู่ ไม่รองรับการผูกเธรด OpenClaw จะส่งคืนข้อความที่ชัดเจนว่า ไม่รองรับ/ไม่พร้อมใช้งาน
ช่องที่รองรับเธรด
- adapter ของช่องใดก็ตามที่เปิดเผยความสามารถในการผูกเซสชัน/เธรด
- การรองรับในตัวปัจจุบัน: เธรด/ช่อง Discord, หัวข้อ Telegram (หัวข้อฟอรัมในกลุ่ม/ซูเปอร์กรุ๊ปและหัวข้อ DM)
- ช่องของ Plugin สามารถเพิ่มการรองรับผ่านอินเทอร์เฟซการผูกเดียวกัน
การผูกช่องแบบถาวร
สำหรับเวิร์กโฟลว์ที่ไม่ใช่แบบชั่วคราว ให้กำหนดค่าการผูก ACP แบบถาวรในรายการระดับบนสุด
bindings[]
โมเดลการผูก
bindings[].type"acp"ระบุการผูกการสนทนา ACP แบบถาวร
bindings[].matchobjectระบุการสนทนาเป้าหมาย รูปแบบสำหรับแต่ละช่อง:
- ช่อง/เธรด Discord:
match.channel="discord"+match.peer.id="<channelOrThreadId>" - ช่อง/DM Slack:
match.channel="slack"+match.peer.id="<channelId|channel:<channelId>|#<channelId>|userId|user:<userId>|slack:<userId>|<@userId>>"ควรใช้ ID ของ Slack ที่คงที่ การเชื่อมโยงช่องจะจับคู่การตอบกลับภายในเธรดของช่องนั้นด้วย - หัวข้อฟอรัม Telegram:
match.channel="telegram"+match.peer.id="<chatId>:topic:<topicId>" - DM/กลุ่ม WhatsApp:
match.channel="whatsapp"+match.peer.id="<E.164|group JID>"ใช้หมายเลข E.164 เช่น+15555550123สำหรับแชตโดยตรง และใช้ JID ของกลุ่ม WhatsApp เช่น120363424282127706@g.usสำหรับกลุ่ม - DM/กลุ่ม iMessage:
match.channel="imessage"+match.peer.id="<handle|chat_id:*|chat_guid:*|chat_identifier:*>"ควรใช้chat_id:*เพื่อให้การเชื่อมโยงกลุ่มคงที่
bindings[].agentIdstringID ของเอเจนต์ OpenClaw ที่เป็นเจ้าของ
bindings[].acp.mode"persistent" | "oneshot"การแทนที่ ACP ที่ไม่บังคับ
bindings[].acp.labelstringป้ายกำกับที่แสดงแก่ผู้ปฏิบัติงานซึ่งไม่บังคับ
bindings[].acp.cwdstringไดเรกทอรีทำงานของรันไทม์ที่ไม่บังคับ
bindings[].acp.backendstringการแทนที่แบ็กเอนด์ที่ไม่บังคับ
ค่าเริ่มต้นของรันไทม์ต่อเอเจนต์
ใช้ agents.list[].runtime เพื่อกำหนดค่าเริ่มต้นของ ACP เพียงครั้งเดียวต่อเอเจนต์:
agents.list[].runtime.type="acp"agents.list[].runtime.acp.agent(ID ของแฮร์เนส เช่นcodexหรือclaude)agents.list[].runtime.acp.backendagents.list[].runtime.acp.modeagents.list[].runtime.acp.cwd
ลำดับความสำคัญของการแทนที่สำหรับเซสชันที่เชื่อมโยงกับ ACP:
bindings[].acp.*agents.list[].runtime.acp.*- ค่าเริ่มต้น ACP ส่วนกลาง (เช่น
acp.backend)
ตัวอย่าง
{ agents: { list: [ { id: "codex", runtime: { type: "acp", acp: { agent: "codex", backend: "acpx", mode: "persistent", cwd: "/workspace/openclaw", }, }, }, { id: "claude", runtime: { type: "acp", acp: { agent: "claude", backend: "acpx", mode: "persistent" }, }, }, ], }, bindings: [ { type: "acp", agentId: "codex", match: { channel: "discord", accountId: "default", peer: { kind: "channel", id: "222222222222222222" }, }, acp: { label: "codex-main" }, }, { type: "acp", agentId: "claude", match: { channel: "telegram", accountId: "default", peer: { kind: "group", id: "-1001234567890:topic:42" }, }, acp: { cwd: "/workspace/repo-b" }, }, { type: "route", agentId: "main", match: { channel: "discord", accountId: "default" }, }, { type: "route", agentId: "main", match: { channel: "telegram", accountId: "default" }, }, ], channels: { discord: { guilds: { "111111111111111111": { channels: { "222222222222222222": { requireMention: false }, }, }, }, }, telegram: { groups: { "-1001234567890": { topics: { "42": { requireMention: false } }, }, }, }, },}ลักษณะการทำงาน
- OpenClaw จะตรวจสอบให้แน่ใจว่าเซสชัน ACP ที่กำหนดค่าไว้มีอยู่ หลังจากผ่านการอนุญาตเฉพาะช่องและก่อนใช้งาน
- ข้อความในช่อง หัวข้อ หรือแชตนั้นจะถูกกำหนดเส้นทางไปยังเซสชัน ACP ที่กำหนดค่าไว้
- การเชื่อมโยง ACP ที่กำหนดค่าไว้เป็นเจ้าของเส้นทางเซสชันของตน การกระจายข้อความแบบ fan-out ของช่องจะไม่แทนที่เซสชัน ACP ที่กำหนดค่าไว้สำหรับการเชื่อมโยงที่ตรงกัน
- ในการสนทนาที่เชื่อมโยงไว้
/newและ/resetจะรีเซ็ตคีย์เซสชัน ACP เดิมโดยตรง - การเชื่อมโยงรันไทม์ชั่วคราว (เช่น ที่สร้างโดยขั้นตอนการโฟกัสเธรด) ยังคงมีผลเมื่อมีอยู่
- สำหรับการสร้าง ACP ข้ามเอเจนต์โดยไม่มี
cwdที่ระบุไว้อย่างชัดเจน OpenClaw จะสืบทอดพื้นที่ทำงานของเอเจนต์เป้าหมายจากการกำหนดค่าเอเจนต์ - เส้นทางพื้นที่ทำงานที่สืบทอดมาซึ่งไม่มีอยู่จะย้อนกลับไปใช้ cwd เริ่มต้นของแบ็กเอนด์ ส่วนความล้มเหลวในการเข้าถึงเส้นทางที่มีอยู่จะแสดงเป็นข้อผิดพลาดในการสร้าง
เริ่มเซสชัน ACP
มีสองวิธีในการเริ่มเซสชัน ACP:
จาก sessions_spawn
ใช้ runtime: "acp" เพื่อเริ่มเซสชัน ACP จากเทิร์นของเอเจนต์หรือการเรียก
เครื่องมือ
{ "task": "เปิดที่เก็บและสรุปการทดสอบที่ล้มเหลว", "runtime": "acp", "agentId": "codex", "thread": true, "mode": "session"}จากคำสั่ง /acp
ใช้ /acp spawn เพื่อให้ผู้ปฏิบัติงานควบคุมจากแชตโดยตรง
/acp spawn codex --mode persistent --thread auto/acp spawn codex --mode oneshot --thread off/acp spawn codex --bind here/acp spawn codex --thread hereแฟล็กสำคัญ:
--mode persistent|oneshot--bind here|off--thread auto|here|off--cwd <absolute-path>--label <name>
พารามิเตอร์ sessions_spawn
taskstringrequiredพรอมต์เริ่มต้นที่ส่งไปยังเซสชัน ACP
runtime"acp"requiredต้องเป็น "acp" สำหรับเซสชัน ACP
agentIdstringID ของแฮร์เนสเป้าหมาย ACP หากตั้งค่าไว้ จะย้อนกลับไปใช้ acp.defaultAgent
threadbooleandefault: falseขอขั้นตอนการเชื่อมโยงเธรดในบริเวณที่รองรับ
mode"run" | "session"default: run"run" ทำงานครั้งเดียว ส่วน "session" ทำงานแบบถาวร หาก thread: true และ
ละเว้น mode OpenClaw อาจใช้ลักษณะการทำงานแบบถาวรเป็นค่าเริ่มต้นตาม
เส้นทางรันไทม์ mode: "session" ต้องใช้ thread: true
cwdstringไดเรกทอรีทำงานของรันไทม์ที่ร้องขอ (ตรวจสอบตามนโยบายของแบ็กเอนด์/รันไทม์) หากละเว้น การสร้าง ACP จะสืบทอดพื้นที่ทำงานของเอเจนต์เป้าหมายเมื่อมีการกำหนดค่าไว้ เส้นทางที่สืบทอดมาซึ่งไม่มีอยู่จะย้อนกลับไปใช้ค่าเริ่มต้นของแบ็กเอนด์ ส่วนข้อผิดพลาด ในการเข้าถึงที่เกิดขึ้นจริงจะถูกส่งคืน
labelstringป้ายกำกับที่แสดงแก่ผู้ปฏิบัติงานซึ่งใช้ในข้อความเซสชัน/แบนเนอร์
resumeSessionIdstringดำเนินเซสชัน ACP ที่มีอยู่ต่อแทนการสร้างเซสชันใหม่ เอเจนต์
จะเล่นประวัติการสนทนาซ้ำผ่าน session/load ต้องใช้
runtime: "acp"
streamTo"parent""parent" จะสตรีมสรุปความคืบหน้าของการเรียกใช้ ACP เริ่มต้นกลับไปยังเซสชัน
ของผู้ร้องขอในรูปแบบเหตุการณ์ระบบ OpenClaw บันทึกประวัติรีเลย์ทั้งหมดไว้ใน
สถานะ SQLite ของเอเจนต์ลูกและลบออกพร้อมกับเซสชันลูก
สตรีมความคืบหน้าของพาเรนต์จะแสดงคำอธิบายจากผู้ช่วยและความคืบหน้าของสถานะ ACP ตามค่าเริ่มต้น เว้นแต่
streaming.progress.commentary=false นอกจากนี้ Discord ยังใช้โหมดความคืบหน้าสำหรับ
การแสดงตัวอย่างของพาเรนต์เป็นค่าเริ่มต้นเมื่อไม่ได้กำหนดค่าโหมดสตรีม ความคืบหน้า
ของสถานะยังคงเป็นไปตาม acp.stream.tagVisibility ดังนั้นแท็ก เช่น plan
จะยังคงถูกซ่อน เว้นแต่จะเปิดใช้งานอย่างชัดเจน
การเรียกใช้ ACP sessions_spawn ใช้ agents.defaults.subagents.runTimeoutSeconds
เป็นขีดจำกัดจำนวนเทิร์นของเอเจนต์ลูกโดยค่าเริ่มต้น เครื่องมือนี้ไม่ยอมรับการแทนที่
ระยะหมดเวลาในแต่ละครั้งที่เรียก (runTimeoutSeconds/timeoutSeconds จะถูกปฏิเสธพร้อม
ข้อผิดพลาดที่ระบุให้กำหนดค่าเริ่มต้น)
modelstringการแทนที่โมเดลอย่างชัดเจนสำหรับเซสชัน ACP ลูก การสร้าง Codex ACP
จะปรับการอ้างอิง OpenAI เช่น openai/gpt-5.4 ให้เป็นการกำหนดค่าเริ่มต้น Codex ACP
ก่อน session/new รูปแบบสแลช เช่น openai/gpt-5.4/high จะตั้งค่า
ระดับความพยายามในการให้เหตุผลของ Codex ACP ด้วย เมื่อละเว้น sessions_spawn({ runtime: "acp" })
จะใช้ค่าเริ่มต้นของโมเดลเอเจนต์ย่อยที่มีอยู่ (agents.defaults.subagents.model หรือ
agents.list[].subagents.model) เมื่อมีการกำหนดค่าไว้ มิฉะนั้นจะให้แฮร์เนส ACP
ใช้โมเดลเริ่มต้นของตนเอง แฮร์เนสอื่นต้องประกาศ ACP
models และรองรับ session/set_model มิฉะนั้น OpenClaw/acpx จะล้มเหลว
พร้อมข้อความที่ชัดเจน แทนที่จะย้อนกลับไปใช้ค่าเริ่มต้นของเอเจนต์เป้าหมายโดยไม่แจ้ง
thinkingstringระดับความพยายามในการคิด/ให้เหตุผลที่ระบุอย่างชัดเจน สำหรับ Codex ACP นั้น minimal จะแมปกับ
ระดับความพยายามต่ำ low/medium/high/xhigh จะแมปโดยตรง และ off จะละเว้น
การแทนที่ระดับความพยายามในการให้เหตุผลตอนเริ่มต้น เมื่อละเว้น การสร้าง ACP จะใช้
ค่าเริ่มต้นด้านการคิดของเอเจนต์ย่อยที่มีอยู่และ
agents.defaults.models["provider/model"].params.thinking ต่อโมเดลสำหรับโมเดล
ที่เลือก
โหมดการเชื่อมโยงและเธรดเมื่อสร้าง
--bind here|off
| โหมด | ลักษณะการทำงาน |
|---|---|
here |
เชื่อมโยงการสนทนาที่ใช้งานอยู่ในปัจจุบันโดยตรง และล้มเหลวหากไม่มีการสนทนาที่ใช้งานอยู่ |
off |
ไม่สร้างการเชื่อมโยงกับการสนทนาปัจจุบัน |
หมายเหตุ:
--bind hereเป็นวิธีที่ง่ายที่สุดสำหรับผู้ปฏิบัติงานในการ "ทำให้ช่องหรือแชตนี้ใช้ Codex เป็นแบ็กเอนด์"--bind hereไม่สร้างเธรดลูก--bind hereใช้ได้เฉพาะในช่องที่รองรับการเชื่อมโยงการสนทนาปัจจุบัน--bindและ--threadไม่สามารถใช้ร่วมกันในการเรียก/acp spawnครั้งเดียวกัน
--thread auto|here|off
| โหมด | ลักษณะการทำงาน |
|---|---|
auto |
เมื่ออยู่ในเธรดที่ใช้งานอยู่: เชื่อมโยงเธรดนั้น เมื่ออยู่นอกเธรด: สร้าง/เชื่อมโยงเธรดลูกหากรองรับ |
here |
กำหนดให้ต้องอยู่ในเธรดที่ใช้งานอยู่ในปัจจุบัน และล้มเหลวหากไม่ได้อยู่ในเธรด |
off |
ไม่มีการเชื่อมโยง เซสชันเริ่มต้นโดยไม่เชื่อมโยง |
หมายเหตุ:
- ในบริเวณการเชื่อมโยงที่ไม่มีเธรด ลักษณะการทำงานเริ่มต้นจะเทียบเท่ากับ
off - การสร้างแบบเชื่อมโยงกับเธรดต้องอาศัยการรองรับจากนโยบายของช่อง:
- Discord:
channels.discord.threadBindings.spawnSessions=true - Telegram:
channels.telegram.threadBindings.spawnSessions=true
- Discord:
- ใช้
--bind hereเมื่อต้องการตรึงการสนทนาปัจจุบันโดยไม่สร้างเธรดลูก
รูปแบบการส่งมอบ
เซสชัน ACP อาจเป็นพื้นที่ทำงานแบบโต้ตอบหรือเป็นงานเบื้องหลัง ที่พาเรนต์เป็นเจ้าของ เส้นทางการส่งมอบขึ้นอยู่กับรูปแบบนั้น
เซสชัน ACP แบบโต้ตอบ
เซสชันแบบโต้ตอบมีไว้เพื่อสนทนาต่อบนพื้นผิวแชตที่มองเห็นได้:
/acp spawn ... --bind hereเชื่อมโยงการสนทนาปัจจุบันกับเซสชัน ACP/acp spawn ... --thread ...เชื่อมโยงเธรด/หัวข้อของช่องกับเซสชัน ACPbindings[].type="acp"แบบถาวรที่กำหนดค่าไว้จะกำหนดเส้นทางการสนทนาที่ตรงกันไปยังเซสชัน ACP เดิม
ข้อความติดตามผลในการสนทนาที่เชื่อมโยงไว้จะถูกกำหนดเส้นทางโดยตรงไปยังเซสชัน ACP และผลลัพธ์ ACP จะถูกส่งกลับไปยัง ช่อง/เธรด/หัวข้อเดียวกัน
สิ่งที่ OpenClaw ส่งไปยังแฮร์เนส:
- การติดตามผลแบบผูกตามปกติจะถูกส่งเป็นข้อความพรอมต์ พร้อมไฟล์แนบเฉพาะเมื่อ harness/backend รองรับเท่านั้น
- คำสั่งจัดการ
/acpและคำสั่ง Gateway ภายในเครื่องจะถูกดักจับก่อนส่งต่อไปยัง ACP - เหตุการณ์การเสร็จสิ้นที่สร้างโดยรันไทม์จะถูกทำให้เป็นรูปธรรมแยกตามเป้าหมาย เอเจนต์ OpenClaw จะได้รับ envelope บริบทรันไทม์ภายในของ OpenClaw ส่วน harness ACP ภายนอกจะได้รับพรอมต์ธรรมดาที่มีผลลัพธ์จากงานลูกและคำสั่ง ไม่ควรส่ง envelope ดิบ
<<<BEGIN_OPENCLAW_INTERNAL_CONTEXT>>>ไปยัง harness ภายนอกหรือบันทึกคงไว้เป็นข้อความบทสนทนาของผู้ใช้ ACP โดยเด็ดขาด - รายการบทสนทนา ACP ใช้ข้อความทริกเกอร์ที่ผู้ใช้มองเห็นหรือพรอมต์การเสร็จสิ้นแบบธรรมดา เมทาดาทาเหตุการณ์ภายในจะยังคงมีโครงสร้างอยู่ใน OpenClaw เมื่อทำได้ และไม่ถือเป็นเนื้อหาแชตที่ผู้ใช้เป็นผู้เขียน
เซสชัน ACP แบบครั้งเดียวที่พาเรนต์เป็นเจ้าของ
เซสชัน ACP แบบครั้งเดียวที่ถูกสร้างโดยการทำงานของเอเจนต์อื่นจะเป็นงานลูก เบื้องหลัง คล้ายกับเอเจนต์ย่อย:
- พาเรนต์ร้องของานด้วย
sessions_spawn({ runtime: "acp", mode: "run" }) - งานลูกทำงานในเซสชัน harness ACP ของตนเอง
- เทิร์นของงานลูกทำงานบนเลนเบื้องหลังเดียวกับที่ใช้สร้างเอเจนต์ย่อยแบบเนทีฟ ดังนั้น harness ACP ที่ช้าจะไม่ปิดกั้นงานในเซสชันหลักอื่นที่ไม่เกี่ยวข้อง
- รายงานการเสร็จสิ้นจะส่งกลับผ่านเส้นทางประกาศการเสร็จสิ้นของงาน OpenClaw จะแปลงเมทาดาทาการเสร็จสิ้นภายในเป็นพรอมต์ ACP แบบธรรมดาก่อนส่งไปยัง harness ภายนอก ดังนั้น harness จะไม่เห็นเครื่องหมายบริบทรันไทม์ที่ใช้เฉพาะใน OpenClaw
- พาเรนต์จะเขียนผลลัพธ์ของงานลูกใหม่ด้วยน้ำเสียงปกติของผู้ช่วย เมื่อการตอบกลับที่ผู้ใช้มองเห็นมีประโยชน์
อย่า ถือว่าเส้นทางนี้เป็นแชตแบบเพียร์ทูเพียร์ระหว่างพาเรนต์กับ งานลูก งานลูกมีช่องทางส่งผลการเสร็จสิ้นกลับไปยังพาเรนต์อยู่แล้ว
sessions_send และการส่งมอบ A2A
sessions_send สามารถกำหนดเป้าหมายเป็นเซสชันอื่นหลังการสร้างได้ สำหรับเซสชันเพียร์
ปกติ OpenClaw ใช้เส้นทางติดตามผลแบบเอเจนต์ถึงเอเจนต์ (A2A) หลังจาก
แทรกข้อความ:
- รอการตอบกลับจากเซสชันเป้าหมาย
- ให้ผู้ร้องขอและเป้าหมายแลกเปลี่ยนเทิร์นติดตามผลตามจำนวนที่จำกัดไว้ได้ตามต้องการ
- ขอให้เป้าหมายสร้างข้อความประกาศ
- ส่งประกาศนั้นไปยังช่องหรือเธรดที่มองเห็นได้
เส้นทาง A2A ดังกล่าวเป็นทางเลือกสำรองสำหรับการส่งระหว่างเพียร์ที่ผู้ส่งต้องการ
การติดตามผลที่มองเห็นได้ เส้นทางนี้ยังคงเปิดใช้งานเมื่อเซสชันที่ไม่เกี่ยวข้องสามารถมองเห็นและ
ส่งข้อความไปยังเป้าหมาย ACP ได้ เช่น ภายใต้การตั้งค่า tools.sessions.visibility
แบบกว้าง
OpenClaw จะข้ามการติดตามผลแบบ A2A เฉพาะเมื่อผู้ร้องขอเป็นพาเรนต์ของ
งานลูก ACP แบบครั้งเดียวที่พาเรนต์นั้นเป็นเจ้าของ ในกรณีดังกล่าว การเรียกใช้ A2A ซ้อนบน
การเสร็จสิ้นของงานอาจปลุกพาเรนต์ด้วยผลลัพธ์ของงานลูก ส่งต่อ
การตอบกลับของพาเรนต์กลับเข้าไปยังงานลูก และสร้างลูปสะท้อนกลับระหว่างพาเรนต์/งานลูก
ผลลัพธ์ sessions_send จะรายงาน delivery.status="skipped" สำหรับ
กรณีงานลูกที่เป็นเจ้าของนั้น เนื่องจากเส้นทางการเสร็จสิ้นรับผิดชอบ
ผลลัพธ์อยู่แล้ว
ดำเนินเซสชันที่มีอยู่ต่อ
ใช้ resumeSessionId เพื่อดำเนินเซสชัน ACP ก่อนหน้าต่อแทน
การเริ่มใหม่ เอเจนต์จะเล่นประวัติการสนทนาของตนซ้ำผ่าน
session/load จึงสามารถดำเนินการต่อด้วยบริบททั้งหมดของสิ่งที่เกิดขึ้นก่อนหน้า
{ "task": "ทำต่อจากจุดที่ค้างไว้ - แก้การทดสอบที่ยังล้มเหลืออยู่", "runtime": "acp", "agentId": "codex", "resumeSessionId": "<previous-session-id>"}กรณีใช้งานทั่วไป:
- ส่งต่อเซสชัน Codex จากแล็ปท็อปไปยังโทรศัพท์ โดยบอกเอเจนต์ให้ทำต่อจากจุดที่ค้างไว้
- ดำเนินเซสชันเขียนโค้ดที่เริ่มแบบโต้ตอบใน CLI ต่อ โดยเปลี่ยนมาทำแบบไม่มีส่วนติดต่อผ่านเอเจนต์
- ดำเนินงานที่หยุดชะงักจากการรีสตาร์ต Gateway หรือหมดเวลาจากการไม่มีการใช้งานต่อ
หมายเหตุ:
resumeSessionIdใช้ได้เฉพาะเมื่อruntime: "acp"เท่านั้น รันไทม์เอเจนต์ย่อยเริ่มต้นจะไม่สนใจฟิลด์ที่ใช้เฉพาะกับ ACP นี้streamToใช้ได้เฉพาะเมื่อruntime: "acp"เท่านั้น รันไทม์เอเจนต์ย่อยเริ่มต้นจะไม่สนใจฟิลด์ที่ใช้เฉพาะกับ ACP นี้resumeSessionIdเป็นรหัสสำหรับดำเนิน ACP/harness ต่อที่ใช้ภายในโฮสต์ ไม่ใช่คีย์เซสชันช่องของ OpenClaw โดย OpenClaw ยังคงตรวจสอบนโยบายการสร้าง ACP และนโยบายเอเจนต์เป้าหมายก่อนส่งต่อ ขณะที่ backend หรือ harness ของ ACP เป็นผู้รับผิดชอบการอนุญาตสำหรับการโหลดรหัส upstream นั้นresumeSessionIdกู้คืนประวัติการสนทนา ACP ของ upstream ส่วนthreadและmodeยังคงใช้กับเซสชัน OpenClaw ใหม่ที่กำลังสร้างตามปกติ ดังนั้นmode: "session"ยังคงต้องใช้thread: true- เอเจนต์เป้าหมายต้องรองรับ
session/load(Codex และ Claude Code รองรับ) - หากไม่พบรหัสเซสชัน การสร้างจะล้มเหลวพร้อมข้อผิดพลาดที่ชัดเจน โดยไม่มีการย้อนกลับไปสร้างเซสชันใหม่แบบเงียบ ๆ
การทดสอบแบบ smoke หลังการปรับใช้
หลังปรับใช้ Gateway ให้ทำการตรวจสอบแบบต้นทางถึงปลายทางกับระบบจริง แทนการเชื่อถือ เฉพาะการทดสอบหน่วย:
- ตรวจสอบเวอร์ชันและคอมมิตของ Gateway ที่ปรับใช้บนโฮสต์เป้าหมาย
- เปิดเซสชันบริดจ์ ACPX ชั่วคราวไปยังเอเจนต์จริง
- ขอให้เอเจนต์นั้นเรียก
sessions_spawnพร้อมruntime: "acp",agentId: "codex",mode: "run"และงานReply with exactly LIVE-ACP-SPAWN-OK - ตรวจสอบ
accepted=yes,childSessionKeyจริง และต้องไม่มีข้อผิดพลาดจากตัวตรวจสอบ - ล้างเซสชันบริดจ์ชั่วคราว
คงเกตไว้ที่ mode: "run" และข้าม streamTo: "parent" -
เส้นทาง mode: "session" ที่ผูกกับเธรดและเส้นทางรีเลย์สตรีมเป็นการทดสอบ
การผสานรวมที่สมบูรณ์กว่าและแยกต่างหาก
ความเข้ากันได้กับแซนด์บ็อกซ์
ปัจจุบันเซสชัน ACP ทำงานบนรันไทม์ของโฮสต์ ไม่ได้ อยู่ภายในแซนด์บ็อกซ์ของ OpenClaw
ข้อจำกัดปัจจุบัน:
- หากเซสชันผู้ร้องขออยู่ในแซนด์บ็อกซ์ การสร้าง ACP จะถูกปิดกั้นทั้งสำหรับ
sessions_spawn({ runtime: "acp" })และ/acp spawn sessions_spawnที่ใช้runtime: "acp"ไม่รองรับsandbox: "require"
การระบุเป้าหมายเซสชัน
การดำเนินการ /acp ส่วนใหญ่รับเป้าหมายเซสชันแบบไม่บังคับ (session-key,
session-id หรือ session-label)
ลำดับการระบุ:
- อาร์กิวเมนต์เป้าหมายที่ระบุอย่างชัดเจน (หรือ
--sessionสำหรับ/acp steer)- ลองใช้คีย์
- จากนั้นใช้รหัสเซสชันที่มีรูปแบบ UUID
- จากนั้นใช้ป้ายกำกับ
- การผูกเธรดปัจจุบัน (หากการสนทนา/เธรดนี้ผูกกับเซสชัน ACP)
- ย้อนกลับไปใช้เซสชันผู้ร้องขอปัจจุบัน
ทั้งการผูกการสนทนาปัจจุบันและการผูกเธรดมีส่วนร่วมในขั้นตอนที่ 2
หากไม่สามารถระบุเป้าหมายได้ OpenClaw จะส่งคืนข้อผิดพลาดที่ชัดเจน
(Unable to resolve session target: ...)
การควบคุม ACP
| คำสั่ง | การทำงาน | ตัวอย่าง |
|---|---|---|
/acp spawn |
สร้างเซสชัน ACP พร้อมตัวเลือกผูกกับปัจจุบันหรือผูกกับเธรด | /acp spawn codex --bind here --cwd /repo |
/acp cancel |
ยกเลิกเทิร์นที่กำลังดำเนินอยู่สำหรับเซสชันเป้าหมาย | /acp cancel agent:codex:acp:<uuid> |
/acp steer |
ส่งคำสั่งชี้นำไปยังเซสชันที่กำลังทำงาน | /acp steer --session support inbox prioritize failing tests |
/acp close |
ปิดเซสชันและยกเลิกการผูกเป้าหมายเธรด | /acp close |
/acp status |
แสดง backend, โหมด, สถานะ, ตัวเลือกรันไทม์ และความสามารถ | /acp status |
/acp set-mode |
ตั้งค่าโหมดรันไทม์สำหรับเซสชันเป้าหมาย | /acp set-mode plan |
/acp set |
เขียนตัวเลือกการกำหนดค่ารันไทม์ทั่วไป | /acp set model openai/gpt-5.4 |
/acp cwd |
ตั้งค่าการแทนที่ไดเรกทอรีทำงานของรันไทม์ | /acp cwd /Users/user/Projects/repo |
/acp permissions |
ตั้งค่าโปรไฟล์นโยบายการอนุมัติ | /acp permissions strict |
/acp timeout |
ตั้งค่าการหมดเวลาของรันไทม์ (วินาที) | /acp timeout 120 |
/acp model |
ตั้งค่าการแทนที่โมเดลของรันไทม์ | /acp model anthropic/claude-opus-4-6 |
/acp reset-options |
ลบการแทนที่ตัวเลือกรันไทม์ของเซสชัน | /acp reset-options |
/acp sessions |
แสดงรายการเซสชัน ACP ล่าสุดจากที่จัดเก็บ | /acp sessions |
/acp doctor |
แสดงสถานะความพร้อมของ backend, ความสามารถ และวิธีแก้ไขที่ดำเนินการได้ | /acp doctor |
/acp install |
แสดงขั้นตอนติดตั้งและเปิดใช้งานที่กำหนดแน่นอน | /acp install |
การควบคุมรันไทม์ (spawn, cancel, steer, close, status, set-mode,
set, cwd, permissions, timeout, model และ reset-options) ต้องใช้
ตัวตนเจ้าของจากช่องภายนอกและ operator.admin จากไคลเอนต์ Gateway
ภายใน ผู้ส่งที่ไม่ใช่เจ้าของแต่ได้รับอนุญาตยังคงใช้ sessions,
doctor, install และ help ได้ สำหรับผู้ส่งที่ไม่ใช่เจ้าของ /acp sessions
จะแสดงเฉพาะเซสชันที่ผูกอยู่ปัจจุบันหรือเซสชันผู้ร้องขอ ส่วนตัวตนเจ้าของและ
ไคลเอนต์ operator.admin จะเห็นเซสชันล่าสุดทั้งหมด
/acp status แสดงตัวเลือกรันไทม์ที่มีผลจริง พร้อมตัวระบุเซสชันระดับรันไทม์และ
ระดับ backend ข้อผิดพลาดของการควบคุมที่ไม่รองรับจะแสดงอย่าง
ชัดเจนเมื่อ backend ขาดความสามารถ คำสั่งที่รับโทเค็นเป้าหมาย
(session-key, session-id หรือ session-label) จะระบุโทเค็นเหล่านั้นผ่านการค้นหาเซสชันของ Gateway
รวมถึงราก session.store แบบกำหนดเองต่อเอเจนต์ /acp sessions
ไม่รับโทเค็นเป้าหมาย
การแมปตัวเลือกรันไทม์
/acp มีคำสั่งอำนวยความสะดวกและตัวตั้งค่าทั่วไป การดำเนินการที่เทียบเท่ากัน:
| คำสั่ง | แมปไปยัง | หมายเหตุ |
|---|---|---|
/acp model <id> |
คีย์การกำหนดค่ารันไทม์ model |
สำหรับ Codex ACP นั้น OpenClaw จะปรับ openai/<model> ให้เป็นรหัสโมเดลของอะแดปเตอร์ และแมปส่วนต่อท้ายการใช้เหตุผลที่คั่นด้วยเครื่องหมายทับ เช่น openai/gpt-5.4/high ไปยัง reasoning_effort |
/acp set thinking <level> |
ตัวเลือกมาตรฐาน thinking |
OpenClaw จะส่งค่าที่เทียบเท่าซึ่งแบ็กเอนด์ประกาศไว้เมื่อมี โดยเลือก thinking ก่อน จากนั้นจึงเป็น effort, reasoning_effort หรือ thought_level สำหรับ Codex ACP อะแดปเตอร์จะแมปค่าไปยัง reasoning_effort |
/acp permissions <profile> |
ตัวเลือกมาตรฐาน permissionProfile |
OpenClaw จะส่งค่าที่เทียบเท่าซึ่งแบ็กเอนด์ประกาศไว้เมื่อมี เช่น approval_policy, permission_profile, permissions หรือ permission_mode |
/acp timeout <seconds> |
ตัวเลือกมาตรฐาน timeoutSeconds |
OpenClaw จะส่งค่าที่เทียบเท่าซึ่งแบ็กเอนด์ประกาศไว้เมื่อมี เช่น timeout หรือ timeout_seconds |
/acp cwd <path> |
การแทนที่ cwd ของรันไทม์ | อัปเดตโดยตรง |
/acp set <key> <value> |
ทั่วไป | key=cwd ใช้พาธแทนที่ cwd |
/acp reset-options |
ล้างค่าการแทนที่รันไทม์ทั้งหมด | - |
แฮร์เนส acpx การตั้งค่า Plugin และสิทธิ์
สำหรับการกำหนดค่าแฮร์เนส acpx (นามแฝง Claude Code / Codex / Gemini CLI) บริดจ์ MCP สำหรับ plugin-tools และ OpenClaw-tools รวมถึงโหมดสิทธิ์ ACP โปรดดู เอเจนต์ ACP - การตั้งค่า
การแก้ไขปัญหา
| อาการ | สาเหตุที่เป็นไปได้ | วิธีแก้ไข |
|---|---|---|
ACP runtime backend is not configured |
Plugin แบ็กเอนด์หายไป ถูกปิดใช้งาน หรือถูกบล็อกโดย plugins.allow |
ติดตั้งและเปิดใช้งาน Plugin แบ็กเอนด์ รวม acpx ไว้ใน plugins.allow เมื่อตั้งค่ารายการอนุญาตนั้นไว้ แล้วเรียกใช้ /acp doctor |
ACP is disabled by policy (acp.enabled=false) |
ACP ถูกปิดใช้งานทั่วระบบ | ตั้งค่า acp.enabled=true |
ACP dispatch is disabled by policy (acp.dispatch.enabled=false) |
ปิดใช้งานการส่งต่ออัตโนมัติจากข้อความในเธรดปกติ | ตั้งค่า acp.dispatch.enabled=true เพื่อกลับมาใช้การกำหนดเส้นทางเธรดอัตโนมัติ การเรียก sessions_spawn({ runtime: "acp" }) โดยตรงยังคงทำงานได้ |
ACP agent "<id>" is not allowed by policy |
เอเจนต์ไม่อยู่ในรายการอนุญาต | ใช้ agentId ที่ได้รับอนุญาต หรืออัปเดต acp.allowedAgents |
/acp doctor รายงานว่าแบ็กเอนด์ไม่พร้อมทันทีหลังเริ่มต้น |
Plugin แบ็กเอนด์หายไป ถูกปิดใช้งาน ถูกบล็อกโดยนโยบายอนุญาต/ปฏิเสธ หรือไฟล์ปฏิบัติการที่กำหนดค่าไว้ไม่พร้อมใช้งาน | ติดตั้ง/เปิดใช้งาน Plugin แบ็กเอนด์ เรียกใช้ /acp doctor อีกครั้ง และตรวจสอบข้อผิดพลาดในการติดตั้งแบ็กเอนด์หรือนโยบายหากสถานะยังคงผิดปกติ |
| ไม่พบคำสั่งแฮร์เนส | ไม่ได้ติดตั้ง CLI ของอะแดปเตอร์, Plugin ภายนอกหายไป หรือการดึงข้อมูล npx ครั้งแรกสำหรับอะแดปเตอร์ที่ไม่ใช่ Codex ล้มเหลว |
เรียกใช้ /acp doctor, ติดตั้ง/เตรียมอะแดปเตอร์ล่วงหน้าบนโฮสต์ Gateway หรือกำหนดค่าคำสั่งเอเจนต์ acpx โดยตรง |
| แฮร์เนสรายงานว่าไม่พบโมเดล | รหัสโมเดลใช้ได้กับผู้ให้บริการ/แฮร์เนสอื่น แต่ใช้ไม่ได้กับเป้าหมาย ACP นี้ | ใช้โมเดลที่แฮร์เนสนั้นแสดงไว้ กำหนดค่าโมเดลในแฮร์เนส หรือละเว้นค่าการแทนที่ |
| แฮร์เนสรายงานข้อผิดพลาดการยืนยันตัวตนของผู้ให้บริการ | OpenClaw ทำงานปกติ แต่ CLI/ผู้ให้บริการเป้าหมายยังไม่ได้เข้าสู่ระบบ | เข้าสู่ระบบหรือระบุคีย์ผู้ให้บริการที่จำเป็นในสภาพแวดล้อมของโฮสต์ Gateway |
Unable to resolve session target: ... |
โทเค็นคีย์/รหัส/ป้ายกำกับไม่ถูกต้อง | เรียกใช้ /acp sessions, คัดลอกคีย์/ป้ายกำกับที่ถูกต้องทุกตัวอักษร แล้วลองอีกครั้ง |
--bind here requires running /acp spawn inside an active ... conversation |
ใช้ --bind here โดยไม่มีการสนทนาที่ใช้งานอยู่ซึ่งสามารถผูกได้ |
ไปยังแชต/ช่องเป้าหมายแล้วลองอีกครั้ง หรือเริ่มโดยไม่ผูก |
Conversation bindings are unavailable for <channel>. |
อะแดปเตอร์ไม่มีความสามารถในการผูก ACP กับการสนทนาปัจจุบัน | ใช้ /acp spawn ... --thread ... ในตำแหน่งที่รองรับ กำหนดค่า bindings[] ระดับบนสุด หรือย้ายไปยังช่องที่รองรับ |
--thread here requires running /acp spawn inside an active ... thread |
ใช้ --thread here นอกบริบทของเธรด |
ย้ายไปยังเธรดเป้าหมาย หรือใช้ --thread auto/off |
Only <user-id> can rebind this channel/conversation/thread. |
ผู้ใช้อื่นเป็นเจ้าของเป้าหมายการผูกที่ใช้งานอยู่ | ผูกใหม่ในฐานะเจ้าของ หรือใช้การสนทนาหรือเธรดอื่น |
Thread bindings are unavailable for <channel>. |
อะแดปเตอร์ไม่มีความสามารถในการผูกเธรด | ใช้ --thread off หรือย้ายไปยังอะแดปเตอร์/ช่องที่รองรับ |
Sandboxed sessions cannot spawn ACP sessions ... |
รันไทม์ ACP ทำงานฝั่งโฮสต์ แต่เซสชันของผู้ร้องขออยู่ในแซนด์บ็อกซ์ | ใช้ runtime="subagent" จากเซสชันในแซนด์บ็อกซ์ หรือเริ่ม ACP จากเซสชันที่ไม่อยู่ในแซนด์บ็อกซ์ |
sessions_spawn sandbox="require" is unsupported for runtime="acp" ... |
มีการร้องขอ sandbox="require" สำหรับรันไทม์ ACP |
ใช้ runtime="subagent" เมื่อต้องใช้แซนด์บ็อกซ์ หรือใช้ ACP กับ sandbox="inherit" จากเซสชันที่ไม่อยู่ในแซนด์บ็อกซ์ |
Cannot apply --model ... did not advertise model support |
แฮร์เนสเป้าหมายไม่รองรับการสลับโมเดล ACP แบบทั่วไป | ใช้แฮร์เนสที่ประกาศ ACP models/session/set_model, ใช้การอ้างอิงโมเดล Codex ACP หรือกำหนดค่าโมเดลโดยตรงในแฮร์เนสหากมีแฟล็กเริ่มต้นของตัวเอง |
| ไม่มีข้อมูลเมตา ACP สำหรับเซสชันที่ผูกไว้ | ข้อมูลเมตาเซสชัน ACP ล้าสมัย/ถูกลบ | สร้างใหม่ด้วย /acp spawn แล้วผูกใหม่/โฟกัสเธรด |
PermissionPromptUnavailableError: Permission prompt unavailable in non-interactive mode |
permissionMode บล็อกการเขียน/การเรียกใช้ในเซสชัน ACP แบบไม่โต้ตอบ |
ตั้งค่า plugins.entries.acpx.config.permissionMode เป็น approve-all แล้วรีสตาร์ต Gateway ดู การกำหนดค่าสิทธิ์ |
| เซสชัน ACP ล้มเหลวตั้งแต่ช่วงแรกโดยมีเอาต์พุตเพียงเล็กน้อย | พรอมต์ขอสิทธิ์ถูกบล็อกโดย permissionMode/nonInteractivePermissions |
ตรวจสอบบันทึกของ Gateway เพื่อหา AcpRuntimeError หากต้องการสิทธิ์เต็มรูปแบบ ให้ตั้งค่า permissionMode=approve-all; หากต้องการลดระดับการทำงานอย่างราบรื่น ให้ตั้งค่า nonInteractivePermissions=deny |
| เซสชัน ACP ค้างไม่สิ้นสุดหลังทำงานเสร็จ | กระบวนการแฮร์เนสเสร็จสิ้นแล้ว แต่เซสชัน ACP ไม่ได้รายงานว่าเสร็จสมบูรณ์ | อัปเดต OpenClaw; การล้างข้อมูล acpx ปัจจุบันจะยุติกระบวนการตัวห่อและอะแดปเตอร์ที่ล้าสมัยซึ่ง OpenClaw เป็นเจ้าของ เมื่อปิดและเมื่อ Gateway เริ่มทำงาน |
แฮร์เนสพบ <<<BEGIN_OPENCLAW_INTERNAL_CONTEXT>>> |
ซองเหตุการณ์ภายในรั่วไหลข้ามขอบเขต ACP | อัปเดต OpenClaw แล้วเรียกใช้ขั้นตอนการทำให้เสร็จสมบูรณ์อีกครั้ง แฮร์เนสภายนอกควรได้รับเฉพาะพรอมต์การทำงานเสร็จสมบูรณ์แบบข้อความธรรมดา |