Multi-agent
การแสดงสถานะ
OpenClaw "presence" เป็นมุมมองแบบเบาและพยายามให้ดีที่สุดของ:
- ตัว Gateway เอง และ
- ไคลเอนต์ที่เชื่อมต่อกับ Gateway (แอป mac, WebChat, CLI ฯลฯ)
Presence ใช้เป็นหลักเพื่อแสดงแท็บ Instances ของแอป macOS และเพื่อ ให้ผู้ปฏิบัติงานมองเห็นสถานะได้อย่างรวดเร็ว
ฟิลด์ Presence (สิ่งที่แสดงขึ้นมา)
รายการ Presence เป็นอ็อบเจ็กต์ที่มีโครงสร้างพร้อมฟิลด์ เช่น:
instanceId(ไม่บังคับแต่แนะนำอย่างยิ่ง): ตัวตนไคลเอนต์ที่เสถียร (โดยปกติคือconnect.client.instanceId)host: ชื่อโฮสต์ที่มนุษย์อ่านเข้าใจง่ายip: ที่อยู่ IP แบบพยายามให้ดีที่สุดversion: สตริงเวอร์ชันของไคลเอนต์deviceFamily/modelIdentifier: คำใบ้เกี่ยวกับฮาร์ดแวร์mode:ui,webchat,cli,backend,probe,test,node, ...lastInputSeconds: "จำนวนวินาทีตั้งแต่มีอินพุตจากผู้ใช้ครั้งล่าสุด" (ถ้าทราบ)reason:self,connect,node-connected,periodic, ...ts: เวลาประทับการอัปเดตล่าสุด (มิลลิวินาทีนับตั้งแต่ epoch)
ผู้ผลิตข้อมูล (presence มาจากที่ใด)
รายการ Presence ถูกสร้างจากหลายแหล่งและถูก รวม เข้าด้วยกัน
1) รายการ self ของ Gateway
Gateway จะตั้งค่าเริ่มต้นรายการ "self" ตอนเริ่มทำงานเสมอ เพื่อให้ UI แสดงโฮสต์ของ Gateway แม้ก่อนที่ไคลเอนต์ใด ๆ จะเชื่อมต่อ
2) การเชื่อมต่อ WebSocket
ไคลเอนต์ WS ทุกตัวเริ่มด้วยคำขอ connect เมื่อ handshake สำเร็จ
Gateway จะ upsert รายการ Presence สำหรับการเชื่อมต่อนั้น
เหตุผลที่คำสั่ง CLI แบบครั้งเดียวไม่แสดงขึ้นมา
CLI มักเชื่อมต่อสำหรับคำสั่งสั้น ๆ แบบครั้งเดียว เพื่อหลีกเลี่ยงการทำให้รายการ
Instances เต็มไปด้วยรายการไม่จำเป็น client.mode === "cli" จึง ไม่ ถูกเปลี่ยนเป็นรายการ Presence
3) beacon system-event
ไคลเอนต์สามารถส่ง beacon ตามรอบที่มีข้อมูลสมบูรณ์ขึ้นผ่านเมธอด system-event แอป mac
ใช้สิ่งนี้เพื่อรายงานชื่อโฮสต์, IP และ lastInputSeconds
4) การเชื่อมต่อของ Node (role: node)
เมื่อ node เชื่อมต่อผ่าน WebSocket ของ Gateway ด้วย role: node Gateway
จะ upsert รายการ Presence สำหรับ node นั้น (เป็น flow เดียวกับไคลเอนต์ WS อื่น ๆ)
กฎการรวม + การลบรายการซ้ำ (เหตุผลที่ instanceId สำคัญ)
รายการ Presence ถูกเก็บไว้ในแผนที่ในหน่วยความจำชุดเดียว:
- รายการถูก key ด้วย presence key
- key ที่ดีที่สุดคือ
instanceIdที่เสถียร (จากconnect.client.instanceId) ซึ่งคงอยู่ข้ามการรีสตาร์ต - key ไม่สนใจตัวพิมพ์เล็กใหญ่
หากไคลเอนต์เชื่อมต่อใหม่โดยไม่มี instanceId ที่เสถียร อาจแสดงเป็นแถว
ซ้ำ
TTL และขนาดที่จำกัด
Presence มีลักษณะชั่วคราวโดยตั้งใจ:
- TTL: รายการที่เก่ากว่า 5 นาทีจะถูกตัดออก
- จำนวนรายการสูงสุด: 200 (รายการเก่าสุดถูกลบทิ้งก่อน)
สิ่งนี้ช่วยให้รายการสดใหม่และหลีกเลี่ยงการเติบโตของหน่วยความจำแบบไม่จำกัด
ข้อควรระวังเกี่ยวกับรีโมต/ทันเนล (IP แบบ loopback)
เมื่อไคลเอนต์เชื่อมต่อผ่าน SSH tunnel / local port forward Gateway อาจ
เห็นที่อยู่ระยะไกลเป็น 127.0.0.1 เพื่อหลีกเลี่ยงการเขียนทับ IP ที่ไคลเอนต์รายงานมาอย่างถูกต้อง
ที่อยู่ระยะไกลแบบ loopback จะถูกละเว้น
ผู้บริโภคข้อมูล
แท็บ Instances ของ macOS
แอป macOS แสดงผลลัพธ์ของ system-presence และใช้ตัวบ่งชี้สถานะขนาดเล็ก
(Active/Idle/Stale) ตามอายุของการอัปเดตล่าสุด
เคล็ดลับการดีบัก
- หากต้องการดูรายการดิบ ให้เรียก
system-presenceกับ Gateway - หากคุณเห็นรายการซ้ำ:
- ยืนยันว่าไคลเอนต์ส่ง
client.instanceIdที่เสถียรใน handshake - ยืนยันว่า beacon ตามรอบใช้
instanceIdเดียวกัน - ตรวจสอบว่ารายการที่ได้จากการเชื่อมต่อขาด
instanceIdหรือไม่ (รายการซ้ำเป็นสิ่งที่คาดไว้)
- ยืนยันว่าไคลเอนต์ส่ง
ที่เกี่ยวข้อง
เมื่อใดที่ตัวบ่งชี้การพิมพ์ถูกส่ง และวิธีปรับแต่ง
การสตรีมขาออก การแบ่งชังก์ และการจัดรูปแบบแยกตามช่องทาง
คอมโพเนนต์ของ Gateway และโปรโตคอล WebSocket ที่ขับเคลื่อนการอัปเดต Presence
โปรโตคอลบนสายสำหรับ connect, system-event และ system-presence