Agent coordination

แซนด์บ็อกซ์และเครื่องมือสำหรับหลายเอเจนต์

Status: active

เอเจนต์แต่ละตัวในการตั้งค่าแบบหลายเอเจนต์สามารถแทนที่นโยบายแซนด์บ็อกซ์และเครื่องมือส่วนกลางได้ หน้านี้ครอบคลุมการกำหนดค่ารายเอเจนต์ กฎลำดับความสำคัญ และตัวอย่างต่าง ๆ


ตัวอย่างการกำหนดค่า

ตัวอย่างที่ 1: เอเจนต์ส่วนตัว + เอเจนต์ครอบครัวแบบจำกัดสิทธิ์
json
{  "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: เอเจนต์สำหรับงานพร้อมแซนด์บ็อกซ์ที่ใช้ร่วมกัน
json
{  "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ข: โปรไฟล์เขียนโค้ดส่วนกลาง + เอเจนต์สำหรับรับส่งข้อความเท่านั้น
json
{  "tools": { "profile": "coding" },  "agents": {    "list": [      {        "id": "support",        "tools": { "profile": "messaging", "allow": ["slack"] }      }    ]  }}

ผลลัพธ์:

  • เอเจนต์เริ่มต้นได้รับเครื่องมือเขียนโค้ด
  • เอเจนต์ support ใช้ได้เฉพาะการรับส่งข้อความ (+ เครื่องมือ Slack)
ตัวอย่างที่ 3: โหมดแซนด์บ็อกซ์ต่างกันในแต่ละเอเจนต์
json
{  "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[].*):

การกำหนดค่าแซนด์บ็อกซ์

การตั้งค่าเฉพาะเอเจนต์จะแทนที่การตั้งค่าส่วนกลาง:

text
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) สามารถจำกัดการเรียกใช้คำสั่งด้วยสิทธิ์ระดับสูงเพิ่มเติมสำหรับเอเจนต์ที่ระบุ ดูรายละเอียดที่ โหมดสิทธิ์ระดับสูง


    การย้ายจากเอเจนต์เดียว

    ก่อนหน้า (เอเจนต์เดียว)

    json
    {  "agents": {    "defaults": {      "workspace": "~/.openclaw/workspace",      "sandbox": {        "mode": "non-main"      }    }  },  "tools": {    "sandbox": {      "tools": {        "allow": ["read", "write", "apply_patch", "exec"],        "deny": []      }    }  }}

    หลังจากนั้น (หลายเอเจนต์)

    json
    {  "agents": {    "list": [      {        "id": "main",        "default": true,        "workspace": "~/.openclaw/workspace",        "sandbox": { "mode": "off" }      }    ]  }}

    ตัวอย่างข้อจำกัดเครื่องมือ

    เอเจนต์แบบอ่านอย่างเดียว

    json
    {  "tools": {    "allow": ["read"],    "deny": ["exec", "write", "edit", "apply_patch", "process"]  }}

    การเรียกใช้เชลล์โดยปิดใช้งานเครื่องมือระบบไฟล์

    json
    {  "tools": {    "allow": ["read", "exec", "process"],    "deny": ["write", "edit", "apply_patch", "browser", "gateway"]  }}

    การสื่อสารเท่านั้น

    json
    {  "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"


    การทดสอบ

    หลังจากกำหนดค่าแซนด์บ็อกซ์และเครื่องมือสำหรับหลายเอเจนต์แล้ว:

  • ตรวจสอบการจับคู่เอเจนต์

    bash
    openclaw agents list --bindings
  • ตรวจสอบคอนเทนเนอร์แซนด์บ็อกซ์

    bash
    docker ps --filter "name=openclaw-sbx-"
  • ทดสอบข้อจำกัดเครื่องมือ

    • ส่งข้อความที่ต้องใช้เครื่องมือที่ถูกจำกัด
    • ตรวจสอบว่าเอเจนต์ไม่สามารถใช้เครื่องมือที่ถูกปฏิเสธได้
  • เฝ้าติดตามบันทึก

    bash
    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" เพื่อใช้คอนเทนเนอร์เดียวร่วมกันระหว่างเอเจนต์

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

    Was this useful?
    On this page

    On this page