---
read_when:
    - การเชื่อมต่อ OpenClaw กับเวิร์กสเปซ ClickClack
    - การทดสอบข้อมูลประจำตัวบอต ClickClack
summary: การตั้งค่าช่องทางโทเค็นบอต ClickClack และไวยากรณ์เป้าหมาย
title: ClickClack
x-i18n:
    generated_at: "2026-07-21T15:17:16Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 32
    provider: openai
    source_hash: 761538cdd7a916415719131b9ff2f40bf3e3e0eab0f7bda450250886acde8a64
    source_path: channels/clickclack.md
    workflow: 16
---

ClickClack เชื่อมต่อ OpenClaw กับพื้นที่ทำงาน ClickClack ที่โฮสต์เองผ่านโทเค็นบอต ClickClack ที่รองรับโดยตรง

ใช้วิธีนี้เมื่อต้องการให้เอเจนต์ OpenClaw ปรากฏเป็นผู้ใช้บอต ClickClack โดย ClickClack รองรับทั้งบอตบริการอิสระและบอตที่ผู้ใช้เป็นเจ้าของ บอตที่ผู้ใช้เป็นเจ้าของจะเก็บ `owner_user_id` ไว้ และได้รับเฉพาะขอบเขตสิทธิ์ของโทเค็นที่คุณอนุญาตเท่านั้น

## การตั้งค่าด่วน

ใน ClickClack ให้เปิด **Workspace settings → Integrations → OpenClaw** สร้าง
บอตโดยใช้ **Setup code (recommended)** แล้วคัดลอกคำสั่งที่สร้างขึ้น:

```bash
openclaw channels add clickclack --code 'https://clickclack.example.com/#XXXX-XXXX-XXXX'
```

สำหรับต้นทางของฟรอนต์เอนด์และ API ที่แยกกัน หรือ API ที่เมานต์ไว้ภายใต้พาธ ClickClack จะสร้าง
เอนด์พอยต์สำหรับรับสิทธิ์ที่แน่นอนแทน:

```bash
openclaw channels add clickclack --code 'https://api.example.com/services/clickclack/api/bot-setup-codes/claim#XXXX-XXXX-XXXX'
```

รหัสตั้งค่าใช้ได้ครั้งเดียวและหมดอายุหลังจาก 10 นาที OpenClaw จะรับสิทธิ์ด้วยรหัสดังกล่าว
รับโทเค็นบอตที่สร้างขึ้นใหม่และการตั้งค่าพื้นที่ทำงาน บันทึกบัญชี
ตรวจสอบการเชื่อมต่อ และรายงานว่า Gateway ที่กำลังทำงานตรวจพบการตั้งค่านี้หรือไม่
สำหรับเอนด์พอยต์แบบระบุเวอร์ชันที่แน่นอน OpenClaw จะตรวจสอบและบันทึกฐาน API มาตรฐาน
ที่ ClickClack ส่งคืน รวมถึงคำนำหน้าพาธใดๆ โดยจะไม่จัดเก็บรหัสตั้งค่า
ไว้ในการกำหนดค่า OpenClaw

การรับสิทธิ์ด้วยรหัสตั้งค่าใช้ HTTPS สำหรับเซิร์ฟเวอร์สาธารณะ นอกจากนี้ยังรองรับ HTTP ธรรมดาสำหรับ
การติดตั้งภายในเครื่องบนที่อยู่ลูปแบ็ก เช่น `localhost` และ `127.0.0.1`

หาก OpenClaw กำลังทำงานอยู่แล้ว ClickClack จะเชื่อมต่อโดยอัตโนมัติและไม่จำเป็นต้องใช้
คำสั่งที่สอง มิฉะนั้น ให้เริ่มต้นด้วย:

```bash
openclaw gateway
```

คุณยังสามารถส่งรหัสแยกจาก URL ของเซิร์ฟเวอร์ได้:

```bash
openclaw channels add clickclack --code XXXX-XXXX-XXXX --base-url https://clickclack.example.com
```

สำหรับการตั้งค่าแบบมีคำแนะนำ ให้เรียกใช้:

```bash
openclaw onboard
```

เลือก ClickClack จากนั้นป้อน URL ของเซิร์ฟเวอร์ โทเค็นบอต และพื้นที่ทำงานเมื่อ
ระบบแจ้ง การตั้งค่าแบบมีคำแนะนำจะตรวจสอบเซิร์ฟเวอร์ โทเค็น และพื้นที่ทำงานหลังจากบันทึก หาก
การตรวจสอบล้มเหลว ระบบจะไม่ละทิ้งการกำหนดค่า

### ทางเลือก: โทเค็นแบบกำหนดเอง

เลือก **Manual token** ใน ClickClack เมื่อกำหนดค่าไคลเอนต์ที่ไม่ใช่ OpenClaw หรือ
เมื่อคุณต้องจัดการโทเค็นด้วยตนเองอย่างชัดเจน:

```bash
openclaw channels add clickclack --base-url https://clickclack.example.com --token ccb_... --workspace default
```

`workspace` รองรับรหัสพื้นที่ทำงาน (`wsp_...`) สลัก หรือชื่อที่แสดง
ไม่สามารถใช้ `--code` ร่วมกับ `--token`, `--token-file` หรือ `--use-env` ได้

### ทางเลือก: โทเค็นจากตัวแปรสภาพแวดล้อม

บัญชีเริ่มต้นสามารถอ่าน `CLICKCLACK_BOT_TOKEN` แทนการจัดเก็บโทเค็น
ในการกำหนดค่า:

```bash
export CLICKCLACK_BOT_TOKEN="ccb_..."
openclaw channels add clickclack --base-url https://clickclack.example.com --workspace default --use-env
openclaw gateway
```

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

### ข้อมูลอ้างอิง JSON5

รูปแบบการกำหนดค่าที่เทียบเท่าคือ:

```json5
{
  channels: {
    clickclack: {
      enabled: true,
      baseUrl: "https://clickclack.example.com",
      token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" },
      workspace: "default",
      defaultTo: "channel:general",
    },
  },
}
```

บัญชีจะถือว่าได้รับการกำหนดค่าเฉพาะเมื่อกำหนด `baseUrl` แหล่งที่มาของโทเค็น และ
`workspace` ครบทั้งหมด แหล่งที่มาของโทเค็นอาจเป็น `token`, `tokenFile` หรือ
`CLICKCLACK_BOT_TOKEN` สำหรับบัญชีเริ่มต้น `workspace` รองรับรหัสพื้นที่ทำงาน
(`wsp_...`) สลัก หรือชื่อ โดย Gateway จะแปลงเป็นรหัสเมื่อเริ่มทำงาน

### คีย์การกำหนดค่าบัญชี

| คีย์                     | ค่าเริ่มต้น             | หมายเหตุ                                                                                   |
| ----------------------- | ------------------- | --------------------------------------------------------------------------------------- |
| `baseUrl`               | ไม่มี (จำเป็น)     | URL สาธารณะของ ClickClack ที่ใช้สำหรับลิงก์ซึ่งเปิดในเบราว์เซอร์                                    |
| `apiBaseUrl`            | `baseUrl`           | เอนด์พอยต์เซิร์ฟเวอร์ถึงเซิร์ฟเวอร์ที่ไม่บังคับ สำหรับ REST และทราฟฟิก WebSocket แบบเรียลไทม์             |
| `token`                 | ไม่มี                | โทเค็นบอตในรูปแบบสตริงธรรมดาหรือการอ้างอิงข้อมูลลับ (`source: "env" \| "file" \| "exec"`)        |
| `tokenFile`             | ไม่มี                | พาธไปยังไฟล์โทเค็นบอต มีลำดับความสำคัญเหนือ `token`                                |
| `workspace`             | ไม่มี (จำเป็น)     | รหัสพื้นที่ทำงาน สลัก หรือชื่อ                                                            |
| `replyMode`             | `"agent"`           | `"agent"` เรียกใช้ไปป์ไลน์เอเจนต์แบบเต็ม ส่วน `"model"` ส่งการเติมข้อความโมเดลโดยตรงแบบสั้น |
| `defaultTo`             | `"channel:general"` | เป้าหมายที่ใช้เมื่อพาธขาออกไม่ได้ระบุเป้าหมาย                                      |
| `allowFrom`             | `["*"]`             | รายการอนุญาตรหัสผู้ใช้สำหรับ DM ขาเข้าและข้อความในช่อง                                 |
| `botUserId`             | ตรวจหาอัตโนมัติ       | แปลงจากข้อมูลประจำตัวของโทเค็นบอตเมื่อเริ่มทำงาน                                        |
| `agentId`               | ค่าเริ่มต้นของเส้นทาง       | ตรึงข้อความขาเข้าของบัญชีนี้ไว้กับเอเจนต์หนึ่งราย                                       |
| `toolsAllow`            | ไม่มี                | รายการอนุญาตเครื่องมือสำหรับการตอบกลับของเอเจนต์จากบัญชีนี้                                     |
| `model`, `systemPrompt` | ไม่มี                | ใช้โดยการเติมข้อความ `replyMode: "model"`                                               |
| `commandMenu`           | `true`              | เผยแพร่คำสั่งเนทีฟไปยังการเติมข้อความอัตโนมัติในเครื่องมือเขียนข้อความของ ClickClack                            |
| `reconnectMs`           | `1500`              | ระยะหน่วงก่อนเชื่อมต่อเรียลไทม์ใหม่ (100 ถึง 60000)                                                |
| `discussions`           | ปิดใช้งาน            | การตั้งค่าช่องที่จัดการแยกตามเซสชัน ดู[การสนทนาของเซสชัน](#session-discussions)  |

### คงชื่อโฮสต์สาธารณะที่มีการควบคุมด้วยการยืนยันตัวตนไว้

ใช้ `apiBaseUrl` เมื่อ ClickClack และ Gateway ของ OpenClaw ทำงานบนโฮสต์เดียวกัน
แต่ชื่อโฮสต์ ClickClack สาธารณะได้รับการป้องกันด้วย Gateway การยืนยันตัวตน
เช่น Cloudflare Access:

```json5
{
  channels: {
    clickclack: {
      baseUrl: "https://clack.openclaw.ai",
      apiBaseUrl: "http://127.0.0.1:8484",
      token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" },
      workspace: "default",
    },
  },
}
```

ชื่อโฮสต์สาธารณะยังคงควบคุมด้วยการยืนยันตัวตนอย่างสมบูรณ์สำหรับผู้ใช้เบราว์เซอร์ได้ OpenClaw
ใช้เอนด์พอยต์ลูปแบ็กสำหรับคำขอ REST การตรวจสอบการตั้งค่า และ
WebSocket แบบเรียลไทม์ ขณะที่ลิงก์ `embedUrl` และ `openUrl` ของการสนทนายังคง
ใช้ `baseUrl` สาธารณะ หากละเว้น `apiBaseUrl` ทราฟฟิกทั้งหมดจะใช้
`baseUrl` ซึ่งคงลักษณะการทำงานเดิมไว้

หาก `plugins.allow` เป็นรายการจำกัดที่ไม่ว่างเปล่า การเลือก
ClickClack อย่างชัดเจนในการตั้งค่าช่องหรือการเรียกใช้ `openclaw plugins enable clickclack`
จะเพิ่ม `clickclack` ต่อท้ายรายการนั้น การติดตั้งระหว่างการเริ่มต้นใช้งานใช้ลักษณะ
การเลือกอย่างชัดเจนแบบเดียวกัน พาธเหล่านี้จะไม่แทนที่ `plugins.deny` หรือการตั้งค่า
`plugins.enabled: false` ส่วนกลาง การเรียกใช้
`openclaw plugins install @openclaw/clickclack` โดยตรงจะเป็นไปตามนโยบาย
การติดตั้ง Plugin ตามปกติ และยังบันทึก ClickClack ไว้ในรายการอนุญาตที่มีอยู่ด้วย

## บอตหลายตัว

แต่ละบัญชีจะเปิดการเชื่อมต่อเรียลไทม์กับ ClickClack ของตนเอง และใช้โทเค็นบอตของตนเอง

```json5
{
  channels: {
    clickclack: {
      enabled: true,
      baseUrl: "https://clickclack.example.com",
      defaultAccount: "service",
      accounts: {
        service: {
          token: { source: "env", provider: "default", id: "CLICKCLACK_SERVICE_BOT_TOKEN" },
          workspace: "default",
          defaultTo: "channel:general",
          agentId: "service-bot",
        },
        support: {
          token: { source: "env", provider: "default", id: "CLICKCLACK_SUPPORT_BOT_TOKEN" },
          workspace: "default",
          defaultTo: "dm:usr_...",
          agentId: "support-bot",
        },
      },
    },
  },
}
```

## การสนทนาของเซสชัน

เปิดใช้งานการสนทนาในบัญชี ClickClack หนึ่งบัญชี เพื่อให้แต่ละเซสชัน OpenClaw มี
ช่อง ClickClack เฉพาะ โทเค็นของบัญชีต้องมี
`channels:write` (ชุด `bot:admin` มีขอบเขตสิทธิ์นี้อยู่) ส่วนโทเค็นตั้งค่า `bot:write`
แบบปกติไม่สามารถสร้างหรือซิงโครไนซ์ช่องได้

```json5
{
  channels: {
    clickclack: {
      enabled: true,
      baseUrl: "https://clickclack.example.com",
      token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" },
      workspace: "default",
      discussions: {
        enabled: true,
        workspace: "default",
        controlUrlBase: "https://team.openclaw.ai",
        section: "Sessions",
      },
    },
  },
}
```

`discussions.workspace` รองรับรหัสพื้นที่ทำงาน สลัก หรือชื่อที่แสดงแบบเดียวกับ
`workspace` ระดับบัญชี และใช้ค่านั้นเป็นค่าเริ่มต้น `section` ควบคุม
ส่วนแถบด้านข้างของ ClickClack และมีค่าเริ่มต้นเป็น `Sessions` เมื่อ
กำหนด `controlUrlBase` ช่องที่จัดการจะลิงก์กลับไปยังเส้นทางเซสชันจริงของ Control UI
ซึ่งคือ `/chat?session=<encoded-session-key>`

เปิดใช้งานการสนทนาในบัญชี ClickClack เพียงหนึ่งบัญชีเท่านั้น ผู้ให้บริการ Gateway ไม่มี
ตัวเลือกบัญชี ดังนั้นระบบจะปฏิเสธบัญชีการสนทนาที่เปิดใช้งานไว้หลายบัญชี
แทนที่จะเลือกบัญชีหนึ่งตามลำดับการกำหนดค่า

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

ข้อความขาเข้าในช่องที่จัดการจะใช้เซสชันย่อยที่กำหนดค่าได้แน่นอนภายใต้
รหัสเอเจนต์เดียวกับเซสชันหลักที่แนบอยู่ เอเจนต์ย่อยจะได้รับแจ้งว่า
ต้องสังเกตเซสชันหลักใด และสามารถใช้ `sessions_history` และ `session_status`
(`changesSince` มีประโยชน์สำหรับการตรวจสอบแบบเพิ่มทีละส่วน) เอเจนต์จะใช้ `sessions_send` เฉพาะ
เมื่อผู้คนในการสนทนาขอให้ส่งต่อหรือชี้นำเซสชันหลัก
การผูกข้อมูล การอ้างอิงความเป็นเจ้าของที่จัดการ และข้อมูลประจำตัวเพียร์ของเซสชันย่อยจะรวม
รหัสเซสชัน OpenClaw ที่เจาะจง พร้อมกับเซิร์ฟเวอร์ ClickClack และ
ช่องที่ตรึงไว้ การรีเซ็ตคีย์เซสชันที่ใช้ซ้ำได้หรือเปลี่ยนเป้าหมายบัญชีจะเพิกถอน
ช่องเดิมภายในเครื่อง เก็บช่องไว้ในคลังเมื่อข้อมูลรับรองเดิมยังใช้งานได้ และ
ไม่สามารถใช้ทรานสคริปต์ย่อยเดิมซ้ำได้ ข้อความที่มาถึงผ่าน
การผูกข้อมูลที่เก็บถาวร รีเซ็ต ปิดใช้งาน หรือเปลี่ยนเป้าหมายแล้วจะถูกละทิ้ง แทนที่จะย้อนกลับ
ไปใช้การกำหนดเส้นทางช่องปกติของบัญชี การผูกข้อมูลที่ปล่อยแล้วจะคงเครื่องหมาย
ช่องที่ถูกเพิกถอนแบบถาวรไว้ เพื่อให้เหตุการณ์เรียลไทม์ที่ล่าช้ายังคงปิดกั้นเมื่อเกิดข้อผิดพลาด ความเป็นเจ้าของ
ระยะไกลใช้คีย์จากเซิร์ฟเวอร์ ClickClack และรหัสช่อง ดังนั้นการเปลี่ยนชื่อบัญชีภายในเครื่อง
จึงไม่สามารถเปลี่ยนช่องที่จัดการให้เป็นช่องทั่วไปได้

คง `tools.sessions.visibility` ไว้ที่ค่าเริ่มต้น `tree` ซึ่งปลอดภัยกว่า Plugin
จะติดตั้งการอนุญาตที่จำกัดตามโฮสต์เฉพาะระหว่างแต่ละเซสชันย่อยกับเซสชัน
หลักที่แนบอยู่เท่านั้น รวมถึงฮุกนโยบายเครื่องมือที่บล็อกการค้นหาเซสชันและ
เป้าหมายข้ามเซสชัน โดยอนุญาต `sessions_history`, `session_status` และ
`sessions_send` เฉพาะสำหรับเซสชันหลักที่แนบอยู่ และป้องกันไม่ให้การเรียกสถานะ
เปลี่ยนโมเดลของเซสชันนั้น เครื่องมือเหล่านั้นยังคงต้องอยู่ในรายการอนุญาตเครื่องมือ
ที่มีผลของเอเจนต์ พรอมต์ระบบเป็นเพียงคำแนะนำ ส่วนการอนุญาตของโฮสต์
และฮุกคือขอบเขตการให้สิทธิ์

เซิร์ฟเวอร์ ClickClack ต้องรองรับฟิลด์ช่องที่มีการจัดการ (`external_managed`,
`external_ref`, `external_url` และ `sidebar_section`) ในการสร้างและ
อัปเดตช่อง และส่งคืนฟิลด์เหล่านี้ในการตอบกลับของช่อง OpenClaw ตรวจสอบสัญญานั้น
ก่อนบันทึกการผูก หากการตอบกลับจากการสร้างสูญหาย การเปิดครั้งถัดไปจะรับช่วง
ช่องตาม `external_ref` ที่เซิร์ฟเวอร์บังคับใช้แทนการสร้างช่องใหม่
จนกว่าจะปรับสถานะผลลัพธ์นั้นให้ตรงกัน การจองที่รอดำเนินการจะแยกกัก
เหตุการณ์ที่ไม่ได้ผูกไว้ในพื้นที่ทำงานปลายทาง ตัวปรับสถานะแบบหยาบ
จะรับช่วงช่องเมื่อเซสชันเดิมยังทำงานอยู่ หรือเก็บช่องเข้าคลังหลังจาก
รีเซ็ต และจะล้างการจองเมื่อไม่มีการสร้างช่องระยะไกล
การอ้างอิงนั้นประกอบด้วยเนมสเปซถาวรต่อการติดตั้ง OpenClaw พร้อมกับ
แฮชของคีย์เซสชัน รหัสเซสชันจริง ปลายทาง ClickClack และรุ่นการผูก
แบบถาวร Gateway ที่แยกจากกันไม่สามารถรับช่วงช่องของกันและกันได้
เซสชันที่รีเซ็ตไม่สามารถสืบทอดประวัติช่องเก่า และการเดินทางไปกลับของบัญชีหรือพื้นที่ทำงาน
ไม่สามารถรับช่วงช่องเดิมอีกครั้ง การผูกยังถูกตรึงไว้กับ URL ของเซิร์ฟเวอร์
ClickClack ที่กำหนดค่าไว้ และจะถูกทำให้ใช้ไม่ได้หากบัญชีถูกเปลี่ยนเป้าหมาย
การเปลี่ยนหรือลบ `controlUrlBase` จะอัปเดตหรือล้างลิงก์ช่องที่มีการจัดการ
ในการปรับสถานะรอบถัดไป การเปลี่ยน
`discussions.workspace` จะเก็บการผูกเก่าเข้าคลังและปล่อยการผูกนั้นก่อนจึงจะสามารถเปิดช่อง
ในพื้นที่ทำงานใหม่ได้ เมื่อข้อมูลประจำตัวของพื้นที่ทำงานเก่ายังคงได้รับการกำหนดค่า
หากโทเค็นถูกแทนที่ด้วยข้อมูลประจำตัวที่จำกัดขอบเขตเฉพาะพื้นที่ทำงานและ
ไม่สามารถเข้าถึงพื้นที่ทำงานเก่าได้ OpenClaw จะบันทึกช่องเก่าว่าถูกเพิกถอนและ
ปล่อยการผูกโดยไม่พยายามใช้โทเค็นทดแทน ให้เก็บช่องที่ตกค้างนั้น
เข้าคลังจาก ClickClack

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

## โหมดการตอบกลับ

- `replyMode: "agent"` (ค่าเริ่มต้น) ส่งข้อความขาเข้าผ่านไปป์ไลน์เอเจนต์ตามปกติ รวมถึงการบันทึกเซสชันและนโยบายเครื่องมือ
- `replyMode: "model"` ข้ามไปป์ไลน์เอเจนต์และใช้ `llm.complete` ของรันไทม์ Plugin สำหรับการตอบกลับโดยตรงจากบอต โดยอาจปรับรูปแบบด้วย `model` และ `systemPrompt` ผู้ให้บริการและโมเดลที่เลือกเป็นผู้กำหนดงบประมาณการประมวลผลคำตอบ

โหมดโมเดลเรียกใช้การประมวลผลคำตอบกับรหัสเอเจนต์ของบอตที่แก้ไขค่าแล้ว ซึ่งจำเป็นต้องเปิด
บิตความเชื่อถือ `plugins.entries.clickclack.llm.allowAgentIdOverride: true`
อย่างชัดเจน:

```json5
{
  plugins: {
    entries: {
      clickclack: {
        llm: {
          allowAgentIdOverride: true,
        },
      },
    },
  },
}
```

ปิดบิตความเชื่อถือนี้ไว้หากใช้เฉพาะโหมดตอบกลับ `agent` ค่าเริ่มต้น
โหมดนั้นไม่จำเป็นต้องใช้บิตนี้

## เมนูคำสั่ง

เมื่อ Gateway เริ่มทำงาน แต่ละบัญชีที่กำหนดค่าไว้จะเผยแพร่คำสั่งเนทีฟของ OpenClaw
ไปยัง ClickClack คำสั่งเหล่านี้จะปรากฏในการเติมข้อความอัตโนมัติของตัวเขียน โดยมี
แฮนเดิลของบอตเป็นป้ายกำกับ ชุดที่เผยแพร่จะถูกแทนที่ทั้งหมดทุกครั้งที่เริ่มทำงาน
รวมถึงการล้างเมนูเก่าเมื่อแค็ตตาล็อกคำสั่งเนทีฟว่างเปล่า

การซิงค์เมนูคำสั่งเปิดใช้งานโดยค่าเริ่มต้น ตั้งค่า `commandMenu: false` ในบัญชี
เพื่อเลือกไม่ใช้:

```json5
{
  channels: {
    clickclack: {
      enabled: true,
      token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" },
      workspace: "default",
      commandMenu: false,
    },
  },
}
```

โทเค็นต้องมี `commands:write` บันเดิล `bot:write` และ
`bot:admin` ปัจจุบันของ ClickClack มีขอบเขตนี้รวมอยู่ และยังสามารถมอบ
แยกต่างหากได้ โทเค็นที่สร้างก่อนเริ่มใช้เมนูคำสั่งอาจต้องเพิ่ม
ขอบเขตนี้หรือใช้โทเค็นทดแทน

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

รุ่นนี้เผยแพร่เฉพาะข้อกำหนดคำสั่งเนทีฟเท่านั้น นามแฝงและ
แค็ตตาล็อกคำสั่งจาก Skills, Plugin หรือคำสั่งกำหนดเองจะไม่ถูกเพิ่มในเมนู หาก
ชื่อหนึ่งได้รับการลงทะเบียนเป็นคำสั่ง HTTP แบบสแลชด้วย ClickClack จะส่งต่อ
การลงทะเบียนนั้นก่อน ส่วนคำสั่งเมนูอื่นจะดำเนินการต่อผ่านการส่งข้อความ
ตามปกติ

ใช้โหมด `agent` สำหรับหลักฐานการเชื่อมโยงข้ามบริการ สำหรับรหัสข้อความ
ClickClack ที่เชื่อถือได้ในรูปแบบมาตรฐาน `msg_<ulid>` ช่องจะสร้าง
รหัสการทำงาน OpenClaw แบบกำหนดแน่นอน `clickclack:<message-id>` จากรหัสดังกล่าว จากนั้นการเรียกโมเดลแต่ละครั้ง
จะมองเห็นได้ในการวินิจฉัยเป็น `clickclack:<message-id>:model:<n>` และเมื่อ
เทิร์นนั้นใช้ ClawRouter รหัสการเรียกโมเดลเดียวกันจะถูกส่งเป็น `X-Request-ID`
โหมด `model` ข้ามการวินิจฉัยการทำงาน/เซสชันของเอเจนต์ตามปกติ จึง
ไม่เหมาะสำหรับเส้นทางหลักฐานนี้

เมื่อเหตุการณ์แบบเรียลไทม์มี `payload.correlation_id` ที่ตรวจสอบแล้ว
ช่องจะส่งค่านี้เป็น `X-Correlation-ID` ในการดึงข้อความที่เชื่อถือได้และ
คำขอตอบกลับ ClickClack ที่เกิดขึ้น ค่าจะใช้ชุดอักขระปลอดภัย
128 อักขระของ ClickClack (`A-Z`, `a-z`, `0-9`, `.`, `_`, `:` และ `-`) โดยจะละเว้นค่าที่ไม่ถูกต้อง
การเชื่อมโยงเหล่านี้มีเฉพาะตัวระบุเท่านั้น ไม่รวมเนื้อหาข้อความ
พรอมต์ ผลลัพธ์การประมวลผล ข้อมูลประจำตัว หรือเอาต์พุตเครื่องมือ

## การส่งสื่อแบบถาวร

การตอบกลับของเอเจนต์ที่มีสื่อต้องใช้การส่งแบบถาวร OpenClaw กำหนด
น็องซ์ของข้อความและการอัปโหลดที่คงที่สำหรับแต่ละส่วนก่อนการเขียนไปยัง ClickClack ครั้งแรก เพื่อให้
การลองใหม่ใช้การอัปโหลดและข้อความเดิมแทนการใช้โควตาพื้นที่จัดเก็บ
หรือเผยแพร่รายการซ้ำ หากมีการอัปโหลดอยู่แล้วหลังการเริ่มระบบใหม่
OpenClaw จะไม่อ่านพาธในเครื่องหรือ URL สื่อระยะไกลต้นฉบับอีกครั้ง

สัญญาการกู้คืนนี้ต้องใช้เซิร์ฟเวอร์ ClickClack ที่รองรับ:

- `GET /api/uploads/by-nonce` พร้อม
  `X-ClickClack-Upload-Nonce: supported` สำหรับผลลัพธ์ทั้งที่พบและไม่พบ
- `GET /api/messages/by-nonce` พร้อม
  `X-ClickClack-Message-Nonce: supported` สำหรับผลลัพธ์ทั้งที่พบและไม่พบ
- การสร้างข้อความและการเชื่อมโยงไฟล์แนบแบบทำซ้ำได้โดยไม่เกิดผลซ้ำ สำหรับ
  น็องซ์และการอัปโหลดเดียวกันที่จำกัดขอบเขตตามเจ้าของ

ข้อผิดพลาด 404 ทั่วไปของเซิร์ฟเวอร์รุ่นเก่าจะไม่ถือเป็นหลักฐานว่าไม่มีการส่ง
OpenClaw จะปล่อยให้สถานะการส่งยังไม่ได้ข้อยุติแทนการเสี่ยงสร้างรายการซ้ำ ให้อัปเดต
ClickClack ก่อนเปิดใช้งานการตอบกลับของเอเจนต์ที่สร้างสื่อ

## แถวกิจกรรมของเอเจนต์

โดยค่าเริ่มต้น ช่อง ClickClack จะไม่แสดงสิ่งใดขณะที่เทิร์นของเอเจนต์กำลังทำงาน และจะแสดงเฉพาะคำตอบสุดท้าย ตั้งค่า `agentActivity: true` ในบัญชีเพื่อเผยแพร่แถวข้อความ `agent_commentary` และ `agent_tool` แบบถาวรขณะที่เทิร์นกำลังดำเนินการ:

```json5
{
  channels: {
    clickclack: {
      enabled: true,
      token: { source: "env", provider: "default", id: "CLICKCLACK_BOT_TOKEN" },
      workspace: "default",
      agentActivity: true,
    },
  },
}
```

ข้อกำหนดและลักษณะการทำงาน:

- **ปิดโดยค่าเริ่มต้น** การตั้งค่ามาตรฐานและเซิร์ฟเวอร์ ClickClack รุ่นเก่าจะไม่ได้รับผลกระทบ
- **ต้องมีขอบเขตโทเค็น `agent_activity:write`** ขอบเขตนี้แยกจาก `bot:write` และไม่ได้รับการสืบทอดจากขอบเขตดังกล่าว ให้สร้างโทเค็นบอตพร้อม `--scopes bot:write,agent_activity:write` (หรือมอบขอบเขตให้โทเค็นที่มีอยู่) ก่อนเปิดใช้งานตัวเลือก
- **ลดระดับการทำงานแบบพยายามให้ดีที่สุด** หากโทเค็นไม่มี `agent_activity:write` หรือเซิร์ฟเวอร์ปฏิเสธการเขียนกิจกรรม ระบบจะบันทึกความล้มเหลวและยังคงส่งคำตอบสุดท้ายได้ตามปกติ โดยจะไม่มีแถวกิจกรรมปรากฏ
- แถวจะถูกจัดกลุ่มต่อเทิร์น (`turn_id`) และรวมเข้าด้วยกันเพื่อให้หนึ่งขั้นตอนเชิงตรรกะมีหนึ่งแถว ส่วนแถวเครื่องมือใช้รูปแบบความคืบหน้าเดียวกับ Discord/Slack/Telegram (ชื่อเครื่องมือพร้อมรายละเอียดคำสั่ง)
- **ข้อมูลเมตาการระบุแหล่งที่มา** โพสต์ที่เอเจนต์เป็นผู้เขียน (แถวกิจกรรมและคำตอบสุดท้าย) มีฟิลด์ `author_model` และ `author_thinking` ที่แก้ไขค่าจากโมเดลจริงซึ่งใช้ในเทิร์น (รวมถึงหลังการใช้ทางเลือกสำรอง) เซิร์ฟเวอร์ที่ไม่ได้กำหนดคอลัมน์เหล่านี้จะเพิกเฉยต่อฟิลด์ JSON ที่ไม่รู้จัก ส่วนเซิร์ฟเวอร์ที่จัดเก็บฟิลด์เหล่านี้สามารถตอบได้ว่า "โมเดลใดกล่าวบรรทัดนี้ ที่ระดับการคิดใด" สำหรับแต่ละข้อความ

## เป้าหมาย

- `channel:<name-or-id>` ส่งไปยังช่องในพื้นที่ทำงาน เป้าหมายแบบไม่มีคำนำหน้าจะใช้ `channel:` เป็นค่าเริ่มต้น
- `dm:<user_id>` สร้างหรือใช้การสนทนาโดยตรงกับผู้ใช้นั้นซ้ำ
- `thread:<message_id>` ตอบกลับในเธรดที่มีข้อความนั้นเป็นราก

เป้าหมายขาออกที่ระบุอย่างชัดเจนอาจมีคำนำหน้าผู้ให้บริการ `clickclack:` หรือ `cc:` ด้วย

สื่อขาออกใช้ API อัปโหลดของ ClickClack จากนั้นแนบการอัปโหลดแบบถาวร
เข้ากับข้อความในช่อง การตอบกลับในเธรด หรือ DM ที่สร้างขึ้น ไฟล์ในเครื่องและ
URL สื่อระยะไกลที่รองรับจะเป็นไปตามนโยบายการเข้าถึงสื่อตามปกติของ OpenClaw โดยมีขีดจำกัด
64 MiB ต่อไฟล์ การส่งแบบถาวรที่เข้าคิวจะใช้น็องซ์แยกตามขอบเขตเจ้าของสำหรับ
การอัปโหลดและแต่ละส่วนของข้อความ จากนั้นลองเชื่อมโยงไฟล์แนบอีกครั้งโดยใช้ออบเจ็กต์
เดิมเหล่านั้น ดูสัญญาเซิร์ฟเวอร์และลักษณะการกู้คืนได้ที่
[การส่งสื่อแบบถาวร](#durable-media-delivery)

ตัวอย่าง:

```bash
openclaw message send --channel clickclack --target channel:general --message "hello"
openclaw message send --channel clickclack --target dm:usr_123 --message "hello"
openclaw message send --channel clickclack --target thread:msg_123 --message "following up"
```

## สิทธิ์

ขอบเขตโทเค็น ClickClack บังคับใช้โดย API ของ ClickClack

- `bot:read`: อ่านข้อมูลพื้นที่ทำงาน/ช่อง/ข้อความ/เธรด/DM/เรียลไทม์/โปรไฟล์
- `bot:write`: `bot:read` รวมถึงข้อความในช่อง การตอบกลับในเธรด DM การอัปโหลด และการเผยแพร่เมนูคำสั่ง
- `bot:admin`: `bot:write` รวมถึงการสร้างช่อง
- `commands:write`: เผยแพร่เมนูคำสั่งของบอต รวมอยู่ในบันเดิล `bot:write` และ `bot:admin` ปัจจุบัน และสามารถมอบแยกต่างหากได้
- `agent_activity:write`: แถวกิจกรรมของเอเจนต์แบบถาวร (`agent_commentary` / `agent_tool`) ไม่ได้รับการสืบทอดจาก `bot:write` หรือ `bot:admin` และจำเป็นเฉพาะเมื่อตั้งค่า `agentActivity: true`

OpenClaw ต้องใช้เพียง `bot:write` ปัจจุบันสำหรับการแชตกับเอเจนต์ตามปกติและการซิงค์เมนูคำสั่ง เพิ่ม `agent_activity:write` เมื่อเปิดใช้งาน [แถวกิจกรรมของเอเจนต์](#agent-activity-rows)

## การแก้ไขปัญหา

- `ClickClack is not configured for account "<id>"`: ตั้งค่า `baseUrl`, `token` (เช่น ผ่าน `CLICKCLACK_BOT_TOKEN`) และ `workspace` สำหรับบัญชีนั้น
- `ClickClack workspace not found: <value>`: ตั้งค่า `workspace` เป็นรหัส สลัก หรือชื่อพื้นที่ทำงานที่ ClickClack ส่งคืน
- ไม่มีการตอบกลับขาเข้า: ยืนยันว่าโทเค็นมีสิทธิ์อ่านแบบเรียลไทม์ และโปรดทราบว่าบอตจะเพิกเฉยต่อข้อความของตนเองและข้อความจากบอตอื่น
- การส่งไปยังช่องล้มเหลว: ตรวจสอบว่าบอตเป็นสมาชิกของพื้นที่ทำงานและมี `bot:write`
- ไม่มีเมนูคำสั่ง: ยืนยันว่า `commandMenu` ไม่ใช่ `false`, เซิร์ฟเวอร์ ClickClack รองรับ `PUT /api/bots/self/commands` และโทเค็นมี `commands:write`
