Developer and self-hosted
Mattermost
Status: indirilebilir Plugin (bot token'ı + WebSocket olayları). Kanallar, gruplar ve DM'ler desteklenir. Mattermost, kendi ortamınızda barındırılabilen bir ekip mesajlaşma platformudur; ürün ayrıntıları ve indirmeler için mattermost.com adresindeki resmi siteye bakın.
Yükleme
Kanalı yapılandırmadan önce Mattermost'u yükleyin:
npm kayıt deposu
openclaw plugins install @openclaw/mattermost
Yerel checkout
openclaw plugins install ./path/to/local/mattermost-plugin
Ayrıntılar: Pluginler
Hızlı kurulum
Plugin'in kullanılabilir olduğundan emin olun
Geçerli paketlenmiş OpenClaw sürümleri bunu zaten birlikte sunar. Daha eski/özel yüklemeler, yukarıdaki komutlarla bunu elle ekleyebilir.
Bir Mattermost botu oluşturun
Bir Mattermost bot hesabı oluşturun ve bot token'ını kopyalayın.
Temel URL'yi kopyalayın
Mattermost temel URL'sini kopyalayın (örn. https://chat.example.com).
OpenClaw'ı yapılandırın ve Gateway'i başlatın
Minimum 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 ü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",
// Mattermost Gateway'e doğrudan ulaşamadığında kullanın (ters proxy/herkese açık 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 +callbackPathdeğerinden 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 token'larla doğrulanır. - OpenClaw, her callback'i kabul etmeden önce mevcut Mattermost komut kaydını yeniler; böylece silinen veya yeniden oluşturulan slash komutlarından kalan eski token'lar Gateway yeniden başlatılmadan kabul edilmeyi bırakır.
- Mattermost API komutun hâlâ güncel olduğunu doğrulayamazsa callback doğrulaması kapalı ş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 yeni arama başlangıçları tekrar baskısını sınırlamak için 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 token'ı çözümlenen komutun kayıtlı token'ıyla eşleşmediğinde slash callback'leri kapalı şekilde başarısız olur (bir komut için geçerli olan token, farklı bir komut için upstream doğrulamaya ulaşamaz).
Erişilebilirlik gereksinimi
Callback uç noktasına Mattermost sunucusundan erişilebilmelidir.
- Mattermost, OpenClaw ile aynı host/ağ ad alanında çalışmıyorsa
callbackUrldeğerinilocalhostolarak ayarlamayın. - Bu URL
/api/channels/mattermost/commandyolunu OpenClaw'a ters proxy ile yönlendirmiyorsacallbackUrldeğerini Mattermost temel URL'niz olarak ayarlamayın. - Hızlı bir kontrol
curl https://<gateway-host>/api/channels/mattermost/commandkomutudur; bir GET,404değil OpenClaw'dan405 Method Not Alloweddöndürmelidir.
Mattermost çıkış izin listesi
Callback hedefiniz özel/tailnet/dahili adreslerse Mattermost ServiceSettings.AllowedUntrustedInternalConnections değerini callback host/domain'ini içerecek şekilde ayarlayın.
Tam URL'ler değil, host/domain girişleri 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 olarak yanıt verir. Kanal davranışı chatmode ile denetlenir:
oncall (varsayılan)
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 yanıt verir.channels.mattermost.requireMentioneski yapılandırmalar için desteklenir, ancakchatmodetercih edilir.
İş 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ı denetlemek için channels.mattermost.replyToMode kullanın.
off(varsayılan): yalnızca gelen gönderi zaten bir iş parçacığındaysa iş parçacığında yanıt ver.first: üst düzey kanal/grup gönderileri için, o 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 kimliğini 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, takip parçaları ve medya aynı iş parçacığında devam eder.
Erişim denetimi (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=["*"].
Kanallar (gruplar)
- Varsayılan:
channels.mattermost.groupPolicy = "allowlist"(bahsetme kapılı). - Gönderenleri
channels.mattermost.groupAllowFromile izin listesine ekleyin (kullanıcı ID'leri önerilir). - Kanal başına bahsetme geçersiz kılmaları, varsayılan için
channels.mattermost.groups.<channelId>.requireMentionveyachannels.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 için hedefler
Bu hedef biçimlerini openclaw message send veya Cron/Webhook'larla kullanın:
- Bir kanal için
channel:<id> - Bir DM için
user:<id> - Bir DM için
@username(Mattermost API üzerinden çözümlenir)
DM kanalı yeniden denemesi
OpenClaw bir Mattermost DM hedefine gönderirken önce doğrudan kanalı çözümlemesi gerektiğinde, geçici doğrudan kanal oluşturma hatalarını varsayılan olarak yeniden dener.
Bu davranışı Mattermost Plugin'i için genel olarak ayarlamak üzere channels.mattermost.dmChannelRetry 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şturmaya (
/api/v4/channels/direct) uygulanır, her Mattermost API çağrısına 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üşünmeyi, araç etkinliğini ve kısmi yanıt metnini, son yanıt göndermek için güvenli olduğunda yerinde tamamlanan tek bir taslak önizleme gönderisine aktarır. Önizleme, kanalı parça başına mesajlarla doldurmak yerine aynı gönderi kimliği üzerinde güncellenir. Medya/hata sonları 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 ve ardından tam yanıtla sonlandırılan tek bir önizleme gönderisi.block, önizleme gönderisinin 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 sonlandırılamazsa (örneğin gönderi akış ortasında silindiyse), OpenClaw yanıtın asla kaybolmaması için yeni bir son gönderi göndermeye geri döner.
- Yalnızca akıl yürütme yükleri,
> Reasoning:blok alıntısı olarak gelen metin dahil olmak üzere kanal gönderilerinden bastırılır. Düşünmeyi diğer yüzeylerde görmek için/reasoning onayarlayın; Mattermost son 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 kimliğidir.emoji,thumbsupveya:+1:gibi adları kabul eder (iki nokta 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=thumbsup
message action=react channel=mattermost target=channel:<channelId> messageId=<postId> emoji=thumbsup remove=true
Yapı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üğmeler içeren mesajlar gönderin. Bir kullanıcı bir düğmeye tıkladığında ajan seçimi alır ve yanıt verebilir.
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üntülenecek 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").
Aracı seçimi alır
Aracı 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 yüzden tıklamada tüm düğmeler kaldırılır - kısmi kaldırma mümkün değildir.
- Kısa çizgi 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 dizelerinden oluşan dizi. Aracı sistem isteminde düğmeler araç 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'sine Mattermost sunucusundan erişilebilmelidir.
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/alan adını Mattermost
ServiceSettings.AllowedUntrustedInternalConnectionslistesine ekleyin.
Doğrudan API entegrasyonu (harici betikler)
Harici betikler ve Webhook'lar, aracının message aracı üzerinden gitmek yerine düğmeleri doğrudan Mattermost REST API aracılığıyla 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", // alphanumeric only - see below
type: "button", // required, or clicks are silently ignored
name: "Approve", // display label
style: "primary", // optional: "default", "primary", "danger"
integration: {
url: "https://gateway.example.com/mattermost/interactions/default",
context: {
action_id: "mybutton01", // must match button id (for name lookup)
action: "approve",
// ... any custom fields ...
_token: "<hmac>", // see HMAC section below
},
},
},
],
},
],
},
}
HMAC token üretimi
Gateway, düğme tıklamalarını HMAC-SHA256 ile doğrular. Harici betikler, Gateway'in doğrulama mantığıyla eşleşen token'lar üretmelidir:
Gizli değeri bot token'ından 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ış anahtarlarla ve boşluksuz serileştirin (Gateway, sıralanmış anahtarlarla JSON.stringify kullanır; bu da kompakt çıktı üretir).
Yükü imzalayın
HMAC-SHA256(key=secret, data=serializedContext)
Token'ı ekleyin
Ortaya çıkan onaltılık özeti bağlam içinde _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'ın
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. - Bağlam alanlarının tümünü (
_tokenhariç) her zaman imzalayın. Gateway_tokendeğerini çıkarır, ardından kalan her şeyi imzalar. Bir alt kümenin imzalanması sessiz doğrulama hatasına neden olur. sort_keys=Truekullanın - Gateway imzalamadan önce anahtarları sıralar ve Mattermost yükü saklarken bağlam alanlarını yeniden sıralayabilir.- Gizli değeri rastgele baytlardan değil, bot token'ından türetin (deterministik). Gizli değer, düğmeleri oluşturan süreçte ve doğrulayan Gateway'de aynı olmalıdır.
Dizin adaptörü
Mattermost Plugin'i, kanal ve kullanıcı adlarını Mattermost API aracılığıyla çözen bir dizin adaptörü içerir. Bu, openclaw message send ve Cron/Webhook teslimatlarında #channel-name ve @username hedeflerini etkinleştirir.
Yapılandırma gerekmez - adaptör hesap yapılandırmasındaki bot token'ını kullanır.
Çok hesap
Mattermost, channels.mattermost.accounts altında birden fazla 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 çok hesap hataları
- Bot token'ını, temel URL'yi ve hesabın etkin olup olmadığını kontrol edin.
- Çok hesap sorunları: ortam değişkenleri yalnızca
defaulthesabı için geçerlidir.
Yerel eğik çizgi komutları başarısız oluyor
Unauthorized: invalid command token.: OpenClaw geri çağırma token'ını kabul etmedi. Tipik nedenler:- eğik çizgi komutu kaydı başlangıçta başarısız oldu veya yalnızca kısmen tamamlandı
- geri çağırma yanlış Gateway/hesaba gidiyor
- 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. callbackUrlatlanırsa ve günlükler geri çağırmanınhttp://127.0.0.1:18789/...olarak çözüldüğüne dair uyarı verirse, bu URL'ye büyük olasılıkla yalnızca Mattermost, OpenClaw ile aynı host/ağ ad alanında çalıştığında erişilebilir. Bunun yerine açıkça harici olarak erişilebilir bircommands.callbackUrlayarlayın.
Düğme sorunları
- Düğmeler beyaz kutular olarak görünüyor: aracı hatalı biçimlendirilmiş düğme verisi 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ındaki
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 muhtemelen kısa çizgi 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ıralanmış 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 bunun dahil edildiğinden emin olun. - Onay düğme adı yerine ham kimlik gösteriyor:
context.action_id, düğmeniniddeğeriyle eşleşmiyor. Her ikisini de aynı temizlenmiş değere ayarlayın. - Aracı 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 sağlamlaştırma