Developer and self-hosted
IRC
ใช้ IRC เมื่อต้องการใช้ OpenClaw ในช่องแบบคลาสสิก (#room) และข้อความส่วนตัว
ติดตั้ง Plugin IRC อย่างเป็นทางการ แล้วกำหนดค่าภายใต้ channels.irc
เริ่มต้นอย่างรวดเร็ว
- ติดตั้ง Plugin:
openclaw plugins install @openclaw/irc- ตั้งค่าอย่างน้อยโฮสต์ ชื่อเล่น และช่องที่จะเข้าร่วมใน
~/.openclaw/openclaw.json:
{ channels: { irc: { enabled: true, host: "irc.example.com", port: 6697, tls: true, nick: "openclaw-bot", channels: ["#openclaw"], }, },}- เริ่มหรือรีสตาร์ต Gateway:
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 มี "ด่าน" แยกกันสองประเภท:
- การเข้าถึงช่อง (
groupPolicy+groups): บอตจะยอมรับข้อความจากช่องนั้นหรือไม่ - การเข้าถึงของผู้ส่ง (
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 พูดคุยกับบอต):
{ channels: { irc: { groupPolicy: "allowlist", groups: { "#openclaw": { allowFrom: ["*"] }, }, }, },}การเรียกให้ตอบกลับ (การกล่าวถึง)
แม้ช่องจะได้รับอนุญาต (ผ่าน groupPolicy + groups) และผู้ส่งได้รับอนุญาตแล้ว ตามค่าเริ่มต้น OpenClaw จะ กำหนดให้ต้องกล่าวถึง ในบริบทกลุ่ม ระบบจะถือว่ามีการกล่าวถึงบอตเมื่อข้อความมีชื่อเล่นของบอตที่เชื่อมต่ออยู่ หรือตรงกับรูปแบบการกล่าวถึงที่กำหนดไว้
ด้วยเหตุนี้ อาจพบล็อกลักษณะ drop channel … (missing-mention) เว้นแต่ข้อความจะมีรูปแบบการกล่าวถึงที่ตรงกับบอต
หากต้องการให้บอตตอบกลับในช่อง IRC โดยไม่ต้องกล่าวถึง ให้ปิดข้อกำหนดการกล่าวถึงสำหรับช่องนั้น:
{ channels: { irc: { groupPolicy: "allowlist", groups: { "#openclaw": { requireMention: false, allowFrom: ["*"], }, }, }, },}หรือหากต้องการอนุญาตช่อง IRC ทั้งหมด (ไม่มีรายการอนุญาตรายช่อง) และยังคงตอบกลับได้โดยไม่ต้องกล่าวถึง:
{ channels: { irc: { groupPolicy: "open", groups: { "*": { requireMention: false, allowFrom: ["*"] }, }, }, },}หมายเหตุด้านความปลอดภัย (แนะนำสำหรับช่องสาธารณะ)
หากอนุญาต allowFrom: ["*"] ในช่องสาธารณะ ทุกคนจะสามารถส่งพรอมต์ให้บอตได้
เพื่อลดความเสี่ยง ให้จำกัดเครื่องมือสำหรับช่องนั้น
ใช้เครื่องมือชุดเดียวกันสำหรับทุกคนในช่อง
{ channels: { irc: { groups: { "#openclaw": { allowFrom: ["*"], tools: { deny: ["group:runtime", "group:fs", "gateway", "nodes", "cron", "browser"], }, }, }, }, },}ใช้เครื่องมือต่างกันตามผู้ส่ง (เจ้าของมีสิทธิ์มากกว่า)
ใช้ toolsBySender เพื่อใช้นโยบายที่เข้มงวดกว่ากับ "*" และนโยบายที่ผ่อนปรนกว่ากับชื่อเล่นของเจ้าของ:
{ 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 หลังเชื่อมต่อ:
{ channels: { irc: { nickserv: { enabled: true, service: "NickServ", password: "your-nickserv-password", }, }, },}ตามค่าเริ่มต้น ระบบจะยืนยันตัวตนกับ NickServ ทุกครั้งที่ตั้งรหัสผ่านไว้ (enabled ต้องเป็น false เฉพาะเมื่อต้องการปิดใช้งาน) service มีค่าเริ่มต้นเป็น NickServ; passwordFile เป็นทางเลือกแทน password แบบอินไลน์
การลงทะเบียนครั้งเดียวเมื่อเชื่อมต่อเป็นทางเลือก (register: true ต้องใช้ registerEmail):
{ channels: { irc: { nickserv: { register: true, registerEmail: "bot@example.com", }, }, },}ปิด register หลังลงทะเบียนชื่อเล่นแล้ว เพื่อหลีกเลี่ยงการพยายาม REGISTER ซ้ำ
ตัวแปรสภาพแวดล้อม
บัญชีเริ่มต้นรองรับ:
IRC_HOSTIRC_PORTIRC_TLSIRC_NICKIRC_USERNAMEIRC_REALNAMEIRC_PASSWORDIRC_CHANNELS(คั่นด้วยจุลภาค)IRC_NICKSERV_PASSWORDIRC_NICKSERV_REGISTER_EMAIL
ไม่สามารถตั้ง IRC_HOST จาก .env ของเวิร์กสเปซได้ โปรดดู ไฟล์ .env ของเวิร์กสเปซ
การแก้ไขปัญหา
- หากบอตเชื่อมต่อได้แต่ไม่เคยตอบกลับในช่อง ให้ตรวจสอบ
channels.irc.groupsและ ตรวจสอบว่าข้อกำหนดการกล่าวถึงกำลังทิ้งข้อความหรือไม่ (missing-mention) หากต้องการให้ตอบกลับโดยไม่ต้องเรียกชื่อ ให้ตั้งrequireMention:falseสำหรับช่องนั้น - หากเข้าสู่ระบบไม่สำเร็จ ให้ตรวจสอบว่าชื่อเล่นพร้อมใช้งานและรหัสผ่านเซิร์ฟเวอร์ถูกต้อง
- หาก TLS ล้มเหลวบนเครือข่ายแบบกำหนดเอง ให้ตรวจสอบโฮสต์/พอร์ตและการตั้งค่าใบรับรอง
เนื้อหาที่เกี่ยวข้อง
- ภาพรวมช่อง — ช่องทั้งหมดที่รองรับ
- การจับคู่ — การยืนยันตัวตนผ่านข้อความส่วนตัวและขั้นตอนการจับคู่
- กลุ่ม — พฤติกรรมการแชตกลุ่มและข้อกำหนดการกล่าวถึง
- การกำหนดเส้นทางช่อง — การกำหนดเส้นทางเซสชันสำหรับข้อความ
- ความปลอดภัย — โมเดลการเข้าถึงและการเสริมความปลอดภัย