Agent coordination
แซนด์บ็อกซ์และเครื่องมือสำหรับหลายเอเจนต์
เอเจนต์แต่ละตัวในการตั้งค่าแบบหลายเอเจนต์สามารถแทนที่นโยบายแซนด์บ็อกซ์และเครื่องมือส่วนกลางได้ หน้านี้ครอบคลุมการกำหนดค่ารายเอเจนต์ กฎลำดับความสำคัญ และตัวอย่างต่าง ๆ
แบ็กเอนด์และโหมด — เอกสารอ้างอิงแซนด์บ็อกซ์ฉบับเต็ม
ดีบักว่า "เหตุใดสิ่งนี้จึงถูกบล็อก"
การเรียกใช้คำสั่งด้วยสิทธิ์ระดับสูงสำหรับผู้ส่งที่เชื่อถือได้
ตัวอย่างการกำหนดค่า
ตัวอย่างที่ 1: เอเจนต์ส่วนตัว + เอเจนต์ครอบครัวแบบจำกัดสิทธิ์
{ "agents": { "list": [ { "id": "main", "default": true, "name": "Personal Assistant", "workspace": "~/.openclaw/workspace", "sandbox": { "mode": "off" } }, { "id": "family", "name": "Family Bot", "workspace": "~/.openclaw/workspace-family", "sandbox": { "mode": "all", "scope": "agent" }, "tools": { "allow": ["read", "message"], "deny": ["exec", "write", "edit", "apply_patch", "process", "browser"], "message": { "crossContext": { "allowWithinProvider": false, "allowAcrossProviders": false } } } } ] }, "bindings": [ { "agentId": "family", "match": { "provider": "whatsapp", "accountId": "*", "peer": { "kind": "group", "id": "120363424282127706@g.us" } } } ]}ผลลัพธ์:
- เอเจนต์
main: ทำงานบนโฮสต์และเข้าถึงเครื่องมือได้ทั้งหมด - เอเจนต์
family: ทำงานใน Docker (หนึ่งคอนเทนเนอร์ต่อเอเจนต์) ใช้ได้เฉพาะreadและส่งข้อความภายในการสนทนาปัจจุบัน
ตัวอย่างที่ 2: เอเจนต์สำหรับงานพร้อมแซนด์บ็อกซ์ที่ใช้ร่วมกัน
{ "agents": { "list": [ { "id": "personal", "workspace": "~/.openclaw/workspace-personal", "sandbox": { "mode": "off" } }, { "id": "work", "workspace": "~/.openclaw/workspace-work", "sandbox": { "mode": "all", "scope": "shared", "workspaceRoot": "/tmp/work-sandboxes" }, "tools": { "allow": ["read", "write", "apply_patch", "exec"], "deny": ["browser", "gateway", "discord"] } } ] }}ตัวอย่างที่ 2ข: โปรไฟล์เขียนโค้ดส่วนกลาง + เอเจนต์สำหรับรับส่งข้อความเท่านั้น
{ "tools": { "profile": "coding" }, "agents": { "list": [ { "id": "support", "tools": { "profile": "messaging", "allow": ["slack"] } } ] }}ผลลัพธ์:
- เอเจนต์เริ่มต้นได้รับเครื่องมือเขียนโค้ด
- เอเจนต์
supportใช้ได้เฉพาะการรับส่งข้อความ (+ เครื่องมือ Slack)
ตัวอย่างที่ 3: โหมดแซนด์บ็อกซ์ต่างกันในแต่ละเอเจนต์
{ "agents": { "defaults": { "sandbox": { "mode": "non-main", "scope": "session" } }, "list": [ { "id": "main", "workspace": "~/.openclaw/workspace", "sandbox": { "mode": "off" } }, { "id": "public", "workspace": "~/.openclaw/workspace-public", "sandbox": { "mode": "all", "scope": "agent" }, "tools": { "allow": ["read"], "deny": ["exec", "write", "edit", "apply_patch"] } } ] }}ลำดับความสำคัญของการกำหนดค่า
เมื่อมีทั้งการกำหนดค่าส่วนกลาง (agents.defaults.*) และการกำหนดค่าเฉพาะเอเจนต์ (agents.list[].*):
การกำหนดค่าแซนด์บ็อกซ์
การตั้งค่าเฉพาะเอเจนต์จะแทนที่การตั้งค่าส่วนกลาง:
agents.list[].sandbox.mode > agents.defaults.sandbox.modeagents.list[].sandbox.scope > agents.defaults.sandbox.scopeagents.list[].sandbox.workspaceRoot > agents.defaults.sandbox.workspaceRootagents.list[].sandbox.workspaceAccess > agents.defaults.sandbox.workspaceAccessagents.list[].sandbox.docker.* > agents.defaults.sandbox.docker.*agents.list[].sandbox.browser.* > agents.defaults.sandbox.browser.*agents.list[].sandbox.prune.* > agents.defaults.sandbox.prune.*ข้อจำกัดเครื่องมือ
ลำดับการกรองมีดังนี้:
โปรไฟล์เครื่องมือ
tools.profile หรือ agents.list[].tools.profile
โปรไฟล์เครื่องมือของผู้ให้บริการ
tools.byProvider[provider].profile หรือ agents.list[].tools.byProvider[provider].profile
นโยบายเครื่องมือส่วนกลาง
tools.allow / tools.deny
นโยบายเครื่องมือของผู้ให้บริการ
tools.byProvider[provider].allow/deny
นโยบายเครื่องมือเฉพาะเอเจนต์
agents.list[].tools.allow/deny
นโยบายผู้ให้บริการของเอเจนต์
agents.list[].tools.byProvider[provider].allow/deny
นโยบายเครื่องมือของแซนด์บ็อกซ์
tools.sandbox.tools หรือ agents.list[].tools.sandbox.tools
นโยบายเครื่องมือของเอเจนต์ย่อย
tools.subagents.tools หากเกี่ยวข้อง
กฎลำดับความสำคัญ
- แต่ละระดับสามารถจำกัดเครื่องมือเพิ่มเติมได้ แต่ไม่สามารถอนุญาตเครื่องมือที่ถูกปฏิเสธในระดับก่อนหน้าให้กลับมาใช้ได้
- หากตั้งค่า
agents.list[].tools.sandbox.toolsค่านี้จะแทนที่tools.sandbox.toolsสำหรับเอเจนต์นั้น - หากตั้งค่า
agents.list[].tools.profileค่านี้จะแทนที่tools.profileสำหรับเอเจนต์นั้น - คีย์เครื่องมือของผู้ให้บริการรองรับทั้ง
provider(เช่นgoogle-antigravity) หรือprovider/model(เช่นopenai/gpt-5.4)
ลักษณะการทำงานของรายการอนุญาตที่ว่างเปล่า
หากรายการอนุญาตที่กำหนดไว้อย่างชัดเจนรายการใดในลำดับนี้ทำให้การทำงานไม่มีเครื่องมือที่เรียกใช้ได้ OpenClaw จะหยุดก่อนส่งพรอมต์ไปยังโมเดล นี่เป็นพฤติกรรมโดยเจตนา: เอเจนต์ที่กำหนดค่าด้วยเครื่องมือที่ไม่มีอยู่ เช่น agents.list[].tools.allow: ["query_db"] ควรล้มเหลวอย่างชัดเจนจนกว่าจะเปิดใช้งาน Plugin ที่ลงทะเบียน query_db ไม่ใช่ทำงานต่อในฐานะเอเจนต์ที่ใช้ได้เฉพาะข้อความ
นโยบายเครื่องมือรองรับรูปแบบย่อ group:* ซึ่งจะขยายเป็นเครื่องมือหลายรายการ ดูรายการทั้งหมดได้ที่ กลุ่มเครื่องมือ
การแทนที่สิทธิ์ระดับสูงรายเอเจนต์ (agents.list[].tools.elevated) สามารถจำกัดการเรียกใช้คำสั่งด้วยสิทธิ์ระดับสูงเพิ่มเติมสำหรับเอเจนต์ที่ระบุ ดูรายละเอียดที่ โหมดสิทธิ์ระดับสูง
การย้ายจากเอเจนต์เดียว
ก่อนหน้า (เอเจนต์เดียว)
{ "agents": { "defaults": { "workspace": "~/.openclaw/workspace", "sandbox": { "mode": "non-main" } } }, "tools": { "sandbox": { "tools": { "allow": ["read", "write", "apply_patch", "exec"], "deny": [] } } }}หลังจากนั้น (หลายเอเจนต์)
{ "agents": { "list": [ { "id": "main", "default": true, "workspace": "~/.openclaw/workspace", "sandbox": { "mode": "off" } } ] }}ตัวอย่างข้อจำกัดเครื่องมือ
เอเจนต์แบบอ่านอย่างเดียว
{ "tools": { "allow": ["read"], "deny": ["exec", "write", "edit", "apply_patch", "process"] }}การเรียกใช้เชลล์โดยปิดใช้งานเครื่องมือระบบไฟล์
{ "tools": { "allow": ["read", "exec", "process"], "deny": ["write", "edit", "apply_patch", "browser", "gateway"] }}การสื่อสารเท่านั้น
{ "tools": { "sessions": { "visibility": "tree" }, "allow": ["sessions_list", "sessions_send", "sessions_history", "session_status"], "deny": ["exec", "write", "edit", "apply_patch", "read", "browser"] }}sessions_history ในโปรไฟล์นี้ยังคงส่งคืนมุมมองการเรียกคืนข้อมูลที่ถูกจำกัดขอบเขตและปรับให้ปลอดภัย แทนการถ่ายโอนบทสนทนาดิบทั้งหมด การเรียกคืนข้อมูลของผู้ช่วยจะตัดแท็กกระบวนการคิด โครงร่าง <relevant-memories> เพย์โหลด XML ของการเรียกเครื่องมือในรูปข้อความธรรมดา (รวมถึง <tool_call>...</tool_call>, <function_call>...</function_call>, <tool_calls>...</tool_calls>, <function_calls>...</function_calls> และบล็อกการเรียกเครื่องมือที่ถูกตัดทอน) โครงร่างการเรียกเครื่องมือที่ถูกลดระดับ โทเค็นควบคุมโมเดลแบบ ASCII/ความกว้างเต็มที่รั่วไหล และ XML การเรียกเครื่องมือของ MiniMax ที่มีรูปแบบไม่ถูกต้องออก ก่อนการปกปิด/ตัดทอน
ข้อผิดพลาดที่พบบ่อย: "non-main"
การทดสอบ
หลังจากกำหนดค่าแซนด์บ็อกซ์และเครื่องมือสำหรับหลายเอเจนต์แล้ว:
ตรวจสอบการจับคู่เอเจนต์
openclaw agents list --bindingsตรวจสอบคอนเทนเนอร์แซนด์บ็อกซ์
docker ps --filter "name=openclaw-sbx-"ทดสอบข้อจำกัดเครื่องมือ
- ส่งข้อความที่ต้องใช้เครื่องมือที่ถูกจำกัด
- ตรวจสอบว่าเอเจนต์ไม่สามารถใช้เครื่องมือที่ถูกปฏิเสธได้
เฝ้าติดตามบันทึก
openclaw logs --follow | grep -E "routing|sandbox|tools"การแก้ไขปัญหา
เอเจนต์ไม่ได้ทำงานในแซนด์บ็อกซ์แม้ตั้งค่า `mode: 'all'`
- ตรวจสอบว่ามี
agents.defaults.sandbox.modeส่วนกลางที่แทนที่ค่านี้หรือไม่ - การกำหนดค่าเฉพาะเอเจนต์มีลำดับความสำคัญสูงกว่า ดังนั้นให้ตั้งค่า
agents.list[].sandbox.mode: "all"
เครื่องมือยังคงใช้งานได้แม้อยู่ในรายการปฏิเสธ
- ตรวจสอบลำดับการกรองทั้งหมด: โปรไฟล์ → โปรไฟล์ผู้ให้บริการ → นโยบายส่วนกลาง → นโยบายผู้ให้บริการ → นโยบายเอเจนต์ → นโยบายผู้ให้บริการของเอเจนต์ → แซนด์บ็อกซ์ → เอเจนต์ย่อย
- แต่ละระดับทำได้เพียงจำกัดเพิ่มเติมเท่านั้น ไม่สามารถอนุญาตสิทธิ์กลับคืนมาได้
- ดูแซนด์บ็อกซ์เทียบกับนโยบายเครื่องมือเทียบกับสิทธิ์ยกระดับ สำหรับการแก้ไขข้อบกพร่องแบบทีละขั้นตอน
คอนเทนเนอร์ไม่ได้แยกต่อเอเจนต์
- ค่าเริ่มต้นของ
scopeคือ"agent"(หนึ่งคอนเทนเนอร์ต่อรหัสเอเจนต์) - ตั้งค่า
scope: "session"เพื่อใช้หนึ่งคอนเทนเนอร์ต่อเซสชัน หรือตั้งค่าscope: "shared"เพื่อใช้คอนเทนเนอร์เดียวร่วมกันระหว่างเอเจนต์
ที่เกี่ยวข้อง
- โหมดสิทธิ์ยกระดับ
- การกำหนดเส้นทางแบบหลายเอเจนต์
- การกำหนดค่าแซนด์บ็อกซ์
- แซนด์บ็อกซ์เทียบกับนโยบายเครื่องมือเทียบกับสิทธิ์ยกระดับ — การแก้ไขข้อบกพร่องว่า "เหตุใดสิ่งนี้จึงถูกบล็อก"
- การทำแซนด์บ็อกซ์ — เอกสารอ้างอิงแซนด์บ็อกซ์ฉบับเต็ม (โหมด ขอบเขต แบ็กเอนด์ อิมเมจ)
- การจัดการเซสชัน