Developer and self-hosted

IRC

ใช้ IRC เมื่อต้องการใช้ OpenClaw ในช่องแบบคลาสสิก (#room) และข้อความส่วนตัว ติดตั้ง Plugin IRC อย่างเป็นทางการ แล้วกำหนดค่าภายใต้ channels.irc

เริ่มต้นอย่างรวดเร็ว

  1. ติดตั้ง Plugin:
bash
openclaw plugins install @openclaw/irc
  1. ตั้งค่าอย่างน้อยโฮสต์ ชื่อเล่น และช่องที่จะเข้าร่วมใน ~/.openclaw/openclaw.json:
json5
{  channels: {    irc: {      enabled: true,      host: "irc.example.com",      port: 6697,      tls: true,      nick: "openclaw-bot",      channels: ["#openclaw"],    },  },}
  1. เริ่มหรือรีสตาร์ต Gateway:
bash
openclaw gateway run

ควรใช้เซิร์ฟเวอร์ IRC ส่วนตัวสำหรับการประสานงานบอต หากตั้งใจใช้เครือข่าย IRC สาธารณะ ตัวเลือกที่นิยม ได้แก่ Libera.Chat, OFTC และ Snoonet หลีกเลี่ยงช่องสาธารณะที่คาดเดาได้สำหรับการรับส่งข้อมูลเบื้องหลังของบอตหรือฝูงบอต

ความทนทานของข้อความขาเข้า

OpenClaw เขียน PRIVMSG ของ IRC แต่ละรายการที่ยอมรับแล้วลงในคิวขาเข้าแบบคงทนก่อนตรวจสอบนโยบายตามปกติและส่งต่อไปยังเอเจนต์ ข้อความที่รอดำเนินการหรือลองใหม่ได้จะยังคงอยู่หลังรีสตาร์ต Gateway และยังคงประมวลผลตามลำดับแยกกันสำหรับแต่ละช่องหรือคู่สนทนาข้อความส่วนตัว

IRC ไม่มีรหัสการส่งมอบที่นำมาเล่นซ้ำได้ และไม่ส่งข้อความที่ไคลเอ็นต์พลาดไประหว่างที่ตัดการเชื่อมต่อซ้ำ ดังนั้น OpenClaw จึงกำหนดรหัสภายในที่คงที่เฉพาะภายในการเชื่อมต่อ TCP ปัจจุบันเท่านั้น คิวช่วยปกป้องช่วงเวลาตั้งแต่ระบบภายในยอมรับข้อความจนถึงการส่งต่อ แต่ไม่สามารถกู้คืนข้อความที่ไม่เคยมาถึง OpenClaw หรือขจัดข้อความซ้ำที่เซิร์ฟเวอร์ส่งซ้ำข้ามการเชื่อมต่อได้

การตั้งค่าการเชื่อมต่อ

คีย์ ค่าเริ่มต้น หมายเหตุ
host ไม่มี (จำเป็น) ชื่อโฮสต์เซิร์ฟเวอร์ IRC
port 6697 เมื่อใช้ TLS, 6667 เมื่อไม่เข้ารหัส 1-65535
tls true ตั้ง false เฉพาะเมื่อตั้งใจใช้ข้อความธรรมดา
nick ไม่มี (จำเป็น) ชื่อเล่นของบอต
username ชื่อเล่น มิฉะนั้นใช้ openclaw ชื่อผู้ใช้ IRC
realname OpenClaw ฟิลด์ชื่อจริง/GECOS
password / passwordFile ไม่มี รหัสผ่านเซิร์ฟเวอร์ โดยไฟล์ต้องเป็นไฟล์ปกติ
channels ไม่มี ช่องที่จะเข้าร่วม (["#openclaw"])
accounts / defaultAccount ไม่มี การตั้งค่าหลายบัญชี ตัวแปรสภาพแวดล้อมจะเติมเฉพาะบัญชีเริ่มต้น

ค่าเริ่มต้นด้านความปลอดภัย

  • IRC ใช้ซ็อกเก็ต TCP/TLS โดยตรงนอกเส้นทางพร็อกซีส่งต่อที่ผู้ดำเนินการ OpenClaw จัดการ ในการปรับใช้ที่กำหนดให้ทราฟฟิกขาออกทั้งหมดต้องผ่านพร็อกซีส่งต่อนั้น ให้ตั้ง channels.irc.enabled=false เว้นแต่จะอนุมัติทราฟฟิก IRC ขาออกโดยตรงไว้อย่างชัดเจน
  • channels.irc.dmPolicy มีค่าเริ่มต้นเป็น "pairing": ผู้ส่งข้อความส่วนตัวที่ไม่รู้จักจะได้รับรหัสจับคู่ ซึ่งอนุมัติได้ด้วย openclaw pairing approve irc <code>
  • channels.irc.groupPolicy มีค่าเริ่มต้นเป็น "allowlist"
  • เมื่อใช้ groupPolicy="allowlist" ให้ตั้ง channels.irc.groups เพื่อกำหนดช่องที่อนุญาต
  • ใช้ TLS (channels.irc.tls=true) เว้นแต่ตั้งใจยอมรับการรับส่งแบบข้อความธรรมดา

การควบคุมการเข้าถึง

ช่อง IRC มี "ด่าน" แยกกันสองประเภท:

  1. การเข้าถึงช่อง (groupPolicy + groups): บอตจะยอมรับข้อความจากช่องนั้นหรือไม่
  2. การเข้าถึงของผู้ส่ง (groupAllowFrom / groups["#channel"].allowFrom รายช่อง): ใครได้รับอนุญาตให้เรียกใช้บอตภายในช่องนั้น

คีย์การกำหนดค่า:

  • รายการอนุญาตสำหรับข้อความส่วนตัว (การเข้าถึงของผู้ส่งข้อความส่วนตัว): channels.irc.allowFrom
  • รายการอนุญาตผู้ส่งในกลุ่ม (การเข้าถึงของผู้ส่งในช่อง): channels.irc.groupAllowFrom
  • การควบคุมรายช่อง (กฎของช่อง + ผู้ส่ง + การกล่าวถึง): channels.irc.groups["#channel"] พร้อม requireMention, allowFrom, enabled, tools, toolsBySender, skills และ systemPrompt
  • channels.irc.groupPolicy="open" อนุญาตช่องที่ไม่ได้กำหนดค่า (โดยค่าเริ่มต้นยังคงต้องกล่าวถึง)

รายการในรายการอนุญาตควรใช้ข้อมูลประจำตัวผู้ส่งที่คงที่ (nick!user@host) การจับคู่ชื่อเล่นเปล่าสามารถเปลี่ยนแปลงได้ และจะเปิดใช้งานเมื่อ channels.irc.dangerouslyAllowNameMatching: true เท่านั้น

จุดที่มักสับสน: allowFrom ใช้สำหรับข้อความส่วนตัว ไม่ใช่ช่อง

หากพบล็อกลักษณะนี้:

  • irc: drop group sender alice!ident@host (policy=allowlist)

...หมายความว่าผู้ส่งไม่ได้รับอนุญาตสำหรับข้อความ กลุ่ม/ช่อง แก้ไขได้โดย:

  • ตั้ง channels.irc.groupAllowFrom (ใช้กับทุกช่องทั่วทั้งระบบ) หรือ
  • ตั้งรายการอนุญาตผู้ส่งรายช่อง: channels.irc.groups["#channel"].allowFrom

ตัวอย่าง (อนุญาตให้ทุกคนใน #openclaw พูดคุยกับบอต):

json5
{  channels: {    irc: {      groupPolicy: "allowlist",      groups: {        "#openclaw": { allowFrom: ["*"] },      },    },  },}

การเรียกให้ตอบกลับ (การกล่าวถึง)

แม้ช่องจะได้รับอนุญาต (ผ่าน groupPolicy + groups) และผู้ส่งได้รับอนุญาตแล้ว ตามค่าเริ่มต้น OpenClaw จะ กำหนดให้ต้องกล่าวถึง ในบริบทกลุ่ม ระบบจะถือว่ามีการกล่าวถึงบอตเมื่อข้อความมีชื่อเล่นของบอตที่เชื่อมต่ออยู่ หรือตรงกับรูปแบบการกล่าวถึงที่กำหนดไว้

ด้วยเหตุนี้ อาจพบล็อกลักษณะ drop channel … (missing-mention) เว้นแต่ข้อความจะมีรูปแบบการกล่าวถึงที่ตรงกับบอต

หากต้องการให้บอตตอบกลับในช่อง IRC โดยไม่ต้องกล่าวถึง ให้ปิดข้อกำหนดการกล่าวถึงสำหรับช่องนั้น:

json5
{  channels: {    irc: {      groupPolicy: "allowlist",      groups: {        "#openclaw": {          requireMention: false,          allowFrom: ["*"],        },      },    },  },}

หรือหากต้องการอนุญาตช่อง IRC ทั้งหมด (ไม่มีรายการอนุญาตรายช่อง) และยังคงตอบกลับได้โดยไม่ต้องกล่าวถึง:

json5
{  channels: {    irc: {      groupPolicy: "open",      groups: {        "*": { requireMention: false, allowFrom: ["*"] },      },    },  },}

หมายเหตุด้านความปลอดภัย (แนะนำสำหรับช่องสาธารณะ)

หากอนุญาต allowFrom: ["*"] ในช่องสาธารณะ ทุกคนจะสามารถส่งพรอมต์ให้บอตได้ เพื่อลดความเสี่ยง ให้จำกัดเครื่องมือสำหรับช่องนั้น

ใช้เครื่องมือชุดเดียวกันสำหรับทุกคนในช่อง

json5
{  channels: {    irc: {      groups: {        "#openclaw": {          allowFrom: ["*"],          tools: {            deny: ["group:runtime", "group:fs", "gateway", "nodes", "cron", "browser"],          },        },      },    },  },}

ใช้เครื่องมือต่างกันตามผู้ส่ง (เจ้าของมีสิทธิ์มากกว่า)

ใช้ toolsBySender เพื่อใช้นโยบายที่เข้มงวดกว่ากับ "*" และนโยบายที่ผ่อนปรนกว่ากับชื่อเล่นของเจ้าของ:

json5
{  channels: {    irc: {      groups: {        "#openclaw": {          allowFrom: ["*"],          toolsBySender: {            "*": {              deny: ["group:runtime", "group:fs", "gateway", "nodes", "cron", "browser"],            },            "id:alice": {              deny: ["gateway", "nodes", "cron"],            },          },        },      },    },  },}

หมายเหตุ:

  • คีย์ toolsBySender ควรใช้คำนำหน้าที่ระบุชัดเจน (channel:, id:, e164:, username:, name:) สำหรับ IRC ให้ใช้ id: กับค่าข้อมูลประจำตัวผู้ส่ง: id:alice หรือ id:alice!~alice@203.0.113.7 เพื่อการจับคู่ที่รัดกุมยิ่งขึ้น
  • ยังคงยอมรับคีย์แบบเดิมที่ไม่มีคำนำหน้า โดยจับคู่เป็น id: เท่านั้น และจะแสดงคำเตือนการเลิกใช้งาน
  • ใช้นโยบายผู้ส่งรายการแรกที่ตรงกัน โดย "*" เป็นตัวเลือกสำรองแบบไวลด์การ์ด

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเข้าถึงกลุ่มกับข้อกำหนดการกล่าวถึง (และการทำงานร่วมกัน) ได้ที่: /channels/groups

NickServ

หากต้องการยืนยันตัวตนกับ NickServ หลังเชื่อมต่อ:

json5
{  channels: {    irc: {      nickserv: {        enabled: true,        service: "NickServ",        password: "your-nickserv-password",      },    },  },}

ตามค่าเริ่มต้น ระบบจะยืนยันตัวตนกับ NickServ ทุกครั้งที่ตั้งรหัสผ่านไว้ (enabled ต้องเป็น false เฉพาะเมื่อต้องการปิดใช้งาน) service มีค่าเริ่มต้นเป็น NickServ; passwordFile เป็นทางเลือกแทน password แบบอินไลน์

การลงทะเบียนครั้งเดียวเมื่อเชื่อมต่อเป็นทางเลือก (register: true ต้องใช้ registerEmail):

json5
{  channels: {    irc: {      nickserv: {        register: true,        registerEmail: "bot@example.com",      },    },  },}

ปิด register หลังลงทะเบียนชื่อเล่นแล้ว เพื่อหลีกเลี่ยงการพยายาม REGISTER ซ้ำ

ตัวแปรสภาพแวดล้อม

บัญชีเริ่มต้นรองรับ:

  • IRC_HOST
  • IRC_PORT
  • IRC_TLS
  • IRC_NICK
  • IRC_USERNAME
  • IRC_REALNAME
  • IRC_PASSWORD
  • IRC_CHANNELS (คั่นด้วยจุลภาค)
  • IRC_NICKSERV_PASSWORD
  • IRC_NICKSERV_REGISTER_EMAIL

ไม่สามารถตั้ง IRC_HOST จาก .env ของเวิร์กสเปซได้ โปรดดู ไฟล์ .env ของเวิร์กสเปซ

การแก้ไขปัญหา

  • หากบอตเชื่อมต่อได้แต่ไม่เคยตอบกลับในช่อง ให้ตรวจสอบ channels.irc.groups และ ตรวจสอบว่าข้อกำหนดการกล่าวถึงกำลังทิ้งข้อความหรือไม่ (missing-mention) หากต้องการให้ตอบกลับโดยไม่ต้องเรียกชื่อ ให้ตั้ง requireMention:false สำหรับช่องนั้น
  • หากเข้าสู่ระบบไม่สำเร็จ ให้ตรวจสอบว่าชื่อเล่นพร้อมใช้งานและรหัสผ่านเซิร์ฟเวอร์ถูกต้อง
  • หาก TLS ล้มเหลวบนเครือข่ายแบบกำหนดเอง ให้ตรวจสอบโฮสต์/พอร์ตและการตั้งค่าใบรับรอง

เนื้อหาที่เกี่ยวข้อง

Was this useful?
On this page

On this page