Installazione
- Registro npm
- Checkout locale
Configurazione rapida
Verificare che il plugin sia disponibile
@openclaw/mattermost con il comando precedente, quindi riavviare il Gateway se è già in esecuzione.Creare un bot Mattermost
Copiare l'URL di base
https://chat.example.com). Un eventuale /api/v4 finale viene rimosso automaticamente.Configurare OpenClaw e avviare il gateway
channels.mattermost.network.dangerouslyAllowPrivateNetwork: true (per account: channels.mattermost.accounts.<id>.network.dangerouslyAllowPrivateNetwork).Comandi slash nativi
I comandi slash nativi devono essere abilitati esplicitamente. Quando sono abilitati, OpenClaw registra i comandi slashoc_* in ogni team di cui il bot è membro e riceve le richieste POST di callback sul server HTTP del gateway.
/oc_status, /oc_model, /oc_models, /oc_new, /oc_help, /oc_think, /oc_reasoning, /oc_verbose, /oc_queue. Con nativeSkills: true, anche i comandi delle skill vengono registrati come /oc_<skill>.
Note sul comportamento
Note sul comportamento
nativeenativeSkillshanno come valore predefinito"auto", che per Mattermost viene interpretato come disabilitato. Impostarli esplicitamente sutrue.callbackPathha come valore predefinito/api/channels/mattermost/command.- Se
callbackUrlviene omesso, OpenClaw ricavahttp://<gateway.customBindHost or localhost>:<gateway.port, default 18789><callbackPath>. Per gli host di associazione con caratteri jolly (0.0.0.0,::) viene utilizzato come ripiegolocalhost. - Nelle configurazioni con più account,
commandspuò essere impostato al livello superiore o sottochannels.mattermost.accounts.<id>.commands(i valori dell’account prevalgono sui campi di livello superiore). - I comandi slash esistenti con lo stesso trigger, creati da altre integrazioni, non vengono modificati (la registrazione li ignora); i comandi creati dal bot vengono aggiornati o ricreati quando cambia l’URL di callback.
- Le callback dei comandi vengono convalidate con i token specifici di ciascun comando restituiti da Mattermost quando OpenClaw registra i comandi
oc_*. - OpenClaw aggiorna la registrazione corrente dei comandi Mattermost prima di accettare ogni callback; in questo modo, i token obsoleti di comandi slash eliminati o rigenerati non vengono più accettati senza dover riavviare il gateway.
- La convalida della callback non viene autorizzata se l’API di Mattermost non può confermare che il comando sia ancora corrente; le convalide non riuscite vengono memorizzate brevemente nella cache, le ricerche simultanee vengono accorpate e l’avvio di nuove ricerche viene limitato per comando per contenere la pressione degli attacchi di replay.
- Le callback slash non vengono autorizzate se la registrazione non è riuscita, l’avvio è stato parziale o il token della callback non corrisponde al token registrato del comando risolto (un token valido per un comando non può raggiungere la convalida a monte per un comando diverso).
- Le callback accettate ricevono una risposta temporanea “Elaborazione in corso…”; la risposta effettiva arriva come messaggio normale.
Requisito di raggiungibilità
Requisito di raggiungibilità
- Non impostare
callbackUrlsulocalhosta meno che Mattermost non sia in esecuzione sullo stesso host/spazio dei nomi di rete di OpenClaw. - Non impostare
callbackUrlsull’URL di base di Mattermost, a meno che tale URL non inoltri tramite proxy inverso/api/channels/mattermost/commanda OpenClaw. - Una verifica rapida consiste nell’usare
curl https://<gateway-host>/api/channels/mattermost/command; una richiesta GET deve restituire405 Method Not Allowedda OpenClaw, non404.
Elenco consentito per il traffico in uscita di Mattermost
Elenco consentito per il traffico in uscita di Mattermost
ServiceSettings.AllowedUntrustedInternalConnections di Mattermost in modo da includere l’host o il dominio della callback.Utilizzare voci host/dominio, non URL completi.- Corretto:
gateway.tailnet-name.ts.net - Errato:
https://gateway.tailnet-name.ts.net
Variabili di ambiente (account predefinito)
Se si preferiscono le variabili di ambiente, impostare quanto segue sull’host del gateway:MATTERMOST_BOT_TOKEN=...MATTERMOST_URL=https://chat.example.com
default). Gli altri account devono utilizzare i valori di configurazione.MATTERMOST_URL non può essere impostato da un .env dell’area di lavoro; vedere File .env dell’area di lavoro.Modalità di chat
Mattermost risponde automaticamente ai DM. Il comportamento nei canali è controllato dachatmode:
- oncall (predefinita)
- onmessage
- onchar
oncharrisponde comunque alle menzioni @ esplicite.channels.mattermost.requireMentionviene ancora rispettato, ma è preferibilechatmode. Le impostazionigroups.<channelId>.requireMentionspecifiche per canale prevalgono su entrambe.- Dopo che il bot invia una risposta visibile nel thread di un canale, ai messaggi successivi nello stesso thread viene risposto senza una nuova menzione @ o il prefisso
onchar, consentendo alle conversazioni multi-turno nel thread di proseguire. La partecipazione viene ricordata per 7 giorni dall’ultima risposta del bot nel thread e persiste dopo il riavvio del gateway. I thread che il bot ha solo osservato non sono interessati; per richiedere nuovamente una menzione esplicita, avviare un nuovo messaggio di primo livello.
Thread e sessioni
Utilizzarechannels.mattermost.replyToMode per controllare se le risposte nei canali e nei gruppi rimangono nel canale principale o avviano un thread sotto il post che le ha attivate.
off(valore predefinito): rispondere in un thread solo quando il post in ingresso si trova già in un thread.first: per i post di primo livello nei canali/gruppi, avviare un thread sotto il post e instradare la conversazione verso una sessione con ambito limitato al thread.allebatched: attualmente hanno lo stesso comportamento difirstper Mattermost, perché, una volta che Mattermost dispone di una radice del thread, i segmenti successivi e i contenuti multimediali continuano nello stesso thread.- Per impostazione predefinita, i messaggi diretti utilizzano
offanche quando è impostatoreplyToMode.
channels.mattermost.replyToModeByChatType per sostituire la modalità per le chat direct, group o channel. Impostare direct per abilitare i thread nei messaggi diretti:
off(valore predefinito): i messaggi diretti rimangono senza thread in un’unica sessione continua.first,allobatched: ogni messaggio diretto di primo livello avvia un thread Mattermost associato a una nuova sessione indipendente.
- Le sessioni con ambito limitato al thread utilizzano l’ID del post di attivazione come radice del thread.
firsteallsono attualmente equivalenti perché, una volta che Mattermost dispone di una radice del thread, i segmenti successivi e i contenuti multimediali continuano nello stesso thread.- Le sostituzioni per tipo di chat hanno la precedenza su
replyToMode. Senza una sostituzionedirect, le distribuzioni esistenti mantengono i DM lineari, senza thread.
Controllo degli accessi (DM)
- Valore predefinito:
channels.mattermost.dmPolicy = "pairing"(i mittenti sconosciuti ricevono un codice di associazione). Altri valori:allowlist,open,disabled. - Approvare tramite:
openclaw pairing list mattermostopenclaw pairing approve mattermost <CODE>
- DM pubblici:
channels.mattermost.dmPolicy="open"piùchannels.mattermost.allowFrom=["*"](lo schema di configurazione impone il carattere jolly). channels.mattermost.allowFromaccetta ID utente (consigliati) e vociaccessGroup:<name>. Vedere Gruppi di accesso.
Canali (gruppi)
- Valore predefinito:
channels.mattermost.groupPolicy = "allowlist"(accesso subordinato alla menzione). - Inserire i mittenti nell’elenco consentito con
channels.mattermost.groupAllowFrom(ID utente consigliati). channels.mattermost.groupAllowFromaccetta vociaccessGroup:<name>. Vedere Gruppi di accesso.- Le sostituzioni delle menzioni per canale si trovano sotto
channels.mattermost.groups.<channelId>.requireMention, oppure sottochannels.mattermost.groups["*"].requireMentionper un valore predefinito. - La corrispondenza
@usernameè modificabile ed è abilitata solo quandochannels.mattermost.dangerouslyAllowNameMatching: true. - Canali aperti:
channels.mattermost.groupPolicy="open"(accesso subordinato alla menzione). - Ordine di risoluzione:
channels.mattermost.groupPolicy, quindichannels.defaults.groupPolicy, quindi"allowlist". - Nota sul runtime: se la sezione
channels.mattermostè completamente assente, durante l’esecuzione i controlli dei gruppi non vengono autorizzati e viene applicatogroupPolicy="allowlist"(anche se è impostatochannels.defaults.groupPolicy), registrando un avviso una sola volta.
Destinazioni per l’invio in uscita
Utilizzare questi formati di destinazione conopenclaw message send o cron/webhook:
Nuovo tentativo per il canale DM
Quando OpenClaw invia a un destinatario DM di Mattermost e deve prima risolvere il canale diretto, per impostazione predefinita ritenta gli errori temporanei di creazione del canale diretto. Usarechannels.mattermost.dmChannelRetry per regolare questo comportamento globalmente per il plugin Mattermost oppure channels.mattermost.accounts.<id>.dmChannelRetry per un singolo account. Valori predefiniti:
- Questo si applica solo alla creazione del canale DM (
/api/v4/channels/direct), non a ogni chiamata API di Mattermost. - I nuovi tentativi usano un backoff esponenziale con jitter e si applicano agli errori temporanei, come limiti di frequenza, risposte 5xx ed errori di rete o timeout.
- Gli errori client 4xx diversi da
429sono considerati permanenti e non vengono ritentati.
Streaming dell’anteprima
Mattermost trasmette il ragionamento, l’attività degli strumenti e il testo parziale della risposta in un post di anteprima in bozza, che viene finalizzato sul posto quando la risposta definitiva può essere inviata in sicurezza. In modalitàpartial, l’anteprima viene aggiornata sullo stesso ID del post anziché riempire il canale di messaggi per ogni frammento. In modalità block, l’anteprima alterna blocchi di testo completato e di attività degli strumenti, in modo che i blocchi precedenti rimangano visibili come post separati invece di essere sovrascritti da quello successivo. Le risposte finali contenenti contenuti multimediali o errori annullano le modifiche dell’anteprima in sospeso e usano la consegna normale anziché pubblicare un post di anteprima usa e getta.
Lo streaming dell’anteprima è attivo per impostazione predefinita in modalità partial. Configurarlo tramite channels.mattermost.streaming.mode (i valori scalari/booleani legacy streaming vengono migrati da openclaw doctor --fix):
Modalità di streaming
Modalità di streaming
partial(predefinita): un singolo post di anteprima che viene modificato man mano che la risposta cresce, quindi finalizzato con la risposta completa.blockalterna l’anteprima tra blocchi di testo completato e di attività degli strumenti, in modo che ogni blocco rimanga visibile come post separato invece di essere sovrascritto sul posto. Gli aggiornamenti paralleli e consecutivi degli strumenti condividono il post corrente dell’attività degli strumenti.progressmostra un’anteprima dello stato durante la generazione e pubblica la risposta finale solo al completamento.offdisattiva lo streaming dell’anteprima. Constreaming.block.enabled: true, i blocchi completati dell’assistente vengono comunque consegnati come normali risposte a blocchi (post separati), anziché come un singolo post finale aggregato.
Note sul comportamento dello streaming
Note sul comportamento dello streaming
- Se lo stream non può essere finalizzato sul posto (ad esempio, se il post è stato eliminato durante lo streaming), OpenClaw ricorre all’invio di un nuovo post finale, così la risposta non viene mai persa.
- I payload contenenti solo il ragionamento vengono esclusi dai post del canale, incluso il testo che arriva come citazione
> Thinking. Impostare/reasoning onper visualizzare il ragionamento in altre superfici; il post finale di Mattermost contiene solo la risposta. - Consultare Streaming per la matrice di associazione dei canali.
Reazioni (strumento messaggi)
- Usare
message action=reactconchannel=mattermost. messageIdè l’ID del post Mattermost.emojiaccetta nomi comethumbsupo:+1:(i due punti sono facoltativi).- Impostare
remove=true(booleano) per rimuovere una reazione. - Gli eventi di aggiunta/rimozione delle reazioni vengono inoltrati come eventi di sistema alla sessione dell’agente instradata, nel rispetto degli stessi controlli dei criteri DM/gruppo applicati ai messaggi.
channels.mattermost.actions.reactions: abilita/disabilita le azioni di reazione (valore predefinito: true).- Override per account:
channels.mattermost.accounts.<id>.actions.reactions.
Pulsanti interattivi (strumento messaggi)
Inviare messaggi con pulsanti cliccabili. Quando un utente fa clic su un pulsante, l’agente riceve la selezione e può rispondere. I pulsanti provengono dal payload semanticopresentation (nelle normali risposte dell’agente e in message action=send). OpenClaw visualizza i pulsanti con valore come pulsanti interattivi di Mattermost, mantiene visibili i pulsanti URL nel testo del messaggio e converte i menu di selezione in testo leggibile.
text).callback_data, callbackData). Obbligatorio per un pulsante cliccabile, a meno che non sia impostato url.label: url nel corpo del messaggio anziché come pulsante interattivo.inlineButtons alle funzionalità del canale:
Controllo dell'accesso
Pulsanti sostituiti dalla conferma
L'agente riceve la selezione
Note sull'implementazione
Note sull'implementazione
- I callback dei pulsanti usano la verifica HMAC-SHA256 (automatica, non richiede configurazione).
- L’intero blocco dell’allegato viene sostituito al clic, pertanto tutti i pulsanti vengono rimossi insieme: la rimozione parziale non è possibile.
- Gli ID delle azioni contenenti trattini o caratteri di sottolineatura vengono normalizzati automaticamente (limitazione dell’instradamento di Mattermost).
- I clic il cui
action_idnon corrisponde a un’azione del post originale vengono rifiutati con403(“Azione sconosciuta”).
Configurazione e raggiungibilità
Configurazione e raggiungibilità
channels.mattermost.capabilities: array di stringhe di funzionalità. Aggiungere"inlineButtons"per abilitare la descrizione dello strumento dei pulsanti nel prompt di sistema dell’agente.channels.mattermost.interactions.callbackBaseUrl: URL di base esterno facoltativo per i callback dei pulsanti (ad esempiohttps://gateway.example.com). Usarlo quando Mattermost non può raggiungere direttamente il Gateway presso il relativo host di associazione.- Nelle configurazioni con più account, è possibile impostare lo stesso campo anche in
channels.mattermost.accounts.<id>.interactions.callbackBaseUrl. - Se
interactions.callbackBaseUrlviene omesso, OpenClaw deriva l’URL di callback dagateway.customBindHost+gateway.port(valore predefinito: 18789), quindi ricorre ahttp://localhost:<port>. Il percorso del callback è/mattermost/interactions/<accountId>. - Regola di raggiungibilità: l’URL di callback del pulsante deve essere raggiungibile dal server Mattermost.
localhostfunziona solo quando Mattermost e OpenClaw sono in esecuzione nello stesso host/spazio dei nomi di rete. channels.mattermost.interactions.allowedSourceIps: elenco degli IP di origine consentiti per i callback dei pulsanti. Senza di esso, vengono accettate solo le origini di loopback (127.0.0.1,::1); pertanto, un server Mattermost remoto deve essere aggiunto all’elenco qui, altrimenti i relativi clic vengono rifiutati con403. Dietro un proxy inverso, impostare anchegateway.trustedProxiesaffinché l’IP reale del client venga derivato dalle intestazioni inoltrate.- Se la destinazione del callback è privata, su tailnet o interna, aggiungerne l’host/dominio a
ServiceSettings.AllowedUntrustedInternalConnectionsdi Mattermost.
Integrazione API diretta (script esterni)
Gli script esterni e i webhook possono pubblicare pulsanti direttamente tramite l’API REST di Mattermost anziché passare dallo strumentomessage dell’agente. È preferibile usare lo strumento message di OpenClaw. Per le integrazioni dirette, importare buildButtonAttachments da @openclaw/mattermost/api.js; se si pubblica JSON non elaborato, seguire queste regole:
Struttura del payload:
Derivare il segreto dal token del bot
HMAC-SHA256(key="openclaw-mattermost-interactions", data=botToken), codificato in esadecimale.Creare l'oggetto di contesto
_token.Serializzare con le chiavi ordinate
Firmare il payload
HMAC-SHA256(key=secret, data=serializedContext)Aggiungere il token
_token nel contesto.Problemi comuni con HMAC
Problemi comuni con HMAC
json.dumpsdi Python aggiunge spazi per impostazione predefinita ({"key": "val"}). Usareseparators=(",", ":")per ottenere lo stesso output compatto di JavaScript ({"key":"val"}).- Firmare sempre tutti i campi del contesto (tranne
_token). Il Gateway rimuove_token, quindi firma tutti i campi rimanenti. La firma di un sottoinsieme causa un errore di verifica silenzioso. - Usare
sort_keys=True: il Gateway ordina le chiavi prima della firma e Mattermost potrebbe riordinare i campi del contesto quando archivia il payload. - Derivare il segreto dal token del bot (in modo deterministico), non da byte casuali. Il segreto deve essere lo stesso nel processo che crea i pulsanti e nel Gateway che esegue la verifica.
Adattatore della directory
Il Plugin Mattermost include un adattatore della directory che risolve i nomi dei canali e degli utenti tramite l’API di Mattermost. Ciò abilita le destinazioni#channel-name e @username in openclaw message send e nelle consegne Cron/Webhook.
Non è necessaria alcuna configurazione: l’adattatore usa il token del bot dalla configurazione dell’account.
Account multipli
Mattermost supporta più account inchannels.mattermost.accounts:
channels.mattermost.defaultAccount seleziona l’account da usare quando non ne viene specificato alcuno.
Risoluzione dei problemi
Nessuna risposta nei canali
Nessuna risposta nei canali
chatmode: "onmessage".Errori di autenticazione o relativi agli account multipli
Errori di autenticazione o relativi agli account multipli
- Controllare il token del bot, l’URL di base e che l’account sia abilitato.
- Problemi con gli account multipli: le variabili di ambiente si applicano solo all’account
default. - Gli host Mattermost privati/LAN richiedono
network.dangerouslyAllowPrivateNetwork: true(la protezione SSRF blocca per impostazione predefinita gli IP privati).
I comandi slash nativi non funzionano
I comandi slash nativi non funzionano
Unauthorized: invalid command token.: OpenClaw non ha accettato il token di callback. Cause tipiche:- la registrazione del comando slash non è riuscita o è stata completata solo parzialmente all’avvio
- il callback raggiunge il Gateway o l’account errato
- Mattermost contiene ancora vecchi comandi che puntano a una destinazione di callback precedente
- il Gateway è stato riavviato senza riattivare i comandi slash
- Se i comandi slash nativi smettono di funzionare, controllare nei log la presenza di
mattermost: failed to register slash commandsomattermost: native slash commands enabled but no commands could be registered. - Se
callbackUrlviene omesso e i log avvertono che il callback è stato risolto in un URL di loopback comehttp://localhost:18789/..., tale URL è probabilmente raggiungibile solo quando Mattermost viene eseguito nello stesso host o spazio dei nomi di rete di OpenClaw. Impostare invece uncommands.callbackUrlesplicito e raggiungibile dall’esterno.
Problemi con i pulsanti
Problemi con i pulsanti
- I pulsanti appaiono come riquadri bianchi o non appaiono affatto: i dati del pulsante non sono validi. Ogni pulsante di presentazione richiede un
labele unvalue(i pulsanti privi di uno dei due vengono ignorati). - I pulsanti vengono visualizzati, ma i clic non producono alcun effetto: verificare che il Gateway sia raggiungibile dal server Mattermost, che l’IP del server Mattermost sia incluso in
channels.mattermost.interactions.allowedSourceIps(senza questa impostazione viene accettato solo il loopback) e cheServiceSettings.AllowedUntrustedInternalConnectionsincluda l’host del callback per le destinazioni private. - I pulsanti restituiscono 404 al clic: il valore
iddel pulsante probabilmente contiene trattini o caratteri di sottolineatura. Il router delle azioni di Mattermost non funziona con ID non alfanumerici. Usare solo[a-zA-Z0-9]. - Il Gateway registra
rejected callback source: il clic proviene da un IP esterno ainteractions.allowedSourceIps. Aggiungere il server Mattermost o il punto di ingresso alla lista consentita e impostaregateway.trustedProxiesdietro un proxy inverso. - Il Gateway registra
invalid _token: mancata corrispondenza HMAC. Verificare di firmare tutti i campi del contesto (non un sottoinsieme), usare chiavi ordinate e JSON compatto (senza spazi). Consultare la sezione HMAC precedente. - Il Gateway registra
missing _token in context: il campo_tokennon è presente nel contesto del pulsante. Assicurarsi che sia incluso durante la creazione del payload dell’integrazione. - Il Gateway rifiuta il clic con
Unknown action:context.action_idnon corrisponde ad alcuniddi azione nel post. Impostare entrambi sullo stesso valore normalizzato. - L’agente non propone pulsanti: aggiungere
capabilities: ["inlineButtons"]alla configurazione del canale Mattermost.
Argomenti correlati
- Instradamento dei canali - instradamento delle sessioni per i messaggi
- Panoramica dei canali - tutti i canali supportati
- Gruppi - comportamento delle chat di gruppo e controllo tramite menzioni
- Associazione - autenticazione dei messaggi diretti e flusso di associazione
- Sicurezza - modello di accesso e rafforzamento della sicurezza