Mainstream messaging
स्थिति: WhatsApp Web (Baileys) के माध्यम से प्रोडक्शन के लिए तैयार। Gateway लिंक किए गए सत्रों का स्वामी है; कोई अलग Twilio WhatsApp चैनल नहीं है।
इंस्टॉल करें
openclaw onboard और openclaw channels add --channel whatsapp पहली बार इसे चुनने पर Plugin इंस्टॉल करने के लिए कहते हैं; यदि Plugin मौजूद नहीं है, तो openclaw channels login --channel whatsapp वही इंस्टॉल प्रवाह प्रदान करता है। डेवलपमेंट चेकआउट स्थानीय Plugin पथ का उपयोग करते हैं; स्थिर/बीटा इंस्टॉल पहले ClawHub से @openclaw/whatsapp इंस्टॉल करते हैं और विफल होने पर npm का उपयोग करते हैं। WhatsApp रनटाइम मुख्य OpenClaw npm पैकेज के बाहर वितरित होता है, इसलिए इसकी रनटाइम निर्भरताएँ बाहरी Plugin के साथ रहती हैं। मैन्युअल इंस्टॉल:
openclaw plugins install clawhub:@openclaw/whatsappसाधारण npm पैकेज (@openclaw/whatsapp) का उपयोग केवल रजिस्ट्री फ़ॉलबैक के लिए करें; पुनरुत्पाद्य इंस्टॉल के लिए ही सटीक संस्करण पिन करें।
अज्ञात प्रेषकों के लिए डिफ़ॉल्ट DM नीति पेयरिंग है।
क्रॉस-चैनल निदान और सुधार कार्यविधियाँ।
संपूर्ण चैनल कॉन्फ़िगरेशन पैटर्न और उदाहरण।
त्वरित सेटअप
पहुँच नीति कॉन्फ़िगर करें
{channels: {whatsapp: { dmPolicy: "pairing", allowFrom: ["+15551234567"], groupPolicy: "allowlist", groupAllowFrom: ["+15551234567"],},},}WhatsApp लिंक करें (QR)
openclaw channels login --channel whatsappलॉगिन केवल QR के माध्यम से होता है। रिमोट या हेडलेस होस्ट पर लॉगिन शुरू करने से पहले लाइव QR को फ़ोन तक पहुँचाने का विश्वसनीय तरीका रखें; टर्मिनल में रेंडर किए गए QR, स्क्रीनशॉट या चैट अटैचमेंट पहुँचते-पहुँचते समाप्त हो सकते हैं।
किसी विशिष्ट खाते के लिए:
openclaw channels login --channel whatsapp --account workलॉगिन से पहले किसी मौजूदा/कस्टम प्रमाणीकरण डायरेक्टरी को जोड़ने के लिए:
openclaw channels add --channel whatsapp --account work --auth-dir /path/to/wa-authopenclaw channels login --channel whatsapp --account workGateway शुरू करें
openclaw gatewayपहले DM पहुँच अनुरोध को स्वीकृत करें (पेयरिंग मोड)
Settings → Channels → DM access requests खोलें, WhatsApp खाता खोजें, और प्रेषक को स्वीकृत करें। यदि आप CLI को प्राथमिकता देते हैं:
openclaw pairing list whatsappopenclaw pairing approve whatsapp <CODE>DM पहुँच अनुरोध 1 घंटे के बाद समाप्त हो जाते हैं; लंबित अनुरोधों की सीमा प्रति खाते 3 है। यह स्वीकृति खाते को लिंक करने के लिए उपयोग किए जाने वाले WhatsApp लॉगिन QR से अलग है।
डिप्लॉयमेंट पैटर्न
समर्पित नंबर (सुझाया गया)
- OpenClaw के लिए अलग WhatsApp पहचान
- अधिक स्पष्ट DM अनुमति-सूचियाँ और रूटिंग सीमाएँ
- स्वयं-चैट संबंधी भ्रम की कम संभावना
{ channels: { whatsapp: { dmPolicy: "allowlist", allowFrom: ["+15551234567"], }, },}व्यक्तिगत नंबर फ़ॉलबैक
ऑनबोर्डिंग व्यक्तिगत नंबर मोड का समर्थन करती है और स्वयं-चैट के अनुकूल आधाररेखा लिखती है: dmPolicy: "allowlist", आपके अपने नंबर सहित allowFrom, selfChatMode: true। रनटाइम स्वयं-चैट सुरक्षा लिंक किए गए स्वयं के नंबर और allowFrom के आधार पर काम करती है।
रनटाइम मॉडल
- Gateway WhatsApp सॉकेट और पुनः कनेक्ट लूप का स्वामी है।
- एक वॉचडॉग दो संकेतों को स्वतंत्र रूप से ट्रैक करता है: मूल WhatsApp Web ट्रांसपोर्ट गतिविधि और एप्लिकेशन-संदेश गतिविधि। हाल में कोई संदेश न आने मात्र से किसी शांत लेकिन कनेक्टेड सत्र को पुनः शुरू नहीं किया जाता; यह केवल तभी बलपूर्वक पुनः कनेक्ट करता है, जब ट्रांसपोर्ट फ़्रेम एक निश्चित आंतरिक अवधि (उपयोगकर्ता द्वारा कॉन्फ़िगर करने योग्य नहीं) तक आना बंद कर दें या एप्लिकेशन संदेश सामान्य संदेश टाइमआउट के 4x से अधिक समय तक न आएँ। हाल में सक्रिय रहे सत्र के पुनः कनेक्ट होने के तुरंत बाद, पहली अवधि 4x अवधि के बजाय छोटे सामान्य संदेश टाइमआउट का उपयोग करती है। उस पुनः कनेक्ट के दौरान Baileys द्वारा पहले ही डिलीवर किए गए ऑफ़लाइन संदेशों का OpenClaw स्वतः उत्तर दे सकता है, जिसकी सीमा आने वाले संदेश-ID की डीडुप्लिकेशन अवधि से निर्धारित होती है; आरंभिक स्टार्टअप छोटे पुराने-इतिहास सुरक्षा उपाय को बनाए रखता है।
- आउटबाउंड प्रेषण के लिए लक्ष्य खाते का सक्रिय WhatsApp लिसनर आवश्यक है; अन्यथा प्रेषण तुरंत विफल हो जाता है।
- जब टोकन वर्तमान प्रतिभागी मेटाडेटा से मेल खाता है, तब समूह प्रेषण
@+<digits>और@<digits>टोकन (टेक्स्ट और मीडिया कैप्शन में) के लिए नेटिव उल्लेख मेटाडेटा जोड़ते हैं; इसमें LID-समर्थित समूह भी शामिल हैं। - स्टेटस और ब्रॉडकास्ट चैट (
@status,@broadcast) अनदेखी की जाती हैं। - प्रत्यक्ष चैट DM सत्र नियमों का उपयोग करती हैं (
session.dmScope; डिफ़ॉल्टmainDM को एजेंट के मुख्य सत्र में समेट देता है)। समूह सत्र प्रत्येक JID के अनुसार अलग रखे जाते हैं (agent:<agentId>:whatsapp:group:<jid>)। - WhatsApp चैनल/न्यूज़लेटर अपने नेटिव
@newsletterJID के माध्यम से स्पष्ट आउटबाउंड लक्ष्य हो सकते हैं, जो DM अर्थविज्ञान के बजाय चैनल सत्र मेटाडेटा (agent:<agentId>:whatsapp:channel:<jid>) का उपयोग करते हैं। - WhatsApp Web ट्रांसपोर्ट Gateway होस्ट पर मानक प्रॉक्सी एनवायरनमेंट वेरिएबल (
HTTPS_PROXY,HTTP_PROXY,NO_PROXY, लोअरकेस रूपांतर) का पालन करता है। प्रति-चैनल सेटिंग के बजाय होस्ट-स्तरीय प्रॉक्सी कॉन्फ़िगरेशन को प्राथमिकता दें।
MeowCaller से वर्तमान अनुरोधकर्ता को कॉल करें (प्रायोगिक)
Plugin WhatsApp से आरंभ होने वाले एजेंट टर्न में whatsapp_call उपलब्ध करा सकता है। यह वर्तमान अधिकृत अनुरोधकर्ता को WhatsApp वॉइस कॉल करने और उनके उत्तर देने के बाद OpenClaw TTS संदेश चलाने के लिए MeowCaller का उपयोग करता है। टूल में गंतव्य नंबर का कोई पैरामीटर नहीं है, इसलिए कोई प्रॉम्प्ट कॉल को रीडायरेक्ट नहीं कर सकता। डिफ़ॉल्ट रूप से अक्षम है।
प्रायोगिक कॉल सक्षम करें
WhatsApp चैनल कॉन्फ़िगरेशन में actions.calls: true जोड़ें और Gateway पुनः शुरू करें:
{"channels": {"whatsapp": { "actions": { "calls": true }}}}अनुपस्थित या false होने पर, OpenClaw whatsapp_call टूल उपलब्ध नहीं कराता।
समीक्षित MeowCaller CLI इंस्टॉल करें
अडैप्टर Gateway होस्ट के PATH पर meowcaller निष्पादनयोग्य फ़ाइल की अपेक्षा करता है। MeowCaller PR #7 के मर्ज होने तक समीक्षित ब्रांच बिल्ड करें:
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, Gateway सेवा के PATH में है। इस संशोधन में स्पष्ट pair और केवल-प्रेषण notify कमांड हैं; notify कोई माइक्रोफ़ोन, स्पीकर, वीडियो डिवाइस या निदान कैप्चर नहीं खोलता। इसके स्थान पर अपस्ट्रीम उदाहरण CLI के play कमांड का उपयोग न करें।
MeowCaller लिंक्ड डिवाइस पेयर करें
WhatsApp एजेंट से कॉल सेटअप जाँचने के लिए कहें (whatsapp_call स्थिति क्रिया खाते-विशिष्ट स्टेट डायरेक्टरी और पेयरिंग कमांड की जानकारी देती है)। डिफ़ॉल्ट खाते के लिए:
state_dir="$HOME/.openclaw/credentials/whatsapp-calls/default"mkdir -p "$state_dir"chmod 700 "$state_dir"meowcaller pair --store "$state_dir/wa-voip.db"इसे इंटरैक्टिव रूप से चलाएँ, WhatsApp > Linked devices से QR स्कैन करें और 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 स्वीकृति प्रॉम्प्ट को 👍/👎 प्रतिक्रियाओं के रूप में रेंडर कर सकता है, जिन्हें शीर्ष-स्तरीय स्वीकृति फ़ॉरवर्डिंग कॉन्फ़िगरेशन नियंत्रित करता है:
{ 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 के माध्यम से संख्या को मानक विकल्प से मैप करता है; पुराने या डुप्लिकेट टैप अनदेखे किए जाते हैं। बहु-प्रश्न, बहु-चयन और मुक्त-टेक्स्ट प्रॉम्प्ट केवल टेक्स्ट-उत्तर बने रहते हैं। सामान्य WhatsApp DM/समूह प्रवेश नियम प्रतिक्रिया देने वाले प्रेषक को अधिकृत करते हैं।
Plugin हुक और गोपनीयता
इनबाउंड WhatsApp संदेशों में व्यक्तिगत सामग्री, फ़ोन नंबर, समूह पहचानकर्ता, प्रेषक नाम और सत्र सहसंबंध फ़ील्ड हो सकते हैं। जब तक आप ऑप्ट इन नहीं करते, WhatsApp इनबाउंड message_received हुक पेलोड को Plugins में ब्रॉडकास्ट नहीं करता:
{ channels: { whatsapp: { pluginHooks: { messageReceived: true, }, }, },}ऑप्ट-इन को channels.whatsapp.accounts.<id>.pluginHooks.messageReceived के अंतर्गत एक खाते तक सीमित करें। इसे केवल उन Plugins के लिए सक्षम करें, जिन पर आप इनबाउंड WhatsApp सामग्री और पहचानकर्ताओं के संबंध में भरोसा करते हैं।
पहुँच नियंत्रण और सक्रियण
DM नीति
channels.whatsapp.dmPolicy:
| मान | व्यवहार |
|---|---|
pairing (डिफ़ॉल्ट) |
अज्ञात प्रेषक पेयरिंग का अनुरोध करते हैं; स्वामी स्वीकृति देता है |
allowlist |
केवल allowFrom प्रेषकों को प्रवेश मिलता है |
open |
आवश्यक है कि allowFrom में "*" शामिल हो |
disabled |
सभी DM ब्लॉक करें |
allowFrom E.164-शैली की संख्याएँ स्वीकार करता है (आंतरिक रूप से सामान्यीकृत)। यह केवल DM प्रेषक की पहुँच-नियंत्रण सूची है — यह समूह JID या @newsletter चैनल JID को स्पष्ट आउटबाउंड प्रेषण सीमित नहीं करता।
बहु-अकाउंट ओवरराइड: channels.whatsapp.accounts.<id>.dmPolicy (और .allowFrom) उस अकाउंट के लिए चैनल-स्तरीय डिफ़ॉल्ट पर प्राथमिकता रखते हैं।
रनटाइम संबंधी टिप्पणियाँ:
- पेयरिंग चैनल अनुमति-स्टोर में बनी रहती हैं और कॉन्फ़िगर किए गए
allowFromके साथ मर्ज होती हैं - निर्धारित स्वचालन और Heartbeat प्राप्तकर्ता फ़ॉलबैक स्पष्ट डिलीवरी लक्ष्यों या कॉन्फ़िगर किए गए
allowFromका उपयोग करते हैं; DM पेयरिंग अनुमोदन स्वतः Cron/Heartbeat प्राप्तकर्ता नहीं होते - यदि कोई अनुमति-सूची कॉन्फ़िगर नहीं की गई है, तो लिंक किया गया स्वयं का नंबर डिफ़ॉल्ट रूप से अनुमत होता है
- OpenClaw आउटबाउंड
fromMeDM को कभी भी स्वतः पेयर नहीं करता (लिंक किए गए डिवाइस से स्वयं को भेजे गए संदेश)
समूह नीति और अनुमति-सूचियाँ
समूह पहुँच की दो परतें हैं:
- समूह सदस्यता अनुमति-सूची (
channels.whatsapp.groups): यदिgroupsछोड़ा गया है, तो सभी समूह पात्र हैं; यदि मौजूद है, तो यह समूह अनुमति-सूची के रूप में काम करता है ("*"सभी को अनुमति देता है)। - समूह प्रेषक नीति (
channels.whatsapp.groupPolicy+groupAllowFrom):openप्रेषक अनुमति-सूची को बायपास करता है,allowlistके लिएgroupAllowFrom(या*) मिलान आवश्यक है,disabledसभी इनबाउंड समूह संदेशों को अवरुद्ध करता है।
यदि groupAllowFrom सेट नहीं है, तो प्रविष्टियाँ होने पर प्रेषक जाँच allowFrom पर फ़ॉलबैक करती है। प्रेषक अनुमति-सूचियों का मूल्यांकन उल्लेख/उत्तर सक्रियण से पहले किया जाता है।
यदि कोई channels.whatsapp ब्लॉक बिल्कुल मौजूद नहीं है, तो रनटाइम groupPolicy: "allowlist" पर फ़ॉलबैक करता है (चेतावनी लॉग के साथ), भले ही channels.defaults.groupPolicy को किसी अन्य मान पर सेट किया गया हो।
उल्लेख और /activation
समूह उत्तरों के लिए डिफ़ॉल्ट रूप से उल्लेख आवश्यक है। उल्लेख पहचान में शामिल हैं:
- बॉट पहचान के स्पष्ट WhatsApp उल्लेख
- कॉन्फ़िगर किए गए उल्लेख रेगेक्स पैटर्न (
agents.entries.*.groupChat.mentionPatterns, फ़ॉलबैकmessages.groupChat.mentionPatterns) - अधिकृत समूह संदेशों के इनबाउंड वॉइस-नोट प्रतिलेख
- अंतर्निहित बॉट-को-उत्तर पहचान (उत्तर प्रेषक बॉट पहचान से मेल खाता है)
सुरक्षा: उद्धरण/उत्तर केवल उल्लेख गेटिंग को संतुष्ट करता है — यह प्रेषक को प्राधिकरण नहीं देता। groupPolicy: "allowlist" के साथ, अनुमति-सूची में न होने वाले प्रेषक किसी अनुमत उपयोगकर्ता के संदेश का उत्तर देते समय भी अवरुद्ध रहते हैं।
सत्र-स्तरीय सक्रियण कमांड: /activation mention या /activation always। यह सत्र स्थिति को अपडेट करता है (वैश्विक कॉन्फ़िगरेशन को नहीं) और स्वामी द्वारा नियंत्रित है।
कॉन्फ़िगर किए गए ACP बाइंडिंग
WhatsApp शीर्ष-स्तरीय bindings[] के माध्यम से स्थायी ACP बाइंडिंग का समर्थन करता है:
{ 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 संख्याओं से मेल खाती हैं; समूह WhatsApp समूह JID से मेल खाते हैं। OpenClaw द्वारा बाउंड ACP सत्र की मौजूदगी सुनिश्चित करने से पहले समूह अनुमति-सूचियाँ, प्रेषक नीति और उल्लेख/सक्रियण गेटिंग चलती हैं। मिलान किया गया बाइंडिंग रूट का स्वामी होता है — प्रसारण समूह उस टर्न को सामान्य WhatsApp सत्रों में वितरित नहीं करते।
व्यक्तिगत नंबर और स्वयं-चैट व्यवहार
जब लिंक किया गया स्वयं का नंबर allowFrom में भी मौजूद होता है, तो स्वयं-चैट सुरक्षा उपाय सक्रिय हो जाते हैं: स्वयं-चैट टर्न के लिए पठन रसीदें छोड़ना, स्वयं को पिंग करने वाले उल्लेख-JID स्वतः-ट्रिगर व्यवहार को अनदेखा करना, और चैनल/अकाउंट का responsePrefix सेट न होने पर उत्तरों को डिफ़ॉल्ट रूप से [{identity.name}] (या [openclaw]) पर भेजना।
संदेश सामान्यीकरण और संदर्भ
इनबाउंड एनवेलप और उत्तर संदर्भ
आने वाले संदेश साझा इनबाउंड एनवेलप में रैप किए जाते हैं। उद्धृत उत्तर इस रूप में संदर्भ जोड़ता है:
[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]।
पठन रसीदें
स्वीकृत इनबाउंड संदेशों के लिए डिफ़ॉल्ट रूप से सक्षम। वैश्विक रूप से अक्षम करें:
{ channels: { whatsapp: { sendReadReceipts: false } } }प्रति-अकाउंट ओवरराइड: channels.whatsapp.accounts.<id>.sendReadReceipts। वैश्विक रूप से सक्षम होने पर भी स्वयं-चैट टर्न पठन रसीदें छोड़ देते हैं।
डिलीवरी, खंडन और मीडिया
पाठ खंडन
- डिफ़ॉल्ट खंड सीमा:
channels.whatsapp.textChunkLimit = 4000 channels.whatsapp.streaming.chunkMode = "length" | "newline";newlineअनुच्छेद सीमाओं (रिक्त पंक्तियों) को प्राथमिकता देता है, फिर लंबाई-सुरक्षित खंडन पर फ़ॉलबैक करता है
आउटबाउंड मीडिया व्यवहार
- चित्र, वीडियो, ऑडियो (PTT वॉइस-नोट) और दस्तावेज़ पेलोड का समर्थन करता है
- ऑडियो को
ptt: trueके साथ Baileysaudioपेलोड के रूप में भेजा जाता है और वह पुश-टू-टॉक वॉइस नोट के रूप में रेंडर होता है; उत्तर पेलोड परaudioAsVoiceसंरक्षित रहता है, ताकि प्रदाता के स्रोत प्रारूप की परवाह किए बिना TTS वॉइस-नोट आउटपुट इसी पथ पर बना रहे - नेटिव Ogg/Opus ऑडियो
audio/ogg; codecs=opusके रूप में भेजा जाता है; अन्य सभी प्रारूपों (Microsoft Edge TTS MP3/WebM आउटपुट सहित) को PTT डिलीवरी से पहलेffmpegद्वारा 48 kHz मोनो Ogg/Opus में ट्रांसकोड किया जाता है /tts latestनवीनतम सहायक उत्तर को एक वॉइस नोट के रूप में भेजता है और उसी उत्तर को दोबारा भेजने से रोकता है;/tts chat on|off|defaultवर्तमान चैट के लिए स्वतः-TTS नियंत्रित करता है- वीडियो पर
gifPlayback: trueभेजने से एनिमेटेड GIF प्लेबैक सक्षम होता है forceDocument/asDocumentआउटबाउंड चित्रों, GIF और वीडियो को WhatsApp के मीडिया संपीड़न से बचाने के लिए Baileys दस्तावेज़ पेलोड के माध्यम से रूट करता है, जिससे निर्धारित फ़ाइलनाम और 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।
{ channels: { whatsapp: { replyToMode: "first" } } }प्रतिक्रिया स्तर
channels.whatsapp.reactionLevel नियंत्रित करता है कि एजेंट इमोजी प्रतिक्रियाओं का कितने व्यापक रूप से उपयोग करता है:
| स्तर | पावती प्रतिक्रियाएँ | एजेंट द्वारा आरंभ की गई प्रतिक्रियाएँ |
|---|---|---|
"off" |
नहीं | नहीं |
"ack" |
हाँ | नहीं |
"minimal" (डिफ़ॉल्ट) |
हाँ | हाँ, संयमित मार्गदर्शन |
"extensive" |
हाँ | हाँ, प्रोत्साहित मार्गदर्शन |
प्रति-अकाउंट ओवरराइड: channels.whatsapp.accounts.<id>.reactionLevel।
{ channels: { whatsapp: { reactionLevel: "ack" } } }पावती प्रतिक्रियाएँ
channels.whatsapp.ackReaction इनबाउंड प्राप्ति पर तत्काल प्रतिक्रिया भेजता है, जिसे reactionLevel द्वारा नियंत्रित किया जाता है ("off" होने पर दबा दिया जाता है):
{ channels: { whatsapp: { ackReaction: { emoji: "👀", direct: true, group: "mentions", // हमेशा | उल्लेख | कभी नहीं }, }, },}टिप्पणियाँ: इनबाउंड स्वीकार किए जाने के तुरंत बाद (उत्तर से पहले) भेजी जाती है; यदि ackReaction, emoji के बिना मौजूद है, तो WhatsApp रूट किए गए एजेंट की पहचान इमोजी का उपयोग करता है और अनुपलब्ध होने पर "👀" का उपयोग करता है (पावती न भेजने के लिए ackReaction छोड़ें या emoji: "" सेट करें); विफलताएँ लॉग की जाती हैं लेकिन उत्तर डिलीवरी को अवरुद्ध नहीं करतीं; समूह मोड mentions केवल उल्लेख से ट्रिगर हुए टर्न पर प्रतिक्रिया करता है, जबकि समूह सक्रियण always उस जाँच को बायपास करता है; WhatsApp केवल channels.whatsapp.ackReaction का उपयोग करता है (पुराना messages.ackReaction यहाँ लागू नहीं होता)।
जीवनचक्र स्थिति प्रतिक्रियाएँ
messages.statusReactions.enabled: true सेट करें, ताकि WhatsApp किसी टर्न के दौरान स्थिर प्राप्ति इमोजी छोड़ने के बजाय पावती प्रतिक्रिया को बदल सके और कतारबद्ध, चिंतन, टूल गतिविधि, Compaction, पूर्ण और त्रुटि जैसी स्थितियों के बीच क्रम से बदलता रहे:
{ messages: { statusReactions: { enabled: true, }, },}टिप्पणियाँ: channels.whatsapp.ackReaction अब भी प्रत्यक्ष संदेशों और समूहों के लिए पात्रता नियंत्रित करता है; कतारबद्ध स्थिति सामान्य पावती प्रतिक्रियाओं वाले प्रभावी इमोजी का उपयोग करती है; WhatsApp में प्रति संदेश एक बॉट प्रतिक्रिया स्लॉट होता है, इसलिए जीवनचक्र अपडेट वर्तमान प्रतिक्रिया को उसी स्थान पर बदलते हैं और अंतिम पूर्ण/त्रुटि स्थिति के बाद पावती बहाल करते हैं।
बहु-अकाउंट और क्रेडेंशियल्स
खाता चयन और डिफ़ॉल्ट
खाता आईडी 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 खाता कॉन्फ़िगरेशन अक्षम करने या हटाने से पहले लाइव लिसनर को भी रोकता है।
लेगेसी प्रमाणीकरण डायरेक्टरियों में, Baileys प्रमाणीकरण फ़ाइलें हटाते समय oauth.json को सुरक्षित रखा जाता है।
टूल, कार्रवाइयाँ और कॉन्फ़िगरेशन लेखन
- एजेंट टूल समर्थन में WhatsApp प्रतिक्रिया कार्रवाई (
react) शामिल है। - कार्रवाई गेट:
channels.whatsapp.actions.reactions,channels.whatsapp.actions.polls(मौजूदा कार्रवाइयों का डिफ़ॉल्टtrueहै),channels.whatsapp.actions.calls(डिफ़ॉल्टfalse, ऊपर MeowCaller देखें)। - चैनल द्वारा आरंभ किए गए कॉन्फ़िगरेशन लेखन डिफ़ॉल्ट रूप से सक्षम हैं;
channels.whatsapp.configWrites: falseके माध्यम से अक्षम करें।
समस्या निवारण
लिंक नहीं है (QR आवश्यक)
लक्षण: चैनल स्थिति लिंक न होने की सूचना देती है।
openclaw channels login --channel whatsappopenclaw channels statusलिंक है लेकिन कनेक्शन टूटा हुआ है / पुनः कनेक्शन लूप
लक्षण: लिंक किए गए खाते में बार-बार कनेक्शन टूटना या पुनः कनेक्ट करने के प्रयास होना।
निष्क्रिय खाते सामान्य संदेश टाइमआउट के बाद भी जुड़े रह सकते हैं; वॉचडॉग केवल तभी पुनरारंभ करता है जब WhatsApp Web ट्रांसपोर्ट गतिविधि रुक जाती है, सॉकेट बंद हो जाता है, या एप्लिकेशन-स्तरीय गतिविधि लंबी सुरक्षा अवधि के बाद भी निष्क्रिय रहती है (ऊपर रनटाइम मॉडल देखें)।
समाधान:
openclaw channels status --probeopenclaw doctoropenclaw logs --followopenclaw gateway statusहोस्ट कनेक्टिविटी और समय-संबंधी समस्याएँ ठीक होने के बाद भी लूप बना रहे, तो खाते की प्रमाणीकरण डायरेक्टरी का बैकअप लें और फिर से लिंक करें:
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 हटाई जा चुकी ~/.openclaw/bin/ensure-whatsapp.sh स्क्रिप्ट को चलाने वाली लेगेसी crontab प्रविष्टियों के बारे में चेतावनी देता है; उन प्रविष्टियों को crontab -e से हटाएँ — cron में systemd यूज़र-बस परिवेश अनुपस्थित हो सकता है, जिससे वह पुरानी स्क्रिप्ट Gateway की स्थिति की गलत रिपोर्ट कर सकती है।
प्रॉक्सी के पीछे QR लॉगिन का समय समाप्त हो जाता है
लक्षण: उपयोग योग्य QR दिखाने से पहले openclaw channels login --channel whatsapp, 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 में जोड़ें, या प्रेषक प्राधिकरण को groupPolicy/groupAllowFrom के अधीन रखते हुए सभी समूहों को स्वीकार करने के लिए groups["*"] जोड़ें।
Bun रनटाइम चेतावनी
OpenClaw Gateway के लिए Node आवश्यक है। Bun, कैननिकल स्टेट स्टोर द्वारा उपयोग की जाने वाली node:sqlite API उपलब्ध नहीं कराता, और doctor लेगेसी Bun सेवाओं को Node पर माइग्रेट करता है।
सिस्टम प्रॉम्प्ट
WhatsApp, groups और direct मैप के माध्यम से समूहों और सीधे चैट के लिए Telegram-शैली के सिस्टम प्रॉम्प्ट का समर्थन करता है।
समूह संदेशों के लिए समाधान: पहले प्रभावी groups मैप निर्धारित किया जाता है — यदि खाता अपनी groups कुंजी परिभाषित करता है, तो वह रूट groups मैप को पूरी तरह बदल देती है (कोई डीप मर्ज नहीं)। इसके बाद प्रॉम्प्ट लुकअप उसी एक परिणामी मैप पर चलता है:
- समूह-विशिष्ट प्रॉम्प्ट (
groups["<groupId>"].systemPrompt): इसका उपयोग तब किया जाता है जब समूह प्रविष्टि मौजूद हो और उसकीsystemPromptकुंजी परिभाषित हो। रिक्त स्ट्रिंग ("") वाइल्डकार्ड को दबाती है और कोई प्रॉम्प्ट लागू नहीं करती। - समूह वाइल्डकार्ड प्रॉम्प्ट (
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या पेयरिंग-स्टोर नियमों द्वारा पहले ही स्वीकार किया जा चुका हो।
उदाहरण:
{ 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, enabled |
| इनबाउंड बैचिंग | messages.inbound.debounceMs, messages.inbound.byChannel.whatsapp |
| सत्र व्यवहार | session.dmScope, historyLimit, dmHistoryLimit, dms.<id>.historyLimit |
| प्रॉम्प्ट | groups.<id>.systemPrompt, groups["*"].systemPrompt, direct.<id>.systemPrompt, direct["*"].systemPrompt |