ในหน้านี้

ในหน้านี้

Mainstream messaging

ข้อมูลเมตาการนำเสนอของ Matrix

OpenClaw แนบเมทาดาทา MessagePresentation ที่ปรับให้อยู่ในรูปแบบมาตรฐานกับเหตุการณ์ Matrix m.room.message ขาออกภายใต้คีย์เนื้อหา com.openclaw.presentation

ไคลเอนต์ Matrix มาตรฐานจะยังคงแสดงผล body ซึ่งเป็นข้อความธรรมดา ส่วนไคลเอนต์ที่รองรับ OpenClaw สามารถอ่านเมทาดาทาที่มีโครงสร้างและแสดงผล UI แบบเนทีฟ เช่น ปุ่ม รายการเลือก แถวบริบท และเส้นแบ่ง

เนื้อหาเหตุการณ์

json
{  "msgtype": "m.text",  "body": "Select model\n\nChoose model:\n- DeepSeek",  "com.openclaw.presentation": {    "version": 1,    "type": "message.presentation",    "title": "Select model",    "tone": "info",    "blocks": [      {        "type": "select",        "placeholder": "Choose model",        "options": [          {            "label": "DeepSeek",            "value": "/model deepseek/deepseek-chat"          }        ]      }    ]  }}
  • version คือเวอร์ชันสคีมาของเมทาดาทา โดยเวอร์ชันปัจจุบันคือ 1 ส่วน type คือตัวจำแนกที่คงที่และมีค่าเป็น "message.presentation" เสมอ อะแดปเตอร์ Matrix จะปล่อยเฉพาะเพย์โหลดที่มีเวอร์ชันและชนิดตรงตามนี้เท่านั้น ในทำนองเดียวกัน ไคลเอนต์ควรละเว้นเวอร์ชันที่ไม่รู้จักซึ่งไม่สามารถตีความได้อย่างปลอดภัย ค่า type ที่ไม่รู้จัก และชนิดบล็อกที่ไม่รู้จัก
  • title และ tone (info, success, warning, danger, neutral) เป็นคำใบ้ที่ระบุหรือไม่ก็ได้
  • ปุ่มและตัวเลือกในรายการเลือกสามารถมี action ที่ระบุชนิด ({ "type": "command", "command": "/..." } หรือ { "type": "callback", "value": "..." }) ควบคู่กับสตริง value แบบเดิมได้ เมื่อมีทั้งสองอย่าง ให้เลือกใช้ action

ลักษณะการทำงานสำรอง

OpenClaw จะแสดงผลข้อความธรรมดาสำรองที่อ่านได้ลงใน body เสมอ เมทาดาทาที่มีโครงสร้างเป็นส่วนเสริมและต้องไม่เป็นข้อกำหนดสำหรับการทำงานร่วมกันพื้นฐานของ Matrix

กฎการแสดงผลสำรอง:

  • เนื้อหา title, text และ context จะแสดงผลเป็นบรรทัดข้อความธรรมดา
  • ปุ่มที่มีการดำเนินการ command จะแสดงผลเป็น label: `/command` เพื่อให้ยังคัดลอกคำสั่งได้ ปุ่มที่มีการดำเนินการ callback หรือมีเพียง value แบบเดิมจะแสดงผลเฉพาะป้ายกำกับ เพื่อเก็บค่าคอลแบ็กที่ไม่เปิดเผยความหมายไว้เป็นส่วนตัว ส่วนปุ่มที่ปิดใช้งานจะแสดงผลเฉพาะป้ายกำกับเสมอ ปุ่ม URL และเว็บแอปจะแสดงผลเป็น label: URL
  • บล็อกรายการเลือกจะแสดงข้อความตัวอย่าง (หรือ ตัวเลือก:) เป็นหัวเรื่อง ตามด้วยบรรทัดตัวเลือกที่มีเฉพาะป้ายกำกับ
  • หากไม่มีสิ่งใดแสดงผล เช่น การนำเสนอที่มีเฉพาะเส้นแบ่ง เนื้อหา body จะใช้ --- เป็นข้อความสำรอง

ไคลเอนต์ที่ไม่รองรับจะยังคงแสดงข้อความสำรอง ส่วนไคลเอนต์ที่รองรับ OpenClaw อาจเลือกใช้เมทาดาทาที่มีโครงสร้างในการแสดงผล โดยยังเก็บข้อความสำรองไว้สำหรับการคัดลอก การค้นหา การแจ้งเตือน และการช่วยการเข้าถึง

บล็อกที่รองรับ

อะแดปเตอร์ Matrix ขาออกประกาศการรองรับแบบเนทีฟสำหรับ:

  • buttons
  • select
  • context
  • divider

บล็อก text รองรับผ่าน body สำรองเสมอ ให้ถือว่าบล็อกทั้งหมดเป็นเพียงคำใบ้ในการนำเสนอแบบพยายามอย่างดีที่สุด และละเว้นฟิลด์กับชนิดบล็อกที่ไม่รู้จัก แทนที่จะทำให้ทั้งข้อความล้มเหลว

การโต้ตอบ

เมทาดาทานี้ไม่ได้เพิ่มความหมายเชิงคอลแบ็กให้กับ Matrix ค่าของปุ่มและรายการเลือกเป็นเพย์โหลดการโต้ตอบสำรอง ซึ่งโดยทั่วไปคือคำสั่งแบบเครื่องหมายทับหรือคำสั่งข้อความ ไคลเอนต์ Matrix ที่ต้องการรองรับการโต้ตอบจะหาค่าของตัวควบคุม (action.command จากนั้น action.value และสุดท้าย value) แล้วส่งกลับไปยังห้องเป็นข้อความปกติ

ตัวอย่างเช่น ปุ่มที่มีค่า /model deepseek/deepseek-chat สามารถจัดการได้โดยส่งค่านั้นเป็นข้อความ Matrix แบบเข้ารหัสในห้องเดียวกัน

ความสัมพันธ์กับเมทาดาทาการอนุมัติ

com.openclaw.presentation ใช้สำหรับการนำเสนอข้อความแบบสมบูรณ์ทั่วไป

พรอมต์ขออนุมัติใช้เมทาดาทาเฉพาะ com.openclaw.approval เนื่องจากการอนุมัติมีสถานะที่เกี่ยวข้องกับความปลอดภัย การตัดสินใจ และรายละเอียดการดำเนินการ/Plugin หากมีคีย์เมทาดาทาทั้งสองอยู่ในเหตุการณ์เดียวกัน ไคลเอนต์ควรเลือกใช้ตัวแสดงผลการอนุมัติโดยเฉพาะ

ข้อความสื่อ

เมื่อการตอบกลับมี URL สื่อหลายรายการ OpenClaw จะส่งเหตุการณ์ Matrix หนึ่งเหตุการณ์ต่อ URL สื่อหนึ่งรายการ ข้อความคำบรรยายและเมทาดาทาการนำเสนอจะแนบกับเหตุการณ์แรกเท่านั้น เพื่อให้ไคลเอนต์ได้รับเพย์โหลดที่มีโครงสร้างคงที่เพียงชุดเดียวโดยไม่มีตัวแสดงผลซ้ำ กฎเดียวกันนี้ใช้เมื่อข้อความยาวถูกแบ่งเป็นหลายเหตุการณ์ โดยเมทาดาทาจะอยู่ในเหตุการณ์แรกเท่านั้น

ควรรักษาเมทาดาทาการนำเสนอให้มีขนาดกะทัดรัด ข้อความขนาดใหญ่ที่ผู้ใช้มองเห็นควรอยู่ใน body และใช้เส้นทางการแบ่งข้อความ Matrix ตามปกติ

Was this useful?