---
read_when:
    - การเปลี่ยนการกำหนดเส้นทางช่องทางหรือพฤติกรรมของกล่องข้อความเข้า
summary: กฎการกำหนดเส้นทางแยกตามช่องทาง (WhatsApp, Telegram, Discord, Slack) และบริบทร่วมกัน
title: การกำหนดเส้นทางช่องทาง
x-i18n:
    generated_at: "2026-04-24T08:57:45Z"
    model: gpt-5.4
    provider: openai
    source_hash: cb87a774bb094af15524702c2c4fd17cf0b41fe27ac0943d1008523a43d5553b
    source_path: channels/channel-routing.md
    workflow: 15
---

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

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

## คำสำคัญ

- **ช่องทาง**: `telegram`, `whatsapp`, `discord`, `irc`, `googlechat`, `slack`, `signal`, `imessage`, `line` รวมถึงช่องทางจาก Plugin โดย `webchat` คือช่องทาง UI ของ WebChat ภายใน และไม่ใช่ช่องทางขาออกที่กำหนดค่าได้
- **AccountId**: อินสแตนซ์บัญชีต่อช่องทาง (เมื่อรองรับ)
- บัญชีเริ่มต้นของช่องทางแบบไม่บังคับ: `channels.<channel>.defaultAccount` ใช้เลือกว่าจะใช้บัญชีใดเมื่อเส้นทางขาออกไม่ได้ระบุ `accountId`
  - ในการตั้งค่าแบบหลายบัญชี ให้ตั้งค่าเริ่มต้นอย่างชัดเจน (`defaultAccount` หรือ `accounts.default`) เมื่อมีการกำหนดค่าตั้งแต่สองบัญชีขึ้นไป หากไม่ตั้งค่า การกำหนดเส้นทางสำรองอาจเลือก Account ID ที่ถูกทำให้เป็นมาตรฐานแล้วตัวแรก
- **AgentId**: เวิร์กสเปซ + ที่เก็บเซสชันแบบแยกขาดจากกัน (“สมอง”)
- **SessionKey**: คีย์บักเก็ตที่ใช้เก็บบริบทและควบคุมการทำงานพร้อมกัน

## รูปแบบของคีย์เซสชัน (ตัวอย่าง)

โดยค่าเริ่มต้น ข้อความส่วนตัวจะถูกรวมเข้ากับเซสชัน **หลัก** ของเอเจนต์:

- `agent:<agentId>:<mainKey>` (ค่าเริ่มต้น: `agent:main:main`)

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

กลุ่มและช่องทางจะยังคงแยกจากกันตามแต่ละช่องทาง:

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

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

## กฎการกำหนดเส้นทาง (เลือกเอเจนต์อย่างไร)

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

1. **ตรงกับ peer แบบเจาะจง** (`bindings` ที่มี `peer.kind` + `peer.id`)
2. **ตรงกับ peer แม่** (การสืบทอดของเธรด)
3. **ตรงกับ guild + roles** (Discord) ผ่าน `guildId` + `roles`
4. **ตรงกับ guild** (Discord) ผ่าน `guildId`
5. **ตรงกับ team** (Slack) ผ่าน `teamId`
6. **ตรงกับบัญชี** (`accountId` บนช่องทางนั้น)
7. **ตรงกับช่องทาง** (ทุกบัญชีบนช่องทางนั้น, `accountId: "*"`)
8. **เอเจนต์เริ่มต้น** (`agents.list[].default` มิฉะนั้นใช้รายการแรก และสำรองเป็น `main`)

เมื่อ binding มีหลายฟิลด์สำหรับการจับคู่ (`peer`, `guildId`, `teamId`, `roles`) **ทุกฟิลด์ที่ระบุต้องตรงกันทั้งหมด** จึงจะใช้ binding นั้นได้

เอเจนต์ที่จับคู่ได้จะเป็นตัวกำหนดว่าจะใช้เวิร์กสเปซและที่เก็บเซสชันใด

## กลุ่มกระจายงาน (รันหลายเอเจนต์)

กลุ่มกระจายงานช่วยให้คุณรัน **หลายเอเจนต์** สำหรับ peer เดียวกันได้ **เมื่อ OpenClaw ปกติจะตอบกลับอยู่แล้ว** (ตัวอย่างเช่น: ในกลุ่ม WhatsApp หลังจากผ่านการกั้นด้วยการกล่าวถึง/การเปิดใช้งานแล้ว)

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

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

ดู: [Broadcast Groups](/th/channels/broadcast-groups)

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

- `agents.list`: นิยามเอเจนต์แบบมีชื่อ (เวิร์กสเปซ, โมเดล ฯลฯ)
- `bindings`: แมปช่องทาง/บัญชี/peer ขาเข้าไปยังเอเจนต์

ตัวอย่าง:

```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" },
  ],
}
```

## ที่เก็บเซสชัน

ที่เก็บเซสชันอยู่ภายใต้ไดเรกทอรี state (ค่าเริ่มต้น `~/.openclaw`):

- `~/.openclaw/agents/<agentId>/sessions/sessions.json`
- ทรานสคริปต์ JSONL จะอยู่ข้าง ๆ ที่เก็บนี้

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

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

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

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

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

การตอบกลับขาเข้าจะรวมสิ่งต่อไปนี้เมื่อมีให้ใช้:

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

พฤติกรรมนี้สอดคล้องกันในทุกช่องทาง

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

- [กลุ่ม](/th/channels/groups)
- [กลุ่มกระจายงาน](/th/channels/broadcast-groups)
- [การจับคู่](/th/channels/pairing)
