Mainstream messaging

WhatsApp

สถานะ: พร้อมใช้งานจริงผ่าน WhatsApp Web (Baileys) Gateway เป็นเจ้าของเซสชันที่เชื่อมโยงไว้ โดยไม่มีช่องทาง Twilio WhatsApp แยกต่างหาก

การติดตั้ง

openclaw onboard และ openclaw channels add --channel whatsapp จะแจ้งให้ติดตั้ง Plugin เมื่อเลือกเป็นครั้งแรก ส่วน openclaw channels login --channel whatsapp มีขั้นตอนการติดตั้งเดียวกันหากไม่มี Plugin การเช็กเอาต์สำหรับการพัฒนาใช้พาธ Plugin ในเครื่อง ส่วนการติดตั้ง stable/beta จะติดตั้ง @openclaw/whatsapp จาก ClawHub ก่อน และใช้ npm เป็นทางเลือกสำรอง รันไทม์ WhatsApp จัดส่งแยกจากแพ็กเกจ npm หลักของ OpenClaw ดังนั้นการขึ้นต่อกันของรันไทม์จึงอยู่กับ Plugin ภายนอก การติดตั้งด้วยตนเอง:

bash
openclaw plugins install clawhub:@openclaw/whatsapp

ใช้แพ็กเกจ npm โดยตรง (@openclaw/whatsapp) สำหรับการใช้รีจิสทรีเป็นทางเลือกสำรองเท่านั้น และตรึงเวอร์ชันที่แน่นอนเฉพาะเมื่อต้องการให้การติดตั้งทำซ้ำได้

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

  • กำหนดค่านโยบายการเข้าถึง

    json5
    {channels: {whatsapp: {  dmPolicy: "pairing",  allowFrom: ["+15551234567"],  groupPolicy: "allowlist",  groupAllowFrom: ["+15551234567"],},},}
  • เชื่อมโยง WhatsApp (QR)

    bash
    openclaw channels login --channel whatsapp

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

    สำหรับบัญชีที่ระบุ:

    bash
    openclaw channels login --channel whatsapp --account work

    หากต้องการแนบไดเรกทอรีการยืนยันตัวตนที่มีอยู่หรือกำหนดเองก่อนเข้าสู่ระบบ:

    bash
    openclaw channels add --channel whatsapp --account work --auth-dir /path/to/wa-authopenclaw channels login --channel whatsapp --account work
  • เริ่ม Gateway

    bash
    openclaw gateway
  • อนุมัติคำขอจับคู่ครั้งแรก (โหมดจับคู่)

    bash
    openclaw pairing list whatsappopenclaw pairing approve whatsapp <CODE>

    คำขอจับคู่จะหมดอายุหลังจาก 1 ชั่วโมง และจำกัดคำขอที่รอดำเนินการไว้ไม่เกิน 3 รายการต่อบัญชี

  • รูปแบบการปรับใช้

    หมายเลขเฉพาะ (แนะนำ)
    • ข้อมูลประจำตัว WhatsApp แยกต่างหากสำหรับ OpenClaw
    • รายการอนุญาต DM และขอบเขตการกำหนดเส้นทางที่ชัดเจนยิ่งขึ้น
    • โอกาสสับสนจากการแชตกับตนเองลดลง
    json5
    {  channels: {    whatsapp: {      dmPolicy: "allowlist",      allowFrom: ["+15551234567"],    },  },}
    ทางเลือกสำรองสำหรับหมายเลขส่วนตัว

    การเริ่มต้นใช้งานรองรับโหมดหมายเลขส่วนตัวและเขียนค่าพื้นฐานที่เหมาะกับการแชตกับตนเอง ได้แก่ dmPolicy: "allowlist", allowFrom ซึ่งรวมหมายเลขของคุณเอง และ selfChatMode: true การป้องกันการแชตกับตนเองของรันไทม์อ้างอิงจากหมายเลขตนเองที่เชื่อมโยงไว้ร่วมกับ allowFrom

    โมเดลรันไทม์

    • Gateway เป็นเจ้าของซ็อกเก็ต WhatsApp และลูปการเชื่อมต่อใหม่
    • Watchdog ติดตามสัญญาณสองชนิดแยกจากกัน ได้แก่ กิจกรรมการรับส่งข้อมูลดิบของ WhatsApp Web และกิจกรรมข้อความของแอปพลิเคชัน เซสชันที่ไม่มีข้อความแต่ยังเชื่อมต่ออยู่จะไม่เริ่มใหม่เพียงเพราะไม่มีข้อความเข้ามาเมื่อเร็ว ๆ นี้ โดยจะบังคับให้เชื่อมต่อใหม่เฉพาะเมื่อไม่มีเฟรมการรับส่งข้อมูลเข้ามาภายในช่วงเวลาภายในที่กำหนดไว้ (ผู้ใช้กำหนดค่าไม่ได้) หรือไม่มีข้อความของแอปพลิเคชันนานเกิน 4 เท่าของระยะหมดเวลาข้อความปกติ ทันทีหลังจากเชื่อมต่อใหม่สำหรับเซสชันที่เพิ่งมีกิจกรรม ช่วงเวลาแรกนั้นจะใช้ระยะหมดเวลาข้อความปกติที่สั้นกว่าแทนช่วงเวลา 4 เท่า OpenClaw สามารถตอบกลับข้อความออฟไลน์ที่ Baileys ส่งมาในช่วงต้นของการเชื่อมต่อใหม่นั้นโดยอัตโนมัติ ภายใต้ขอบเขตอายุการขจัดข้อความซ้ำตาม ID ข้อความขาเข้า ส่วนการเริ่มต้นครั้งแรกยังคงใช้ตัวป้องกันประวัติเก่าระยะสั้น
    • การส่งขาออกต้องมี Listener ของ WhatsApp ที่ทำงานอยู่สำหรับบัญชีเป้าหมาย มิฉะนั้นการส่งจะล้มเหลวทันที
    • การส่งไปยังกลุ่มจะแนบข้อมูลเมตาการกล่าวถึงแบบเนทีฟสำหรับโทเค็น @+<digits> และ @<digits> (ทั้งในข้อความและคำบรรยายสื่อ) เมื่อโทเค็นตรงกับข้อมูลเมตาผู้เข้าร่วมปัจจุบัน รวมถึงกลุ่มที่รองรับด้วย LID
    • แชตสถานะและแชตออกอากาศ (@status, @broadcast) จะถูกละเว้น
    • แชตโดยตรงใช้กฎเซสชัน DM (session.dmScope; ค่าเริ่มต้น main จะรวม DM เข้ากับเซสชันหลักของเอเจนต์) เซสชันกลุ่มจะแยกจากกันตาม JID (agent:<agentId>:whatsapp:group:<jid>)
    • สามารถกำหนด WhatsApp Channels/Newsletters เป็นเป้าหมายขาออกอย่างชัดเจนผ่าน JID แบบเนทีฟ @newsletter โดยใช้ข้อมูลเมตาเซสชันช่องทาง (agent:<agentId>:whatsapp:channel:<jid>) แทนความหมายแบบ DM
    • การรับส่งข้อมูลของ WhatsApp Web รองรับตัวแปรสภาพแวดล้อมพร็อกซีมาตรฐานบนโฮสต์ Gateway (HTTPS_PROXY, HTTP_PROXY, NO_PROXY และรูปแบบตัวพิมพ์เล็ก) ควรใช้การกำหนดค่าพร็อกซีระดับโฮสต์แทนการตั้งค่ารายช่องทาง
    • เมื่อเปิดใช้ messages.removeAckAfterReply OpenClaw จะล้างรีแอ็กชันตอบรับเมื่อส่งคำตอบที่มองเห็นได้สำเร็จ

    โทรหาผู้ร้องขอปัจจุบันด้วย MeowCaller (ทดลอง)

    Plugin สามารถเปิดใช้ whatsapp_call ในรอบการทำงานของเอเจนต์ที่มาจาก WhatsApp โดยใช้ MeowCaller เพื่อโทรด้วยเสียงผ่าน WhatsApp ไปยังผู้ร้องขอที่ได้รับอนุญาตในปัจจุบัน และเล่นข้อความ TTS ของ OpenClaw หลังจากผู้รับสาย เครื่องมือนี้ไม่มีพารามิเตอร์หมายเลขปลายทาง ดังนั้นพรอมต์จึงไม่สามารถเปลี่ยนเส้นทางสายได้ ปิดใช้งานโดยค่าเริ่มต้น

  • เปิดใช้การโทรแบบทดลอง

    เพิ่ม actions.calls: true ในการกำหนดค่าช่องทาง WhatsApp แล้วเริ่ม Gateway ใหม่:

    json
    {"channels": {"whatsapp": {  "actions": {    "calls": true  }}}}

    เมื่อไม่มีค่าหรือเป็น false OpenClaw จะไม่เปิดใช้เครื่องมือ whatsapp_call

  • ติดตั้ง CLI ของ MeowCaller ที่ผ่านการตรวจสอบแล้ว

    อะแดปเตอร์ต้องการไฟล์ปฏิบัติการ meowcaller ใน PATH ของโฮสต์ Gateway จนกว่า MeowCaller PR #7 จะผสานรวม ให้บิลด์สาขาที่ผ่านการตรวจสอบแล้ว:

    bash
    git clone --branch feat/send-only-notify https://github.com/steipete/meowcaller.gitcd meowcallergit checkout 752050471fc2bf7a8cdfbf7dbd3cd4e865d85d3fmkdir -p "$HOME/.local/bin"go build -o "$HOME/.local/bin/meowcaller" ./cmd/meowcaller

    ตรวจสอบให้แน่ใจว่า $HOME/.local/bin อยู่ใน PATH ของบริการ Gateway รีวิชันนี้มีคำสั่ง pair และคำสั่งส่งอย่างเดียว notify อย่างชัดเจน โดย notify จะไม่เปิดไมโครโฟน ลำโพง อุปกรณ์วิดีโอ หรือการเก็บข้อมูลวินิจฉัยใด ๆ ห้ามใช้คำสั่ง play ของ CLI ตัวอย่างต้นทางแทน

  • จับคู่อุปกรณ์ที่เชื่อมโยงของ MeowCaller

    ขอให้เอเจนต์ WhatsApp ตรวจสอบการตั้งค่าการโทร (การดำเนินการสถานะ whatsapp_call จะรายงานไดเรกทอรีสถานะเฉพาะบัญชีและคำสั่งจับคู่) สำหรับบัญชีเริ่มต้น:

    bash
    state_dir="$HOME/.openclaw/credentials/whatsapp-calls/default"mkdir -p "$state_dir"chmod 700 "$state_dir"meowcaller pair --store "$state_dir/wa-voip.db"

    เรียกใช้แบบโต้ตอบ สแกน QR จาก WhatsApp > Linked devices และรอ MeowCaller linked device ready เก็บ wa-voip.db เป็นความลับ เนื่องจากเป็นเซสชัน MeowCaller บัญชีที่ไม่ใช่ค่าเริ่มต้นจะได้รับพาธพื้นที่จัดเก็บของตนเองจากการดำเนินการสถานะ ส่วนบน Windows ให้เรียกใช้คำสั่ง PowerShell ที่ระบุ

  • กำหนดค่า TTS และโทรจาก WhatsApp

    กำหนดค่า ผู้ให้บริการ TTS ที่รองรับโทรศัพท์ เริ่ม Gateway ใหม่ แล้วส่งคำขอ เช่น Call me and say the build finished. เครื่องมือจะระบุผู้ส่งจากบริบทขาเข้าที่เชื่อถือได้ สังเคราะห์ไฟล์ WAV ส่วนตัวชั่วคราว เรียกใช้ MeowCaller ภายในช่วงเวลาการโทรที่จำกัด และลบไฟล์เสียงหลังจากนั้น OpenClaw จะส่งพื้นที่จัดเก็บของบัญชีอย่างชัดเจน รอสถานะออกเป็นศูนย์หลังจากรับสาย/เล่นเสียง/วางสาย และถือว่าการหมดเวลาหรือสถานะออกที่ไม่ใช่ศูนย์เป็นการเรียกเครื่องมือที่ล้มเหลว

  • ข้อจำกัด: รองรับเฉพาะการโทรเสียงขาออกแบบหนึ่งต่อหนึ่ง ไม่มีหมายเลขปลายทางแบบกำหนดเอง ไม่ใช้การยืนยันตัวตนร่วมกับการเชื่อมต่อแชต ไม่รองรับการโทรหาตนเองจากโหมดหมายเลขส่วนตัวหรือการแชตกับตนเอง จำกัดเสียงสังเคราะห์ไว้ที่ 60 วินาที ไม่มีการยืนยันจากฝั่งโทรศัพท์ว่าได้ยินเสียงนอกเหนือจากการเสร็จสิ้นขั้นตอนรับสาย/เล่นเสียง/วางสายของ MeowCaller และ OpenClaw จะหยุดกระบวนการคู่หูหลังจากช่วงเวลาจำกัด 115-175 วินาที (ครอบคลุมขั้นตอนการเชื่อมต่อ การรับสาย การเล่นเสียง และการปิดของ MeowCaller)

    พรอมต์การอนุมัติ

    WhatsApp สามารถแสดงพรอมต์อนุมัติการดำเนินการและ Plugin เป็นรีแอ็กชัน 👍/👎 ซึ่งควบคุมด้วยการกำหนดค่าการส่งต่อการอนุมัติระดับบนสุด:

    json5
    {  approvals: {    exec: {      enabled: true,      mode: "session",    },    plugin: {      enabled: true,      mode: "targets",      targets: [{ channel: "whatsapp", to: "+15551234567" }],    },  },}

    approvals.exec และ approvals.plugin ทำงานแยกจากกัน การเปิดใช้ WhatsApp เป็นช่องทางจะเชื่อมโยงเฉพาะการรับส่งข้อมูลและจะไม่ส่งสิ่งใด เว้นแต่จะเปิดใช้กลุ่มการอนุมัติที่ตรงกันและกำหนดเส้นทางมายังช่องทางนี้ โหมดเซสชันจะส่งการอนุมัติด้วยอีโมจิแบบเนทีฟเฉพาะสำหรับการอนุมัติที่มาจาก WhatsApp เท่านั้น โหมดเป้าหมายใช้ไปป์ไลน์การส่งต่อร่วมสำหรับเป้าหมายที่ระบุอย่างชัดเจน และไม่สร้างการกระจาย DM ไปยังผู้อนุมัติแยกต่างหาก

    รีแอ็กชันการอนุมัติของ WhatsApp ต้องกำหนดผู้อนุมัติอย่างชัดเจนใน allowFrom (หรือ "*") โดย defaultTo กำหนดเป้าหมายข้อความเริ่มต้นทั่วไป ไม่ใช่รายชื่อผู้อนุมัติ คำสั่ง /approve แบบดำเนินการด้วยตนเองยังคงผ่านเส้นทางการอนุญาตผู้ส่งตามปกติของ WhatsApp ก่อนการตัดสินผลการอนุมัติ

    รีแอ็กชันสำหรับคำถาม

    สำหรับพรอมต์ ask_user ที่มีคำถามแบบเลือกคำตอบเดียวซึ่งไม่เป็นความลับหนึ่งข้อและมีตัวเลือกหนึ่งถึงสี่ตัวเลือก WhatsApp จะแสดง 1️⃣ ถึง 4️⃣ ข้างป้ายกำกับตัวเลือก ให้รีแอ็กชันต่อพรอมต์ที่ส่งด้วยหมายเลขที่ตรงกันเพื่อตอบ OpenClaw จะจับคู่หมายเลขกับตัวเลือกมาตรฐานผ่าน Gateway โดยจะละเว้นการแตะที่หมดอายุหรือซ้ำ พรอมต์แบบหลายคำถาม หลายตัวเลือก และข้อความอิสระยังคงตอบได้ด้วยข้อความเท่านั้น กฎการรับเข้า DM/กลุ่มของ WhatsApp ตามปกติจะอนุญาตผู้ส่งที่รีแอ็กชัน

    Hook ของ Plugin และความเป็นส่วนตัว

    ข้อความ WhatsApp ขาเข้าอาจมีเนื้อหาส่วนบุคคล หมายเลขโทรศัพท์ ตัวระบุกลุ่ม ชื่อผู้ส่ง และฟิลด์สหสัมพันธ์ของเซสชัน WhatsApp จะไม่กระจายเพย์โหลด Hook ขาเข้า message_received ไปยัง Plugin เว้นแต่คุณจะเลือกเข้าร่วม:

    json5
    {  channels: {    whatsapp: {      pluginHooks: {        messageReceived: true,      },    },  },}

    จำกัดขอบเขตการเลือกเข้าร่วมไว้ที่บัญชีเดียวภายใต้ channels.whatsapp.accounts.<id>.pluginHooks.messageReceived เปิดใช้เฉพาะกับ Plugin ที่คุณไว้วางใจให้เข้าถึงเนื้อหาและตัวระบุของ WhatsApp ขาเข้าเท่านั้น

    การควบคุมการเข้าถึงและการเปิดใช้งาน

    นโยบาย DM

    channels.whatsapp.dmPolicy:

    ค่า ลักษณะการทำงาน
    pairing (ค่าเริ่มต้น) ผู้ส่งที่ไม่รู้จักร้องขอการจับคู่ เจ้าของเป็นผู้อนุมัติ
    allowlist อนุญาตเฉพาะผู้ส่งใน allowFrom
    open กำหนดให้ allowFrom ต้องมี "*"
    disabled บล็อก DM ทั้งหมด

    allowFrom ยอมรับหมายเลขรูปแบบ E.164 (ปรับให้อยู่ในรูปแบบมาตรฐานภายใน) รายการนี้เป็นเพียงรายการควบคุมการเข้าถึงของผู้ส่ง DM เท่านั้น — ไม่ได้ควบคุมการส่งออกที่ระบุชัดเจนไปยัง JID ของกลุ่มหรือ JID ของช่อง @newsletter

    การเขียนทับสำหรับหลายบัญชี: channels.whatsapp.accounts.<id>.dmPolicy (และ .allowFrom) มีลำดับความสำคัญเหนือค่าเริ่มต้นระดับช่องสำหรับบัญชีนั้น

    หมายเหตุเกี่ยวกับรันไทม์:

    • การจับคู่จะคงอยู่ในที่เก็บรายการอนุญาตของช่องและผสานกับ allowFrom ที่กำหนดค่าไว้
    • ระบบอัตโนมัติตามกำหนดเวลาและการใช้ผู้รับสำรองของ Heartbeat จะใช้เป้าหมายการส่งที่ระบุชัดเจนหรือ allowFrom ที่กำหนดค่าไว้ การอนุมัติการจับคู่ DM ไม่ได้ทำให้ผู้ใช้เป็นผู้รับ Cron/Heartbeat โดยปริยาย
    • หากไม่ได้กำหนดค่ารายการอนุญาต หมายเลขของตนเองที่เชื่อมโยงอยู่จะได้รับอนุญาตตามค่าเริ่มต้น
    • OpenClaw จะไม่จับคู่ DM ขาออกของ fromMe โดยอัตโนมัติ (ข้อความที่ส่งถึงตนเองจากอุปกรณ์ที่เชื่อมโยง)

    นโยบายกลุ่มและรายการอนุญาต

    การเข้าถึงกลุ่มมีสองชั้น:

    1. รายการอนุญาตสมาชิกกลุ่ม (channels.whatsapp.groups): หากละเว้น groups กลุ่มทั้งหมดจะมีสิทธิ์ใช้งาน หากระบุไว้ ค่านี้จะทำหน้าที่เป็นรายการอนุญาตของกลุ่ม ("*" อนุญาตทั้งหมด)
    2. นโยบายผู้ส่งในกลุ่ม (channels.whatsapp.groupPolicy + groupAllowFrom): open จะข้ามรายการอนุญาตผู้ส่ง, allowlist ต้องตรงกับ groupAllowFrom (หรือ *), และ disabled จะบล็อกขาเข้าจากกลุ่มทั้งหมด

    หากไม่ได้ตั้งค่า groupAllowFrom การตรวจสอบผู้ส่งจะใช้ allowFrom เป็นตัวสำรองเมื่อมีรายการอยู่ ระบบจะประเมินรายการอนุญาตผู้ส่งก่อนการเปิดใช้งานด้วยการกล่าวถึง/การตอบกลับ

    หากไม่มีบล็อก channels.whatsapp อยู่เลย รันไทม์จะใช้ groupPolicy: "allowlist" เป็นตัวสำรอง (พร้อมบันทึกคำเตือน) แม้ว่า channels.defaults.groupPolicy จะถูกตั้งค่าเป็นค่าอื่นก็ตาม

    การกล่าวถึงและ /activation

    การตอบกลับในกลุ่มต้องมีการกล่าวถึงตามค่าเริ่มต้น การตรวจจับการกล่าวถึงครอบคลุมถึง:

    • การกล่าวถึงตัวตนของบอตใน WhatsApp โดยชัดเจน
    • รูปแบบนิพจน์ทั่วไปสำหรับการกล่าวถึงที่กำหนดค่าไว้ (agents.list[].groupChat.mentionPatterns, ใช้ messages.groupChat.mentionPatterns เป็นตัวสำรอง)
    • ข้อความถอดเสียงจากข้อความเสียงขาเข้าสำหรับข้อความกลุ่มที่ได้รับอนุญาต
    • การตรวจจับการตอบกลับถึงบอตโดยปริยาย (ผู้ส่งข้อความตอบกลับตรงกับตัวตนของบอต)

    ความปลอดภัย: การอ้างข้อความ/การตอบกลับทำให้ผ่านเงื่อนไขการกล่าวถึงเท่านั้น — ไม่ได้ ให้สิทธิ์แก่ผู้ส่ง เมื่อใช้ groupPolicy: "allowlist" ผู้ส่งที่ไม่อยู่ในรายการอนุญาตจะยังคงถูกบล็อก แม้จะตอบกลับข้อความของผู้ใช้ที่อยู่ในรายการอนุญาตก็ตาม

    คำสั่งเปิดใช้งานระดับเซสชัน: /activation mention หรือ /activation always คำสั่งนี้จะอัปเดตสถานะเซสชัน (ไม่ใช่การกำหนดค่าส่วนกลาง) และจำกัดให้เฉพาะเจ้าของ

    การเชื่อมโยง ACP ที่กำหนดค่าไว้

    WhatsApp รองรับการเชื่อมโยง ACP แบบถาวรผ่าน bindings[] ระดับบนสุด:

    json5
    {  bindings: [    {      type: "acp",      agentId: "codex",      match: {        channel: "whatsapp",        accountId: "work",        peer: { kind: "direct", id: "+15555550123" },      },    },    {      type: "acp",      agentId: "codex",      match: {        channel: "whatsapp",        accountId: "work",        peer: { kind: "group", id: "120363424282127706@g.us" },      },    },  ],}

    แชตโดยตรงจะจับคู่กับหมายเลข E.164 ส่วนกลุ่มจะจับคู่กับ JID ของกลุ่ม WhatsApp รายการอนุญาตของกลุ่ม นโยบายผู้ส่ง และเงื่อนไขการกล่าวถึง/การเปิดใช้งานจะทำงานก่อนที่ OpenClaw จะตรวจสอบว่ามีเซสชัน ACP ที่เชื่อมโยงอยู่ การเชื่อมโยงที่ตรงกันจะเป็นเจ้าของเส้นทาง — กลุ่มบรอดแคสต์จะไม่กระจายเทิร์นนั้นไปยังเซสชัน WhatsApp ทั่วไป

    พฤติกรรมของหมายเลขส่วนบุคคลและแชตกับตนเอง

    เมื่อหมายเลขของตนเองที่เชื่อมโยงอยู่ปรากฏใน allowFrom ด้วย ระบบป้องกันแชตกับตนเองจะทำงาน: ข้ามใบตอบรับการอ่านสำหรับเทิร์นแชตกับตนเอง, เพิกเฉยต่อพฤติกรรมทริกเกอร์อัตโนมัติจาก JID การกล่าวถึงซึ่งจะส่งการแจ้งเตือนถึงตนเอง และกำหนดให้การตอบกลับใช้ [{identity.name}] (หรือ [openclaw]) ตามค่าเริ่มต้นเมื่อไม่ได้ตั้งค่า messages.responsePrefix

    การปรับข้อความให้เป็นมาตรฐานและบริบท

    ซองข้อความขาเข้าและบริบทการตอบกลับ

    ข้อความขาเข้าจะถูกห่อด้วยซองข้อความขาเข้าที่ใช้ร่วมกัน การตอบกลับที่อ้างข้อความจะเพิ่มบริบทในรูปแบบนี้:

    text
    [Replying to <sender> id:<stanzaId>]<quoted body or media placeholder>[/Replying]

    ระบบจะใส่ข้อมูลเมตาของการตอบกลับ (ReplyToId, ReplyToBody, ReplyToSender, JID/E.164 ของผู้ส่ง) เมื่อมีข้อมูล หากเป้าหมายที่อ้างถึงเป็นสื่อที่ดาวน์โหลดได้ OpenClaw จะบันทึกผ่านที่เก็บสื่อขาเข้าตามปกติและเปิดเผย MediaPath/MediaType เพื่อให้เอเจนต์ตรวจสอบได้โดยตรง แทนที่จะเห็นเพียง <media:image>

    ตัวยึดตำแหน่งสื่อและการแยกข้อมูลตำแหน่งที่ตั้ง/รายชื่อติดต่อ

    ข้อความที่มีเฉพาะสื่อจะถูกปรับให้อยู่ในรูปตัวยึดตำแหน่ง: <media:image>, <media:video>, <media:audio>, <media:document>, <media:sticker>

    ข้อความเสียงของกลุ่มที่ได้รับอนุญาตจะถูกถอดเสียงก่อนตรวจสอบเงื่อนไขการกล่าวถึงเมื่อเนื้อหามีเพียง <media:audio> ดังนั้นการกล่าวถึงบอตในข้อความเสียงจึงสามารถทริกเกอร์การตอบกลับได้ หากข้อความถอดเสียงยังไม่กล่าวถึงบอต ข้อความนั้นจะคงอยู่ในประวัติกลุ่มที่รอดำเนินการแทนตัวยึดตำแหน่งดิบ

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

    การแทรกประวัติกลุ่มที่รอดำเนินการ

    ข้อความกลุ่มที่ยังไม่ได้ประมวลผลจะถูกบัฟเฟอร์และแทรกเป็นบริบทเมื่อบอตถูกทริกเกอร์ในที่สุด

    • ขีดจำกัดเริ่มต้น: 50
    • การกำหนดค่า: channels.whatsapp.historyLimit, ใช้ messages.groupChat.historyLimit เป็นตัวสำรอง
    • 0 จะปิดใช้งาน

    เครื่องหมายการแทรก: [Chat messages since your last reply - for context] และ [Current message - respond to this]

    ใบตอบรับการอ่าน

    เปิดใช้งานตามค่าเริ่มต้นสำหรับข้อความขาเข้าที่ได้รับการยอมรับ ปิดใช้งานแบบส่วนกลาง:

    json5
    { channels: { whatsapp: { sendReadReceipts: false } } }

    การเขียนทับรายบัญชี: channels.whatsapp.accounts.<id>.sendReadReceipts เทิร์นแชตกับตนเองจะข้ามใบตอบรับการอ่านแม้เปิดใช้งานแบบส่วนกลาง

    การส่ง การแบ่งส่วน และสื่อ

    การแบ่งข้อความ
    • ขีดจำกัดส่วนข้อความเริ่มต้น: channels.whatsapp.textChunkLimit = 4000
    • channels.whatsapp.streaming.chunkMode = "length" | "newline"; newline จะเลือกแบ่งตามขอบเขตย่อหน้า (บรรทัดว่าง) ก่อน แล้วจึงใช้การแบ่งตามความยาวที่ปลอดภัยเป็นตัวสำรอง
    พฤติกรรมของสื่อขาออก
    • รองรับเพย์โหลดรูปภาพ วิดีโอ เสียง (ข้อความเสียง PTT) และเอกสาร
    • เสียงจะถูกส่งเป็นเพย์โหลด audio ของ Baileys พร้อม ptt: true โดยแสดงเป็นข้อความเสียงแบบกดเพื่อพูด; audioAsVoice จะถูกคงไว้ในเพย์โหลดการตอบกลับ เพื่อให้เอาต์พุตข้อความเสียง TTS ใช้เส้นทางนี้ต่อไปโดยไม่ขึ้นกับรูปแบบต้นทางของผู้ให้บริการ
    • เสียง Ogg/Opus แบบเนทีฟจะส่งเป็น audio/ogg; codecs=opus; รูปแบบอื่นทั้งหมด (รวมถึงเอาต์พุต MP3/WebM จาก Microsoft Edge TTS) จะถูกแปลงด้วย ffmpeg เป็น Ogg/Opus โมโน 48 kHz ก่อนส่งแบบ PTT
    • /tts latest จะส่งการตอบกลับล่าสุดของผู้ช่วยเป็นข้อความเสียงหนึ่งรายการและระงับการส่งซ้ำสำหรับการตอบกลับเดียวกัน; /tts chat on|off|default ควบคุม TTS อัตโนมัติสำหรับแชตปัจจุบัน
    • การใช้ gifPlayback: true กับการส่งวิดีโอจะเปิดใช้การเล่น GIF แบบเคลื่อนไหว
    • forceDocument/asDocument จะกำหนดเส้นทางรูปภาพ GIF และวิดีโอขาออกผ่านเพย์โหลดเอกสารของ Baileys เพื่อหลีกเลี่ยงการบีบอัดสื่อของ WhatsApp โดยคงชื่อไฟล์และชนิด MIME ที่ระบุได้ไว้
    • คำบรรยายจะใช้กับสื่อรายการแรกในการตอบกลับที่มีสื่อหลายรายการ ยกเว้นข้อความเสียง PTT: เสียงจะถูกส่งก่อนโดยไม่มีคำบรรยาย จากนั้นคำบรรยายจะถูกส่งเป็นข้อความแยกต่างหาก (ไคลเอนต์ WhatsApp แสดงคำบรรยายข้อความเสียงไม่สม่ำเสมอ)
    • แหล่งสื่ออาจเป็น HTTP(S), file:// หรือพาธภายในเครื่อง
    ขีดจำกัดขนาดสื่อและพฤติกรรมสำรอง
    • ขีดจำกัดการบันทึกขาเข้าและการส่งขาออก: channels.whatsapp.mediaMaxMb (ค่าเริ่มต้น 50)
    • การเขียนทับรายบัญชี: channels.whatsapp.accounts.<id>.mediaMaxMb
    • ระบบจะปรับรูปภาพให้เหมาะสมโดยอัตโนมัติ (ปรับขนาด/ไล่ระดับคุณภาพ) เพื่อให้ไม่เกินขีดจำกัด เว้นแต่ forceDocument/asDocument จะร้องขอการส่งแบบเอกสาร
    • เมื่อส่งสื่อล้มเหลว กลไกสำรองสำหรับรายการแรกจะส่งข้อความเตือนแทนการละทิ้งการตอบกลับโดยไม่มีการแจ้งเตือน

    การอ้างข้อความในการตอบกลับ

    channels.whatsapp.replyToMode ควบคุมการอ้างข้อความในการตอบกลับแบบเนทีฟ (การตอบกลับขาออกจะแสดงการอ้างข้อความขาเข้า):

    ค่า พฤติกรรม
    "off" (ค่าเริ่มต้น) ไม่อ้างข้อความ ส่งเป็นข้อความธรรมดา
    "first" อ้างเฉพาะส่วนแรกของการตอบกลับขาออก
    "all" อ้างทุกส่วนของการตอบกลับขาออก
    "batched" อ้างการตอบกลับแบบชุดที่อยู่ในคิว และไม่อ้างการตอบกลับทันที

    การเขียนทับรายบัญชี: channels.whatsapp.accounts.<id>.replyToMode

    json5
    { channels: { whatsapp: { replyToMode: "first" } } }

    ระดับการแสดงรีแอ็กชัน

    channels.whatsapp.reactionLevel ควบคุมขอบเขตการใช้รีแอ็กชันอีโมจิของเอเจนต์:

    ระดับ รีแอ็กชันตอบรับ รีแอ็กชันที่เอเจนต์เริ่มเอง
    "off" ไม่ ไม่
    "ack" ใช่ ไม่
    "minimal" (ค่าเริ่มต้น) ใช่ ใช่ พร้อมแนวทางแบบระมัดระวัง
    "extensive" ใช่ ใช่ พร้อมแนวทางที่ส่งเสริมให้ใช้

    การเขียนทับรายบัญชี: channels.whatsapp.accounts.<id>.reactionLevel

    json5
    { channels: { whatsapp: { reactionLevel: "ack" } } }

    รีแอ็กชันตอบรับ

    channels.whatsapp.ackReaction จะส่งรีแอ็กชันทันทีเมื่อได้รับข้อความขาเข้า โดยมี reactionLevel เป็นเงื่อนไขควบคุม (ระงับเมื่อ "off"):

    json5
    {  channels: {    whatsapp: {      ackReaction: {        emoji: "👀",        direct: true,        group: "mentions", // always | mentions | never      },    },  },}

    หมายเหตุ: ส่งทันทีหลังจากยอมรับข้อความขาเข้า (ก่อนตอบกลับ); หากมี ackReaction แต่ไม่มี emoji WhatsApp จะใช้อีโมจิตัวตนของเอเจนต์ตามเส้นทาง โดยใช้ "👀" เป็นตัวสำรอง (ละเว้น ackReaction หรือตั้งค่า emoji: "" เพื่อไม่ให้มีรีแอ็กชันตอบรับ); ระบบจะบันทึกความล้มเหลวแต่จะไม่ขัดขวางการส่งคำตอบ; โหมดกลุ่ม mentions จะแสดงรีแอ็กชันเฉพาะเทิร์นที่ทริกเกอร์ด้วยการกล่าวถึง ขณะที่การเปิดใช้งานกลุ่ม always จะข้ามการตรวจสอบนี้; WhatsApp ใช้เฉพาะ channels.whatsapp.ackReaction เท่านั้น (messages.ackReaction แบบเดิมใช้ไม่ได้ในส่วนนี้)

    รีแอ็กชันสถานะวงจรการทำงาน

    ตั้งค่า messages.statusReactions.enabled: true เพื่อให้ WhatsApp แทนที่รีแอ็กชันตอบรับระหว่างเทิร์น แทนที่จะคงอีโมจิรับข้อความแบบคงที่ โดยหมุนเวียนผ่านสถานะต่าง ๆ เช่น อยู่ในคิว กำลังคิด กิจกรรมของเครื่องมือ Compaction เสร็จสิ้น และข้อผิดพลาด:

    json5
    {  messages: {    statusReactions: {      enabled: true,      emojis: {        deploy: "🛫",        build: "🏗️",        concierge: "💁",      },    },  },}

    หมายเหตุ: channels.whatsapp.ackReaction ยังคงควบคุมสิทธิ์การใช้งานสำหรับข้อความโดยตรงและกลุ่ม สถานะที่อยู่ในคิวใช้อีโมจิที่มีผลเหมือนกับรีแอ็กชันตอบรับแบบธรรมดา WhatsApp มีช่องรีแอ็กชันของบอทหนึ่งช่องต่อข้อความ ดังนั้นการอัปเดตวงจรชีวิตจะแทนที่รีแอ็กชันปัจจุบันในตำแหน่งเดิม messages.removeAckAfterReply: true จะล้างรีแอ็กชันสถานะสุดท้ายหลังจากระยะเวลาคงสถานะเสร็จสิ้น/ข้อผิดพลาดที่กำหนดไว้ หมวดหมู่อีโมจิของเครื่องมือประกอบด้วย tool, coding, web, deploy, build และ concierge

    หลายบัญชีและข้อมูลประจำตัว

    การเลือกบัญชีและค่าเริ่มต้น

    รหัสบัญชีมาจาก channels.whatsapp.accounts การเลือกบัญชีเริ่มต้นจะใช้ default หากมีอยู่ มิฉะนั้นจะใช้รหัสบัญชีแรกที่กำหนดค่าไว้ (เรียงตามตัวอักษร) รหัสบัญชีจะถูกปรับให้อยู่ในรูปแบบมาตรฐานภายในเพื่อใช้ค้นหา

    พาธข้อมูลประจำตัวและความเข้ากันได้แบบเดิม
    • พาธการยืนยันตัวตนปัจจุบัน: ~/.openclaw/credentials/whatsapp/<accountId>/creds.json (สำรอง: creds.json.bak)
    • การยืนยันตัวตนเริ่มต้นแบบเดิมใน ~/.openclaw/credentials/ ยังคงได้รับการจดจำ/ย้ายข้อมูลสำหรับขั้นตอนของบัญชีเริ่มต้น
    ลักษณะการทำงานเมื่อออกจากระบบ

    openclaw channels logout --channel whatsapp [--account <id>] จะล้างสถานะการยืนยันตัวตน WhatsApp ของบัญชีนั้น เมื่อสามารถเข้าถึง Gateway ได้ การออกจากระบบจะหยุดตัวรับฟังที่ทำงานอยู่ของบัญชีนั้นก่อน เพื่อให้เซสชันที่เชื่อมโยงหยุดรับข้อความก่อนการเริ่มระบบใหม่ครั้งถัดไป openclaw channels remove --channel whatsapp จะหยุดตัวรับฟังที่ทำงานอยู่ก่อนปิดใช้งานหรือลบการกำหนดค่าบัญชีเช่นกัน

    ในไดเรกทอรีการยืนยันตัวตนแบบเดิม ระบบจะเก็บ oauth.json ไว้ ขณะที่ลบไฟล์การยืนยันตัวตนของ Baileys

    เครื่องมือ การดำเนินการ และการเขียนการกำหนดค่า

    • การรองรับเครื่องมือของเอเจนต์รวมถึงการดำเนินการรีแอ็กชันของ WhatsApp (react)
    • เงื่อนไขควบคุมการดำเนินการ: channels.whatsapp.actions.reactions, channels.whatsapp.actions.polls (การดำเนินการที่มีอยู่มีค่าเริ่มต้นเป็น true), channels.whatsapp.actions.calls (ค่าเริ่มต้น false โปรดดู MeowCaller ด้านบน)
    • การเขียนการกำหนดค่าที่เริ่มต้นโดยช่องทางเปิดใช้งานเป็นค่าเริ่มต้น ปิดใช้งานผ่าน channels.whatsapp.configWrites: false

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

    ยังไม่ได้เชื่อมโยง (ต้องใช้ QR)

    อาการ: สถานะช่องทางรายงานว่ายังไม่ได้เชื่อมโยง

    bash
    openclaw channels login --channel whatsappopenclaw channels status
    เชื่อมโยงแล้วแต่ตัดการเชื่อมต่อ / วนเชื่อมต่อใหม่

    อาการ: บัญชีที่เชื่อมโยงแล้วตัดการเชื่อมต่อหรือพยายามเชื่อมต่อใหม่ซ้ำ ๆ

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

    วิธีแก้ไข:

    bash
    openclaw channels status --probeopenclaw doctoropenclaw logs --followopenclaw gateway status

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

    bash
    cp -a ~/.openclaw/credentials/whatsapp/<accountId> \  ~/.openclaw/credentials/whatsapp/<accountId>.bakopenclaw channels logout --channel whatsapp --account <accountId>openclaw channels login --channel whatsapp --account <accountId>

    หาก ~/.openclaw/logs/whatsapp-health.log ระบุว่า Gateway inactive แต่ทั้ง openclaw gateway status และ openclaw channels status --probe แสดงว่าสถานะปกติ ให้เรียกใช้ openclaw doctor บน Linux คำสั่ง doctor จะเตือนเกี่ยวกับรายการ crontab แบบเดิมที่เรียกใช้สคริปต์ ~/.openclaw/bin/ensure-whatsapp.sh ซึ่งเลิกใช้งานแล้ว ให้ลบรายการเหล่านั้นด้วย crontab -e เนื่องจาก cron อาจไม่มีสภาพแวดล้อมบัสผู้ใช้ของ systemd และทำให้สคริปต์เก่านั้นรายงานสถานะ Gateway ผิดพลาด

    การเข้าสู่ระบบด้วย QR หมดเวลาเมื่ออยู่หลังพร็อกซี

    อาการ: openclaw channels login --channel whatsapp ล้มเหลวก่อนแสดง QR ที่ใช้งานได้ โดยมี status=408 Request Time-out หรือการตัดการเชื่อมต่อซ็อกเก็ต TLS

    การเข้าสู่ระบบ WhatsApp Web ใช้สภาพแวดล้อมพร็อกซีมาตรฐานของโฮสต์ Gateway (HTTPS_PROXY, HTTP_PROXY, รูปแบบตัวพิมพ์เล็ก, NO_PROXY) ตรวจสอบว่ากระบวนการ Gateway สืบทอดตัวแปรสภาพแวดล้อมพร็อกซี และ NO_PROXY ไม่ตรงกับ mmg.whatsapp.net

    ไม่มีตัวรับฟังที่ทำงานอยู่ขณะส่ง

    การส่งออกจะล้มเหลวทันทีเมื่อไม่มีตัวรับฟัง Gateway ที่ทำงานอยู่สำหรับบัญชีเป้าหมาย ตรวจสอบว่า Gateway กำลังทำงานและบัญชีเชื่อมโยงแล้ว

    การตอบกลับปรากฏในบันทึกการสนทนาแต่ไม่ปรากฏใน WhatsApp

    แถวในบันทึกการสนทนาบันทึกสิ่งที่เอเจนต์สร้างขึ้น ส่วนการส่งผ่าน WhatsApp จะได้รับการตรวจสอบแยกต่างหาก OpenClaw จะถือว่าการตอบกลับอัตโนมัติถูกส่งแล้วก็ต่อเมื่อ Baileys ส่งคืนรหัสข้อความขาออกสำหรับการส่งข้อความหรือสื่อที่มองเห็นได้อย่างน้อยหนึ่งรายการ

    รีแอ็กชันตอบรับเป็นการยืนยันการรับก่อนตอบกลับที่แยกเป็นอิสระ รีแอ็กชันที่สำเร็จไม่ได้พิสูจน์ว่าการตอบกลับด้วยข้อความ/สื่อภายหลังได้รับการยอมรับ ตรวจสอบบันทึก Gateway เพื่อหา auto-reply delivery failed หรือ auto-reply was not accepted by WhatsApp provider

    ข้อความกลุ่มถูกละเว้นโดยไม่คาดคิด

    ตรวจสอบตามลำดับนี้: groupPolicy, groupAllowFrom/allowFrom, รายการในรายการอนุญาต groups, การควบคุมด้วยการกล่าวถึง (requireMention + รูปแบบการกล่าวถึง) และคีย์ซ้ำใน openclaw.json (รายการ JSON5 ที่อยู่ภายหลังจะแทนที่รายการก่อนหน้า ให้มี groupPolicy เพียงรายการเดียวต่อขอบเขต)

    หากมี channels.whatsapp.groups WhatsApp ยังคงสามารถสังเกตข้อความจากกลุ่มอื่นได้ แต่ OpenClaw จะทิ้งข้อความเหล่านั้นก่อนกำหนดเส้นทางเซสชัน เพิ่ม JID ของกลุ่มลงใน channels.whatsapp.groups หรือเพิ่ม groups["*"] เพื่ออนุญาตทุกกลุ่ม ขณะที่ยังคงควบคุมการอนุญาตผู้ส่งผ่าน groupPolicy/groupAllowFrom

    คำเตือนรันไทม์ Bun

    Gateway ของ OpenClaw ต้องใช้ Node โดย Bun ไม่มี API node:sqlite ที่พื้นที่จัดเก็บสถานะมาตรฐานใช้ และ doctor จะย้ายบริการ Bun แบบเดิมไปยัง Node

    พรอมต์ระบบ

    WhatsApp รองรับพรอมต์ระบบแบบ Telegram สำหรับกลุ่มและแชตโดยตรงผ่านแมป groups และ direct

    การพิจารณาสำหรับข้อความกลุ่ม: ระบบจะกำหนดแมป groups ที่มีผลก่อน หากบัญชีกำหนดคีย์ groups ของตนเองไว้ ไม่ว่าจะในรูปแบบใด คีย์ดังกล่าวจะแทนที่แมป groups ระดับรากทั้งหมด (ไม่มีการผสานแบบลึก) จากนั้นการค้นหาพรอมต์จะดำเนินการกับแมปผลลัพธ์เพียงแมปเดียวนั้น:

    1. พรอมต์เฉพาะกลุ่ม (groups["<groupId>"].systemPrompt): ใช้เมื่อมีรายการกลุ่มอยู่ และ มีการกำหนดคีย์ systemPrompt ของรายการนั้น สตริงว่าง ("") จะระงับไวลด์การ์ดและไม่ใช้พรอมต์ใด
    2. พรอมต์ไวลด์การ์ดของกลุ่ม (groups["*"].systemPrompt): ใช้เมื่อไม่มีรายการของกลุ่มนั้น หรือมีรายการแต่ไม่มีคีย์ systemPrompt

    การพิจารณาสำหรับข้อความโดยตรงใช้รูปแบบเดียวกันกับแมป direct และ direct["*"]

    ความแตกต่างจาก Telegram: Telegram จะระงับ groups ระดับรากสำหรับทุกบัญชีในการตั้งค่าแบบหลายบัญชี (แม้แต่บัญชีที่ไม่มี groups ของตนเอง) เพื่อป้องกันไม่ให้บอทได้รับข้อความจากกลุ่มที่ตนไม่ได้เป็นสมาชิก WhatsApp ไม่ใช้กลไกป้องกันดังกล่าว โดยบัญชีใดก็ตามที่ไม่มีการแทนที่ของตนเองจะสืบทอด groups/direct ระดับราก ไม่ว่าจะมีบัญชีกี่บัญชี ในการตั้งค่า WhatsApp แบบหลายบัญชี ให้กำหนดแมปทั้งหมดภายใต้แต่ละบัญชีอย่างชัดเจนหากต้องการพรอมต์แยกตามบัญชี

    ลักษณะการทำงานที่สำคัญ:

    • channels.whatsapp.groups เป็นทั้งแมปการกำหนดค่าต่อกลุ่มและรายการอนุญาตกลุ่มระดับแชต ไม่ว่าจะอยู่ในขอบเขตระดับรากหรือบัญชี groups["*"] หมายถึง "อนุญาตทุกกลุ่ม" สำหรับขอบเขตนั้น
    • เพิ่มไวลด์การ์ด systemPrompt เฉพาะเมื่อคุณต้องการให้ขอบเขตนั้นอนุญาตทุกกลุ่มอยู่แล้ว หากต้องการให้เฉพาะชุดรหัสกลุ่มที่กำหนดตายตัวมีสิทธิ์ใช้งาน ให้ใส่พรอมต์ซ้ำในแต่ละรายการที่อยู่ในรายการอนุญาตอย่างชัดเจน แทนการใช้ groups["*"]
    • การอนุญาตกลุ่มและการอนุญาตผู้ส่งเป็นการตรวจสอบที่แยกจากกัน groups["*"] จะขยายกลุ่มที่เข้าถึงการจัดการกลุ่ม แต่ไม่ได้อนุญาตผู้ส่งทุกคนในกลุ่มเหล่านั้น การควบคุมดังกล่าวยังคงอยู่ภายใต้ groupPolicy/groupAllowFrom
    • channels.whatsapp.direct ไม่มีผลข้างเคียงที่เทียบเท่าสำหรับ DM: direct["*"] มีหน้าที่เพียงจัดเตรียมการกำหนดค่าเริ่มต้นหลังจาก DM ได้รับอนุญาตแล้วโดย dmPolicy ร่วมกับ allowFrom หรือกฎของพื้นที่จัดเก็บการจับคู่

    ตัวอย่าง:

    json5
    {  channels: {    whatsapp: {      groups: {        // ใช้เฉพาะเมื่อต้องอนุญาตทุกกลุ่มในขอบเขตระดับราก        // ใช้กับทุกบัญชีที่ไม่ได้กำหนดแมป groups ของตนเอง        "*": { systemPrompt: "พรอมต์เริ่มต้นสำหรับทุกกลุ่ม" },      },      direct: {        // ใช้กับทุกบัญชีที่ไม่ได้กำหนดแมป direct ของตนเอง        "*": { systemPrompt: "พรอมต์เริ่มต้นสำหรับแชตโดยตรงทั้งหมด" },      },      accounts: {        work: {          groups: {            // บัญชีนี้กำหนด groups ของตนเอง ดังนั้น groups ระดับรากจึงถูก            // แทนที่ทั้งหมด หากต้องการคงไวลด์การ์ดไว้ ให้กำหนด "*" ที่นี่อย่างชัดเจนด้วย            "120363406415684625@g.us": {              requireMention: false,              systemPrompt: "มุ่งเน้นการจัดการโครงการ",            },            // ใช้เฉพาะเมื่อต้องอนุญาตทุกกลุ่มในบัญชีนี้            "*": { systemPrompt: "พรอมต์เริ่มต้นสำหรับกลุ่มงาน" },          },          direct: {            // บัญชีนี้กำหนดแมป direct ของตนเอง ดังนั้นรายการ direct ระดับรากจึงถูก            // แทนที่ทั้งหมด หากต้องการคงไวลด์การ์ดไว้ ให้กำหนด "*" ที่นี่อย่างชัดเจนด้วย            "+15551234567": { systemPrompt: "พรอมต์สำหรับแชตงานโดยตรงรายการหนึ่งโดยเฉพาะ" },            "*": { systemPrompt: "พรอมต์เริ่มต้นสำหรับแชตงานโดยตรง" },          },        },      },    },  },}

    ตัวชี้ไปยังข้อมูลอ้างอิงการกำหนดค่า

    ข้อมูลอ้างอิงหลัก: ข้อมูลอ้างอิงการกำหนดค่า - WhatsApp

    ขอบเขต ฟิลด์
    การเข้าถึง dmPolicy, allowFrom, groupPolicy, groupAllowFrom, groups
    การส่งมอบ textChunkLimit, streaming.chunkMode, mediaMaxMb, sendReadReceipts, ackReaction, reactionLevel
    หลายบัญชี accounts.<id>.enabled, accounts.<id>.authDir และการแทนที่อื่น ๆ ต่อบัญชี
    การดำเนินงาน configWrites, debounceMs, web.enabled
    ลักษณะการทำงานของเซสชัน session.dmScope, historyLimit, dmHistoryLimit, dms.<id>.historyLimit
    พรอมต์ groups.<id>.systemPrompt, groups["*"].systemPrompt, direct.<id>.systemPrompt, direct["*"].systemPrompt

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

    Was this useful?
    On this page

    On this page