---
read_when:
    - การเปลี่ยนการกำหนดเส้นทางของช่องทางหรือพฤติกรรมของกล่องข้อความขาเข้า
summary: กฎการกำหนดเส้นทางสำหรับแต่ละช่องทาง (WhatsApp, Telegram, Discord, Slack) และบริบทที่ใช้ร่วมกัน
title: การกำหนดเส้นทางช่องทาง
x-i18n:
    generated_at: "2026-05-02T10:07:29Z"
    model: gpt-5.5
    provider: openai
    source_hash: 9a752696e70d2c13d3ab1c9cedd41442e0d8aee6d78b3a069b53dd2b262174da
    source_path: channels/channel-routing.md
    workflow: 16
---

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

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` มีรายการที่ไม่ใช่ไวลด์การ์ดเพียงรายการเดียว
- รายการนั้นสามารถทำให้เป็นรูปแบบมาตรฐานเป็น ID ผู้ส่งที่เป็นรูปธรรมสำหรับช่องทางนั้นได้
- ผู้ส่ง DM ขาเข้าไม่ตรงกับเจ้าของที่ตรึงไว้นั้น

ในกรณีที่ไม่ตรงกันนั้น OpenClaw ยังคงบันทึกข้อมูลเมตาเซสชันขาเข้า แต่จะข้ามการอัปเดต `lastRoute` ของเซสชัน main

## การบันทึกขาเข้าที่มีการป้องกัน

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 หลังผ่านการกั้นด้วยการกล่าวถึง/การเปิดใช้งาน)

การกำหนดค่า:

```json5
{
  broadcast: {
    strategy: "parallel",
    "120363403215116621@g.us": ["alfred", "baerbel"],
    "+15555550123": ["support", "logger"],
  },
}
```

ดู: [กลุ่มบรอดแคสต์](/th/channels/broadcast-groups)

## ภาพรวมการกำหนดค่า

- `agents.list`: คำนิยามเอเจนต์ที่มีชื่อ (พื้นที่ทำงาน โมเดล และอื่น ๆ)
- `bindings`: แมปช่องทาง/บัญชี/เพียร์ขาเข้าไปยังเอเจนต์

ตัวอย่าง:

```json5
{
  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`
- ทรานสคริปต์ JSONL อยู่ข้างคลัง

คุณสามารถแทนที่พาธคลังผ่าน `session.store` และการทำเทมเพลต `{agentId}` ได้

การค้นหาเซสชันของ Gateway และ ACP จะสแกนคลังเอเจนต์ที่รองรับด้วยดิสก์ใต้ราก `agents/` เริ่มต้น และใต้ราก `session.store` ที่ทำเทมเพลตไว้ด้วย คลังที่ค้นพบต้องอยู่ภายในรากเอเจนต์ที่แก้ไขแล้วนั้น และใช้ไฟล์ `sessions.json` ปกติ Symlink และพาธที่อยู่นอกรากจะถูกละเว้น

## พฤติกรรมของ WebChat

WebChat แนบกับ **เอเจนต์ที่เลือก** และค่าเริ่มต้นเป็นเซสชัน main ของเอเจนต์ ด้วยเหตุนี้ WebChat จึงให้คุณเห็นบริบทข้ามช่องทางของเอเจนต์นั้นได้ในที่เดียว

## บริบทการตอบกลับ

การตอบกลับขาเข้าประกอบด้วย:

- `ReplyToId`, `ReplyToBody` และ `ReplyToSender` เมื่อมีให้ใช้งาน
- บริบทที่อ้างอิงจะถูกต่อท้ายใน `Body` เป็นบล็อก `[Replying to ...]`

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

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

- [กลุ่ม](/th/channels/groups)
- [กลุ่มบรอดแคสต์](/th/channels/broadcast-groups)
- [การจับคู่](/th/channels/pairing)
