Developer and self-hosted
Tlon
Tlon เป็นเมสเซนเจอร์แบบกระจายศูนย์ที่สร้างบน Urbit โดย OpenClaw จะเชื่อมต่อกับ ship ของ Urbit และ ตอบกลับ DM และข้อความแชตกลุ่ม โดยค่าเริ่มต้น การตอบกลับในกลุ่มต้องมีการกล่าวถึงด้วย @ พร้อมมี กฎการให้สิทธิ์และขั้นตอนการอนุมัติโดยเจ้าของซ้อนทับอยู่ด้านบน
สถานะ: Plugin ที่รวมมาให้ รองรับ DM การกล่าวถึงในกลุ่ม เธรด Rich Text การอัปโหลด/ดาวน์โหลดรูปภาพ และ ระบบการอนุมัติโดยเจ้าของ แต่ไม่รองรับรีแอ็กชันและโพล
Plugin ที่รวมมาให้
Tlon รวมอยู่ใน OpenClaw รุ่นปัจจุบันแล้ว บิลด์แบบแพ็กเกจไม่จำเป็นต้องติดตั้งแยกต่างหาก
สำหรับบิลด์รุ่นเก่าหรือการติดตั้งแบบกำหนดเองที่ไม่รวม Tlon ให้ติดตั้งจาก npm:
openclaw plugins install @openclaw/tlonใช้ชื่อแพ็กเกจเปล่าเพื่อติดตามแท็กรุ่นปัจจุบัน ปักหมุดเวอร์ชัน (@openclaw/tlon@x.y.z)
เฉพาะเมื่อต้องการให้การติดตั้งทำซ้ำได้เท่านั้น
จาก checkout ในเครื่อง:
openclaw plugins install ./path/to/local/tlon-pluginรายละเอียด: Plugin
การตั้งค่า
openclaw channels add --channel tlon --ship ~sampel-palnet --url https://your-ship-host --code lidlut-tabwed-pillex-ridrupหรือแก้ไขการกำหนดค่าโดยตรง:
{ channels: { tlon: { enabled: true, ship: "~sampel-palnet", url: "https://your-ship-host", code: "lidlut-tabwed-pillex-ridrup", ownerShip: "~your-main-ship", // แนะนำ: ship ของคุณ ซึ่งได้รับสิทธิ์เสมอ }, },}รีสตาร์ต Gateway หลังจากแก้ไขการกำหนดค่าโดยตรง จากนั้นส่ง DM ถึงบอตหรือกล่าวถึงบอตด้วย @ ใน ช่องกลุ่ม
ความคงทนของข้อมูลขาเข้า
OpenClaw จะจัดเก็บเหตุการณ์ DM และแชตกลุ่มของ Tlon ที่ยอมรับแล้วก่อนส่งต่อให้เอเจนต์ เทิร์นที่รอดำเนินการหรือลองใหม่ได้จะยังคงอยู่หลังจาก Gateway รีสตาร์ต และงานจะยังคงประมวลผลแบบเรียงลำดับต่อช่องกลุ่มหรือคู่สนทนาโดยตรง ID ข้อความ Urbit ที่เสถียรยังช่วยระงับเหตุการณ์ที่ถูกส่งซ้ำ ตราบใดที่ยังมีระเบียนคิวหรือระเบียนการเสร็จสิ้นที่เก็บรักษาไว้
การส่งมอบระหว่างขอบเขตคิวกับเอเจนต์เป็นแบบอย่างน้อยหนึ่งครั้ง: หากระบบขัดข้องระหว่างการส่งต่อ อาจมีการเล่นซ้ำหนึ่งเทิร์น ดังนั้นการดำเนินการของเอเจนต์ที่ก่อให้เกิดผลข้างเคียงภายนอกควรมีคุณสมบัติ idempotent เมื่อทำได้
Ship ส่วนตัว/LAN
โดยค่าเริ่มต้น OpenClaw จะบล็อกชื่อโฮสต์และช่วง IP ส่วนตัว/ภายในเพื่อป้องกัน SSRF หาก ship ของคุณทำงานบนเครือข่ายส่วนตัว (localhost, IP ของ LAN, ชื่อโฮสต์ภายใน) ให้เลือกอนุญาตอย่างชัดเจน:
{ channels: { tlon: { url: "http://localhost:8080", network: { dangerouslyAllowPrivateNetwork: true, }, }, },}มีผลกับเป้าหมาย เช่น http://localhost:8080, http://192.168.x.x:8080 และ
http://my-ship.local:8080 เปิดใช้งานตัวเลือกนี้เฉพาะกับ URL ของ ship ที่คุณเชื่อถือเท่านั้น เนื่องจากจะปิดใช้การป้องกัน SSRF
สำหรับคำขอ HTTP ของบัญชีนั้น
ช่องกลุ่ม
ปักหมุดช่องด้วยตนเอง หรือเปิดใช้การค้นหาอัตโนมัติ:
{ channels: { tlon: { groupChannels: ["chat/~host-ship/general", "chat/~host-ship/support"], autoDiscoverChannels: true, }, },}เมื่อไม่ได้ตั้งค่าในการกำหนดค่า autoDiscoverChannels จะมีค่าเริ่มต้นเป็น false; วิซาร์ดการตั้งค่าจะกำหนดค่าเริ่มต้นของ
พรอมต์เป็นใช่ และเขียน true อย่างชัดเจน เมื่อเปิดใช้ OpenClaw จะสืบค้นกลุ่มที่เข้าร่วมเมื่อเริ่มต้นระบบ
เฝ้าดูช่องใหม่เมื่อมีการยอมรับคำเชิญเข้ากลุ่ม และตรวจสอบซ้ำทุก 2 นาที
การควบคุมการเข้าถึง
รายการอนุญาต DM (ว่าง = ไม่อนุญาต DM เว้นแต่ผู้ส่งคือ ownerShip):
{ channels: { tlon: { dmAllowlist: ["~zod", "~nec"], }, },}การให้สิทธิ์กลุ่มมีค่าเริ่มต้นเป็น restricted ต่อช่อง ตั้งค่า defaultAuthorizedShips เป็น
ค่าพื้นฐาน และกำหนดทับตาม nest ของแต่ละช่อง:
{ channels: { tlon: { defaultAuthorizedShips: ["~zod"], authorization: { channelRules: { "chat/~host-ship/general": { mode: "restricted", allowedShips: ["~zod", "~nec"], }, "chat/~host-ship/announcements": { mode: "open", }, }, }, }, },}เมื่อบอตตอบกลับภายในเธรดแล้ว บอตจะตอบข้อความภายหลังในเธรดนั้นต่อไป โดยไม่ต้องมีการกล่าวถึงอีกครั้ง
ตั้งค่า channels.tlon.implicitMentions.threadParticipation: false เพื่อกำหนดให้ต้องมีการกล่าวถึงอย่างชัดเจนครั้งใหม่
สำหรับข้อความติดตามเหล่านั้น การกำหนดทับระดับบัญชีใช้ channels.tlon.accounts.<id>.implicitMentions ขณะนี้ Tlon
ไม่ได้สร้างข้อเท็จจริง replyToBot หรือ quotedBot ดังนั้นแฟล็กเหล่านั้นจึงไม่มีผลที่นี่
เจ้าของและระบบการอนุมัติ
{ channels: { tlon: { ownerShip: "~your-main-ship", }, },}ship ของเจ้าของได้รับสิทธิ์ทุกที่: คำเชิญ DM จะได้รับการยอมรับโดยอัตโนมัติเสมอ คำเชิญเข้ากลุ่มจะ
ได้รับการยอมรับโดยอัตโนมัติเสมอ และข้อความในช่องจะผ่านการให้สิทธิ์เสมอ เจ้าของไม่จำเป็นต้อง
อยู่ใน dmAllowlist, defaultAuthorizedShips หรือ groupInviteAllowlist
เมื่อตั้งค่า ownerShip คำขอที่ไม่ได้รับสิทธิ์จะไม่เพียงถูกทิ้ง แต่จะถูกจัดคิวเป็น
การอนุมัติที่รอดำเนินการและส่ง DM ถึงเจ้าของ:
- คำขอ DM จาก ship ที่ไม่ได้อยู่ใน
dmAllowlist - การกล่าวถึงในช่องที่ผู้ส่งไม่ผ่านการให้สิทธิ์
- คำเชิญเข้ากลุ่มจาก ship ที่ไม่ได้อยู่ใน
groupInviteAllowlist(เมื่อปิดการยอมรับอัตโนมัติ หรือเปิดอยู่แต่ ผู้เชิญไม่อยู่ในรายการอนุญาต)
เจ้าของตอบกลับทาง DM เพื่อดำเนินการกับคำขอ:
| การตอบกลับของเจ้าของ | ผล |
|---|---|
approve / deny / block |
ดำเนินการกับการอนุมัติที่รอดำเนินการล่าสุด |
approve <id> / deny <id> |
ดำเนินการกับการอนุมัติที่ระบุด้วย ID |
block |
บล็อก ship ในระบบดั้งเดิมด้วย เพื่อไม่ให้เชื่อมต่อใหม่ |
unblock ~ship |
ยกเลิกการบล็อกในระบบดั้งเดิม |
blocked |
แสดงรายการ ship ที่ถูกบล็อกอยู่ |
pending |
แสดงรายการคำขออนุมัติที่รอดำเนินการ |
หากไม่ได้กำหนดค่า ownerShip DM และการกล่าวถึงในช่องที่ไม่ได้รับสิทธิ์จะถูกทิ้งและบันทึกลงล็อกเท่านั้น
โดยจะไม่มีพรอมต์การอนุมัติ
การตั้งค่าการยอมรับอัตโนมัติ
ยอมรับคำเชิญ DM โดยอัตโนมัติจาก ship ที่อยู่ใน dmAllowlist แล้ว (เจ้าของจะได้รับการยอมรับ
โดยอัตโนมัติเสมอไม่ว่าแฟล็กนี้จะเป็นค่าใด):
{ channels: { tlon: { autoAcceptDmInvites: true, }, },}ยอมรับคำเชิญเข้ากลุ่มโดยอัตโนมัติจากรายการอนุญาต (ปฏิเสธโดยค่าเริ่มต้น: เมื่อ autoAcceptGroupInvites: true และ
groupInviteAllowlist ว่างเปล่า จะไม่ยอมรับคำเชิญจากผู้ที่ไม่ใช่เจ้าของ):
{ channels: { tlon: { autoAcceptGroupInvites: true, groupInviteAllowlist: ["~zod"], }, },}การโหลดซ้ำทันทีผ่านที่เก็บการตั้งค่า Urbit
การตั้งค่าส่วนใหญ่ข้างต้น (dmAllowlist, groupInviteAllowlist, groupChannels,
defaultAuthorizedShips, autoDiscoverChannels, autoAcceptDmInvites,
autoAcceptGroupInvites, ownerShip, showModelSignature) จะถูกทำสำเนาไปยังเอเจนต์
%settings ของ ship (desk moltbot, bucket tlon) ในการเรียกใช้ครั้งแรก จากนั้นจึงอ่านจากที่นั่นแบบสด
ดังนั้นการเปลี่ยนแปลงที่ทำผ่านไคลเอนต์ Landscape หรือคำสั่งการตั้งค่าของ Skills ที่รวมมาให้จะมีผลโดยไม่ต้อง
รีสตาร์ต Gateway นอกจากนี้ channelRules และการอนุมัติที่รอดำเนินการยังถูกจัดเก็บไว้ที่นั่นในรูปแบบ JSON ด้วย การกำหนดค่า
ไฟล์ยังคงเป็นแหล่งข้อมูลจริงสำหรับค่าที่ไม่เคยเขียนลงในที่เก็บการตั้งค่า
เป้าหมายการส่งมอบ (CLI/cron)
ใช้กับ openclaw message send หรือการส่งมอบด้วย cron:
- DM:
~sampel-palnetหรือdm/~sampel-palnet - กลุ่ม:
chat/~host-ship/channelหรือgroup:~host-ship/channel
Skills ที่รวมมาให้
Plugin รวม @tloncorp/tlon-skill ซึ่งเป็น CLI สำหรับ
การดำเนินการกับ Urbit โดยตรง และพร้อมใช้งานโดยอัตโนมัติเมื่อติดตั้ง Plugin แล้ว:
- กิจกรรม: การกล่าวถึง การตอบกลับ รายการที่ยังไม่ได้อ่าน
- ช่อง: แสดงรายการ สร้าง เปลี่ยนชื่อ
- ผู้ติดต่อ: แสดงรายการ/รับ/อัปเดตโปรไฟล์
- กลุ่ม: สร้าง เข้าร่วม ขั้นตอนการเชิญ/ขอเข้าร่วม บทบาท
- ฮุก: จัดการฮุกของช่อง
- ข้อความ: ประวัติ ค้นหา
- DM: ส่ง แสดงรีแอ็กชัน ยอมรับ/ปฏิเสธ
- โพสต์: แสดงรีแอ็กชัน ลบ
- สมุดบันทึก: โพสต์ไปยังช่องไดอารี
- การตั้งค่า: โหลดการกำหนดค่า Plugin ซ้ำทันทีผ่านที่เก็บการตั้งค่าด้านบน
ความสามารถ
| ฟีเจอร์ | สถานะ |
|---|---|
| ข้อความโดยตรง | รองรับ |
| กลุ่ม/ช่อง | รองรับ (ค่าเริ่มต้นต้องมีการกล่าวถึง) |
| เธรด | รองรับ (ตอบกลับต่อไปเมื่อเข้าร่วมแล้ว) |
| Rich Text | แปลง Markdown เป็นรูปแบบดั้งเดิมของ Tlon |
| รูปภาพ | ดาวน์โหลดขาเข้า อัปโหลดขาออก |
| รีแอ็กชัน | ผ่าน Skills ที่รวมมาให้ เท่านั้น |
| โพล | ไม่รองรับ |
| คำสั่งดั้งเดิม | ค่าเริ่มต้นอนุญาตเฉพาะเจ้าของ |
การแก้ไขปัญหา
openclaw statusopenclaw gateway statusopenclaw logs --followopenclaw doctorความล้มเหลวที่พบบ่อย:
- ไม่สนใจ DM: ผู้ส่งไม่ได้อยู่ใน
dmAllowlistและไม่ได้กำหนดค่าownerShipสำหรับขั้นตอนการอนุมัติ - ไม่สนใจข้อความกลุ่ม: ไม่พบ/ไม่ได้ปักหมุดช่อง หรือผู้ส่งไม่ผ่านการให้สิทธิ์และไม่มี
ownerShipสำหรับจัดคิวการอนุมัติ - ข้อผิดพลาดในการเชื่อมต่อ: ตรวจสอบว่าเข้าถึง URL ของ ship ได้ ตั้งค่า
network.dangerouslyAllowPrivateNetworkสำหรับ ship ในเครื่อง - ข้อผิดพลาดในการยืนยันตัวตน: รหัสเข้าสู่ระบบจะหมุนเวียน ให้คัดลอกรหัสปัจจุบันจาก ship ของคุณ
ข้อมูลอ้างอิงการกำหนดค่า
การกำหนดค่าแบบเต็ม: การกำหนดค่า
| คีย์ | ความหมาย |
|---|---|
channels.tlon.enabled |
เปิด/ปิดการเริ่มต้นช่อง |
channels.tlon.ship |
ชื่อ ship Urbit ของบอต (เช่น ~sampel-palnet) |
channels.tlon.url |
URL ของ ship (เช่น https://sampel-palnet.tlon.network) |
channels.tlon.code |
รหัสเข้าสู่ระบบของ ship |
channels.tlon.network.dangerouslyAllowPrivateNetwork |
อนุญาต URL ของ ship บน localhost/LAN (เลือกใช้ SSRF) |
channels.tlon.ownerShip |
ship ของเจ้าของ: ได้รับสิทธิ์เสมอและรับคำขออนุมัติ |
channels.tlon.dmAllowlist |
ship ที่อนุญาตให้ส่ง DM (ว่าง = ไม่มีนอกจากเจ้าของ) |
channels.tlon.autoAcceptDmInvites |
ยอมรับ DM จาก ship ใน dmAllowlist โดยอัตโนมัติ |
channels.tlon.autoAcceptGroupInvites |
ยอมรับคำเชิญเข้ากลุ่มจาก groupInviteAllowlist โดยอัตโนมัติ |
channels.tlon.groupInviteAllowlist |
ship ที่คำเชิญเข้ากลุ่มจะได้รับการยอมรับโดยอัตโนมัติ |
channels.tlon.autoDiscoverChannels |
ค้นหาช่องกลุ่มที่เข้าร่วมโดยอัตโนมัติ (ค่าเริ่มต้น: false) |
channels.tlon.implicitMentions.threadParticipation |
อนุญาตให้ข้อความติดตามในเธรดที่เข้าร่วมข้ามข้อกำหนดการกล่าวถึง |
channels.tlon.groupChannels |
nest ของช่องที่ปักหมุดด้วยตนเอง |
channels.tlon.defaultAuthorizedShips |
ship ที่ได้รับสิทธิ์สำหรับทุกช่อง (ใช้เมื่อไม่มีกฎที่ตรงกัน) |
channels.tlon.authorization.channelRules |
โหมดการยืนยันสิทธิ์และรายการอนุญาตต่อ nest ของช่อง |
channels.tlon.showModelSignature |
ต่อท้าย _[Generated by <model>]_ ในข้อความตอบกลับ |
channels.tlon.responsePrefix |
คำนำหน้าแบบคงที่ที่เติมไว้หน้าข้อความตอบกลับขาออก |
channels.tlon.accounts.<id> |
บัญชีเพิ่มเติมที่มีชื่อ (การตั้งค่าแบบหลาย ship) |
หมายเหตุ
- การตอบกลับในกลุ่มต้องมีการกล่าวถึงด้วย @ (เช่น
~your-bot-ship) เว้นแต่บอตจะเข้าร่วมเธรดนั้นแล้ว - การตอบกลับเธรดจะอยู่ภายในเธรด และบอตยังได้รับข้อความ 10 รายการล่าสุดจากบริบทของเธรดโดยเพิ่มไว้ด้านหน้า สำหรับเอเจนต์
- Rich text (ตัวหนา ตัวเอียง โค้ด หัวข้อ รายการ) จะแปลงเป็นรูปแบบเนทีฟของ Tlon
- การส่งข้อความขาเข้าที่ขอข้อมูลสรุปของช่อง (เช่น "สรุป ช่องนี้") จะเรียกใช้การสรุปประวัติในตัวแทนขั้นตอนการตอบกลับตามปกติ
ที่เกี่ยวข้อง
- ภาพรวมช่อง — ช่องทั้งหมดที่รองรับ
- การจับคู่ — การยืนยันตัวตนผ่าน DM และขั้นตอนการจับคู่
- กลุ่ม — ลักษณะการทำงานของแชทกลุ่มและการควบคุมด้วยการกล่าวถึง
- การกำหนดเส้นทางช่อง — การกำหนดเส้นทางเซสชันสำหรับข้อความ
- ความปลอดภัย — โมเดลการเข้าถึงและการเสริมความแข็งแกร่งด้านความปลอดภัย