ในหน้านี้
ในหน้านี้
Multi-agent
การกำหนดเส้นทางแบบหลายเอเจนต์
เรียกใช้เอเจนต์ที่_แยกจากกัน_หลายตัวในกระบวนการ Gateway เดียว โดยแต่ละตัวมีเวิร์กสเปซ ไดเรกทอรีสถานะ (agentDir) และประวัติเซสชันที่ใช้ SQLite เป็นแบ็กเอนด์เป็นของตนเอง รวมถึงบัญชีช่องทางหลายบัญชี (เช่น หมายเลข WhatsApp สองหมายเลข) ข้อความขาเข้าจะถูกกำหนดเส้นทางไปยังเอเจนต์ที่ถูกต้องผ่าน การผูก
เอเจนต์ คือขอบเขตทั้งหมดของแต่ละเพอร์โซนา ซึ่งประกอบด้วยไฟล์เวิร์กสเปซ โปรไฟล์การยืนยันตัวตน รีจิสทรีโมเดล และที่เก็บเซสชัน การผูก จะแมปบัญชีช่องทาง (เวิร์กสเปซ Slack, หมายเลข WhatsApp เป็นต้น) ไปยังเอเจนต์หนึ่งตัว
เอเจนต์หนึ่งตัวคืออะไร
เอเจนต์แต่ละตัวมีสิ่งต่อไปนี้เป็นของตนเอง:
- เวิร์กสเปซ: ไฟล์,
AGENTS.md/SOUL.md/USER.md, บันทึกในเครื่อง, กฎของเพอร์โซนา - ไดเรกทอรีสถานะ (
agentDir): โปรไฟล์การยืนยันตัวตน รีจิสทรีโมเดล การกำหนดค่ารายเอเจนต์ - ที่เก็บเซสชัน: ประวัติการแชตและสถานะการกำหนดเส้นทางใน
~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite
โปรไฟล์การยืนยันตัวตนแยกตามเอเจนต์และอ่านจาก:
Skills จะโหลดจากเวิร์กสเปซของแต่ละเอเจนต์รวมถึงรูทที่ใช้ร่วมกัน เช่น ~/.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
ตัวช่วยเอเจนต์
เพิ่มเอเจนต์แบบแยกตัวใหม่:
แฟล็ก: --workspace <dir>, --model <id>, --agent-dir <dir>, --bind <channel[:accountId]> (ใช้ซ้ำได้), --non-interactive (ต้องใช้ --workspace)
เพิ่ม bindings เพื่อกำหนดเส้นทางข้อความขาเข้า (ตัวช่วยสร้างจะเสนอให้ดำเนินการนี้) แล้วตรวจสอบ:
เริ่มต้นอย่างรวดเร็ว
สร้างเวิร์กสเปซของแต่ละเอเจนต์
แต่ละเอเจนต์จะได้รับเวิร์กสเปซของตนเองพร้อม SOUL.md, AGENTS.md และ USER.md ที่เลือกใช้ได้ รวมถึง agentDir เฉพาะและที่เก็บเซสชันภายใต้ ~/.openclaw/agents/<agentId>
สร้างบัญชีช่องทาง
สร้างหนึ่งบัญชีต่อหนึ่งเอเจนต์บนช่องทางที่ต้องการ:
- Discord: ใช้บอตหนึ่งตัวต่อเอเจนต์ เปิดใช้ Message Content Intent แล้วคัดลอกโทเค็นของแต่ละตัว
- Telegram: สร้างบอตหนึ่งตัวต่อเอเจนต์ผ่าน BotFather แล้วคัดลอกโทเค็นของแต่ละตัว
- WhatsApp: เชื่อมโยงหมายเลขโทรศัพท์แต่ละหมายเลขต่อบัญชี
เพิ่มเอเจนต์ บัญชี และการผูก
เพิ่มเอเจนต์ภายใต้ agents.list บัญชีช่องทางภายใต้ channels.<channel>.accounts และเชื่อมต่อด้วย bindings (ดูตัวอย่างด้านล่าง)
รีสตาร์ตและตรวจสอบ
หลายเอเจนต์ หลายเพอร์โซนา
agentId แต่ละรายการที่กำหนดค่าไว้เป็นขอบเขตเพอร์โซนาที่แยกจากกันสำหรับสถานะหลักของเอเจนต์:
- บัญชีที่แตกต่างกันในแต่ละช่องทาง (ตาม
accountId) - บุคลิกที่แตกต่างกัน (
AGENTS.md/SOUL.mdรายเอเจนต์) - การยืนยันตัวตนและเซสชันแยกจากกัน โดยเปิดใช้การเข้าถึงข้ามเอเจนต์ผ่านฟีเจอร์หรือการกำหนดค่า Plugin ที่ระบุอย่างชัดเจนเท่านั้น
วิธีนี้ทำให้หลายคนใช้ Gateway เดียวร่วมกันได้ โดยยังคงแยกสถานะหลักของเอเจนต์ออกจากกัน
คลัง Memory Wiki รายเอเจนต์
โดยค่าเริ่มต้น Memory Wiki ใช้คลังส่วนกลางหนึ่งแห่ง หากต้องการแยก
ความรู้ที่คอมไพล์แล้วของเอเจนต์ฝ่ายสนับสนุนออกจากของเอเจนต์ฝ่ายการตลาด ให้ตั้งค่า
plugins.entries.memory-wiki.config.vault.scope เป็น agent:
พาธที่กำหนดค่าคือไดเรกทอรีแม่ OpenClaw จะต่อท้ายด้วย
รหัสเอเจนต์ที่ปรับให้เป็นมาตรฐาน ทำให้ได้พาธ เช่น ~/.openclaw/wiki/support และ
~/.openclaw/wiki/marketing การดำเนินการ CLI และ Gateway ที่มีขอบเขตรายเอเจนต์ต้องระบุ
เอเจนต์อย่างชัดเจนเมื่อกำหนดค่าเอเจนต์หลายตัว ดู
คลัง Memory Wiki รายเอเจนต์ สำหรับรายละเอียดเกี่ยวกับการกรองบริดจ์
การย้ายข้อมูล และขอบเขตความเชื่อถือ
การค้นหาหน่วยความจำ QMD ข้ามเอเจนต์
หากต้องการให้เอเจนต์หนึ่งค้นหาทรานสคริปต์เซสชัน QMD ของเอเจนต์อื่น ให้เพิ่มคอลเลกชันเพิ่มเติมภายใต้ agents.list[].memorySearch.qmd.extraCollections ใช้ agents.defaults.memorySearch.qmd.extraCollections เมื่อเอเจนต์ทุกตัวควรใช้คอลเลกชันเดียวกันร่วมกัน
พาธของคอลเลกชันเพิ่มเติมสามารถใช้ร่วมกันระหว่างเอเจนต์ได้ แต่ name ของพาธนั้นจะยังต้องระบุอย่างชัดเจนเมื่อพาธอยู่นอกเวิร์กสเปซของเอเจนต์ พาธภายในเวิร์กสเปซจะยังมีขอบเขตรายเอเจนต์ เพื่อให้แต่ละเอเจนต์มีชุดการค้นหาทรานสคริปต์ของตนเอง
หมายเลข WhatsApp หนึ่งหมายเลข หลายคน (แยก DM)
กำหนดเส้นทาง DM ของ WhatsApp จากผู้ส่งแต่ละรายไปยังเอเจนต์ต่างกันบนบัญชี WhatsApp บัญชีเดียว โดยจับคู่ E.164 ของผู้ส่ง (+15551234567) กับ peer.kind: "direct" การตอบกลับยังคงส่งจากหมายเลข WhatsApp เดียวกัน เนื่องจากไม่มีอัตลักษณ์ผู้ส่งแยกตามเอเจนต์
การควบคุมการเข้าถึง 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 ที่ไม่ซ้ำกัน ผูกแต่ละบัญชีกับเอเจนต์และแยกรายการอนุญาตสำหรับแต่ละบอต
- เชิญบอตแต่ละตัวเข้ากิลด์และเปิดใช้งาน Message Content Intent
- โทเค็นอยู่ใน
channels.discord.accounts.<id>.token(บัญชีเริ่มต้นสามารถใช้DISCORD_BOT_TOKENได้)
บอต Telegram ต่อเอเจนต์
- สร้างบอตหนึ่งตัวต่อเอเจนต์ด้วย 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/openclaw.json (JSON5):
รูปแบบที่ใช้ทั่วไป
WhatsApp สำหรับงานประจำวัน + Telegram สำหรับงานเชิงลึก
แยกตามช่องทาง: กำหนดเส้นทาง WhatsApp ไปยังเอเจนต์ที่รวดเร็วสำหรับการใช้งานประจำวัน และ Telegram ไปยังเอเจนต์ Opus
ตัวอย่างเหล่านี้ใช้ accountId: "*" เพื่อให้การผูกยังคงทำงานหากเพิ่มบัญชีในภายหลัง หากต้องการกำหนดเส้นทาง DM/กลุ่มรายการเดียวไปยัง Opus โดยให้รายการที่เหลือยังอยู่บนแชต ให้เพิ่มการผูก match.peer สำหรับคู่สนทนานั้น — การจับคู่คู่สนทนาจะมีลำดับความสำคัญเหนือกฎระดับช่องทางเสมอ
ช่องทางเดียวกัน กำหนดคู่สนทนาหนึ่งรายไปยัง Opus
ให้ WhatsApp ยังคงใช้เอเจนต์ที่รวดเร็ว แต่กำหนดเส้นทาง DM หนึ่งรายการไปยัง Opus:
การผูกคู่สนทนาจะมีลำดับความสำคัญเสมอ ดังนั้นให้วางไว้เหนือกฎระดับช่องทาง
เอเจนต์ครอบครัวที่ผูกกับกลุ่ม WhatsApp
ผูกเอเจนต์เฉพาะสำหรับครอบครัวเข้ากับกลุ่ม WhatsApp หนึ่งกลุ่ม โดยกำหนดให้ต้องกล่าวถึงและใช้นโยบายเครื่องมือที่เข้มงวดยิ่งขึ้น:
รายการอนุญาต/ปฏิเสธเครื่องมือคือ เครื่องมือ ไม่ใช่ Skills หาก Skills จำเป็นต้องเรียกใช้ไบนารี ให้ตรวจสอบว่าอนุญาต exec และมีไบนารีอยู่ในแซนด์บ็อกซ์ สำหรับการควบคุมที่เข้มงวดยิ่งขึ้น ให้ตั้งค่า agents.list[].groupChat.mentionPatterns และเปิดใช้รายการอนุญาตของกลุ่มสำหรับช่องทางไว้
การกำหนดค่าแซนด์บ็อกซ์และเครื่องมือต่อเอเจนต์
แต่ละเอเจนต์สามารถมีข้อจำกัดแซนด์บ็อกซ์และเครื่องมือของตนเองได้:
สิ่งที่ได้รับ:
- การแยกเพื่อความปลอดภัย: จำกัดเครื่องมือสำหรับเอเจนต์ที่ไม่น่าเชื่อถือ
- การควบคุมทรัพยากร: ใช้แซนด์บ็อกซ์กับเอเจนต์ที่ระบุโดยให้เอเจนต์อื่นทำงานบนโฮสต์
- นโยบายที่ยืดหยุ่น: กำหนดสิทธิ์ที่แตกต่างกันสำหรับแต่ละเอเจนต์
ดูตัวอย่างโดยละเอียดที่ แซนด์บ็อกซ์และเครื่องมือแบบหลายเอเจนต์
เนื้อหาที่เกี่ยวข้อง
- เอเจนต์ ACP — การเรียกใช้ชุดเครื่องมือการเขียนโค้ดภายนอก
- การกำหนดเส้นทางช่องทาง — วิธีส่งข้อความไปยังเอเจนต์
- สถานะการออนไลน์ — สถานะการออนไลน์และความพร้อมใช้งานของเอเจนต์
- เซสชัน — การแยกและการกำหนดเส้นทางเซสชัน
- เอเจนต์ย่อย — การสร้างการทำงานของเอเจนต์ในเบื้องหลัง