Configuration
การกำหนดเส้นทางของช่องทาง
ช่องทางและการกำหนดเส้นทาง
OpenClaw กำหนดเส้นทางการตอบกลับ กลับไปยังช่องทางที่ข้อความมาจาก โมเดลไม่ได้เลือกช่องทาง การกำหนดเส้นทางเป็นแบบกำหนดแน่นอนและควบคุมโดยการกำหนดค่าโฮสต์
คำสำคัญ
- ช่องทาง:
telegram,whatsapp,discord,irc,googlechat,slack,signal,imessage,lineรวมถึงช่องทางของ Pluginwebchatคือช่องทาง UI WebChat ภายใน และไม่ใช่ช่องทางขาออกที่กำหนดค่าได้ - AccountId: อินสแตนซ์บัญชีต่อช่องทาง (เมื่อรองรับ)
- บัญชีเริ่มต้นของช่องทางแบบไม่บังคับ:
channels.<channel>.defaultAccountเลือก บัญชีที่จะใช้เมื่อเส้นทางขาออกไม่ได้ระบุaccountId- ในการตั้งค่าแบบหลายบัญชี ให้ตั้งค่าเริ่มต้นอย่างชัดเจน (
defaultAccountหรือaccounts.default) เมื่อมีการกำหนดค่าตั้งแต่สองบัญชีขึ้นไป หากไม่มี การกำหนดเส้นทางสำรองอาจเลือก ID บัญชีที่ถูกทำให้เป็นมาตรฐานรายการแรก
- ในการตั้งค่าแบบหลายบัญชี ให้ตั้งค่าเริ่มต้นอย่างชัดเจน (
- AgentId: พื้นที่ทำงานแยก + ที่เก็บเซสชัน ("สมอง")
- SessionKey: คีย์บักเก็ตที่ใช้เก็บบริบทและควบคุมภาวะพร้อมกัน
คำนำหน้าเป้าหมายขาออก
เป้าหมายขาออกแบบชัดเจนอาจมีคำนำหน้าผู้ให้บริการ เช่น telegram:123 หรือ tg:123 Core จะถือว่าคำนำหน้านั้นเป็นเพียงคำใบ้สำหรับการเลือกช่องทาง เมื่อช่องทางที่เลือกเป็น last หรือยังไม่ถูกแก้ไขเท่านั้น และเฉพาะเมื่อ Plugin ที่โหลดประกาศคำนำหน้านั้นไว้ หากผู้เรียกเลือกช่องทางอย่างชัดเจนแล้ว คำนำหน้าผู้ให้บริการต้องตรงกับช่องทางนั้น ชุดผสมข้ามช่องทาง เช่น การส่ง WhatsApp ไปยัง telegram:123 จะล้มเหลวก่อนการทำให้เป้าหมายเป็นมาตรฐานเฉพาะ Plugin
คำนำหน้าชนิดเป้าหมายและบริการ เช่น channel:<id>, user:<id>, room:<id>, thread:<id>, imessage:<handle> และ sms:<number> จะอยู่ภายในไวยากรณ์ของช่องทางที่เลือก คำนำหน้าเหล่านี้ไม่ได้เลือกผู้ให้บริการด้วยตัวเอง
รูปแบบคีย์เซสชัน (ตัวอย่าง)
โดยค่าเริ่มต้น ข้อความโดยตรงจะยุบรวมไปยังเซสชัน main ของเอเจนต์:
agent:<agentId>:<mainKey>(ค่าเริ่มต้น:agent:main:main)
แม้เมื่อประวัติการสนทนาข้อความโดยตรงถูกแชร์กับ main นโยบาย sandbox และเครื่องมือจะใช้คีย์รันไทม์แชตโดยตรงต่อบัญชีที่สร้างขึ้นสำหรับ DM ภายนอก เพื่อไม่ให้ข้อความที่มาจากช่องทางถูกปฏิบัติเหมือนการรันเซสชัน main ภายในเครื่อง
กลุ่มและช่องทางยังคงแยกกันต่อช่องทาง:
- กลุ่ม:
agent:<agentId>:<channel>:group:<id> - ช่องทาง/ห้อง:
agent:<agentId>:<channel>:channel:<id>
เธรด:
- เธรด Slack/Discord ต่อท้าย
:thread:<threadId>เข้ากับคีย์ฐาน - หัวข้อฟอรัม Telegram ฝัง
:topic:<topicId>ในคีย์กลุ่ม
ตัวอย่าง:
agent:main:telegram:group:-1001234567890:topic:42agent:main:discord:channel:123456:thread:987654
การปักหมุดเส้นทาง DM หลัก
เมื่อ session.dmScope เป็น main ข้อความโดยตรงอาจแชร์เซสชันหลักเดียวกันได้ เพื่อป้องกันไม่ให้ lastRoute ของเซสชันถูกเขียนทับโดย DM ที่ไม่ใช่เจ้าของ OpenClaw จะอนุมานเจ้าของที่ถูกปักหมุดจาก allowFrom เมื่อเงื่อนไขทั้งหมดนี้เป็นจริง:
allowFromมีรายการที่ไม่ใช่ wildcard เพียงรายการเดียวพอดี- รายการนั้นสามารถทำให้เป็นมาตรฐานเป็น ID ผู้ส่งที่เป็นรูปธรรมสำหรับช่องทางนั้นได้
- ผู้ส่ง DM ขาเข้าไม่ตรงกับเจ้าของที่ถูกปักหมุดนั้น
ในกรณีที่ไม่ตรงกันนั้น OpenClaw ยังคงบันทึกเมตาดาต้าเซสชันขาเข้า แต่จะข้ามการอัปเดต lastRoute ของเซสชันหลัก
การบันทึกขาเข้าที่มีการป้องกัน
Plugin ของช่องทางสามารถทำเครื่องหมายระเบียนเซสชันขาเข้าเป็น createIfMissing: false เมื่อเส้นทางที่มีการป้องกันต้องไม่สร้างเซสชัน OpenClaw ใหม่ ในโหมดนั้น OpenClaw อาจอัปเดตเมตาดาต้าและ lastRoute สำหรับเซสชันที่มีอยู่ แต่จะไม่สร้างรายการเซสชันที่มีเฉพาะเส้นทางเพียงเพราะสังเกตเห็นข้อความหนึ่ง
กฎการกำหนดเส้นทาง (วิธีเลือกเอเจนต์)
การกำหนดเส้นทางจะเลือก หนึ่งเอเจนต์ สำหรับแต่ละข้อความขาเข้า:
- ตรงกับเพียร์แบบพอดี (
bindingsพร้อมpeer.kind+peer.id) - ตรงกับเพียร์แม่ (การสืบทอดของเธรด)
- ตรงกับกิลด์ + บทบาท (Discord) ผ่าน
guildId+roles - ตรงกับกิลด์ (Discord) ผ่าน
guildId - ตรงกับทีม (Slack) ผ่าน
teamId - ตรงกับบัญชี (
accountIdบนช่องทาง) - ตรงกับช่องทาง (บัญชีใดก็ได้บนช่องทางนั้น,
accountId: "*") - เอเจนต์เริ่มต้น (
agents.list[].defaultมิฉะนั้นใช้รายการแรกในลิสต์ สำรองเป็นmain)
เมื่อ binding มีฟิลด์จับคู่หลายรายการ (peer, guildId, teamId, roles) ฟิลด์ที่ให้มาทั้งหมดต้องตรงกัน binding นั้นจึงจะมีผล
เอเจนต์ที่จับคู่ได้จะกำหนดว่าจะใช้พื้นที่ทำงานและที่เก็บเซสชันใด
กลุ่มบรอดแคสต์ (รันหลายเอเจนต์)
กลุ่มบรอดแคสต์ช่วยให้คุณรัน หลายเอเจนต์ สำหรับเพียร์เดียวกัน เมื่อปกติ OpenClaw จะตอบกลับ (เช่น ในกลุ่ม WhatsApp หลังผ่านการกั้นด้วยการกล่าวถึง/การเปิดใช้งาน)
การกำหนดค่า:
{
broadcast: {
strategy: "parallel",
"[email protected]": ["alfred", "baerbel"],
"+15555550123": ["support", "logger"],
},
}
ดู: กลุ่มบรอดแคสต์
ภาพรวมการกำหนดค่า
agents.list: นิยามเอเจนต์ที่มีชื่อ (พื้นที่ทำงาน โมเดล ฯลฯ)bindings: แมปช่องทาง/บัญชี/เพียร์ขาเข้าไปยังเอเจนต์
ตัวอย่าง:
{
agents: {
list: [{ id: "support", name: "Support", workspace: "~/.openclaw/workspace-support" }],
},
bindings: [
{ match: { channel: "slack", teamId: "T123" }, agentId: "support" },
{ match: { channel: "telegram", peer: { kind: "group", id: "-100123" } }, agentId: "support" },
],
}
ที่เก็บเซสชัน
ที่เก็บเซสชันอยู่ใต้ไดเรกทอรีสถานะ (ค่าเริ่มต้น ~/.openclaw):
~/.openclaw/agents/<agentId>/sessions/sessions.json- transcript แบบ JSONL อยู่ข้างที่เก็บ
คุณสามารถแทนที่พาธที่เก็บผ่าน session.store และการทำเทมเพลต {agentId} ได้
การค้นพบเซสชันของ Gateway และ ACP ยังสแกนที่เก็บเอเจนต์แบบอยู่บนดิสก์ภายใต้ราก agents/ เริ่มต้น และภายใต้ราก session.store แบบเทมเพลต ที่เก็บที่ค้นพบต้องอยู่ภายในรากเอเจนต์ที่แก้ไขแล้วนั้น และใช้ไฟล์ sessions.json ปกติ symlink และพาธที่อยู่นอกรากจะถูกละเว้น
พฤติกรรม WebChat
WebChat แนบเข้ากับ เอเจนต์ที่เลือก และค่าเริ่มต้นคือเซสชันหลักของเอเจนต์ ด้วยเหตุนี้ WebChat จึงให้คุณเห็นบริบทข้ามช่องทางสำหรับเอเจนต์นั้นได้ในที่เดียว
บริบทการตอบกลับ
การตอบกลับขาเข้ามี:
ReplyToId,ReplyToBodyและReplyToSenderเมื่อมี- บริบทที่อ้างอิงจะถูกต่อท้าย
Bodyเป็นบล็อก[Replying to ...]
สิ่งนี้สอดคล้องกันในทุกช่องทาง