Multi-agent
การกำหนดเส้นทางแบบหลายเอเจนต์
เรียกใช้เอเจนต์ที่_แยกจากกัน_หลายตัวในกระบวนการ Gateway เดียว โดยแต่ละตัวมีเวิร์กสเปซ ไดเรกทอรีสถานะ (agentDir) และประวัติเซสชันที่ใช้ SQLite เป็นแบ็กเอนด์เป็นของตนเอง รวมถึงบัญชีช่องทางหลายบัญชี (เช่น หมายเลข WhatsApp สองหมายเลข) ข้อความขาเข้าจะถูกกำหนดเส้นทางไปยังเอเจนต์ที่ถูกต้องผ่าน การผูก
เอเจนต์ คือขอบเขตทั้งหมดของแต่ละเพอร์โซนา ซึ่งประกอบด้วยไฟล์เวิร์กสเปซ โปรไฟล์การยืนยันตัวตน รีจิสทรีโมเดล และที่เก็บเซสชัน การผูก จะแมปบัญชีช่องทาง (เวิร์กสเปซ Slack, หมายเลข WhatsApp เป็นต้น) ไปยังเอเจนต์หนึ่งตัว
เอเจนต์หนึ่งตัวคืออะไร
เอเจนต์แต่ละตัวมีสิ่งต่อไปนี้เป็นของตนเอง:
- เวิร์กสเปซ: ไฟล์,
AGENTS.md/SOUL.md/USER.md, บันทึกในเครื่อง, กฎของเพอร์โซนา - ไดเรกทอรีสถานะ (
agentDir): โปรไฟล์การยืนยันตัวตน รีจิสทรีโมเดล การกำหนดค่ารายเอเจนต์ - ที่เก็บเซสชัน: ประวัติการแชตและสถานะการกำหนดเส้นทางใน
~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite
โปรไฟล์การยืนยันตัวตนแยกตามเอเจนต์และอ่านจาก:
~/.openclaw/agents/<agentId>/agent/auth-profiles.jsonSkills จะโหลดจากเวิร์กสเปซของแต่ละเอเจนต์รวมถึงรูทที่ใช้ร่วมกัน เช่น ~/.openclaw/skills แล้วกรองตามรายการอนุญาต Skills ที่มีผลของเอเจนต์ ใช้ agents.defaults.skills สำหรับค่าพื้นฐานที่ใช้ร่วมกัน และ agents.list[].skills สำหรับการแทนที่รายเอเจนต์ (รายการที่ระบุอย่างชัดเจนจะแทนที่ค่าเริ่มต้น ไม่ได้นำมารวมกัน) ดู Skills: รายเอเจนต์เทียบกับใช้ร่วมกัน และ Skills: รายการอนุญาตของเอเจนต์
พื้นที่จัดเก็บที่ Plugin เป็นเจ้าของจะเป็นไปตามการกำหนดค่าของ Plugin นั้น การเพิ่มเอเจนต์ตัวที่สอง ไม่ได้แยกที่เก็บส่วนกลางของทุก Plugin โดยอัตโนมัติ ตัวอย่างเช่น ให้กำหนดค่า คลัง Memory Wiki รายเอเจนต์ เมื่อเพอร์โซนาไม่ควรใช้ความรู้วิกิที่คอมไพล์แล้วร่วมกัน
พาธ
| รายการ | ค่าเริ่มต้น | การแทนที่ |
|---|---|---|
| การกำหนดค่า | ~/.openclaw/openclaw.json |
OPENCLAW_CONFIG_PATH |
| ไดเรกทอรีสถานะ | ~/.openclaw |
OPENCLAW_STATE_DIR |
| เวิร์กสเปซของเอเจนต์เริ่มต้น | ~/.openclaw/workspace (หรือ workspace-<profile> เมื่อตั้งค่า OPENCLAW_PROFILE) |
agents.list[].workspace, จากนั้น agents.defaults.workspace, หรือ OPENCLAW_WORKSPACE_DIR |
| เวิร์กสเปซของเอเจนต์อื่น | <stateDir>/workspace-<agentId> (หรือ <agents.defaults.workspace>/<agentId> เมื่อตั้งค่าไว้) |
agents.list[].workspace |
| ไดเรกทอรีเอเจนต์ | ~/.openclaw/agents/<agentId>/agent |
agents.list[].agentDir |
| เซสชันและทรานสคริปต์ | ~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite |
— |
| อาร์ติแฟกต์เซสชันแบบเดิม/ที่เก็บถาวร | ~/.openclaw/agents/<agentId>/sessions |
— |
โหมดเอเจนต์เดียว (ค่าเริ่มต้น)
หากไม่กำหนดค่าใด OpenClaw จะเรียกใช้เอเจนต์หนึ่งตัว:
agentIdมีค่าเริ่มต้นเป็นmain- คีย์เซสชันเป็น
agent:main:<mainKey>(mainKeyเริ่มต้นคือmain) - เวิร์กสเปซมีค่าเริ่มต้นเป็น
~/.openclaw/workspace(หรือworkspace-<profile>เมื่อตั้งค่าOPENCLAW_PROFILEเป็นค่าอื่นที่ไม่ใช่default) - สถานะมีค่าเริ่มต้นเป็น
~/.openclaw/agents/main/agent
ตัวช่วยเอเจนต์
เพิ่มเอเจนต์แบบแยกตัวใหม่:
openclaw agents add workแฟล็ก: --workspace <dir>, --model <id>, --agent-dir <dir>, --bind <channel[:accountId]> (ใช้ซ้ำได้), --non-interactive (ต้องใช้ --workspace)
เพิ่ม bindings เพื่อกำหนดเส้นทางข้อความขาเข้า (ตัวช่วยสร้างจะเสนอให้ดำเนินการนี้) แล้วตรวจสอบ:
openclaw agents list --bindingsเริ่มต้นอย่างรวดเร็ว
สร้างเวิร์กสเปซของแต่ละเอเจนต์
openclaw agents add codingopenclaw agents add socialแต่ละเอเจนต์จะได้รับเวิร์กสเปซของตนเองพร้อม SOUL.md, AGENTS.md และ USER.md ที่เลือกใช้ได้ รวมถึง agentDir เฉพาะและที่เก็บเซสชันภายใต้ ~/.openclaw/agents/<agentId>
สร้างบัญชีช่องทาง
สร้างหนึ่งบัญชีต่อหนึ่งเอเจนต์บนช่องทางที่ต้องการ:
- Discord: ใช้บอตหนึ่งตัวต่อเอเจนต์ เปิดใช้ Message Content Intent แล้วคัดลอกโทเค็นของแต่ละตัว
- Telegram: สร้างบอตหนึ่งตัวต่อเอเจนต์ผ่าน BotFather แล้วคัดลอกโทเค็นของแต่ละตัว
- WhatsApp: เชื่อมโยงหมายเลขโทรศัพท์แต่ละหมายเลขต่อบัญชี
openclaw channels login --channel whatsapp --account workเพิ่มเอเจนต์ บัญชี และการผูก
เพิ่มเอเจนต์ภายใต้ agents.list บัญชีช่องทางภายใต้ channels.<channel>.accounts และเชื่อมต่อด้วย bindings (ดูตัวอย่างด้านล่าง)
รีสตาร์ตและตรวจสอบ
openclaw gateway restartopenclaw agents list --bindingsopenclaw channels status --probeหลายเอเจนต์ หลายเพอร์โซนา
agentId แต่ละรายการที่กำหนดค่าไว้เป็นขอบเขตเพอร์โซนาที่แยกจากกันสำหรับสถานะหลักของเอเจนต์:
- บัญชีที่แตกต่างกันในแต่ละช่องทาง (ตาม
accountId) - บุคลิกที่แตกต่างกัน (
AGENTS.md/SOUL.mdรายเอเจนต์) - การยืนยันตัวตนและเซสชันแยกจากกัน โดยเปิดใช้การเข้าถึงข้ามเอเจนต์ผ่านฟีเจอร์หรือการกำหนดค่า Plugin ที่ระบุอย่างชัดเจนเท่านั้น
วิธีนี้ทำให้หลายคนใช้ Gateway เดียวร่วมกันได้ โดยยังคงแยกสถานะหลักของเอเจนต์ออกจากกัน
คลัง Memory Wiki รายเอเจนต์
โดยค่าเริ่มต้น Memory Wiki ใช้คลังส่วนกลางหนึ่งแห่ง หากต้องการแยก
ความรู้ที่คอมไพล์แล้วของเอเจนต์ฝ่ายสนับสนุนออกจากของเอเจนต์ฝ่ายการตลาด ให้ตั้งค่า
plugins.entries.memory-wiki.config.vault.scope เป็น agent:
{ plugins: { entries: { "memory-wiki": { enabled: true, config: { vault: { scope: "agent", path: "~/.openclaw/wiki", }, }, }, }, },}พาธที่กำหนดค่าคือไดเรกทอรีแม่ OpenClaw จะต่อท้ายด้วย
รหัสเอเจนต์ที่ปรับให้เป็นมาตรฐาน ทำให้ได้พาธ เช่น ~/.openclaw/wiki/support และ
~/.openclaw/wiki/marketing การดำเนินการ CLI และ Gateway ที่มีขอบเขตรายเอเจนต์ต้องระบุ
เอเจนต์อย่างชัดเจนเมื่อกำหนดค่าเอเจนต์หลายตัว ดู
คลัง Memory Wiki รายเอเจนต์ สำหรับรายละเอียดเกี่ยวกับการกรองบริดจ์
การย้ายข้อมูล และขอบเขตความเชื่อถือ
การค้นหาหน่วยความจำ QMD ข้ามเอเจนต์
หากต้องการให้เอเจนต์หนึ่งค้นหาทรานสคริปต์เซสชัน QMD ของเอเจนต์อื่น ให้เพิ่มคอลเลกชันเพิ่มเติมภายใต้ agents.list[].memorySearch.qmd.extraCollections ใช้ agents.defaults.memorySearch.qmd.extraCollections เมื่อเอเจนต์ทุกตัวควรใช้คอลเลกชันเดียวกันร่วมกัน
{ agents: { defaults: { workspace: "~/workspaces/main", memorySearch: { qmd: { extraCollections: [{ path: "~/agents/family/sessions", name: "family-sessions" }], }, }, }, list: [ { id: "main", workspace: "~/workspaces/main", memorySearch: { qmd: { extraCollections: [{ path: "notes" }], // ตีความภายในเวิร์กสเปซ -> คอลเลกชันชื่อ "notes-main" }, }, }, { id: "family", workspace: "~/workspaces/family" }, ], }, memory: { backend: "qmd", qmd: { includeDefaultMemory: false }, },}พาธของคอลเลกชันเพิ่มเติมสามารถใช้ร่วมกันระหว่างเอเจนต์ได้ แต่ name ของพาธนั้นจะยังต้องระบุอย่างชัดเจนเมื่อพาธอยู่นอกเวิร์กสเปซของเอเจนต์ พาธภายในเวิร์กสเปซจะยังมีขอบเขตรายเอเจนต์ เพื่อให้แต่ละเอเจนต์มีชุดการค้นหาทรานสคริปต์ของตนเอง
หมายเลข WhatsApp หนึ่งหมายเลข หลายคน (แยก DM)
กำหนดเส้นทาง DM ของ WhatsApp จากผู้ส่งแต่ละรายไปยังเอเจนต์ต่างกันบนบัญชี WhatsApp บัญชีเดียว โดยจับคู่ E.164 ของผู้ส่ง (+15551234567) กับ peer.kind: "direct" การตอบกลับยังคงส่งจากหมายเลข WhatsApp เดียวกัน เนื่องจากไม่มีอัตลักษณ์ผู้ส่งแยกตามเอเจนต์
{ agents: { list: [ { id: "alex", workspace: "~/.openclaw/workspace-alex" }, { id: "mia", workspace: "~/.openclaw/workspace-mia" }, ], }, bindings: [ { agentId: "alex", match: { channel: "whatsapp", peer: { kind: "direct", id: "+15551230001" } }, }, { agentId: "mia", match: { channel: "whatsapp", peer: { kind: "direct", id: "+15551230002" } }, }, ], channels: { whatsapp: { dmPolicy: "allowlist", allowFrom: ["+15551230001", "+15551230002"], }, },}การควบคุมการเข้าถึง DM (การจับคู่/รายการอนุญาต) เป็นแบบส่วนกลางต่อบัญชี WhatsApp ไม่ใช่รายเอเจนต์ สำหรับกลุ่มที่ใช้ร่วมกัน ให้ผูกกลุ่มกับเอเจนต์หนึ่งตัวหรือใช้ กลุ่มบรอดแคสต์
กฎการกำหนดเส้นทาง
การผูกให้ผลลัพธ์แบบกำหนดแน่นอน โดยรายการที่เฉพาะเจาะจงที่สุดจะชนะ ดู การกำหนดเส้นทางช่องทาง สำหรับลำดับระดับทั้งหมด (เพียร์ตรงกันทุกประการ, เพียร์แม่, ไวลด์การ์ดเพียร์, กิลด์+บทบาท, กิลด์, ทีม, บัญชี, ช่องทาง, เอเจนต์เริ่มต้น) กฎบางข้อที่ควรเน้นมีดังนี้:
- หากการผูกหลายรายการตรงกันภายในระดับเดียวกัน รายการแรกตามลำดับในการกำหนดค่าจะชนะ
- หากการผูกกำหนดฟิลด์จับคู่หลายฟิลด์ (เช่น
peer+guildId) ฟิลด์ทั้งหมดที่ระบุต้องตรงกัน (ความหมายแบบAND) - การผูกที่ไม่ระบุ
accountIdจะตรงกับบัญชีเริ่มต้นเท่านั้น ไม่ใช่ทุกบัญชี ใช้accountId: "*"สำหรับค่าทดแทนทั้งช่องทาง หรือaccountId: "<name>"สำหรับบัญชีหนึ่งบัญชี การเพิ่มการผูกเดิมอีกครั้งพร้อมรหัสบัญชีที่ระบุอย่างชัดเจน จะอัปเกรดการผูกเดิมที่ระบุเฉพาะช่องทางแทนการสร้างรายการซ้ำ
หลายบัญชี / หลายหมายเลขโทรศัพท์
ช่องทางที่รองรับหลายบัญชี (เช่น WhatsApp) ใช้ accountId เพื่อระบุการเข้าสู่ระบบแต่ละครั้ง accountId แต่ละรายการจะกำหนดเส้นทางไปยังเอเจนต์ของตนเอง ดังนั้นเซิร์ฟเวอร์หนึ่งเครื่องจึงรองรับหมายเลขโทรศัพท์หลายหมายเลขได้โดยไม่ทำให้เซสชันปะปนกัน
ตั้งค่า channels.<channel>.defaultAccount เพื่อเลือกบัญชีที่จะใช้เมื่อไม่ได้ระบุ accountId หากไม่ได้ตั้งค่า OpenClaw จะใช้ default หากมี มิฉะนั้นจะใช้ id ของบัญชีแรกที่กำหนดค่าไว้ (เรียงลำดับแล้ว)
ช่องทางที่รองรับหลายบัญชี: discord, feishu, googlechat, imessage, irc, line, mattermost, matrix, nextcloud-talk, nostr, signal, slack, telegram, whatsapp, zalo, zalouser
แนวคิด
agentId: "สมอง" หนึ่งชุด (พื้นที่ทำงาน การยืนยันตัวตนต่อเอเจนต์ และที่เก็บเซสชันต่อเอเจนต์)accountId: อินสแตนซ์บัญชีช่องทางหนึ่งรายการ (เช่น บัญชี WhatsApppersonalเทียบกับbiz)binding: กำหนดเส้นทางข้อความขาเข้าไปยังagentIdตาม(channel, accountId, peer)และอาจใช้ id ของกิลด์/ทีมด้วย- แชตโดยตรงจะรวมไปยัง
agent:<agentId>:<mainKey>("main" ต่อเอเจนต์; ดูsession.mainKey)
ตัวอย่างตามแพลตฟอร์ม
บอต Discord ต่อเอเจนต์
บัญชีบอต Discord แต่ละบัญชีจะเชื่อมโยงกับ accountId ที่ไม่ซ้ำกัน ผูกแต่ละบัญชีกับเอเจนต์และแยกรายการอนุญาตสำหรับแต่ละบอต
{ agents: { list: [ { id: "main", workspace: "~/.openclaw/workspace-main" }, { id: "coding", workspace: "~/.openclaw/workspace-coding" }, ], }, bindings: [ { agentId: "main", match: { channel: "discord", accountId: "default" } }, { agentId: "coding", match: { channel: "discord", accountId: "coding" } }, ], channels: { discord: { groupPolicy: "allowlist", accounts: { default: { token: "DISCORD_BOT_TOKEN_MAIN", guilds: { "123456789012345678": { channels: { "222222222222222222": { allow: true, requireMention: false }, }, }, }, }, coding: { token: "DISCORD_BOT_TOKEN_CODING", guilds: { "123456789012345678": { channels: { "333333333333333333": { allow: true, requireMention: false }, }, }, }, }, }, }, },}- เชิญบอตแต่ละตัวเข้ากิลด์และเปิดใช้งาน Message Content Intent
- โทเค็นอยู่ใน
channels.discord.accounts.<id>.token(บัญชีเริ่มต้นสามารถใช้DISCORD_BOT_TOKENได้)
บอต Telegram ต่อเอเจนต์
{ agents: { list: [ { id: "main", workspace: "~/.openclaw/workspace-main" }, { id: "alerts", workspace: "~/.openclaw/workspace-alerts" }, ], }, bindings: [ { agentId: "main", match: { channel: "telegram", accountId: "default" } }, { agentId: "alerts", match: { channel: "telegram", accountId: "alerts" } }, ], channels: { telegram: { accounts: { default: { botToken: "123456:ABC...", dmPolicy: "pairing", }, alerts: { botToken: "987654:XYZ...", dmPolicy: "allowlist", allowFrom: ["tg:123456789"], }, }, }, },}- สร้างบอตหนึ่งตัวต่อเอเจนต์ด้วย BotFather แล้วคัดลอกโทเค็นแต่ละรายการ
- โทเค็นอยู่ใน
channels.telegram.accounts.<id>.botToken(บัญชีเริ่มต้นสามารถใช้TELEGRAM_BOT_TOKENได้) - หากมีบอตหลายตัวในกลุ่ม Telegram เดียวกัน ให้เชิญบอตแต่ละตัวและกล่าวถึงบอตที่ควรตอบ
- ปิดใช้งาน Privacy Mode ของ BotFather สำหรับบอตแต่ละตัวในกลุ่ม (
/setprivacy-> Disable) จากนั้นนำบอตออกแล้วเพิ่มกลับเข้าไป เพื่อให้ Telegram นำการตั้งค่าไปใช้ - อนุญาตกลุ่มด้วย
channels.telegram.groupsหรือใช้groupPolicy: "open"เฉพาะสำหรับการติดตั้งใช้งานในกลุ่มที่เชื่อถือได้ - ใส่ ID ผู้ใช้ของผู้ส่งใน
groupAllowFromส่วน ID ของกลุ่มและซูเปอร์กรุ๊ปต้องอยู่ในchannels.telegram.groupsไม่ใช่groupAllowFrom - ผูกตาม
accountIdเพื่อให้บอตแต่ละตัวกำหนดเส้นทางไปยังเอเจนต์ของตนเอง
หมายเลข WhatsApp ต่อเอเจนต์
เชื่อมโยงแต่ละบัญชีก่อนเริ่ม Gateway:
openclaw channels login --channel whatsapp --account personalopenclaw channels login --channel whatsapp --account biz~/.openclaw/openclaw.json (JSON5):
{ agents: { list: [ { id: "home", default: true, name: "Home", workspace: "~/.openclaw/workspace-home", agentDir: "~/.openclaw/agents/home/agent", }, { id: "work", name: "Work", workspace: "~/.openclaw/workspace-work", agentDir: "~/.openclaw/agents/work/agent", }, ], }, // การกำหนดเส้นทางแบบแน่นอน: รายการแรกที่ตรงกันจะถูกเลือก (รายการที่เฉพาะเจาะจงที่สุดก่อน) bindings: [ { agentId: "home", match: { channel: "whatsapp", accountId: "personal" } }, { agentId: "work", match: { channel: "whatsapp", accountId: "biz" } }, // การแทนที่ต่อคู่สนทนาแบบไม่บังคับ (ตัวอย่าง: ส่งกลุ่มที่ระบุไปยังเอเจนต์สำหรับงาน) { agentId: "work", match: { channel: "whatsapp", accountId: "personal", peer: { kind: "group", id: "[email protected]" }, }, }, ], // ปิดเป็นค่าเริ่มต้น: ต้องเปิดใช้งานการส่งข้อความระหว่างเอเจนต์และเพิ่มในรายการอนุญาตอย่างชัดเจน tools: { agentToAgent: { enabled: false, allow: ["home", "work"], }, }, channels: { whatsapp: { accounts: { personal: { // การแทนที่แบบไม่บังคับ ค่าเริ่มต้น: ~/.openclaw/credentials/whatsapp/personal // authDir: "~/.openclaw/credentials/whatsapp/personal", }, biz: { // การแทนที่แบบไม่บังคับ ค่าเริ่มต้น: ~/.openclaw/credentials/whatsapp/biz // authDir: "~/.openclaw/credentials/whatsapp/biz", }, }, }, },}รูปแบบที่ใช้ทั่วไป
WhatsApp สำหรับงานประจำวัน + Telegram สำหรับงานเชิงลึก
แยกตามช่องทาง: กำหนดเส้นทาง WhatsApp ไปยังเอเจนต์ที่รวดเร็วสำหรับการใช้งานประจำวัน และ Telegram ไปยังเอเจนต์ Opus
{ agents: { list: [ { id: "chat", name: "Everyday", workspace: "~/.openclaw/workspace-chat", model: "anthropic/claude-sonnet-4-6", }, { id: "opus", name: "Deep Work", workspace: "~/.openclaw/workspace-opus", model: "anthropic/claude-opus-4-6", }, ], }, bindings: [ { agentId: "chat", match: { channel: "whatsapp", accountId: "*" } }, { agentId: "opus", match: { channel: "telegram", accountId: "*" } }, ],}ตัวอย่างเหล่านี้ใช้ accountId: "*" เพื่อให้การผูกยังคงทำงานหากเพิ่มบัญชีในภายหลัง หากต้องการกำหนดเส้นทาง DM/กลุ่มรายการเดียวไปยัง Opus โดยให้รายการที่เหลือยังอยู่บนแชต ให้เพิ่มการผูก match.peer สำหรับคู่สนทนานั้น — การจับคู่คู่สนทนาจะมีลำดับความสำคัญเหนือกฎระดับช่องทางเสมอ
ช่องทางเดียวกัน กำหนดคู่สนทนาหนึ่งรายไปยัง Opus
ให้ WhatsApp ยังคงใช้เอเจนต์ที่รวดเร็ว แต่กำหนดเส้นทาง DM หนึ่งรายการไปยัง Opus:
{ agents: { list: [ { id: "chat", name: "Everyday", workspace: "~/.openclaw/workspace-chat", model: "anthropic/claude-sonnet-4-6", }, { id: "opus", name: "Deep Work", workspace: "~/.openclaw/workspace-opus", model: "anthropic/claude-opus-4-6", }, ], }, bindings: [ { agentId: "opus", match: { channel: "whatsapp", accountId: "*", peer: { kind: "direct", id: "+15551234567" } }, }, { agentId: "chat", match: { channel: "whatsapp", accountId: "*" } }, ],}การผูกคู่สนทนาจะมีลำดับความสำคัญเสมอ ดังนั้นให้วางไว้เหนือกฎระดับช่องทาง
เอเจนต์ครอบครัวที่ผูกกับกลุ่ม WhatsApp
ผูกเอเจนต์เฉพาะสำหรับครอบครัวเข้ากับกลุ่ม WhatsApp หนึ่งกลุ่ม โดยกำหนดให้ต้องกล่าวถึงและใช้นโยบายเครื่องมือที่เข้มงวดยิ่งขึ้น:
{ agents: { list: [ { id: "family", name: "Family", workspace: "~/.openclaw/workspace-family", identity: { name: "Family Bot" }, groupChat: { mentionPatterns: ["@family", "@familybot", "@Family Bot"], }, sandbox: { mode: "all", scope: "agent", }, tools: { allow: [ "exec", "read", "sessions_list", "sessions_history", "sessions_send", "sessions_spawn", "session_status", ], deny: ["write", "edit", "apply_patch", "browser", "canvas", "nodes", "cron"], }, }, ], }, bindings: [ { agentId: "family", match: { channel: "whatsapp", peer: { kind: "group", id: "[email protected]" }, }, }, ],}รายการอนุญาต/ปฏิเสธเครื่องมือคือ เครื่องมือ ไม่ใช่ Skills หาก Skills จำเป็นต้องเรียกใช้ไบนารี ให้ตรวจสอบว่าอนุญาต exec และมีไบนารีอยู่ในแซนด์บ็อกซ์ สำหรับการควบคุมที่เข้มงวดยิ่งขึ้น ให้ตั้งค่า agents.list[].groupChat.mentionPatterns และเปิดใช้รายการอนุญาตของกลุ่มสำหรับช่องทางไว้
การกำหนดค่าแซนด์บ็อกซ์และเครื่องมือต่อเอเจนต์
แต่ละเอเจนต์สามารถมีข้อจำกัดแซนด์บ็อกซ์และเครื่องมือของตนเองได้:
{ agents: { list: [ { id: "personal", workspace: "~/.openclaw/workspace-personal", sandbox: { mode: "off", // ไม่มีแซนด์บ็อกซ์สำหรับเอเจนต์ส่วนตัว }, // ไม่มีข้อจำกัดเครื่องมือ - ใช้งานเครื่องมือทั้งหมดได้ }, { id: "family", workspace: "~/.openclaw/workspace-family", sandbox: { mode: "all", // ใช้แซนด์บ็อกซ์เสมอ scope: "agent", // หนึ่งคอนเทนเนอร์ต่อเอเจนต์ docker: { // การตั้งค่าครั้งเดียวแบบไม่บังคับหลังสร้างคอนเทนเนอร์ setupCommand: "apt-get update && apt-get install -y git curl", }, }, tools: { allow: ["read"], // เฉพาะเครื่องมืออ่าน deny: ["exec", "write", "edit", "apply_patch"], // ปฏิเสธรายการอื่น }, }, ], },}สิ่งที่ได้รับ:
- การแยกเพื่อความปลอดภัย: จำกัดเครื่องมือสำหรับเอเจนต์ที่ไม่น่าเชื่อถือ
- การควบคุมทรัพยากร: ใช้แซนด์บ็อกซ์กับเอเจนต์ที่ระบุโดยให้เอเจนต์อื่นทำงานบนโฮสต์
- นโยบายที่ยืดหยุ่น: กำหนดสิทธิ์ที่แตกต่างกันสำหรับแต่ละเอเจนต์
ดูตัวอย่างโดยละเอียดที่ แซนด์บ็อกซ์และเครื่องมือแบบหลายเอเจนต์
เนื้อหาที่เกี่ยวข้อง
- เอเจนต์ ACP — การเรียกใช้ชุดเครื่องมือการเขียนโค้ดภายนอก
- การกำหนดเส้นทางช่องทาง — วิธีส่งข้อความไปยังเอเจนต์
- สถานะการออนไลน์ — สถานะการออนไลน์และความพร้อมใช้งานของเอเจนต์
- เซสชัน — การแยกและการกำหนดเส้นทางเซสชัน
- เอเจนต์ย่อย — การสร้างการทำงานของเอเจนต์ในเบื้องหลัง