Configuration
กลุ่มการกระจายข้อความ
ภาพรวม
กลุ่มบรอดแคสต์เรียกใช้ เอเจนต์หลายตัว กับข้อความขาเข้าเดียวกัน เอเจนต์แต่ละตัวประมวลผลข้อความในเซสชันที่แยกจากกันและโพสต์คำตอบของตนเอง ดังนั้นหมายเลข WhatsApp หนึ่งหมายเลขจึงสามารถรองรับทีมเอเจนต์เฉพาะทางในแชตกลุ่มหรือข้อความส่วนตัวเดียวกันได้
ระบบจะประเมินกลุ่มบรอดแคสต์หลังจากรายการอนุญาตของช่องทางและกฎการเปิดใช้งานกลุ่มแล้ว ในกลุ่ม WhatsApp การบรอดแคสต์จะเกิดขึ้นเมื่อโดยปกติ OpenClaw จะตอบกลับ (ตัวอย่างเช่น เมื่อมีการกล่าวถึง ทั้งนี้ขึ้นอยู่กับการตั้งค่ากลุ่มของคุณ) กลุ่มบรอดแคสต์เปลี่ยนเฉพาะว่า เอเจนต์ใดทำงาน เท่านั้น ไม่ได้เปลี่ยนว่าข้อความมีสิทธิ์ได้รับการประมวลผลหรือไม่
เลน QA ของ WhatsApp แบบใช้งานจริงประกอบด้วย whatsapp-broadcast-group-fanout ซึ่งตรวจสอบว่าข้อความในกลุ่มหนึ่งข้อความที่มีการกล่าวถึงสามารถสร้างคำตอบที่มองเห็นได้และแตกต่างกันจากเอเจนต์ที่กำหนดค่าไว้สองตัว
การกำหนดค่า
การตั้งค่าพื้นฐาน
เพิ่มส่วน broadcast ที่ระดับบนสุด (ถัดจาก bindings) คีย์คือ ID ของคู่สนทนา WhatsApp และค่าคืออาร์เรย์ของ ID เอเจนต์:
- แชตกลุ่ม: JID ของกลุ่ม (เช่น
120363403215116621@g.us) - ข้อความส่วนตัว: หมายเลขโทรศัพท์ E.164 ของผู้ส่ง (เช่น
+15551234567)
{ "broadcast": { "120363403215116621@g.us": ["alfred", "baerbel", "assistant3"] }}ผลลัพธ์: เมื่อ OpenClaw จะตอบกลับในแชตนี้ ระบบจะเรียกใช้เอเจนต์ทั้งสามตัว
ID เอเจนต์ทุกรายการต้องมีอยู่ใน agents.list: การตรวจสอบความถูกต้องของการกำหนดค่าจะรายงาน ID ที่ไม่รู้จัก และรันไทม์จะข้าม ID เหล่านั้นพร้อมคำเตือน Broadcast agent <id> not found in agents.list; skipping
กลยุทธ์การประมวลผล
broadcast.strategy กำหนดวิธีที่เอเจนต์ประมวลผลข้อความ:
| กลยุทธ์ | ลักษณะการทำงาน |
|---|---|
parallel (ค่าเริ่มต้น) |
เอเจนต์ทั้งหมดประมวลผลพร้อมกัน คำตอบอาจมาถึงในลำดับใดก็ได้ |
sequential |
เอเจนต์ประมวลผลตามลำดับในอาร์เรย์ โดยแต่ละตัวรอให้ตัวก่อนหน้าทำงานเสร็จ |
{ "broadcast": { "strategy": "sequential", "120363403215116621@g.us": ["alfred", "baerbel"] }}ตัวอย่างฉบับสมบูรณ์
{ "agents": { "list": [ { "id": "code-reviewer", "name": "Code Reviewer", "workspace": "/path/to/code-reviewer", "sandbox": { "mode": "all" } }, { "id": "security-auditor", "name": "Security Auditor", "workspace": "/path/to/security-auditor", "sandbox": { "mode": "all" } }, { "id": "docs-generator", "name": "Documentation Generator", "workspace": "/path/to/docs-generator", "sandbox": { "mode": "all" } } ] }, "broadcast": { "strategy": "parallel", "120363403215116621@g.us": ["code-reviewer", "security-auditor", "docs-generator"], "120363424282127706@g.us": ["support-en", "support-de"], "+15555550123": ["assistant", "logger"] }}วิธีการทำงาน
ลำดับการไหลของข้อความ
ข้อความขาเข้ามาถึง
ข้อความจากกลุ่ม WhatsApp หรือข้อความส่วนตัวมาถึง
การกำหนดเส้นทางและการรับเข้า
OpenClaw ใช้รายการอนุญาตของช่องทาง กฎการเปิดใช้งานกลุ่ม และความเป็นเจ้าของการเชื่อมโยง ACP ที่กำหนดค่าไว้
การตรวจสอบบรอดแคสต์
หากไม่มีการเชื่อมโยง ACP ที่กำหนดค่าไว้เป็นเจ้าของเส้นทาง OpenClaw จะตรวจสอบว่า ID ของคู่สนทนาอยู่ใน broadcast หรือไม่
หากใช้บรอดแคสต์
- เอเจนต์ทุกรายการประมวลผลข้อความ
- เอเจนต์แต่ละตัวมีคีย์เซสชันและบริบทที่แยกจากกัน
- เอเจนต์ประมวลผลแบบขนาน (ค่าเริ่มต้น) หรือแบบตามลำดับ
- ไฟล์แนบเสียงจะถูกถอดเสียงหนึ่งครั้งก่อนกระจายงาน เพื่อให้เอเจนต์ใช้บทถอดเสียงเดียวกันแทนการเรียก STT แยกกัน
หากไม่ใช้บรอดแคสต์
OpenClaw ส่งต่อไปยังเส้นทางปกติหรือเส้นทางเซสชัน ACP ที่กำหนดค่าไว้ซึ่งถูกเลือกระหว่างการกำหนดเส้นทาง
การแยกเซสชัน
เอเจนต์แต่ละตัวในกลุ่มบรอดแคสต์จะแยกสิ่งต่อไปนี้ออกจากกันโดยสมบูรณ์:
- คีย์เซสชัน (
agent:alfred:whatsapp:group:120363...เทียบกับagent:baerbel:whatsapp:group:120363...) - ประวัติการสนทนา (เอเจนต์จะไม่เห็นคำตอบของเอเจนต์ตัวอื่น)
- พื้นที่ทำงาน (แซนด์บ็อกซ์แยกกันหากกำหนดค่าไว้)
- การเข้าถึงเครื่องมือ (รายการอนุญาต/ปฏิเสธที่แตกต่างกัน)
- หน่วยความจำ/บริบท (
IDENTITY.md,SOUL.mdฯลฯ แยกจากกัน)
มีข้อยกเว้นหนึ่งอย่างที่ตั้งใจให้ใช้ร่วมกัน: บัฟเฟอร์บริบทของกลุ่ม (ข้อความล่าสุดในกลุ่มที่ใช้เป็นบริบท) จะใช้ร่วมกันสำหรับคู่สนทนาแต่ละราย ดังนั้นเอเจนต์บรอดแคสต์ทั้งหมดจะเห็นบริบทเดียวกันเมื่อถูกเรียกใช้ ระบบจะล้างบัฟเฟอร์หนึ่งครั้งหลังจากการกระจายงานเสร็จสิ้น
วิธีนี้ทำให้เอเจนต์แต่ละตัวมีบุคลิก โมเดล ทักษะ และสิทธิ์เข้าถึงเครื่องมือที่แตกต่างกันได้ (ตัวอย่างเช่น อ่านอย่างเดียวเทียบกับอ่านและเขียน)
ตัวอย่าง: เซสชันที่แยกจากกัน
ในกลุ่ม 120363403215116621@g.us ที่มีเอเจนต์ ["alfred", "baerbel"]:
บริบทของ Alfred
Session: agent:alfred:whatsapp:group:120363403215116621@g.usHistory: [user message, alfred's previous responses]Workspace: ~/openclaw-alfred/Tools: read, write, execบริบทของ Baerbel
Session: agent:baerbel:whatsapp:group:120363403215116621@g.usHistory: [user message, baerbel's previous responses]Workspace: ~/openclaw-baerbel/Tools: read onlyกรณีการใช้งาน
- ทีมเอเจนต์เฉพาะทาง: กลุ่มนักพัฒนาที่
code-reviewer,security-auditor,test-generatorและdocs-checkerต่างตอบข้อความเดียวกันจากมุมมองของตนเอง - การรองรับหลายภาษา: แชตสนับสนุนหนึ่งห้องที่มี
support-en,support-de,support-esตอบกลับเป็นภาษาของตนเอง - การประกันคุณภาพ:
support-agentตอบคำถาม ขณะที่qa-agentตรวจสอบและตอบเฉพาะเมื่อพบปัญหา - งานอัตโนมัติ:
task-tracker,time-loggerและreport-generatorรับข้อมูลอัปเดตสถานะเดียวกันทั้งหมด
แนวทางปฏิบัติที่แนะนำ
1. ให้งานของเอเจนต์มีขอบเขตชัดเจน
กำหนดหน้าที่เดียวที่ชัดเจนให้เอเจนต์แต่ละตัว (formatter, linter, tester) แทนการใช้เอเจนต์ "dev-helper" แบบทั่วไปหนึ่งตัว
2. ใช้ ID และชื่อที่สื่อความหมาย
{ "agents": { "list": [ { "id": "security-scanner", "name": "Security Scanner" }, { "id": "code-formatter", "name": "Code Formatter" }, { "id": "test-generator", "name": "Test Generator" } ] }}3. กำหนดค่าการเข้าถึงเครื่องมือให้แตกต่างกัน
{ "agents": { "list": [ { "id": "reviewer", "tools": { "allow": ["read", "exec"] } }, { "id": "fixer", "tools": { "allow": ["read", "write", "edit", "exec"] } } ] }}reviewer อ่านได้อย่างเดียว fixer อ่านและเขียนได้
4. ตรวจสอบประสิทธิภาพ
เมื่อมีเอเจนต์จำนวนมาก ให้เลือกใช้ "strategy": "parallel" (ค่าเริ่มต้น) จำกัดกลุ่มบรอดแคสต์ไว้เพียงไม่กี่เอเจนต์ และใช้โมเดลที่เร็วขึ้นสำหรับเอเจนต์ที่ทำงานง่ายกว่า
5. ความล้มเหลวถูกแยกออกจากกัน
เอเจนต์ล้มเหลวแยกจากกัน ข้อผิดพลาดของเอเจนต์หนึ่งตัวจะถูกบันทึก (Broadcast agent <id> failed: ...) และไม่ขัดขวางเอเจนต์ตัวอื่น
ความเข้ากันได้
ผู้ให้บริการ
ปัจจุบันกลุ่มบรอดแคสต์ใช้งานได้เฉพาะกับ WhatsApp (ช่องทางเว็บ) ช่องทางอื่นจะละเว้นการกำหนดค่า broadcast
การกำหนดเส้นทาง
กลุ่มบรอดแคสต์ทำงานร่วมกับการกำหนดเส้นทางที่มีอยู่:
{ "bindings": [ { "match": { "channel": "whatsapp", "peer": { "kind": "group", "id": "GROUP_A" } }, "agentId": "alfred" } ], "broadcast": { "GROUP_B": ["agent1", "agent2"] }}GROUP_A: มีเพียง alfred ที่ตอบกลับ (การกำหนดเส้นทางปกติ)GROUP_B: agent1 และ agent2 ตอบกลับ (บรอดแคสต์)
การแก้ไขปัญหา
เอเจนต์ไม่ตอบกลับ
ตรวจสอบ:
- ID เอเจนต์มีอยู่ใน
agents.list(การตรวจสอบความถูกต้องของการกำหนดค่าจะปฏิเสธ ID ที่ไม่รู้จัก) - รูปแบบ ID ของคู่สนทนาถูกต้อง (JID ของกลุ่ม เช่น
120363403215116621@g.usหรือ E.164 เช่น+15551234567สำหรับข้อความส่วนตัว) - ข้อความผ่านการคัดกรองตามปกติ (กฎการกล่าวถึง/การเปิดใช้งานยังคงมีผล)
แก้จุดบกพร่อง:
openclaw logs --follow | grep -i broadcastการกระจายงานที่สำเร็จจะบันทึก Broadcasting message to <n> agents (<strategy>)
มีเอเจนต์เพียงตัวเดียวตอบกลับ
สาเหตุ: ID ของคู่สนทนาอาจอยู่ในการเชื่อมโยงเส้นทางปกติแต่ไม่อยู่ใน broadcast หรืออาจตรงกับการเชื่อมโยง ACP แบบเฉพาะสิทธิ์ที่กำหนดค่าไว้
วิธีแก้: เพิ่มคู่สนทนาที่ผูกกับเส้นทางปกติลงในการกำหนดค่าบรอดแคสต์ หรือลบ/เปลี่ยนการเชื่อมโยง ACP ที่กำหนดค่าไว้ หากต้องการการกระจายงานแบบบรอดแคสต์
ปัญหาด้านประสิทธิภาพ
หากทำงานช้าเมื่อมีเอเจนต์จำนวนมาก: ลดจำนวนเอเจนต์ต่อกลุ่ม ใช้โมเดลที่เบากว่า และตรวจสอบเวลาเริ่มต้นของแซนด์บ็อกซ์
ตัวอย่าง
ตัวอย่างที่ 1: ทีมตรวจสอบโค้ด
{ "broadcast": { "strategy": "parallel", "120363403215116621@g.us": [ "code-formatter", "security-scanner", "test-coverage", "docs-checker" ] }, "agents": { "list": [ { "id": "code-formatter", "workspace": "~/agents/formatter", "tools": { "allow": ["read", "write"] } }, { "id": "security-scanner", "workspace": "~/agents/security", "tools": { "allow": ["read", "exec"] } }, { "id": "test-coverage", "workspace": "~/agents/testing", "tools": { "allow": ["read", "exec"] } }, { "id": "docs-checker", "workspace": "~/agents/docs", "tools": { "allow": ["read"] } } ] }}ข้อมูลโค้ดหนึ่งชุดในกลุ่มจะสร้างคำตอบสี่รายการ ได้แก่ การแก้ไขรูปแบบ ข้อค้นพบด้านความปลอดภัย ช่องว่างของความครอบคลุมการทดสอบ และข้อสังเกตเล็กน้อยเกี่ยวกับเอกสาร
ตัวอย่างที่ 2: ไปป์ไลน์หลายภาษา
{ "broadcast": { "strategy": "sequential", "+15555550123": ["detect-language", "translator-en", "translator-de"] }, "agents": { "list": [ { "id": "detect-language", "workspace": "~/agents/lang-detect" }, { "id": "translator-en", "workspace": "~/agents/translate-en" }, { "id": "translator-de", "workspace": "~/agents/translate-de" } ] }}ข้อมูลอ้างอิง API
สคีมาการกำหนดค่า
interface OpenClawConfig { broadcast?: { strategy?: "parallel" | "sequential"; [peerId: string]: string[]; };}ฟิลด์
strategy"parallel" | "sequential"default: "parallel"วิธีกำหนดการประมวลผลของเอเจนต์ parallel เรียกใช้เอเจนต์ทั้งหมดพร้อมกัน ส่วน sequential เรียกใช้ตามลำดับในอาร์เรย์
[peerId]string[]JID ของกลุ่ม WhatsApp หรือหมายเลขโทรศัพท์ E.164 ค่าคืออาร์เรย์ของ ID เอเจนต์ที่ต้องประมวลผลข้อความทั้งหมดจากคู่สนทนารายนั้น
ข้อจำกัด
- จำนวนเอเจนต์สูงสุด: ไม่มีขีดจำกัดตายตัว แต่เอเจนต์จำนวนมาก (10 ตัวขึ้นไป) อาจทำงานช้า
- บริบทที่ใช้ร่วมกัน: เอเจนต์จะไม่เห็นคำตอบของกันและกัน (เป็นไปตามการออกแบบ)
- ลำดับข้อความ: คำตอบแบบขนานอาจมาถึงในลำดับใดก็ได้
- ขีดจำกัดอัตราการใช้งาน: คำตอบทั้งหมดมาจากบัญชี WhatsApp เดียว ดังนั้นคำตอบของเอเจนต์ทุกตัวจะนับรวมในขีดจำกัดอัตราการใช้งาน WhatsApp เดียวกัน