Developer and self-hosted
Mattermost
स्थिति: डाउनलोड करने योग्य Plugin (बॉट टोकन + WebSocket इवेंट)। चैनल, निजी चैनल, समूह DM और DM समर्थित हैं। Mattermost एक स्वयं होस्ट किया जा सकने वाला टीम मैसेजिंग प्लेटफ़ॉर्म है (mattermost.com)।
इंस्टॉल करें
npm registry
openclaw plugins install @openclaw/mattermostस्थानीय चेकआउट
openclaw plugins install ./path/to/local/mattermost-pluginविवरण: Plugins
त्वरित सेटअप
सुनिश्चित करें कि Plugin उपलब्ध है
ऊपर दिए गए कमांड से @openclaw/mattermost इंस्टॉल करें, फिर यदि Gateway पहले से चल रहा है तो उसे पुनः आरंभ करें।
Mattermost बॉट बनाएँ
एक Mattermost बॉट खाता बनाएँ, बॉट टोकन कॉपी करें और बॉट को उन टीमों तथा चैनलों में जोड़ें जिन्हें उसे पढ़ना चाहिए।
बेस URL कॉपी करें
Mattermost का बेस URL कॉपी करें (उदाहरण के लिए, https://chat.example.com)। अंत में मौजूद /api/v4 अपने-आप हटा दिया जाता है।
OpenClaw कॉन्फ़िगर करें और Gateway शुरू करें
न्यूनतम कॉन्फ़िगरेशन:
{ channels: { mattermost: { enabled: true, botToken: "mm-token", baseUrl: "https://chat.example.com", dmPolicy: "pairing", }, },}गैर-इंटरैक्टिव विकल्प:
openclaw channels add --channel mattermost --bot-token <token> --http-url https://chat.example.comमूल स्लैश कमांड
मूल स्लैश कमांड वैकल्पिक हैं। सक्षम होने पर, OpenClaw उन सभी टीमों में oc_* स्लैश कमांड पंजीकृत करता है जिनका बॉट सदस्य है और Gateway HTTP सर्वर पर कॉलबैक POST प्राप्त करता है।
{ channels: { mattermost: { commands: { native: true, nativeSkills: true, callbackPath: "/api/channels/mattermost/command", // इसका उपयोग तब करें जब Mattermost सीधे Gateway तक न पहुँच सके (रिवर्स प्रॉक्सी/सार्वजनिक URL)। callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, }, },}पंजीकृत कमांड: /oc_status, /oc_model, /oc_models, /oc_new, /oc_help, /oc_think, /oc_reasoning, /oc_verbose, /oc_queue। nativeSkills: true के साथ, स्किल कमांड भी /oc_<skill> के रूप में पंजीकृत किए जाते हैं।
व्यवहार संबंधी टिप्पणियाँ
nativeऔरnativeSkillsका डिफ़ॉल्ट"auto"है, जिसका Mattermost के लिए अर्थ अक्षम होता है। इन्हें स्पष्ट रूप सेtrueपर सेट करें।callbackPathका डिफ़ॉल्ट/api/channels/mattermost/commandहै।- यदि
callbackUrlछोड़ दिया जाता है, तो OpenClawhttp://<gateway.customBindHost or localhost>:<gateway.port, default 18789><callbackPath>व्युत्पन्न करता है। वाइल्डकार्ड बाइंड होस्ट (0.0.0.0,::)localhostपर फ़ॉलबैक करते हैं। - बहु-खाता सेटअप के लिए,
commandsको शीर्ष स्तर पर याchannels.mattermost.accounts.<id>.commandsके अंतर्गत सेट किया जा सकता है (खाता मान शीर्ष-स्तरीय फ़ील्ड को ओवरराइड करते हैं)। - अन्य इंटीग्रेशन द्वारा बनाए गए समान ट्रिगर वाले मौजूदा स्लैश कमांड अपरिवर्तित छोड़े जाते हैं (पंजीकरण उन्हें छोड़ देता है); बॉट द्वारा बनाए गए कमांड कॉलबैक URL बदलने पर अपडेट किए जाते हैं या फिर से बनाए जाते हैं।
- कमांड कॉलबैक को उन प्रति-कमांड टोकन से सत्यापित किया जाता है जिन्हें Mattermost तब लौटाता है जब OpenClaw
oc_*कमांड पंजीकृत करता है। - OpenClaw प्रत्येक कॉलबैक स्वीकार करने से पहले वर्तमान Mattermost कमांड पंजीकरण रीफ़्रेश करता है, इसलिए हटाए गए या पुनः जनरेट किए गए स्लैश कमांड के पुराने टोकन Gateway पुनः आरंभ किए बिना स्वीकार होना बंद हो जाते हैं।
- यदि Mattermost API यह पुष्टि नहीं कर पाता कि कमांड अभी भी वर्तमान है, तो कॉलबैक सत्यापन बंद अवस्था में विफल होता है; विफल सत्यापन थोड़े समय के लिए कैश किए जाते हैं, समवर्ती लुकअप को एकीकृत किया जाता है और रीप्ले दबाव सीमित करने के लिए प्रत्येक कमांड के नए लुकअप प्रारंभ की दर सीमित की जाती है।
- पंजीकरण विफल होने, स्टार्टअप आंशिक रहने या कॉलबैक टोकन का निर्धारित कमांड के पंजीकृत टोकन से मेल न खाने पर स्लैश कॉलबैक बंद अवस्था में विफल होते हैं (एक कमांड के लिए मान्य टोकन किसी अलग कमांड के अपस्ट्रीम सत्यापन तक नहीं पहुँच सकता)।
- स्वीकार किए गए कॉलबैक को अस्थायी "प्रोसेस किया जा रहा है..." उत्तर से अभिस्वीकृत किया जाता है; वास्तविक उत्तर सामान्य संदेश के रूप में आता है।
पहुँच-योग्यता की आवश्यकता
कॉलबैक एंडपॉइंट Mattermost सर्वर से पहुँच योग्य होना चाहिए।
callbackUrlकोlocalhostपर तब तक सेट न करें, जब तक Mattermost उसी होस्ट/नेटवर्क नेमस्पेस पर न चलता हो जिस पर OpenClaw चलता है।callbackUrlको अपने Mattermost बेस URL पर तब तक सेट न करें, जब तक वह URL/api/channels/mattermost/commandको OpenClaw पर रिवर्स-प्रॉक्सी न करता हो।- एक त्वरित जाँच
curl https://<gateway-host>/api/channels/mattermost/commandहै; GET को OpenClaw से405 Method Not Allowedलौटाना चाहिए, न कि404।
Mattermost इग्रेस अनुमति-सूची
यदि आपके कॉलबैक का लक्ष्य निजी/tailnet/आंतरिक पते हैं, तो कॉलबैक होस्ट/डोमेन शामिल करने के लिए Mattermost ServiceSettings.AllowedUntrustedInternalConnections सेट करें।
पूर्ण URL के बजाय होस्ट/डोमेन प्रविष्टियों का उपयोग करें।
- सही:
gateway.tailnet-name.ts.net - गलत:
https://gateway.tailnet-name.ts.net
पर्यावरण चर (डिफ़ॉल्ट खाता)
यदि आप पर्यावरण चर पसंद करते हैं, तो इन्हें Gateway होस्ट पर सेट करें:
MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
चैट मोड
Mattermost स्वचालित रूप से DM का उत्तर देता है। चैनल का व्यवहार chatmode द्वारा नियंत्रित होता है:
oncall (डिफ़ॉल्ट)
चैनलों में केवल @उल्लेख किए जाने पर उत्तर दें।
onmessage
प्रत्येक चैनल संदेश का उत्तर दें।
onchar
जब कोई संदेश ट्रिगर उपसर्ग से शुरू हो, तब उत्तर दें।
कॉन्फ़िगरेशन उदाहरण:
{ channels: { mattermost: { chatmode: "onchar", oncharPrefixes: [">", "!"], // डिफ़ॉल्ट }, },}टिप्पणियाँ:
oncharअब भी स्पष्ट @उल्लेखों का उत्तर देता है।channels.mattermost.requireMentionका अब भी पालन किया जाता है, लेकिनchatmodeको प्राथमिकता दी जाती है। प्रति-चैनलgroups.<channelId>.requireMentionसेटिंग दोनों पर वरीयता रखती हैं।- बॉट द्वारा किसी चैनल थ्रेड में दृश्यमान उत्तर भेजने के बाद, उसी थ्रेड के बाद के संदेशों का उत्तर नए @उल्लेख या
oncharउपसर्ग के बिना दिया जाता है, जिससे बहु-चरणीय थ्रेड वार्तालाप जारी रहता है। बॉट द्वारा उस थ्रेड में अंतिम उत्तर देने के बाद भागीदारी 7 दिनों तक याद रखी जाती है और Gateway पुनः आरंभ होने के बाद भी बनी रहती है। वे थ्रेड अप्रभावित रहते हैं जिन्हें बॉट ने केवल देखा है; स्पष्ट उल्लेख फिर से आवश्यक बनाने के लिए नया शीर्ष-स्तरीय संदेश शुरू करें।
थ्रेडिंग और सत्र
यह नियंत्रित करने के लिए channels.mattermost.replyToMode का उपयोग करें कि चैनल और समूह के उत्तर मुख्य चैनल में रहें या ट्रिगर करने वाली पोस्ट के अंतर्गत थ्रेड शुरू करें।
off(डिफ़ॉल्ट): थ्रेड में केवल तभी उत्तर दें जब इनबाउंड पोस्ट पहले से किसी थ्रेड में हो।first: शीर्ष-स्तरीय चैनल/समूह पोस्ट के लिए, उस पोस्ट के अंतर्गत थ्रेड शुरू करें और वार्तालाप को थ्रेड-स्कोप वाले सत्र में रूट करें।allऔरbatched: वर्तमान में Mattermost के लिएfirstजैसा ही व्यवहार, क्योंकि Mattermost में थ्रेड रूट बन जाने के बाद, अनुवर्ती खंड और मीडिया उसी थ्रेड में जारी रहते हैं।replyToModeसेट होने पर भी प्रत्यक्ष संदेशों का डिफ़ॉल्टoffहोता है।
direct, group या channel चैट के लिए मोड ओवरराइड करने हेतु channels.mattermost.replyToModeByChatType का उपयोग करें। प्रत्यक्ष संदेशों के लिए थ्रेडिंग ऑप्ट इन करने हेतु direct सेट करें:
off(डिफ़ॉल्ट): प्रत्यक्ष संदेश एक ही निरंतर सत्र में बिना थ्रेड के रहते हैं।first,allयाbatched: प्रत्येक शीर्ष-स्तरीय प्रत्यक्ष संदेश एक नया, स्वतंत्र सत्र समर्थित Mattermost थ्रेड शुरू करता है।
{ channels: { mattermost: { replyToMode: "all", replyToModeByChatType: { direct: "first", }, }, },}टिप्पणियाँ:
- थ्रेड-स्कोप वाले सत्र ट्रिगर करने वाली पोस्ट ID को थ्रेड रूट के रूप में उपयोग करते हैं।
firstऔरallवर्तमान में समान हैं, क्योंकि Mattermost में थ्रेड रूट बन जाने के बाद, अनुवर्ती खंड और मीडिया उसी थ्रेड में जारी रहते हैं।- प्रति-चैट-प्रकार ओवरराइड
replyToModeपर वरीयता रखते हैं।directओवरराइड के बिना, मौजूदा डिप्लॉयमेंट सपाट, बिना थ्रेड वाले DM बनाए रखते हैं।
पहुँच नियंत्रण (DM)
- डिफ़ॉल्ट:
channels.mattermost.dmPolicy = "pairing"(अज्ञात प्रेषकों को पेयरिंग कोड मिलता है)। अन्य मान:allowlist,open,disabled। - इसके माध्यम से अनुमोदित करें:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- सार्वजनिक DM:
channels.mattermost.dmPolicy="open"के साथchannels.mattermost.allowFrom=["*"](कॉन्फ़िगरेशन स्कीमा वाइल्डकार्ड लागू करता है)। channels.mattermost.allowFromउपयोगकर्ता ID (अनुशंसित) औरaccessGroup:<name>प्रविष्टियाँ स्वीकार करता है। पहुँच समूह देखें।
चैनल (समूह)
- डिफ़ॉल्ट:
channels.mattermost.groupPolicy = "allowlist"(उल्लेख द्वारा नियंत्रित)। channels.mattermost.groupAllowFromसे प्रेषकों को अनुमति-सूची में जोड़ें (उपयोगकर्ता ID अनुशंसित हैं)।channels.mattermost.groupAllowFrom,accessGroup:<name>प्रविष्टियाँ स्वीकार करता है। पहुँच समूह देखें।- प्रति-चैनल उल्लेख ओवरराइड
channels.mattermost.groups.<channelId>.requireMentionके अंतर्गत या डिफ़ॉल्ट के लिएchannels.mattermost.groups["*"].requireMentionमें होते हैं। @usernameमिलान परिवर्तनशील है और केवलchannels.mattermost.dangerouslyAllowNameMatching: trueहोने पर सक्षम होता है।- खुले चैनल:
channels.mattermost.groupPolicy="open"(उल्लेख द्वारा नियंत्रित)। - निर्धारण क्रम:
channels.mattermost.groupPolicy, फिरchannels.defaults.groupPolicy, फिर"allowlist"। - रनटाइम टिप्पणी: यदि
channels.mattermostअनुभाग पूरी तरह अनुपस्थित है, तो रनटाइम समूह जाँच के लिए बंद अवस्था मेंgroupPolicy="allowlist"पर विफल होता है (channels.defaults.groupPolicyसेट होने पर भी) और एक बार चेतावनी लॉग करता है।
उदाहरण:
{ channels: { mattermost: { groupPolicy: "open", groups: { "*": { requireMention: true }, "team-channel-id": { requireMention: false }, }, }, },}आउटबाउंड डिलीवरी के लक्ष्य
openclaw message send या cron/Webhook के साथ इन लक्ष्य प्रारूपों का उपयोग करें:
| लक्ष्य | यहाँ डिलीवर करता है |
|---|---|
channel:<id> |
ID द्वारा चैनल |
channel:<name> या #channel-name |
नाम द्वारा चैनल, बॉट की सदस्यता वाली सभी टीमों में खोजा जाता है |
user:<id> या mattermost:<id> |
उस उपयोगकर्ता के साथ DM |
@username |
DM (उपयोगकर्ता नाम Mattermost API के माध्यम से निर्धारित किया जाता है) |
आउटबाउंड प्रेषण प्रत्येक संदेश में अधिकतम एक अटैचमेंट का समर्थन करता है; एकाधिक फ़ाइलों को अलग-अलग प्रेषणों में विभाजित करें।
DM चैनल पुनः प्रयास
जब OpenClaw किसी Mattermost DM लक्ष्य को भेजता है और पहले प्रत्यक्ष चैनल को रिज़ॉल्व करने की आवश्यकता होती है, तो यह डिफ़ॉल्ट रूप से प्रत्यक्ष-चैनल निर्माण की अस्थायी विफलताओं पर पुनः प्रयास करता है।
Mattermost Plugin के लिए इस व्यवहार को वैश्विक रूप से समायोजित करने हेतु channels.mattermost.dmChannelRetry का उपयोग करें, या किसी एक खाते के लिए channels.mattermost.accounts.<id>.dmChannelRetry का। डिफ़ॉल्ट:
{ channels: { mattermost: { dmChannelRetry: { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 10000, timeoutMs: 30000, }, }, },}टिप्पणियाँ:
- यह केवल DM चैनल निर्माण (
/api/v4/channels/direct) पर लागू होता है, प्रत्येक Mattermost API कॉल पर नहीं। - पुनः प्रयास जिटर के साथ एक्सपोनेंशियल बैकऑफ़ का उपयोग करते हैं और दर सीमाओं, 5xx प्रतिक्रियाओं तथा नेटवर्क या टाइमआउट त्रुटियों जैसी अस्थायी विफलताओं पर लागू होते हैं।
429के अतिरिक्त 4xx क्लाइंट त्रुटियों को स्थायी माना जाता है और उन पर पुनः प्रयास नहीं किया जाता।
पूर्वावलोकन स्ट्रीमिंग
Mattermost विचार-प्रक्रिया, टूल गतिविधि और आंशिक उत्तर पाठ को एक ड्राफ़्ट पूर्वावलोकन पोस्ट में स्ट्रीम करता है, जिसे अंतिम उत्तर भेजना सुरक्षित होने पर उसी स्थान पर अंतिम रूप दिया जाता है। partial मोड में पूर्वावलोकन प्रत्येक खंड के लिए संदेशों से चैनल को भरने के बजाय उसी पोस्ट आईडी पर अपडेट होता है। block मोड में पूर्वावलोकन पूर्ण पाठ और टूल-गतिविधि ब्लॉक के बीच बदलता रहता है, ताकि पुराने ब्लॉक अगले ब्लॉक द्वारा अधिलेखित होने के बजाय अलग पोस्ट के रूप में दिखाई देते रहें। मीडिया/त्रुटि वाले अंतिम संदेश लंबित पूर्वावलोकन संपादनों को रद्द करते हैं और त्यागे जाने वाले पूर्वावलोकन पोस्ट को फ़्लश करने के बजाय सामान्य डिलीवरी का उपयोग करते हैं।
पूर्वावलोकन स्ट्रीमिंग partial मोड में डिफ़ॉल्ट रूप से चालू होती है। channels.mattermost.streaming.mode के माध्यम से कॉन्फ़िगर करें (पुराने स्केलर/बूलियन streaming मानों को openclaw doctor --fix द्वारा माइग्रेट किया जाता है):
{ channels: { mattermost: { streaming: { mode: "partial" }, // off | partial | block | progress }, },}स्ट्रीमिंग मोड
partial(डिफ़ॉल्ट): एक पूर्वावलोकन पोस्ट, जिसे उत्तर बढ़ने के साथ संपादित किया जाता है और फिर पूर्ण उत्तर के साथ अंतिम रूप दिया जाता है।blockपूर्वावलोकन को पूर्ण पाठ और टूल-गतिविधि ब्लॉक के बीच बदलता है, ताकि प्रत्येक ब्लॉक उसी स्थान पर अधिलेखित होने के बजाय अपनी अलग पोस्ट के रूप में दिखाई देता रहे। समानांतर और क्रमिक टूल अपडेट वर्तमान टूल-गतिविधि पोस्ट साझा करते हैं।progressजनरेशन के दौरान स्थिति पूर्वावलोकन दिखाता है और केवल पूरा होने पर अंतिम उत्तर पोस्ट करता है।offपूर्वावलोकन स्ट्रीमिंग अक्षम करता है।streaming.block.enabled: trueके साथ, पूर्ण हो चुके सहायक ब्लॉक फिर भी एक संयुक्त अंतिम पोस्ट के बजाय सामान्य ब्लॉक उत्तरों (अलग-अलग पोस्ट) के रूप में डिलीवर किए जाते हैं।
स्ट्रीमिंग व्यवहार संबंधी टिप्पणियाँ
- यदि स्ट्रीम को उसी स्थान पर अंतिम रूप नहीं दिया जा सकता (उदाहरण के लिए, पोस्ट स्ट्रीम के बीच में हटा दी गई हो), तो OpenClaw एक नई अंतिम पोस्ट भेजता है, ताकि उत्तर कभी न खोए।
- केवल विचार-प्रक्रिया वाले पेलोड को चैनल पोस्ट से दबा दिया जाता है, जिसमें
> Thinkingब्लॉककोट के रूप में आने वाला पाठ भी शामिल है। अन्य सतहों पर विचार-प्रक्रिया देखने के लिए/reasoning onसेट करें; Mattermost की अंतिम पोस्ट में केवल उत्तर रहता है। - चैनल-मैपिंग मैट्रिक्स के लिए स्ट्रीमिंग देखें।
प्रतिक्रियाएँ (संदेश टूल)
message action=reactका उपयोगchannel=mattermostके साथ करें।messageIdMattermost पोस्ट आईडी है।emoji,thumbsupया:+1:जैसे नाम स्वीकार करता है (कोलन वैकल्पिक हैं)।- प्रतिक्रिया हटाने के लिए
remove=true(बूलियन) सेट करें। - प्रतिक्रिया जोड़ने/हटाने की घटनाएँ रूट किए गए एजेंट सत्र को सिस्टम घटनाओं के रूप में अग्रेषित की जाती हैं और उन पर संदेशों जैसी ही DM/समूह नीति जाँच लागू होती हैं।
उदाहरण:
message action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsupmessage action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsup remove=trueकॉन्फ़िगरेशन:
channels.mattermost.actions.reactions: प्रतिक्रिया क्रियाएँ सक्षम/अक्षम करें (डिफ़ॉल्ट true)।- प्रति-खाता ओवरराइड:
channels.mattermost.accounts.<id>.actions.reactions।
इंटरैक्टिव बटन (संदेश टूल)
क्लिक किए जा सकने वाले बटनों वाले संदेश भेजें। जब कोई उपयोगकर्ता किसी बटन पर क्लिक करता है, तो एजेंट को चयन प्राप्त होता है और वह उत्तर दे सकता है।
बटन सिमैंटिक presentation पेलोड से आते हैं (सामान्य एजेंट उत्तरों और message action=send में)। OpenClaw मान बटनों को Mattermost इंटरैक्टिव बटनों के रूप में रेंडर करता है, URL बटनों को संदेश पाठ में दृश्यमान रखता है और चयन मेनू को पठनीय पाठ में बदल देता है।
message action=send channel=mattermost target=channel:<channelId> presentation={"blocks":[{"type":"buttons","buttons":[{"label":"Yes","value":"yes"},{"label":"No","value":"no"}]}]}प्रस्तुति बटन फ़ील्ड:
labelstringrequiredप्रदर्शन लेबल (उपनाम: text)।
valuestringक्लिक करने पर वापस भेजा जाने वाला मान, जिसका उपयोग क्रिया आईडी के रूप में होता है (उपनाम: callback_data, callbackData)। जब तक url सेट न हो, क्लिक किए जा सकने वाले बटन के लिए यह आवश्यक है।
urlstringलिंक बटन; इंटरैक्टिव बटन के बजाय संदेश के मुख्य भाग में label: url पाठ के रूप में रेंडर किया जाता है।
style"primary" | "secondary" | "success" | "danger"बटन शैली। Mattermost उन मानों पर डिफ़ॉल्ट शैली लागू करता है जिनका वह समर्थन नहीं करता।
एजेंट सिस्टम प्रॉम्प्ट में बटन समर्थन दर्शाने के लिए, चैनल क्षमताओं में inlineButtons जोड़ें:
{ channels: { mattermost: { capabilities: ["inlineButtons"], }, },}जब कोई उपयोगकर्ता किसी बटन पर क्लिक करता है:
पहुँच जाँच
क्लिक करने वाले को संदेश प्रेषक जैसी ही DM/समूह नीति जाँच पास करनी होगी; अनधिकृत क्लिक को एक क्षणिक सूचना मिलती है और उन्हें अनदेखा कर दिया जाता है।
बटन पुष्टिकरण से बदले जाते हैं
सभी बटनों को एक पुष्टिकरण पंक्ति से बदल दिया जाता है (उदाहरण: "✓ Yes selected by @user")।
एजेंट को चयन प्राप्त होता है
एजेंट को चयन एक इनबाउंड संदेश (साथ में एक सिस्टम घटना) के रूप में प्राप्त होता है और वह उत्तर देता है।
कार्यान्वयन संबंधी टिप्पणियाँ
- बटन कॉलबैक HMAC-SHA256 सत्यापन का उपयोग करते हैं (स्वचालित, किसी कॉन्फ़िगरेशन की आवश्यकता नहीं)।
- क्लिक करने पर पूरा अटैचमेंट ब्लॉक बदल दिया जाता है, इसलिए सभी बटन एक साथ हटा दिए जाते हैं - आंशिक निष्कासन संभव नहीं है।
- हाइफ़न या अंडरस्कोर वाली क्रिया आईडी स्वचालित रूप से सैनिटाइज़ की जाती हैं (Mattermost रूटिंग सीमा)।
- ऐसे क्लिक जिनका
action_idमूल पोस्ट की किसी क्रिया से मेल नहीं खाता,403("अज्ञात क्रिया") के साथ अस्वीकार कर दिए जाते हैं।
कॉन्फ़िगरेशन और पहुँच-योग्यता
channels.mattermost.capabilities: क्षमता स्ट्रिंगों की सरणी। एजेंट सिस्टम प्रॉम्प्ट में बटन टूल का विवरण सक्षम करने के लिए"inlineButtons"जोड़ें।channels.mattermost.interactions.callbackBaseUrl: बटन कॉलबैक के लिए वैकल्पिक बाहरी आधार URL (उदाहरण के लिएhttps://gateway.example.com)। इसका उपयोग तब करें जब Mattermost, Gateway तक उसके बाइंड होस्ट पर सीधे नहीं पहुँच सकता।- बहु-खाता सेटअप में, आप यही फ़ील्ड
channels.mattermost.accounts.<id>.interactions.callbackBaseUrlके अंतर्गत भी सेट कर सकते हैं। - यदि
interactions.callbackBaseUrlछोड़ा गया है, तो OpenClaw कॉलबैक URL कोgateway.customBindHost+gateway.port(डिफ़ॉल्ट 18789) से प्राप्त करता है और फिरhttp://localhost:<port>का फ़ॉलबैक उपयोग करता है। कॉलबैक पथ/mattermost/interactions/<accountId>है। - पहुँच-योग्यता नियम: बटन कॉलबैक URL Mattermost सर्वर से पहुँच-योग्य होना चाहिए।
localhostकेवल तभी काम करता है जब Mattermost और OpenClaw एक ही होस्ट/नेटवर्क नेमस्पेस पर चलते हों। channels.mattermost.interactions.allowedSourceIps: बटन कॉलबैक के लिए स्रोत-IP अनुमति-सूची। इसके बिना केवल लूपबैक स्रोत (127.0.0.1,::1) स्वीकार किए जाते हैं, इसलिए दूरस्थ Mattermost सर्वर को यहाँ अनुमति-सूची में शामिल करना होगा, अन्यथा उसके क्लिक403के साथ अस्वीकार कर दिए जाएँगे। रिवर्स प्रॉक्सी के पीछे,gateway.trustedProxiesभी सेट करें, ताकि वास्तविक क्लाइंट IP अग्रेषित हेडर से प्राप्त किया जाए।- यदि आपका कॉलबैक लक्ष्य निजी/टेलनेट/आंतरिक है, तो उसके होस्ट/डोमेन को Mattermost
ServiceSettings.AllowedUntrustedInternalConnectionsमें जोड़ें।
प्रत्यक्ष API एकीकरण (बाहरी स्क्रिप्ट)
बाहरी स्क्रिप्ट और Webhook एजेंट के message टूल से गुज़रे बिना Mattermost REST API के माध्यम से सीधे बटन पोस्ट कर सकते हैं। OpenClaw के message टूल को प्राथमिकता दें। प्रत्यक्ष एकीकरण के लिए @openclaw/mattermost/api.js से buildButtonAttachments आयात करें; कच्चा JSON पोस्ट करते समय इन नियमों का पालन करें:
पेलोड संरचना:
{ channel_id: "<channelId>", message: "कोई विकल्प चुनें:", props: { attachments: [ { actions: [ { id: "mybutton01", // केवल अक्षरांकिक - नीचे देखें type: "button", // आवश्यक, अन्यथा क्लिक चुपचाप अनदेखे कर दिए जाते हैं name: "स्वीकृत करें", // प्रदर्शन लेबल style: "primary", // वैकल्पिक: "default", "primary", "danger" integration: { url: "https://gateway.example.com/mattermost/interactions/default", context: { action_id: "mybutton01", // बटन आईडी से मेल खाना चाहिए action: "approve", // ... कोई भी कस्टम फ़ील्ड ... _token: "<hmac>", // नीचे HMAC अनुभाग देखें }, }, }, ], }, ], },}HMAC टोकन जनरेशन
Gateway HMAC-SHA256 से बटन क्लिक का सत्यापन करता है। बाहरी स्क्रिप्ट को ऐसे टोकन जनरेट करने होंगे जो Gateway के सत्यापन लॉजिक से मेल खाते हों:
बॉट टोकन से सीक्रेट प्राप्त करें
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken), हेक्स-एन्कोडेड।
कॉन्टेक्स्ट ऑब्जेक्ट बनाएँ
_token को छोड़कर सभी फ़ील्ड के साथ कॉन्टेक्स्ट ऑब्जेक्ट बनाएँ।
क्रमबद्ध कुंजियों के साथ सीरियलाइज़ करें
पुनरावर्ती रूप से क्रमबद्ध कुंजियों और बिना स्पेस के सीरियलाइज़ करें (Gateway नेस्टेड ऑब्जेक्ट को भी कैननिकलाइज़ करता है और कॉम्पैक्ट JSON बनाता है)।
पेलोड पर हस्ताक्षर करें
HMAC-SHA256(key=secret, data=serializedContext)
टोकन जोड़ें
परिणामी हेक्स डाइजेस्ट को कॉन्टेक्स्ट में _token के रूप में जोड़ें।
Python उदाहरण:
secret = hmac.new( b"openclaw-mattermost-interactions", bot_token.encode(), hashlib.sha256).hexdigest() ctx = {"action_id": "mybutton01", "action": "approve"}payload = json.dumps(ctx, sort_keys=True, separators=(",", ":"))token = hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest() context = {**ctx, "_token": token}सामान्य HMAC समस्याएँ
- Python का
json.dumpsडिफ़ॉल्ट रूप से रिक्त स्थान जोड़ता है ({"key": "val"})। JavaScript के संक्षिप्त आउटपुट ({"key":"val"}) से मिलान करने के लिएseparators=(",", ":")का उपयोग करें। - हमेशा संदर्भ के सभी फ़ील्ड (
_tokenको छोड़कर) हस्ताक्षरित करें। Gateway_tokenको हटाता है, फिर शेष सभी चीज़ों को हस्ताक्षरित करता है। किसी उपसमुच्चय को हस्ताक्षरित करने से सत्यापन बिना किसी सूचना के विफल हो जाता है। sort_keys=Trueका उपयोग करें—Gateway हस्ताक्षर करने से पहले कुंजियों को क्रमबद्ध करता है और पेलोड संग्रहीत करते समय Mattermost संदर्भ फ़ील्ड का क्रम बदल सकता है।- सीक्रेट को रैंडम बाइट्स से नहीं, बल्कि बॉट टोकन से व्युत्पन्न करें (नियतात्मक रूप से)। बटन बनाने वाली प्रक्रिया और सत्यापन करने वाले Gateway, दोनों में सीक्रेट समान होना चाहिए।
डायरेक्टरी अडैप्टर
Mattermost Plugin में एक डायरेक्टरी अडैप्टर शामिल है, जो Mattermost API के माध्यम से चैनल और उपयोगकर्ता नामों को हल करता है। इससे openclaw message send और cron/webhook डिलीवरी में #channel-name तथा @username लक्ष्य सक्षम होते हैं।
किसी कॉन्फ़िगरेशन की आवश्यकता नहीं है—अडैप्टर अकाउंट कॉन्फ़िगरेशन से बॉट टोकन का उपयोग करता है।
एकाधिक अकाउंट
Mattermost, channels.mattermost.accounts के अंतर्गत एकाधिक अकाउंट का समर्थन करता है:
{ channels: { mattermost: { accounts: { default: { name: "Primary", botToken: "mm-token", baseUrl: "https://chat.example.com" }, alerts: { name: "Alerts", botToken: "mm-token-2", baseUrl: "https://alerts.example.com" }, }, }, },}अकाउंट के मान शीर्ष-स्तरीय फ़ील्ड को ओवरराइड करते हैं; कोई अकाउंट निर्दिष्ट न होने पर channels.mattermost.defaultAccount यह चुनता है कि किस अकाउंट का उपयोग किया जाए।
समस्या निवारण
चैनलों में कोई उत्तर नहीं
सुनिश्चित करें कि बॉट चैनल में है और उसका उल्लेख करें (oncall), ट्रिगर प्रीफ़िक्स का उपयोग करें (onchar), या chatmode: "onmessage" सेट करें।
प्रमाणीकरण या एकाधिक अकाउंट संबंधी त्रुटियाँ
- बॉट टोकन, आधार URL और अकाउंट सक्षम है या नहीं, इसकी जाँच करें।
- एकाधिक अकाउंट संबंधी समस्याएँ: पर्यावरण चर केवल
defaultअकाउंट पर लागू होते हैं। - निजी/LAN Mattermost होस्ट को
network.dangerouslyAllowPrivateNetwork: trueकी आवश्यकता होती है (SSRF सुरक्षा डिफ़ॉल्ट रूप से निजी IP को अवरुद्ध करती है)।
नेटिव स्लैश कमांड विफल होते हैं
Unauthorized: invalid command token.: OpenClaw ने कॉलबैक टोकन स्वीकार नहीं किया। सामान्य कारण:- स्टार्टअप पर स्लैश कमांड पंजीकरण विफल हुआ या केवल आंशिक रूप से पूरा हुआ
- कॉलबैक गलत Gateway/अकाउंट तक पहुँच रहा है
- Mattermost में अभी भी पुराने कमांड हैं, जो पिछले कॉलबैक लक्ष्य की ओर इंगित करते हैं
- Gateway स्लैश कमांड को दोबारा सक्रिय किए बिना पुनः आरंभ हुआ
- यदि नेटिव स्लैश कमांड काम करना बंद कर दें, तो लॉग में
mattermost: failed to register slash commandsयाmattermost: native slash commands enabled but no commands could be registeredकी जाँच करें। - यदि
callbackUrlछोड़ दिया गया है और लॉग चेतावनी देते हैं कि कॉलबैकhttp://localhost:18789/...जैसे लूपबैक URL में हल हुआ है, तो संभवतः वह URL केवल तभी पहुँच योग्य है जब Mattermost, OpenClaw के समान होस्ट/नेटवर्क नेमस्पेस पर चल रहा हो। इसके बजाय बाहरी रूप से पहुँच योग्य स्पष्टcommands.callbackUrlसेट करें।
बटन संबंधी समस्याएँ
- बटन सफ़ेद बॉक्स के रूप में दिखाई देते हैं या बिल्कुल दिखाई नहीं देते: बटन डेटा विकृत है। प्रत्येक प्रस्तुति बटन के लिए एक
labelऔर एकvalueआवश्यक है (इनमें से कोई भी न होने वाले बटन हटा दिए जाते हैं)। - बटन रेंडर होते हैं, लेकिन क्लिक करने पर कुछ नहीं होता: सत्यापित करें कि Mattermost सर्वर से Gateway तक पहुँचा जा सकता है, Mattermost सर्वर का IP
channels.mattermost.interactions.allowedSourceIpsमें शामिल है (इसके बिना केवल लूपबैक स्वीकार किया जाता है), और निजी लक्ष्यों के लिएServiceSettings.AllowedUntrustedInternalConnectionsमें कॉलबैक होस्ट शामिल है। - क्लिक करने पर बटन 404 लौटाते हैं: बटन के
idमें संभवतः हाइफ़न या अंडरस्कोर हैं। Mattermost का एक्शन राउटर गैर-अक्षरांकीय ID पर काम नहीं करता। केवल[a-zA-Z0-9]का उपयोग करें। - Gateway लॉग में
rejected callback source: क्लिकinteractions.allowedSourceIpsसे बाहर के IP से आया। Mattermost सर्वर या अपने इनग्रेस को अनुमति-सूची में जोड़ें और रिवर्स प्रॉक्सी के पीछेgateway.trustedProxiesसेट करें। - Gateway लॉग में
invalid _token: HMAC मेल नहीं खाता। जाँचें कि आपने सभी संदर्भ फ़ील्ड को हस्ताक्षरित किया है (केवल किसी उपसमुच्चय को नहीं), क्रमबद्ध कुंजियों का उपयोग किया है और संक्षिप्त JSON (रिक्त स्थान के बिना) का उपयोग किया है। ऊपर दिया गया HMAC अनुभाग देखें। - Gateway लॉग में
missing _token in context:_tokenफ़ील्ड बटन के संदर्भ में नहीं है। इंटीग्रेशन पेलोड बनाते समय सुनिश्चित करें कि इसे शामिल किया गया है। - Gateway
Unknown actionके साथ क्लिक अस्वीकार करता है:context.action_id, पोस्ट पर मौजूद किसी भी एक्शनidसे मेल नहीं खाता। दोनों को समान स्वच्छीकृत मान पर सेट करें। - एजेंट बटन प्रस्तुत नहीं करता: Mattermost चैनल कॉन्फ़िगरेशन में
capabilities: ["inlineButtons"]जोड़ें।
संबंधित
- चैनल रूटिंग—संदेशों के लिए सत्र रूटिंग
- चैनल का अवलोकन—सभी समर्थित चैनल
- समूह—समूह चैट का व्यवहार और उल्लेख नियंत्रण
- पेयरिंग—DM प्रमाणीकरण और पेयरिंग प्रवाह
- सुरक्षा—पहुँच मॉडल और सुदृढ़ीकरण