Configuration

การกำหนดเส้นทางของช่องทาง

ช่องทางและการกำหนดเส้นทาง

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

คำสำคัญ

  • ช่องทาง: telegram, whatsapp, discord, irc, googlechat, slack, signal, imessage, line รวมถึงช่องทางของ Plugin webchat คือช่องทาง 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:42
  • agent: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 สำหรับเซสชันที่มีอยู่ แต่จะไม่สร้างรายการเซสชันที่มีเฉพาะเส้นทางเพียงเพราะสังเกตเห็นข้อความหนึ่ง

กฎการกำหนดเส้นทาง (วิธีเลือกเอเจนต์)

การกำหนดเส้นทางจะเลือก หนึ่งเอเจนต์ สำหรับแต่ละข้อความขาเข้า:

  1. ตรงกับเพียร์แบบพอดี (bindings พร้อม peer.kind + peer.id)
  2. ตรงกับเพียร์แม่ (การสืบทอดของเธรด)
  3. ตรงกับกิลด์ + บทบาท (Discord) ผ่าน guildId + roles
  4. ตรงกับกิลด์ (Discord) ผ่าน guildId
  5. ตรงกับทีม (Slack) ผ่าน teamId
  6. ตรงกับบัญชี (accountId บนช่องทาง)
  7. ตรงกับช่องทาง (บัญชีใดก็ได้บนช่องทางนั้น, accountId: "*")
  8. เอเจนต์เริ่มต้น (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 ...]

สิ่งนี้สอดคล้องกันในทุกช่องทาง

ที่เกี่ยวข้อง