Developer and self-hosted
Mattermost
Durum: indirilebilir Plugin (bot belirteci + WebSocket olayları). Kanallar, gruplar ve DM'ler desteklenir. Mattermost, kendi sunucunuzda barındırılabilen bir ekip mesajlaşma platformudur; ürün ayrıntıları ve indirmeler için resmi siteye mattermost.com adresinden bakın.
Kurulum
Kanalı yapılandırmadan önce Mattermost'u kurun:
npm registry
openclaw plugins install @openclaw/mattermostLocal checkout
openclaw plugins install ./path/to/local/mattermost-pluginAyrıntılar: Plugins
Hızlı kurulum
Plugin'in kullanılabilir olduğundan emin olun
Yukarıdaki komutla @openclaw/mattermost yükleyin, ardından Gateway zaten çalışıyorsa yeniden başlatın.
Bir Mattermost botu oluşturun
Bir Mattermost bot hesabı oluşturun ve bot belirtecini kopyalayın.
Temel URL'yi kopyalayın
Mattermost temel URL'sini kopyalayın (ör. https://chat.example.com).
OpenClaw'u yapılandırın ve gateway'i başlatın
Minimal yapılandırma:
{ channels: { mattermost: { enabled: true, botToken: "mm-token", baseUrl: "https://chat.example.com", dmPolicy: "pairing", }, },}Yerel slash komutları
Yerel slash komutları isteğe bağlıdır. Etkinleştirildiğinde OpenClaw, Mattermost API'si üzerinden oc_* slash komutlarını kaydeder ve gateway HTTP sunucusunda callback POST'ları alır.
{ channels: { mattermost: { commands: { native: true, nativeSkills: true, callbackPath: "/api/channels/mattermost/command", // Use when Mattermost cannot reach the gateway directly (reverse proxy/public URL). callbackUrl: "https://gateway.example.com/api/channels/mattermost/command", }, }, },}Davranış notları
native: "auto"Mattermost için varsayılan olarak devre dışıdır. Etkinleştirmek içinnative: trueayarlayın.callbackUrlatlanırsa OpenClaw, gateway host/port +callbackPathüzerinden bir tane türetir.- Çok hesaplı kurulumlarda
commands, üst düzeyde veyachannels.mattermost.accounts.<id>.commandsaltında ayarlanabilir (hesap değerleri üst düzey alanları geçersiz kılar). - Komut callback'leri, OpenClaw
oc_*komutlarını kaydettiğinde Mattermost tarafından döndürülen komut başına belirteçlerle doğrulanır. - OpenClaw, her callback'i kabul etmeden önce geçerli Mattermost komut kaydını yeniler; böylece silinmiş veya yeniden oluşturulmuş slash komutlarından kalan eski belirteçler gateway yeniden başlatması olmadan kabul edilmez.
- Mattermost API'si komutun hâlâ güncel olduğunu doğrulayamazsa callback doğrulaması kapalı kalacak şekilde başarısız olur; başarısız doğrulamalar kısa süreliğine önbelleğe alınır, eşzamanlı aramalar birleştirilir ve yeniden oynatma baskısını sınırlamak için yeni arama başlangıçları komut başına hız sınırına tabi tutulur.
- Kayıt başarısız olduğunda, başlangıç kısmi olduğunda veya callback belirteci çözümlenen komutun kayıtlı belirteciyle eşleşmediğinde slash callback'leri kapalı kalacak şekilde başarısız olur (bir komut için geçerli olan belirteç, farklı bir komut için upstream doğrulamaya ulaşamaz).
Erişilebilirlik gereksinimi
Callback uç noktası Mattermost sunucusundan erişilebilir olmalıdır.
- Mattermost, OpenClaw ile aynı host/ağ ad alanında çalışmıyorsa
callbackUrldeğerinilocalhostolarak ayarlamayın. - Bu URL,
/api/channels/mattermost/commandyolunu OpenClaw'a reverse proxy yapmıyorsacallbackUrldeğerini Mattermost temel URL'niz olarak ayarlamayın. - Hızlı bir kontrol
curl https://<gateway-host>/api/channels/mattermost/commandkomutudur; GET, OpenClaw'dan404değil405 Method Not Alloweddöndürmelidir.
Mattermost çıkış izin listesi
Callback hedefiniz özel/tailnet/dahili adreslere gidiyorsa Mattermost ServiceSettings.AllowedUntrustedInternalConnections değerini callback host/domain'i içerecek şekilde ayarlayın.
Tam URL'ler değil, host/domain girdileri kullanın.
- İyi:
gateway.tailnet-name.ts.net - Kötü:
https://gateway.tailnet-name.ts.net
Ortam değişkenleri (varsayılan hesap)
Env var'ları tercih ediyorsanız bunları gateway host'unda ayarlayın:
MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
Sohbet modları
Mattermost DM'lere otomatik yanıt verir. Kanal davranışı chatmode ile kontrol edilir:
oncall (default)
Kanallarda yalnızca @bahsedildiğinde yanıt ver.
onmessage
Her kanal mesajına yanıt ver.
onchar
Bir mesaj tetikleyici önekle başladığında yanıt ver.
Yapılandırma örneği:
{ channels: { mattermost: { chatmode: "onchar", oncharPrefixes: [">", "!"], }, },}Notlar:
onchar, açık @bahsetmelere yine de yanıt verir.channels.mattermost.requireMentioneski yapılandırmalar için dikkate alınır ancakchatmodetercih edilir.- Bot bir kanal iş parçacığında görünür bir yanıt gönderdikten sonra, aynı iş parçacığındaki sonraki mesajlar yeni bir @bahsetme veya
oncharöneki olmadan yanıtlanır; böylece çok turlu iş parçacığı konuşmaları akmaya devam eder. Katılım, 7 günlük iş parçacığı hareketsizliği boyunca hatırlanır (her yanıtta yenilenir) ve gateway yeniden başlatmaları arasında kalıcıdır. Botun yalnızca gözlemlediği iş parçacıkları etkilenmez; yeniden açık bir bahsetme gerektirmek için yeni bir üst düzey mesaj başlatın.
İş parçacıkları ve oturumlar
Kanal ve grup yanıtlarının ana kanalda mı kalacağını yoksa tetikleyen gönderinin altında bir iş parçacığı mı başlatacağını kontrol etmek için channels.mattermost.replyToMode kullanın.
off(varsayılan): yalnızca gelen gönderi zaten bir iş parçacığındaysa bir iş parçacığında yanıt ver.first: üst düzey kanal/grup gönderileri için bu gönderinin altında bir iş parçacığı başlat ve konuşmayı iş parçacığı kapsamlı bir oturuma yönlendir.all: bugün Mattermost içinfirstile aynı davranış.- Doğrudan mesajlar bu ayarı yok sayar ve iş parçacığı kullanılmadan kalır.
Yapılandırma örneği:
{ channels: { mattermost: { replyToMode: "all", }, },}Notlar:
- İş parçacığı kapsamlı oturumlar, tetikleyen gönderi id'sini iş parçacığı kökü olarak kullanır.
firstveallşu anda eşdeğerdir çünkü Mattermost bir iş parçacığı köküne sahip olduğunda devam parçaları ve medya aynı iş parçacığında devam eder.
Erişim kontrolü (DM'ler)
- Varsayılan:
channels.mattermost.dmPolicy = "pairing"(bilinmeyen gönderenler bir eşleştirme kodu alır). - Şununla onaylayın:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- Herkese açık DM'ler:
channels.mattermost.dmPolicy="open"artıchannels.mattermost.allowFrom=["*"]. channels.mattermost.allowFrom,accessGroup:<name>girdilerini kabul eder. Bkz. Erişim grupları.
Kanallar (gruplar)
- Varsayılan:
channels.mattermost.groupPolicy = "allowlist"(bahsetme kapılı). - Gönderenleri
channels.mattermost.groupAllowFromile izin listesine alın (kullanıcı ID'leri önerilir). channels.mattermost.groupAllowFrom,accessGroup:<name>girdilerini kabul eder. Bkz. Erişim grupları.- Kanal başına bahsetme geçersiz kılmaları
channels.mattermost.groups.<channelId>.requireMentionaltında veya varsayılan içinchannels.mattermost.groups["*"].requireMentionaltında bulunur. @usernameeşleştirmesi değişkendir ve yalnızcachannels.mattermost.dangerouslyAllowNameMatching: trueolduğunda etkinleştirilir.- Açık kanallar:
channels.mattermost.groupPolicy="open"(bahsetme kapılı). - Çalışma zamanı notu:
channels.mattermosttamamen eksikse çalışma zamanı, grup kontrolleri içingroupPolicy="allowlist"değerine geri döner (channels.defaults.groupPolicyayarlanmış olsa bile).
Örnek:
{ channels: { mattermost: { groupPolicy: "open", groups: { "*": { requireMention: true }, "team-channel-id": { requireMention: false }, }, }, },}Giden teslimat hedefleri
Bu hedef biçimlerini openclaw message send veya Cron/Webhook'lar ile kullanın:
- Bir kanal için
channel:<id> - Bir DM için
user:<id> - Bir DM için
@username(Mattermost API'si üzerinden çözümlenir)
DM kanalı yeniden denemesi
OpenClaw bir Mattermost DM hedefine gönderirken önce doğrudan kanalı çözmesi gerektiğinde, varsayılan olarak geçici doğrudan kanal oluşturma hatalarını yeniden dener.
Bu davranışı Mattermost Plugin'i için genel olarak ayarlamak üzere channels.mattermost.dmChannelRetry kullanın veya tek bir hesap için channels.mattermost.accounts.<id>.dmChannelRetry kullanın.
{ channels: { mattermost: { dmChannelRetry: { maxRetries: 3, initialDelayMs: 1000, maxDelayMs: 10000, timeoutMs: 30000, }, }, },}Notlar:
- Bu yalnızca DM kanalı oluşturma (
/api/v4/channels/direct) için geçerlidir, her Mattermost API çağrısı için değil. - Yeniden denemeler hız sınırları, 5xx yanıtları ve ağ veya zaman aşımı hataları gibi geçici hatalara uygulanır.
429dışındaki 4xx istemci hataları kalıcı kabul edilir ve yeniden denenmez.
Önizleme akışı
Mattermost düşünme, araç etkinliği ve kısmi yanıt metnini tek bir taslak önizleme gönderisine aktarır; son yanıt gönderilmeye güvenli olduğunda bu gönderi yerinde kesinleşir. Önizleme, kanalı parça başına mesajlarla doldurmak yerine aynı gönderi id'si üzerinde güncellenir. Medya/hata nihai sonuçları bekleyen önizleme düzenlemelerini iptal eder ve tek kullanımlık bir önizleme gönderisini boşaltmak yerine normal teslimatı kullanır.
channels.mattermost.streaming üzerinden etkinleştirin:
{ channels: { mattermost: { streaming: "partial", // off | partial | block | progress }, },}Akış modları
partialolağan seçimdir: yanıt büyüdükçe düzenlenen, ardından tam yanıtla kesinleştirilen tek bir önizleme gönderisi.block, önizleme gönderisi içinde ekleme tarzı taslak parçaları kullanır.progress, oluşturma sırasında bir durum önizlemesi gösterir ve yalnızca tamamlandığında son yanıtı gönderir.off, önizleme akışını devre dışı bırakır.
Akış davranışı notları
- Akış yerinde kesinleştirilemiyorsa (örneğin gönderi akış ortasında silindiyse), OpenClaw yanıtın asla kaybolmaması için yeni bir nihai gönderi göndermeye geri döner.
- Yalnızca düşünme içeren yükler,
> Thinkingblok alıntısı olarak gelen metin dahil kanal gönderilerinden bastırılır. Diğer yüzeylerde düşünmeyi görmek için/reasoning onayarlayın; Mattermost nihai gönderisi yalnızca yanıtı tutar. - Kanal eşleme matrisi için bkz. Akış.
Tepkiler (mesaj aracı)
channel=mattermostilemessage action=reactkullanın.messageId, Mattermost gönderi id'sidir.emoji,thumbsupveya:+1:gibi adları kabul eder (iki nokta üst üste isteğe bağlıdır).- Bir tepkiyi kaldırmak için
remove=true(boolean) ayarlayın. - Tepki ekleme/kaldırma olayları, yönlendirilen ajan oturumuna sistem olayları olarak iletilir.
Örnekler:
message action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsupmessage action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsup remove=trueYapılandırma:
channels.mattermost.actions.reactions: tepki eylemlerini etkinleştir/devre dışı bırak (varsayılan true).- Hesap başına geçersiz kılma:
channels.mattermost.accounts.<id>.actions.reactions.
Etkileşimli düğmeler (mesaj aracı)
Tıklanabilir düğmelerle mesajlar gönderin. Bir kullanıcı bir düğmeye tıkladığında ajan seçimi alır ve yanıt verebilir.
Normal ajan yanıtları anlamsal presentation yükleri de içerebilir. OpenClaw, değer düğmelerini Mattermost etkileşimli düğmeleri olarak işler, URL düğmelerini ileti metninde görünür tutar ve seçim menülerini okunabilir metne düşürür.
Kanal yeteneklerine inlineButtons ekleyerek düğmeleri etkinleştirin:
{ channels: { mattermost: { capabilities: ["inlineButtons"], }, },}buttons parametresiyle message action=send kullanın. Düğmeler 2B dizidir (düğme satırları):
message action=send channel=mattermost target=channel:<channelId> buttons=[[{"text":"Yes","callback_data":"yes"},{"text":"No","callback_data":"no"}]]Düğme alanları:
textstringrequiredGörünen etiket.
callback_datastringrequiredTıklamada geri gönderilen değer (eylem kimliği olarak kullanılır).
style"default" | "primary" | "danger"Düğme stili.
Bir kullanıcı bir düğmeye tıkladığında:
Düğmeler onayla değiştirilir
Tüm düğmeler bir onay satırıyla değiştirilir (örn. "✓ Yes selected by @user").
Ajan seçimi alır
Ajan seçimi gelen ileti olarak alır ve yanıtlar.
Uygulama notları
- Düğme geri çağırmaları HMAC-SHA256 doğrulaması kullanır (otomatik, yapılandırma gerekmez).
- Mattermost, API yanıtlarından geri çağırma verilerini çıkarır (güvenlik özelliği), bu nedenle tıklamada tüm düğmeler kaldırılır - kısmi kaldırma mümkün değildir.
- Tire veya alt çizgi içeren eylem kimlikleri otomatik olarak temizlenir (Mattermost yönlendirme sınırlaması).
Yapılandırma ve erişilebilirlik
channels.mattermost.capabilities: yetenek dizelerinin dizisi. Ajan sistem isteminde düğmeler aracı açıklamasını etkinleştirmek için"inlineButtons"ekleyin.channels.mattermost.interactions.callbackBaseUrl: düğme geri çağırmaları için isteğe bağlı harici temel URL (örneğinhttps://gateway.example.com). Mattermost, Gateway'e bağlandığı host üzerinden doğrudan erişemediğinde bunu kullanın.- Çok hesaplı kurulumlarda, aynı alanı
channels.mattermost.accounts.<id>.interactions.callbackBaseUrlaltında da ayarlayabilirsiniz. interactions.callbackBaseUrlatlanırsa OpenClaw, geri çağırma URL'sinigateway.customBindHost+gateway.portüzerinden türetir, ardındanhttp://localhost:<port>değerine geri döner.- Erişilebilirlik kuralı: düğme geri çağırma URL'si Mattermost sunucusundan erişilebilir olmalıdır.
localhostyalnızca Mattermost ve OpenClaw aynı host/ağ ad alanında çalıştığında işe yarar. - Geri çağırma hedefiniz özel/tailnet/dahili ise, host'unu/alan adını Mattermost
ServiceSettings.AllowedUntrustedInternalConnectionsalanına ekleyin.
Doğrudan API entegrasyonu (harici betikler)
Harici betikler ve Webhook'lar, ajanın message aracından geçmek yerine düğmeleri doğrudan Mattermost REST API üzerinden gönderebilir. Mümkün olduğunda Plugin'den buildButtonAttachments() kullanın; ham JSON gönderiyorsanız şu kuralları izleyin:
Yük yapısı:
{ channel_id: "<channelId>", message: "Choose an option:", props: { attachments: [ { actions: [ { id: "mybutton01", // yalnızca alfanümerik - aşağıya bakın type: "button", // zorunlu, yoksa tıklamalar sessizce yok sayılır name: "Approve", // görünen etiket style: "primary", // isteğe bağlı: "default", "primary", "danger" integration: { url: "https://gateway.example.com/mattermost/interactions/default", context: { action_id: "mybutton01", // düğme kimliğiyle eşleşmelidir (ad araması için) action: "approve", // ... özel alanlar ... _token: "<hmac>", // aşağıdaki HMAC bölümüne bakın }, }, }, ], }, ], },}HMAC belirteci oluşturma
Gateway, düğme tıklamalarını HMAC-SHA256 ile doğrular. Harici betikler, Gateway'in doğrulama mantığıyla eşleşen belirteçler oluşturmalıdır:
Gizli anahtarı bot belirtecinden türetin
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken)
Bağlam nesnesini oluşturun
Bağlam nesnesini _token hariç tüm alanlarla oluşturun.
Sıralanmış anahtarlarla serileştirin
Sıralanmış anahtarlar ve boşluksuz serileştirin (Gateway, kompakt çıktı üreten sıralı anahtarlarla JSON.stringify kullanır).
Yükü imzalayın
HMAC-SHA256(key=secret, data=serializedContext)
Belirteci ekleyin
Ortaya çıkan hex özeti bağlama _token olarak ekleyin.
Python örneği:
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}Yaygın HMAC sorunları
- Python'un
json.dumpsişlevi varsayılan olarak boşluk ekler ({"key": "val"}). JavaScript'in kompakt çıktısıyla ({"key":"val"}) eşleşmek içinseparators=(",", ":")kullanın. - Her zaman tüm bağlam alanlarını (
_tokenhariç) imzalayın. Gateway_tokenalanını çıkarır ve kalan her şeyi imzalar. Bir alt kümeyi imzalamak sessiz doğrulama hatasına neden olur. sort_keys=Truekullanın - Gateway imzalamadan önce anahtarları sıralar ve Mattermost yükü depolarken bağlam alanlarını yeniden sıralayabilir.- Gizli anahtarı rastgele baytlardan değil, bot belirtecinden türetin (deterministik). Gizli anahtar, düğmeleri oluşturan süreç ile doğrulayan Gateway arasında aynı olmalıdır.
Dizin bağdaştırıcısı
Mattermost Plugin'i, Mattermost API aracılığıyla kanal ve kullanıcı adlarını çözen bir dizin bağdaştırıcısı içerir. Bu, openclaw message send ve Cron/Webhook teslimatlarında #channel-name ve @username hedeflerini etkinleştirir.
Yapılandırma gerekmez - bağdaştırıcı, hesap yapılandırmasındaki bot belirtecini kullanır.
Çoklu hesap
Mattermost, channels.mattermost.accounts altında birden çok hesabı destekler:
{ 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" }, }, }, },}Sorun giderme
Kanallarda yanıt yok
Botun kanalda olduğundan emin olun ve ondan bahsedin (oncall), bir tetikleyici öneki kullanın (onchar) veya chatmode: "onmessage" ayarlayın.
Kimlik doğrulama veya çoklu hesap hataları
- Bot belirtecini, temel URL'yi ve hesabın etkin olup olmadığını kontrol edin.
- Çoklu hesap sorunları: env var'lar yalnızca
defaulthesabına uygulanır.
Yerel eğik çizgi komutları başarısız oluyor
Unauthorized: invalid command token.: OpenClaw geri çağırma belirtecini kabul etmedi. Tipik nedenler:- eğik çizgi komut kaydı başlangıçta başarısız oldu veya yalnızca kısmen tamamlandı
- geri çağırma yanlış Gateway/hesaba ulaşıyor
- Mattermost hâlâ önceki bir geri çağırma hedefine işaret eden eski komutlara sahip
- Gateway, eğik çizgi komutlarını yeniden etkinleştirmeden yeniden başlatıldı
- Yerel eğik çizgi komutları çalışmayı durdurursa günlüklerde
mattermost: failed to register slash commandsveyamattermost: native slash commands enabled but no commands could be registeredarayın. callbackUrlatlanmışsa ve günlükler geri çağırmanınhttp://127.0.0.1:18789/...olarak çözüldüğü konusunda uyarıyorsa, bu URL muhtemelen yalnızca Mattermost, OpenClaw ile aynı host/ağ ad alanında çalıştığında erişilebilirdir. Bunun yerine açıkça harici olarak erişilebilir bircommands.callbackUrlayarlayın.
Düğme sorunları
- Düğmeler beyaz kutular olarak görünür: ajan hatalı biçimlendirilmiş düğme verileri gönderiyor olabilir. Her düğmede hem
texthem decallback_dataalanlarının bulunduğunu kontrol edin. - Düğmeler işleniyor ancak tıklamalar hiçbir şey yapmıyor: Mattermost sunucu yapılandırmasında
AllowedUntrustedInternalConnectionsdeğerinin127.0.0.1 localhostiçerdiğini ve ServiceSettings içindeEnablePostActionIntegrationdeğerinintrueolduğunu doğrulayın. - Düğmeler tıklamada 404 döndürüyor: düğme
iddeğeri büyük olasılıkla tire veya alt çizgi içeriyor. Mattermost'un eylem yönlendiricisi alfanümerik olmayan kimliklerde bozulur. Yalnızca[a-zA-Z0-9]kullanın. - Gateway günlüklerinde
invalid _token: HMAC uyuşmazlığı. Tüm bağlam alanlarını (bir alt küme değil) imzaladığınızı, sıralı anahtarlar kullandığınızı ve kompakt JSON (boşluksuz) kullandığınızı kontrol edin. Yukarıdaki HMAC bölümüne bakın. - Gateway günlüklerinde
missing _token in context:_tokenalanı düğmenin bağlamında yok. Entegrasyon yükünü oluştururken dahil edildiğinden emin olun. - Onay, düğme adı yerine ham kimliği gösteriyor:
context.action_id, düğmeniniddeğeriyle eşleşmiyor. Her ikisini de aynı temizlenmiş değere ayarlayın. - Ajan düğmelerden haberdar değil: Mattermost kanal yapılandırmasına
capabilities: ["inlineButtons"]ekleyin.
İlgili
- Kanal Yönlendirme - iletiler için oturum yönlendirmesi
- Kanallara Genel Bakış - desteklenen tüm kanallar
- Gruplar - grup sohbeti davranışı ve bahsetme kapısı
- Eşleştirme - DM kimlik doğrulaması ve eşleştirme akışı
- Güvenlik - erişim modeli ve sertleştirme