Gateway
Konfiguracja — kanały
Klucze konfiguracji poszczególnych kanałów pod channels.*. Obejmuje dostęp do DM i grup,
konfiguracje wielu kont, bramkowanie wzmianek oraz klucze poszczególnych kanałów dla Slack, Discord,
Telegram, WhatsApp, Matrix, iMessage i pozostałych dołączonych wtyczek kanałów.
Informacje o agentach, narzędziach, środowisku uruchomieniowym Gateway i innych kluczach najwyższego poziomu znajdziesz w Dokumentacji konfiguracji.
Kanały
Każdy kanał uruchamia się automatycznie, gdy istnieje jego sekcja konfiguracji (chyba że ustawiono enabled: false).
Dostęp do DM i grup
Wszystkie kanały obsługują zasady DM i zasady grup:
| Zasada DM | Zachowanie |
|---|---|
pairing (domyślna) |
Nieznani nadawcy otrzymują jednorazowy kod parowania; właściciel musi zatwierdzić |
allowlist |
Tylko nadawcy z allowFrom (lub ze sparowanego magazynu zezwoleń) |
open |
Zezwala na wszystkie przychodzące DM (wymaga allowFrom: ["*"]) |
disabled |
Ignoruje wszystkie przychodzące DM |
| Zasada grupy | Zachowanie |
|---|---|
allowlist (domyślna) |
Tylko grupy pasujące do skonfigurowanej listy zezwoleń |
open |
Pomija listy zezwoleń grup (bramkowanie wzmianek nadal obowiązuje) |
disabled |
Blokuje wszystkie wiadomości grup/pokoi |
Nadpisania modelu kanału
Użyj channels.modelByChannel, aby przypiąć konkretne identyfikatory kanałów do modelu. Wartości akceptują provider/model lub skonfigurowane aliasy modeli. Mapowanie kanału ma zastosowanie, gdy sesja nie ma już nadpisania modelu (na przykład ustawionego przez /model).
{
channels: {
modelByChannel: {
discord: {
"123456789012345678": "anthropic/claude-opus-4-6",
},
slack: {
C1234567890: "openai/gpt-4.1",
},
telegram: {
"-1001234567890": "openai/gpt-4.1-mini",
"-1001234567890:topic:99": "anthropic/claude-sonnet-4-6",
},
},
},
}
Domyślne ustawienia kanałów i Heartbeat
Użyj channels.defaults dla współdzielonych zasad grup i zachowania Heartbeat między dostawcami:
{
channels: {
defaults: {
groupPolicy: "allowlist", // open | allowlist | disabled
contextVisibility: "all", // all | allowlist | allowlist_quote
heartbeat: {
showOk: false,
showAlerts: true,
useIndicator: true,
},
},
},
}
channels.defaults.groupPolicy: zastępcza zasada grup, gdygroupPolicyna poziomie dostawcy nie jest ustawione.channels.defaults.contextVisibility: domyślny tryb widoczności dodatkowego kontekstu dla wszystkich kanałów. Wartości:all(domyślnie, uwzględnia cały cytowany/wątkowy/historyczny kontekst),allowlist(uwzględnia tylko kontekst od nadawców z listy zezwoleń),allowlist_quote(tak samo jak allowlist, ale zachowuje jawny kontekst cytatu/odpowiedzi). Nadpisanie dla kanału:channels.<channel>.contextVisibility.channels.defaults.heartbeat.showOk: uwzględnia prawidłowe statusy kanałów w wyjściu Heartbeat.channels.defaults.heartbeat.showAlerts: uwzględnia statusy zdegradowane/błędów w wyjściu Heartbeat.channels.defaults.heartbeat.useIndicator: renderuje kompaktowe wyjście Heartbeat w stylu wskaźnika.
WhatsApp działa przez kanał web Gateway (Baileys Web). Uruchamia się automatycznie, gdy istnieje połączona sesja.
{
web: {
enabled: true,
heartbeatSeconds: 60,
whatsapp: {
keepAliveIntervalMs: 25000,
connectTimeoutMs: 60000,
defaultQueryTimeoutMs: 60000,
},
reconnect: {
initialMs: 2000,
maxMs: 120000,
factor: 1.4,
jitter: 0.2,
maxAttempts: 0,
},
},
channels: {
whatsapp: {
dmPolicy: "pairing", // pairing | allowlist | open | disabled
allowFrom: ["+15555550123", "+447700900123"],
textChunkLimit: 4000,
chunkMode: "length", // length | newline
mediaMaxMb: 50,
sendReadReceipts: true, // blue ticks (false in self-chat mode)
groups: {
"*": { requireMention: true },
},
groupPolicy: "allowlist",
groupAllowFrom: ["+15551234567"],
},
},
}
WhatsApp z wieloma kontami
{
channels: {
whatsapp: {
accounts: {
default: {},
personal: {},
biz: {
// authDir: "~/.openclaw/credentials/whatsapp/biz",
},
},
},
},
}
- Polecenia wychodzące domyślnie używają konta
default, jeśli istnieje; w przeciwnym razie pierwszego skonfigurowanego identyfikatora konta (po sortowaniu). - Opcjonalne
channels.whatsapp.defaultAccountnadpisuje ten wybór domyślnego konta zastępczego, gdy pasuje do skonfigurowanego identyfikatora konta. - Starszy katalog uwierzytelniania Baileys dla jednego konta jest migrowany przez
openclaw doctordowhatsapp/default. - Nadpisania dla kont:
channels.whatsapp.accounts.<id>.sendReadReceipts,channels.whatsapp.accounts.<id>.dmPolicy,channels.whatsapp.accounts.<id>.allowFrom.
Telegram
{
channels: {
telegram: {
enabled: true,
botToken: "your-bot-token",
dmPolicy: "pairing",
allowFrom: ["tg:123456789"],
groups: {
"*": { requireMention: true },
"-1001234567890": {
allowFrom: ["@admin"],
systemPrompt: "Keep answers brief.",
topics: {
"99": {
requireMention: false,
skills: ["search"],
systemPrompt: "Stay on topic.",
},
},
},
},
customCommands: [
{ command: "backup", description: "Git backup" },
{ command: "generate", description: "Create an image" },
],
historyLimit: 50,
replyToMode: "first", // off | first | all | batched
linkPreview: true,
streaming: "partial", // off | partial | block | progress (default: off; opt in explicitly to avoid preview-edit rate limits)
actions: { reactions: true, sendMessage: true },
reactionNotifications: "own", // off | own | all
mediaMaxMb: 100,
retry: {
attempts: 3,
minDelayMs: 400,
maxDelayMs: 30000,
jitter: 0.1,
},
network: {
autoSelectFamily: true,
dnsResultOrder: "ipv4first",
},
apiRoot: "https://api.telegram.org",
proxy: "socks5://localhost:9050",
webhookUrl: "https://example.com/telegram-webhook",
webhookSecret: "secret",
webhookPath: "/telegram-webhook",
},
},
}
- Token bota:
channels.telegram.botTokenlubchannels.telegram.tokenFile(tylko zwykły plik; dowiązania symboliczne są odrzucane), zTELEGRAM_BOT_TOKENjako wartością zastępczą dla konta domyślnego. apiRootto wyłącznie katalog główny Telegram Bot API. Użyjhttps://api.telegram.orgalbo własnego hostowanego/proxy katalogu głównego, niehttps://api.telegram.org/bot<TOKEN>;openclaw doctor --fixusuwa przypadkowy końcowy sufiks/bot<TOKEN>.- Opcjonalne
channels.telegram.defaultAccountnadpisuje wybór konta domyślnego, gdy pasuje do skonfigurowanego identyfikatora konta. - W konfiguracjach wielu kont (2+ identyfikatory kont) ustaw jawne konto domyślne (
channels.telegram.defaultAccountlubchannels.telegram.accounts.default), aby uniknąć routingu zastępczego;openclaw doctorostrzega, gdy go brakuje lub jest nieprawidłowe. configWrites: falseblokuje zapisy konfiguracji inicjowane przez Telegram (migracje ID supergrup,/config set|unset).- Wpisy najwyższego poziomu
bindings[]ztype: "acp"konfigurują trwałe powiązania ACP dla tematów forum (użyj kanonicznegochatId:topic:topicIdwmatch.peer.id). Semantyka pól jest współdzielona w Agenci ACP. - Podglądy strumieni Telegram używają
sendMessage+editMessageText(działa w czatach bezpośrednich i grupowych). - Zasada ponawiania: zobacz Zasada ponawiania.
Discord
{
channels: {
discord: {
enabled: true,
token: "your-bot-token",
mediaMaxMb: 100,
allowBots: false,
actions: {
reactions: true,
stickers: true,
polls: true,
permissions: true,
messages: true,
threads: true,
pins: true,
search: true,
memberInfo: true,
roleInfo: true,
roles: false,
channelInfo: true,
voiceStatus: true,
events: true,
moderation: false,
},
replyToMode: "off", // off | first | all | batched
dmPolicy: "pairing",
allowFrom: ["1234567890", "123456789012345678"],
dm: { enabled: true, groupEnabled: false, groupChannels: ["openclaw-dm"] },
guilds: {
"123456789012345678": {
slug: "friends-of-openclaw",
requireMention: false,
ignoreOtherMentions: true,
reactionNotifications: "own",
users: ["987654321098765432"],
channels: {
general: { allow: true },
help: {
allow: true,
requireMention: true,
users: ["987654321098765432"],
skills: ["docs"],
systemPrompt: "Short answers only.",
},
},
},
},
historyLimit: 20,
textChunkLimit: 2000,
chunkMode: "length", // length | newline
streaming: {
mode: "progress", // off | partial | block | progress (Discord default: progress)
progress: {
label: "auto",
maxLines: 8,
toolProgress: true,
},
},
maxLinesPerMessage: 17,
ui: {
components: {
accentColor: "#5865F2",
},
},
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
spawnSessions: true,
defaultSpawnContext: "fork",
},
voice: {
enabled: true,
autoJoin: [
{
guildId: "123456789012345678",
channelId: "234567890123456789",
},
],
daveEncryption: true,
decryptionFailureTolerance: 24,
connectTimeoutMs: 30000,
reconnectGraceMs: 15000,
tts: {
provider: "openai",
openai: { voice: "alloy" },
},
},
execApprovals: {
enabled: "auto", // true | false | "auto"
approvers: ["987654321098765432"],
agentFilter: ["default"],
sessionFilter: ["discord:"],
target: "dm", // dm | channel | both
cleanupAfterResolve: false,
},
retry: {
attempts: 3,
minDelayMs: 500,
maxDelayMs: 30000,
jitter: 0.1,
},
},
},
}
- Token:
channels.discord.token, zDISCORD_BOT_TOKENjako rozwiązaniem zastępczym dla konta domyślnego. - Bezpośrednie połączenia wychodzące, które podają jawny Discord
token, używają tego tokena dla danego wywołania; ustawienia ponawiania/polityki konta nadal pochodzą z wybranego konta w aktywnej migawce środowiska uruchomieniowego. - Opcjonalne
channels.discord.defaultAccountzastępuje wybór konta domyślnego, gdy pasuje do identyfikatora skonfigurowanego konta. - Używaj
user:<id>(DM) albochannel:<id>(kanał gildii) jako celów dostarczania; same numeryczne identyfikatory są odrzucane. - Slugi gildii są zapisane małymi literami, a spacje zastąpione znakami
-; klucze kanałów używają nazwy w formie sluga (bez#). Preferuj identyfikatory gildii. - Wiadomości autorstwa botów są domyślnie ignorowane.
allowBots: trueje włącza; użyjallowBots: "mentions", aby akceptować tylko wiadomości botów, które wspominają bota (własne wiadomości nadal są filtrowane). channels.discord.guilds.<id>.ignoreOtherMentions(oraz nadpisania kanałów) odrzuca wiadomości, które wspominają innego użytkownika lub rolę, ale nie bota (z wyłączeniem @everyone/@here).channels.discord.mentionAliasesmapuje stabilny wychodzący tekst@handlena identyfikatory użytkowników Discord przed wysłaniem, dzięki czemu znani członkowie zespołu mogą być wspominani deterministycznie nawet wtedy, gdy przejściowa pamięć podręczna katalogu jest pusta. Nadpisania per konto znajdują się podchannels.discord.accounts.<accountId>.mentionAliases.maxLinesPerMessage(domyślnie 17) dzieli wysokie wiadomości nawet wtedy, gdy mają mniej niż 2000 znaków.channels.discord.threadBindingssteruje routingiem Discord powiązanym z wątkiem:enabled: nadpisanie Discord dla funkcji sesji powiązanych z wątkiem (/focus,/unfocus,/agents,/session idle,/session max-ageoraz powiązane dostarczanie/routing)idleHours: nadpisanie Discord dla automatycznego cofnięcia skupienia po braku aktywności, w godzinach (0wyłącza)maxAgeHours: nadpisanie Discord dla sztywnego maksymalnego wieku, w godzinach (0wyłącza)spawnSessions: przełącznik dlasessions_spawn({ thread: true })oraz automatycznego tworzenia/powiązania wątku przez ACP thread-spawn (domyślnie:true)defaultSpawnContext: natywny kontekst podagenta dla uruchomień powiązanych z wątkiem (domyślnie"fork")
- Wpisy najwyższego poziomu
bindings[]ztype: "acp"konfigurują trwałe powiązania ACP dla kanałów i wątków (użyj identyfikatora kanału/wątku wmatch.peer.id). Semantyka pól jest wspólna w Agentach ACP. channels.discord.ui.components.accentColorustawia kolor akcentu dla kontenerów komponentów Discord v2.channels.discord.voicewłącza rozmowy na kanałach głosowych Discord oraz opcjonalne nadpisania automatycznego dołączania + LLM + TTS. Konfiguracje Discord tylko tekstowe domyślnie pozostawiają głos wyłączony; ustawchannels.discord.voice.enabled=true, aby go włączyć.channels.discord.voice.modelopcjonalnie zastępuje model LLM używany do odpowiedzi w kanałach głosowych Discord.channels.discord.voice.daveEncryptionorazchannels.discord.voice.decryptionFailureTolerancesą przekazywane do opcji DAVE@discordjs/voice(domyślnietruei24).channels.discord.voice.connectTimeoutMskontroluje początkowe oczekiwanie Ready@discordjs/voicedla/vc joinoraz prób automatycznego dołączania (domyślnie30000).channels.discord.voice.reconnectGraceMskontroluje, ile czasu odłączona sesja głosowa może potrzebować na wejście w sygnalizację ponownego połączenia, zanim OpenClaw ją zniszczy (domyślnie15000).- Odtwarzanie głosu Discord nie jest przerywane przez zdarzenie rozpoczęcia mówienia innego użytkownika. Aby uniknąć pętli sprzężenia zwrotnego, OpenClaw ignoruje nowe przechwytywanie głosu podczas odtwarzania TTS.
- OpenClaw dodatkowo próbuje odzyskiwać odbiór głosu przez opuszczenie sesji głosowej i ponowne dołączenie do niej po powtarzających się niepowodzeniach odszyfrowania.
channels.discord.streamingto kanoniczny klucz trybu strumieniowania. Discord domyślnie używastreaming.mode: "progress", więc postęp narzędzi/pracy pojawia się w jednej edytowanej wiadomości podglądu; ustawstreaming.mode: "off", aby go wyłączyć. Starsze wartościstreamModeoraz logicznestreamingpozostają aliasami środowiska uruchomieniowego; uruchomopenclaw doctor --fix, aby przepisać utrwaloną konfigurację.channels.discord.autoPresencemapuje dostępność środowiska uruchomieniowego na obecność bota (healthy => online, degraded => idle, exhausted => dnd) i umożliwia opcjonalne nadpisania tekstu statusu.channels.discord.dangerouslyAllowNameMatchingponownie włącza zmienne dopasowywanie nazw/tagów (tryb zgodności awaryjnej).channels.discord.execApprovals: natywne dla Discord dostarczanie zatwierdzeń exec oraz autoryzacja zatwierdzających.enabled:true,falsealbo"auto"(domyślnie). W trybie automatycznym zatwierdzenia exec aktywują się, gdy zatwierdzających można rozpoznać zapproversalbocommands.ownerAllowFrom.approvers: identyfikatory użytkowników Discord uprawnionych do zatwierdzania żądań exec. Gdy pominięte, używa zastępczocommands.ownerAllowFrom.agentFilter: opcjonalna lista dozwolonych identyfikatorów agentów. Pomiń, aby przekazywać zatwierdzenia dla wszystkich agentów.sessionFilter: opcjonalne wzorce kluczy sesji (podciąg albo regex).target: miejsce wysyłania monitów o zatwierdzenie."dm"(domyślnie) wysyła do DM zatwierdzających,"channel"wysyła do kanału źródłowego,"both"wysyła do obu. Gdy cel zawiera"channel", przyciski są użyteczne tylko dla rozpoznanych zatwierdzających.cleanupAfterResolve: gdytrue, usuwa DM z zatwierdzeniem po zatwierdzeniu, odmowie lub przekroczeniu limitu czasu.
Tryby powiadomień o reakcjach: off (brak), own (wiadomości bota, domyślnie), all (wszystkie wiadomości), allowlist (z guilds.<id>.users dla wszystkich wiadomości).
Google Chat
{
channels: {
googlechat: {
enabled: true,
serviceAccountFile: "/path/to/service-account.json",
audienceType: "app-url", // app-url | project-number
audience: "https://gateway.example.com/googlechat",
webhookPath: "/googlechat",
botUser: "users/1234567890",
dm: {
enabled: true,
policy: "pairing",
allowFrom: ["users/1234567890"],
},
groupPolicy: "allowlist",
groups: {
"spaces/AAAA": { allow: true, requireMention: true },
},
actions: { reactions: true },
typingIndicator: "message",
mediaMaxMb: 20,
},
},
}
- JSON konta usługi: wbudowany (
serviceAccount) albo oparty na pliku (serviceAccountFile). - Obsługiwany jest też SecretRef konta usługi (
serviceAccountRef). - Rozwiązania zastępcze env:
GOOGLE_CHAT_SERVICE_ACCOUNTalboGOOGLE_CHAT_SERVICE_ACCOUNT_FILE. - Używaj
spaces/<spaceId>albousers/<userId>jako celów dostarczania. channels.googlechat.dangerouslyAllowNameMatchingponownie włącza zmienne dopasowywanie podmiotów e-mail (tryb zgodności awaryjnej).
Slack
{
channels: {
slack: {
enabled: true,
botToken: "xoxb-...",
appToken: "xapp-...",
socketMode: {
clientPingTimeout: 15000,
serverPingTimeout: 30000,
pingPongLoggingEnabled: false,
},
dmPolicy: "pairing",
allowFrom: ["U123", "U456", "*"],
dm: { enabled: true, groupEnabled: false, groupChannels: ["G123"] },
channels: {
C123: { allow: true, requireMention: true, allowBots: false },
"#general": {
allow: true,
requireMention: true,
allowBots: false,
users: ["U123"],
skills: ["docs"],
systemPrompt: "Short answers only.",
},
},
historyLimit: 50,
allowBots: false,
reactionNotifications: "own",
reactionAllowlist: ["U123"],
replyToMode: "off", // off | first | all | batched
thread: {
historyScope: "thread", // thread | channel
inheritParent: false,
},
actions: {
reactions: true,
messages: true,
pins: true,
memberInfo: true,
emojiList: true,
},
slashCommand: {
enabled: true,
name: "openclaw",
sessionPrefix: "slack:slash",
ephemeral: true,
},
typingReaction: "hourglass_flowing_sand",
textChunkLimit: 4000,
chunkMode: "length",
streaming: {
mode: "partial", // off | partial | block | progress
nativeTransport: true, // use Slack native streaming API when mode=partial
},
mediaMaxMb: 20,
execApprovals: {
enabled: "auto", // true | false | "auto"
approvers: ["U123"],
agentFilter: ["default"],
sessionFilter: ["slack:"],
target: "dm", // dm | channel | both
},
},
},
}
- Tryb Socket wymaga zarówno
botToken, jak iappToken(SLACK_BOT_TOKEN+SLACK_APP_TOKENjako rozwiązanie zastępcze env dla konta domyślnego). - Tryb HTTP wymaga
botTokenorazsigningSecret(w katalogu głównym albo per konto). socketModeprzekazuje strojenie transportu Socket Mode SDK Slack do publicznego API odbiornika Bolt. Używaj go tylko podczas badania przekroczeń limitu czasu ping/pong albo zachowania przestarzałego websocketu.botToken,appToken,signingSecretorazuserTokenakceptują zwykłe tekstowe ciągi znaków albo obiekty SecretRef.- Migawki kont Slack ujawniają pola źródła/statusu per dane uwierzytelniające, takie jak
botTokenSource,botTokenStatus,appTokenStatusoraz, w trybie HTTP,signingSecretStatus.configured_unavailableoznacza, że konto jest skonfigurowane przez SecretRef, ale bieżąca ścieżka polecenia/środowiska uruchomieniowego nie mogła rozpoznać wartości sekretu. configWrites: falseblokuje zapisy konfiguracji inicjowane przez Slack.- Opcjonalne
channels.slack.defaultAccountzastępuje wybór konta domyślnego, gdy pasuje do identyfikatora skonfigurowanego konta. channels.slack.streaming.modeto kanoniczny klucz trybu strumieniowania Slack.channels.slack.streaming.nativeTransportkontroluje natywny transport strumieniowania Slack. Starsze wartościstreamMode, logicznestreamingoraznativeStreamingpozostają aliasami środowiska uruchomieniowego; uruchomopenclaw doctor --fix, aby przepisać utrwaloną konfigurację.- Używaj
user:<id>(DM) albochannel:<id>jako celów dostarczania.
Tryby powiadomień o reakcjach: off, own (domyślnie), all, allowlist (z reactionAllowlist).
Izolacja sesji wątku: thread.historyScope jest per wątek (domyślnie) albo współdzielony w obrębie kanału. thread.inheritParent kopiuje transkrypcję kanału nadrzędnego do nowych wątków.
- Natywne strumieniowanie Slack oraz status wątku w stylu asystenta Slack „is typing...” wymagają celu wątku odpowiedzi. DM najwyższego poziomu domyślnie pozostają poza wątkiem, więc nadal mogą strumieniować przez robocze podglądy Slack publikowane i edytowane, zamiast pokazywać podgląd natywnego strumienia/statusu w stylu wątku.
typingReactiondodaje tymczasową reakcję do przychodzącej wiadomości Slack podczas generowania odpowiedzi, a następnie usuwa ją po zakończeniu. Użyj krótkiego kodu emoji Slack, takiego jak"hourglass_flowing_sand".channels.slack.execApprovals: natywne dla Slack dostarczanie zatwierdzeń exec oraz autoryzacja zatwierdzających. Ten sam schemat co w Discord:enabled(true/false/"auto"),approvers(identyfikatory użytkowników Slack),agentFilter,sessionFilteroraztarget("dm","channel"albo"both").
| Grupa akcji | Domyślnie | Uwagi |
|---|---|---|
| reactions | włączone | Reagowanie + lista reakcji |
| messages | włączone | Odczyt/wysyłanie/edycja/usuwanie |
| pins | włączone | Przypnij/odepnij/listuj |
| memberInfo | włączone | Informacje o członku |
| emojiList | włączone | Lista niestandardowych emoji |
Mattermost
Mattermost jest dostarczany jako dołączony Plugin w bieżących wydaniach OpenClaw. Starsze lub
niestandardowe kompilacje mogą zainstalować bieżący pakiet npm za pomocą
openclaw plugins install @openclaw/mattermost. Sprawdź
npmjs.com/package/@openclaw/mattermost
pod kątem bieżących dist-tags przed przypięciem wersji.
{
channels: {
mattermost: {
enabled: true,
botToken: "mm-token",
baseUrl: "https://chat.example.com",
dmPolicy: "pairing",
chatmode: "oncall", // oncall | onmessage | onchar
oncharPrefixes: [">", "!"],
groups: {
"*": { requireMention: true },
"team-channel-id": { requireMention: false },
},
commands: {
native: true, // opt-in
nativeSkills: true,
callbackPath: "/api/channels/mattermost/command",
// Optional explicit URL for reverse-proxy/public deployments
callbackUrl: "https://gateway.example.com/api/channels/mattermost/command",
},
textChunkLimit: 4000,
chunkMode: "length",
},
},
}
Tryby czatu: oncall (odpowiada na @-wzmiankę, domyślnie), onmessage (każda wiadomość), onchar (wiadomości zaczynające się od prefiksu wyzwalacza).
Gdy natywne polecenia Mattermost są włączone:
commands.callbackPathmusi być ścieżką (na przykład/api/channels/mattermost/command), a nie pełnym adresem URL.commands.callbackUrlmusi wskazywać endpoint Gateway OpenClaw i być osiągalny z serwera Mattermost.- Natywne wywołania zwrotne slash są uwierzytelniane tokenami poszczególnych poleceń zwracanymi
przez Mattermost podczas rejestracji poleceń slash. Jeśli rejestracja się nie powiedzie albo
żadne polecenia nie zostaną aktywowane, OpenClaw odrzuca wywołania zwrotne z komunikatem
Unauthorized: invalid command token. - W przypadku prywatnych, tailnetowych lub wewnętrznych hostów wywołań zwrotnych Mattermost może wymagać,
aby
ServiceSettings.AllowedUntrustedInternalConnectionszawierało host/domenę wywołania zwrotnego. Używaj wartości hosta/domeny, nie pełnych adresów URL. channels.mattermost.configWrites: zezwalaj na zapisy konfiguracji inicjowane przez Mattermost lub ich odmawiaj.channels.mattermost.requireMention: wymagaj@mentionprzed odpowiedzią w kanałach.channels.mattermost.groups.<channelId>.requireMention: nadpisanie bramkowania wzmiankami dla danego kanału ("*"jako domyślne).- Opcjonalne
channels.mattermost.defaultAccountnadpisuje domyślny wybór konta, gdy pasuje do skonfigurowanego identyfikatora konta.
Signal
{
channels: {
signal: {
enabled: true,
account: "+15555550123", // optional account binding
dmPolicy: "pairing",
allowFrom: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"],
configWrites: true,
reactionNotifications: "own", // off | own | all | allowlist
reactionAllowlist: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"],
historyLimit: 50,
},
},
}
Tryby powiadomień o reakcjach: off, own (domyślnie), all, allowlist (z reactionAllowlist).
channels.signal.account: przypnij uruchomienie kanału do konkretnej tożsamości konta Signal.channels.signal.configWrites: zezwalaj na zapisy konfiguracji inicjowane przez Signal lub ich odmawiaj.- Opcjonalne
channels.signal.defaultAccountnadpisuje domyślny wybór konta, gdy pasuje do skonfigurowanego identyfikatora konta.
BlueBubbles
BlueBubbles to starszy most iMessage (obsługiwany przez Plugin, skonfigurowany w channels.bluebubbles). Istniejące konfiguracje pozostają obsługiwane, ale nowe wdrożenia OpenClaw iMessage powinny preferować channels.imessage, gdy imsg może działać na hoście Messages.
{
channels: {
bluebubbles: {
enabled: true,
dmPolicy: "pairing",
// serverUrl, password, webhookPath, group controls, and advanced actions:
// see /channels/bluebubbles
},
},
}
- Główne ścieżki kluczy omówione tutaj:
channels.bluebubbles,channels.bluebubbles.dmPolicy. - Opcjonalne
channels.bluebubbles.defaultAccountnadpisuje domyślny wybór konta, gdy pasuje do skonfigurowanego identyfikatora konta. - Wpisy najwyższego poziomu
bindings[]ztype: "acp"mogą wiązać konwersacje BlueBubbles z trwałymi sesjami ACP. Użyj uchwytu BlueBubbles lub ciągu docelowego (chat_id:*,chat_guid:*,chat_identifier:*) wmatch.peer.id. Semantyka pól współdzielonych: Agenci ACP. - Pełna konfiguracja kanału BlueBubbles i uzasadnienie wycofania są udokumentowane w BlueBubbles.
iMessage
OpenClaw uruchamia imsg rpc (JSON-RPC przez stdio). Nie jest wymagany daemon ani port. To preferowana ścieżka dla nowych konfiguracji OpenClaw iMessage, gdy host może przyznać uprawnienia do bazy danych Messages i Automation.
{
channels: {
imessage: {
enabled: true,
cliPath: "imsg",
dbPath: "~/Library/Messages/chat.db",
remoteHost: "user@gateway-host",
dmPolicy: "pairing",
allowFrom: ["+15555550123", "[email protected]", "chat_id:123"],
historyLimit: 50,
includeAttachments: false,
attachmentRoots: ["/Users/*/Library/Messages/Attachments"],
remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],
mediaMaxMb: 16,
service: "auto",
region: "US",
},
},
}
-
Opcjonalne
channels.imessage.defaultAccountnadpisuje domyślny wybór konta, gdy pasuje do skonfigurowanego identyfikatora konta. -
Wymaga Full Disk Access do bazy danych Messages.
-
Preferuj cele
chat_id:<id>. Użyjimsg chats --limit 20, aby wyświetlić listę czatów. -
cliPathmoże wskazywać wrapper SSH; ustawremoteHost(hostlubuser@host) do pobierania załączników przez SCP. -
attachmentRootsiremoteAttachmentRootsograniczają ścieżki załączników przychodzących (domyślnie:/Users/*/Library/Messages/Attachments). -
SCP używa ścisłego sprawdzania klucza hosta, więc upewnij się, że klucz hosta przekaźnika już istnieje w
~/.ssh/known_hosts. -
channels.imessage.configWrites: zezwalaj na zapisy konfiguracji inicjowane przez iMessage lub ich odmawiaj. -
Wpisy najwyższego poziomu
bindings[]ztype: "acp"mogą wiązać konwersacje iMessage z trwałymi sesjami ACP. Użyj znormalizowanego uchwytu lub jawnego celu czatu (chat_id:*,chat_guid:*,chat_identifier:*) wmatch.peer.id. Semantyka pól współdzielonych: Agenci ACP.
iMessage SSH wrapper example
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"
Matrix
Matrix jest obsługiwany przez Plugin i skonfigurowany w channels.matrix.
{
channels: {
matrix: {
enabled: true,
homeserver: "https://matrix.example.org",
accessToken: "syt_bot_xxx",
proxy: "http://127.0.0.1:7890",
encryption: true,
initialSyncLimit: 20,
defaultAccount: "ops",
accounts: {
ops: {
name: "Ops",
userId: "@ops:example.org",
accessToken: "syt_ops_xxx",
},
alerts: {
userId: "@alerts:example.org",
password: "secret",
proxy: "http://127.0.0.1:7891",
},
},
},
},
}
- Uwierzytelnianie tokenem używa
accessToken; uwierzytelnianie hasłem używauserId+password. channels.matrix.proxykieruje ruch HTTP Matrix przez jawny proxy HTTP(S). Nazwane konta mogą nadpisać to za pomocąchannels.matrix.accounts.<id>.proxy.channels.matrix.network.dangerouslyAllowPrivateNetworkzezwala na prywatne/wewnętrzne homeservery.proxyi ta zgoda sieciowa są niezależnymi kontrolkami.channels.matrix.defaultAccountwybiera preferowane konto w konfiguracjach wielokontowych.channels.matrix.autoJoindomyślnie ma wartośćoff, więc zaproszone pokoje i nowe zaproszenia w stylu DM są ignorowane, dopóki nie ustawiszautoJoin: "allowlist"zautoJoinAllowlistalboautoJoin: "always".channels.matrix.execApprovals: natywne dla Matrix dostarczanie zatwierdzeń exec i autoryzacja zatwierdzających.enabled:true,falsealbo"auto"(domyślnie). W trybie automatycznym zatwierdzenia exec aktywują się, gdy zatwierdzających można rozwiązać zapproverslubcommands.ownerAllowFrom.approvers: identyfikatory użytkowników Matrix (np.@owner:example.org) uprawnione do zatwierdzania żądań exec.agentFilter: opcjonalna lista dozwolonych identyfikatorów agentów. Pomiń, aby przekazywać zatwierdzenia dla wszystkich agentów.sessionFilter: opcjonalne wzorce kluczy sesji (podciąg lub regex).target: gdzie wysyłać monity o zatwierdzenie."dm"(domyślnie),"channel"(pokój źródłowy) albo"both".- Nadpisania dla poszczególnych kont:
channels.matrix.accounts.<id>.execApprovals.
channels.matrix.dm.sessionScopekontroluje, jak DM-y Matrix grupują się w sesje:per-user(domyślnie) współdzieli według routowanego peera, natomiastper-roomizoluje każdy pokój DM.- Sondy statusu Matrix i wyszukiwania katalogu na żywo używają tej samej polityki proxy co ruch runtime.
- Pełna konfiguracja Matrix, reguły targetowania i przykłady konfiguracji są udokumentowane w Matrix.
Microsoft Teams
Microsoft Teams jest obsługiwany przez Plugin i skonfigurowany w channels.msteams.
{
channels: {
msteams: {
enabled: true,
configWrites: true,
// appId, appPassword, tenantId, webhook, team/channel policies:
// see /channels/msteams
},
},
}
- Główne ścieżki kluczy omówione tutaj:
channels.msteams,channels.msteams.configWrites. - Pełna konfiguracja Teams (poświadczenia, Webhook, polityka DM/grup, nadpisania dla zespołu/kanału) jest udokumentowana w Microsoft Teams.
IRC
IRC jest obsługiwany przez Plugin i skonfigurowany w channels.irc.
{
channels: {
irc: {
enabled: true,
dmPolicy: "pairing",
configWrites: true,
nickserv: {
enabled: true,
service: "NickServ",
password: "${IRC_NICKSERV_PASSWORD}",
register: false,
registerEmail: "[email protected]",
},
},
},
}
- Główne ścieżki kluczy omówione tutaj:
channels.irc,channels.irc.dmPolicy,channels.irc.configWrites,channels.irc.nickserv.*. - Opcjonalne
channels.irc.defaultAccountnadpisuje domyślny wybór konta, gdy pasuje do skonfigurowanego identyfikatora konta. - Pełna konfiguracja kanału IRC (host/port/TLS/kanały/listy dozwolonych/bramkowanie wzmiankami) jest udokumentowana w IRC.
Wiele kont (wszystkie kanały)
Uruchamiaj wiele kont na kanał (każde z własnym accountId):
{
channels: {
telegram: {
accounts: {
default: {
name: "Primary bot",
botToken: "123456:ABC...",
},
alerts: {
name: "Alerts bot",
botToken: "987654:XYZ...",
},
},
},
},
}
defaultjest używane, gdyaccountIdzostanie pominięte (CLI + routing).- Tokeny env mają zastosowanie tylko do konta domyślnego.
- Bazowe ustawienia kanału mają zastosowanie do wszystkich kont, chyba że zostaną nadpisane dla danego konta.
- Użyj
bindings[].match.accountId, aby kierować każde konto do innego agenta. - Jeśli dodasz konto inne niż domyślne przez
openclaw channels add(lub onboarding kanału), nadal mając jednokontową konfigurację kanału najwyższego poziomu, OpenClaw najpierw przeniesie jednokontowe wartości najwyższego poziomu objęte zakresem konta do mapy kont kanału, aby pierwotne konto nadal działało. Większość kanałów przenosi je dochannels.<channel>.accounts.default; Matrix może zamiast tego zachować istniejący pasujący nazwany/domyślny cel. - Istniejące powiązania tylko kanałowe (bez
accountId) nadal pasują do konta domyślnego; powiązania objęte zakresem konta pozostają opcjonalne. openclaw doctor --fixnaprawia także mieszane kształty, przenosząc jednokontowe wartości najwyższego poziomu objęte zakresem konta do promowanego konta wybranego dla tego kanału. Większość kanałów używaaccounts.default; Matrix może zamiast tego zachować istniejący pasujący nazwany/domyślny cel.
Inne kanały Plugin
Wiele kanałów Plugin jest skonfigurowanych jako channels.<id> i udokumentowanych na własnych stronach kanałów (na przykład Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat i Twitch).
Zobacz pełny indeks kanałów: Kanały.
Bramkowanie czatu grupowego wzmiankami
Wiadomości grupowe domyślnie wymagają wzmianki (wzmianka w metadanych lub bezpieczne wzorce regex). Dotyczy czatów grupowych WhatsApp, Telegram, Discord, Google Chat i iMessage.
Widoczne odpowiedzi są kontrolowane osobno. Pokoje grupowe/kanałowe domyślnie używają messages.groupChat.visibleReplies: "message_tool": OpenClaw nadal przetwarza turę, ale zwykłe odpowiedzi końcowe pozostają prywatne, a widoczne wyjście w pokoju wymaga message(action=send). Ustaw "automatic" tylko wtedy, gdy chcesz zachowania starszego typu, w którym zwykłe odpowiedzi są publikowane z powrotem w pokoju. Aby zastosować to samo zachowanie widocznych odpowiedzi wyłącznie przez narzędzie także do czatów bezpośrednich, ustaw messages.visibleReplies: "message_tool"; harness Codex również używa tego zachowania wyłącznie przez narzędzie jako domyślnego dla nieustawionych czatów bezpośrednich.
Widoczne odpowiedzi wyłącznie przez narzędzie wymagają modelu/środowiska uruchomieniowego, które niezawodnie wywołuje narzędzia. Jeśli
dziennik sesji pokazuje tekst asystenta z didSendViaMessagingTool: false,
model utworzył prywatną odpowiedź końcową zamiast wywołać narzędzie wiadomości.
Przełącz na silniejszy model wywołujący narzędzia dla tego kanału albo ustaw
messages.groupChat.visibleReplies: "automatic", aby przywrócić starsze widoczne odpowiedzi końcowe.
Jeśli narzędzie wiadomości jest niedostępne w ramach aktywnej polityki narzędzi, OpenClaw wraca do automatycznych widocznych odpowiedzi zamiast po cichu tłumić odpowiedź. openclaw doctor ostrzega o tej niezgodności.
Gateway przeładowuje konfigurację messages na gorąco po zapisaniu pliku. Restartuj tylko wtedy, gdy obserwowanie plików lub przeładowywanie konfiguracji jest wyłączone we wdrożeniu.
Typy wzmianek:
- Wzmianki metadanych: Natywne wzmianki @ platformy. Ignorowane w trybie czatu z samym sobą w WhatsApp.
- Wzorce tekstowe: Bezpieczne wzorce regex w
agents.list[].groupChat.mentionPatterns. Nieprawidłowe wzorce i niebezpieczne zagnieżdżone powtórzenia są ignorowane. - Bramka wzmianek jest egzekwowana tylko wtedy, gdy wykrywanie jest możliwe (natywne wzmianki lub co najmniej jeden wzorzec).
{
messages: {
visibleReplies: "automatic", // global default for direct/source chats; Codex harness defaults unset direct chats to message_tool
groupChat: {
historyLimit: 50,
visibleReplies: "message_tool", // default; use "automatic" for legacy final replies
},
},
agents: {
list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }],
},
}
messages.groupChat.historyLimit ustawia globalną wartość domyślną. Kanały mogą ją nadpisać przez channels.<channel>.historyLimit (albo dla poszczególnych kont). Ustaw 0, aby wyłączyć.
messages.visibleReplies jest globalną wartością domyślną dla tur źródłowych; messages.groupChat.visibleReplies nadpisuje ją dla tur źródłowych grup/kanałów. Gdy messages.visibleReplies nie jest ustawione, harness może dostarczyć własną wartość domyślną dla bezpośrednich/źródłowych; harness Codex domyślnie używa message_tool. Listy dozwolonych kanałów i bramka wzmianek nadal decydują, czy tura jest przetwarzana.
Limity historii DM
{
channels: {
telegram: {
dmHistoryLimit: 30,
dms: {
"123456789": { historyLimit: 50 },
},
},
},
}
Rozwiązywanie: nadpisanie dla DM → domyślna wartość dostawcy → brak limitu (wszystko zachowane).
Obsługiwane: telegram, whatsapp, discord, slack, signal, imessage, msteams.
Tryb czatu z samym sobą
Dodaj własny numer do allowFrom, aby włączyć tryb czatu z samym sobą (ignoruje natywne wzmianki @, odpowiada tylko na wzorce tekstowe):
{
channels: {
whatsapp: {
allowFrom: ["+15555550123"],
groups: { "*": { requireMention: true } },
},
},
agents: {
list: [
{
id: "main",
groupChat: { mentionPatterns: ["reisponde", "@openclaw"] },
},
],
},
}
Polecenia (obsługa poleceń czatu)
{
commands: {
native: "auto", // register native commands when supported
nativeSkills: "auto", // register native skill commands when supported
text: true, // parse /commands in chat messages
bash: false, // allow ! (alias: /bash)
bashForegroundMs: 2000,
config: false, // allow /config
mcp: false, // allow /mcp
plugins: false, // allow /plugins
debug: false, // allow /debug
restart: true, // allow /restart + gateway restart tool
ownerAllowFrom: ["discord:123456789012345678"],
ownerDisplay: "raw", // raw | hash
ownerDisplaySecret: "${OWNER_ID_HASH_SECRET}",
allowFrom: {
"*": ["user1"],
discord: ["user:123"],
},
useAccessGroups: true,
},
}
Szczegóły poleceń
- Ten blok konfiguruje powierzchnie poleceń. Aktualny katalog wbudowanych i dołączonych poleceń znajduje się w Poleceniach ukośnikowych.
- Ta strona jest odniesieniem do kluczy konfiguracji, a nie pełnym katalogiem poleceń. Polecenia należące do kanałów/Pluginów, takie jak QQ Bot
/bot-ping/bot-help/bot-logs, LINE/card, parowanie urządzenia/pair, pamięć/dreaming, sterowanie telefonem/phoneoraz Talk/voice, są udokumentowane na stronach swoich kanałów/Pluginów oraz w Poleceniach ukośnikowych. - Polecenia tekstowe muszą być samodzielnymi wiadomościami zaczynającymi się od
/. native: "auto"włącza natywne polecenia dla Discord/Telegram, pozostawia Slack wyłączony.nativeSkills: "auto"włącza natywne polecenia Skills dla Discord/Telegram, pozostawia Slack wyłączony.- Nadpisanie dla kanału:
channels.discord.commands.native(wartość logiczna albo"auto"). Dla Discordfalsepomija rejestrację i czyszczenie natywnych poleceń podczas uruchamiania. - Nadpisz rejestrację natywnych poleceń Skills dla kanału za pomocą
channels.<provider>.commands.nativeSkills. channels.telegram.customCommandsdodaje dodatkowe pozycje menu bota Telegram.bash: truewłącza! <cmd>dla powłoki hosta. Wymagatools.elevated.enabledoraz nadawcy wtools.elevated.allowFrom.<channel>.config: truewłącza/config(odczytuje/zapisujeopenclaw.json). Dla klientów Gatewaychat.sendtrwałe zapisy/config set|unsetwymagają takżeoperator.admin; tylko do odczytu/config showpozostaje dostępne dla zwykłych klientów operatora z zakresem zapisu.mcp: truewłącza/mcpdla konfiguracji serwera MCP zarządzanego przez OpenClaw wmcp.servers.plugins: truewłącza/pluginsdla odkrywania, instalowania oraz włączania/wyłączania Pluginów.channels.<provider>.configWritesbramkuje mutacje konfiguracji dla kanału (domyślnie: true).- W przypadku kanałów wielokontowych
channels.<provider>.accounts.<id>.configWritesbramkuje także zapisy kierowane do tego konta (na przykład/allowlist --config --account <id>albo/config set channels.<provider>.accounts.<id>...). restart: falsewyłącza/restartoraz akcje narzędzia restartowania Gateway. Domyślnie:true.ownerAllowFromto jawna lista dozwolonych właścicieli dla poleceń/narzędzi tylko dla właściciela. Jest oddzielna odallowFrom.ownerDisplay: "hash"haszuje identyfikatory właścicieli w prompcie systemowym. UstawownerDisplaySecret, aby kontrolować haszowanie.allowFromjest ustawiane per dostawca. Gdy jest ustawione, jest jedynym źródłem autoryzacji (listy dozwolone kanałów/parowanie orazuseAccessGroupssą ignorowane).useAccessGroups: falsepozwala poleceniom omijać polityki grup dostępu, gdyallowFromnie jest ustawione.- Mapa dokumentacji poleceń:
- katalog wbudowany i dołączony: Polecenia ukośnikowe
- powierzchnie poleceń specyficzne dla kanałów: Kanały
- polecenia QQ Bot: QQ Bot
- polecenia parowania: Parowanie
- polecenie karty LINE: LINE
- Dreaming pamięci: Dreaming
Powiązane
- Odniesienie konfiguracji — klucze najwyższego poziomu
- Konfiguracja — agenci
- Przegląd kanałów