Перейти до основного вмісту
Ключі конфігурації для кожного каналу в channels.*. Охоплює доступ у DM і групах, multi-account конфігурації, обмеження за згадуванням і ключі для кожного каналу для Slack, Discord, Telegram, WhatsApp, Matrix, iMessage та інших вбудованих Plugin каналів. Для агентів, інструментів, runtime Gateway та інших ключів верхнього рівня див. Configuration reference.

Канали

Кожен канал запускається автоматично, коли існує його секція конфігурації (якщо не задано enabled: false).

Доступ у DM і групах

Усі канали підтримують політики DM і групові політики:
DM policyBehavior
pairing (типово)Невідомі відправники отримують одноразовий код pairing; власник має схвалити
allowlistЛише відправники з allowFrom (або зі сховища paired allow)
openДозволити всі вхідні DM (потрібно allowFrom: ["*"])
disabledІгнорувати всі вхідні DM
Group policyBehavior
allowlist (типово)Лише групи, що відповідають налаштованому allowlist
openОбійти group allowlist (обмеження за згадуванням усе ще застосовується)
disabledБлокувати всі повідомлення груп/кімнат
channels.defaults.groupPolicy задає типове значення, коли groupPolicy провайдера не встановлено. Коди pairing спливають через 1 годину. Кількість очікуваних запитів pairing для DM обмежена 3 на канал. Якщо блок провайдера повністю відсутній (channels.<provider> відсутній), групова політика runtime резервно використовує allowlist (fail-closed) з попередженням під час запуску.

Перевизначення моделі для каналів

Використовуйте channels.modelByChannel, щоб прив’язати певні ID каналів до моделі. Значення приймають provider/model або налаштовані псевдоніми моделей. Зіставлення каналу застосовується, коли сесія ще не має перевизначення моделі (наприклад, встановленого через /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",
      },
    },
  },
}

Типові значення каналів і Heartbeat

Використовуйте channels.defaults для спільної групової політики та поведінки Heartbeat між провайдерами:
{
  channels: {
    defaults: {
      groupPolicy: "allowlist", // open | allowlist | disabled
      contextVisibility: "all", // all | allowlist | allowlist_quote
      heartbeat: {
        showOk: false,
        showAlerts: true,
        useIndicator: true,
      },
    },
  },
}
  • channels.defaults.groupPolicy: резервна групова політика, коли groupPolicy на рівні провайдера не встановлено.
  • channels.defaults.contextVisibility: типовий режим видимості додаткового контексту для всіх каналів. Значення: all (типово, включати весь контекст цитат/тредів/історії), allowlist (включати лише контекст від відправників з allowlist), allowlist_quote (так само, як allowlist, але зберігати явний контекст цитати/відповіді). Перевизначення для каналу: channels.<channel>.contextVisibility.
  • channels.defaults.heartbeat.showOk: включати статуси здорових каналів у вивід Heartbeat.
  • channels.defaults.heartbeat.showAlerts: включати статуси degraded/error каналів у вивід Heartbeat.
  • channels.defaults.heartbeat.useIndicator: рендерити компактний вивід Heartbeat у стилі індикатора.

WhatsApp

WhatsApp працює через web-канал Gateway (Baileys Web). Він запускається автоматично, коли існує пов’язана сесія.
{
  channels: {
    whatsapp: {
      dmPolicy: "pairing", // pairing | allowlist | open | disabled
      allowFrom: ["+15555550123", "+447700900123"],
      textChunkLimit: 4000,
      chunkMode: "length", // length | newline
      mediaMaxMb: 50,
      sendReadReceipts: true, // сині галочки (false у режимі self-chat)
      groups: {
        "*": { requireMention: true },
      },
      groupPolicy: "allowlist",
      groupAllowFrom: ["+15551234567"],
    },
  },
  web: {
    enabled: true,
    heartbeatSeconds: 60,
    reconnect: {
      initialMs: 2000,
      maxMs: 120000,
      factor: 1.4,
      jitter: 0.2,
      maxAttempts: 0,
    },
  },
}
{
  channels: {
    whatsapp: {
      accounts: {
        default: {},
        personal: {},
        biz: {
          // authDir: "~/.openclaw/credentials/whatsapp/biz",
        },
      },
    },
  },
}
  • Вихідні команди типово використовують обліковий запис default, якщо він є; інакше — перший налаштований ID облікового запису (після сортування).
  • Необов’язковий channels.whatsapp.defaultAccount перевизначає цей резервний вибір типового облікового запису, якщо він збігається з налаштованим ID облікового запису.
  • Застарілий каталог автентифікації Baileys для одного облікового запису переноситься командою openclaw doctor у whatsapp/default.
  • Перевизначення для окремого облікового запису: 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 (типово: off; увімкніть явно, щоб уникнути обмежень частоти на редагування preview)
      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",
      },
      proxy: "socks5://localhost:9050",
      webhookUrl: "https://example.com/telegram-webhook",
      webhookSecret: "secret",
      webhookPath: "/telegram-webhook",
    },
  },
}
  • Токен бота: channels.telegram.botToken або channels.telegram.tokenFile (лише звичайний файл; symlink відхиляються), з TELEGRAM_BOT_TOKEN як резервним значенням для типового облікового запису.
  • Необов’язковий channels.telegram.defaultAccount перевизначає вибір типового облікового запису, якщо він збігається з налаштованим ID облікового запису.
  • У multi-account конфігураціях (2+ ID облікових записів) задайте явний типовий обліковий запис (channels.telegram.defaultAccount або channels.telegram.accounts.default), щоб уникнути резервної маршрутизації; openclaw doctor попереджає, якщо цього немає або значення некоректне.
  • configWrites: false блокує записи конфігурації, ініційовані з Telegram (міграції ID supergroup, /config set|unset).
  • Записи верхнього рівня bindings[] з type: "acp" налаштовують постійні прив’язки ACP для тем форуму (використовуйте канонічний chatId:topic:topicId у match.peer.id). Семантика полів спільна з ACP Agents.
  • Preview потоків у Telegram використовують sendMessage + editMessageText (працює в прямих і групових чатах).
  • Політика повторних спроб: див. Retry policy.

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: "off", // off | partial | block | progress (progress зіставляється з partial у Discord)
      maxLinesPerMessage: 17,
      ui: {
        components: {
          accentColor: "#5865F2",
        },
      },
      threadBindings: {
        enabled: true,
        idleHours: 24,
        maxAgeHours: 0,
        spawnSubagentSessions: false, // opt-in для sessions_spawn({ thread: true })
      },
      voice: {
        enabled: true,
        autoJoin: [
          {
            guildId: "123456789012345678",
            channelId: "234567890123456789",
          },
        ],
        daveEncryption: true,
        decryptionFailureTolerance: 24,
        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,
      },
    },
  },
}
  • Токен: channels.discord.token, з DISCORD_BOT_TOKEN як резервним значенням для типового облікового запису.
  • Прямі вихідні виклики, які передають явний Discord token, використовують цей токен для виклику; налаштування повторних спроб/політик облікового запису все одно беруться з вибраного облікового запису в активному snapshot runtime.
  • Необов’язковий channels.discord.defaultAccount перевизначає вибір типового облікового запису, якщо він збігається з налаштованим ID облікового запису.
  • Використовуйте user:<id> (DM) або channel:<id> (канал guild) як target доставки; числові ID без префікса відхиляються.
  • Slug для guild — у нижньому регістрі із заміною пробілів на -; ключі каналів використовують slugified-ім’я (без #). Віддавайте перевагу ID guild.
  • Повідомлення, створені ботом, типово ігноруються. allowBots: true вмикає їх; використовуйте allowBots: "mentions", щоб приймати лише повідомлення ботів, які згадують бота (власні повідомлення все одно фільтруються).
  • channels.discord.guilds.<id>.ignoreOtherMentions (і перевизначення для каналів) відкидає повідомлення, які згадують іншого користувача або роль, але не бота (за винятком @everyone/@here).
  • maxLinesPerMessage (типово 17) розбиває високі повідомлення, навіть якщо вони коротші за 2000 символів.
  • channels.discord.threadBindings керує маршрутизацією, прив’язаною до тредів Discord:
    • enabled: перевизначення Discord для функцій сесій, прив’язаних до тредів (/focus, /unfocus, /agents, /session idle, /session max-age, а також прив’язана доставка/маршрутизація)
    • idleHours: перевизначення Discord для авто-unfocus після неактивності, у годинах (0 вимикає)
    • maxAgeHours: перевизначення Discord для жорсткого максимального віку в годинах (0 вимикає)
    • spawnSubagentSessions: перемикач opt-in для автоматичного створення/прив’язки тредів через sessions_spawn({ thread: true })
  • Записи верхнього рівня bindings[] з type: "acp" налаштовують постійні прив’язки ACP для каналів і тредів (використовуйте ID каналу/треду в match.peer.id). Семантика полів спільна з ACP Agents.
  • channels.discord.ui.components.accentColor задає accent color для контейнерів Discord components v2.
  • channels.discord.voice вмикає розмови у voice-каналах Discord і необов’язкове auto-join + перевизначення TTS.
  • channels.discord.voice.daveEncryption і channels.discord.voice.decryptionFailureTolerance напряму передаються в параметри DAVE @discordjs/voice (типово true і 24).
  • OpenClaw також намагається відновити прийом voice, виходячи й повторно приєднуючись до voice-сесії після повторних збоїв дешифрування.
  • channels.discord.streaming — канонічний ключ режиму streaming. Застарілі streamMode і булеві значення streaming мігруються автоматично.
  • channels.discord.autoPresence зіставляє доступність runtime з присутністю бота (healthy => online, degraded => idle, exhausted => dnd) і дозволяє необов’язкові перевизначення тексту статусу.
  • channels.discord.dangerouslyAllowNameMatching повторно вмикає зіставлення за змінними іменами/тегами (режим сумісності break-glass).
  • channels.discord.execApprovals: нативна доставка погоджень exec у Discord і авторизація тих, хто погоджує.
    • enabled: true, false або "auto" (типово). У режимі auto погодження exec активуються, коли тих, хто погоджує, можна визначити з approvers або commands.ownerAllowFrom.
    • approvers: ID користувачів Discord, яким дозволено погоджувати запити exec. Якщо не вказано, резервно використовується commands.ownerAllowFrom.
    • agentFilter: необов’язковий allowlist ID агентів. Якщо опущено, погодження пересилаються для всіх агентів.
    • sessionFilter: необов’язкові шаблони ключів сесій (підрядок або regex).
    • target: куди надсилати запити на погодження. "dm" (типово) надсилає в DM тих, хто погоджує, "channel" — у вихідний канал, "both" — в обидва місця. Коли target включає "channel", кнопками можуть користуватися лише визначені approvers.
    • cleanupAfterResolve: коли true, видаляє DM з погодженням після схвалення, відхилення або тайм-ауту.
Режими сповіщень про реакції: off (немає), own (повідомлення бота, типово), all (усі повідомлення), allowlist (від guilds.<id>.users для всіх повідомлень).

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 service account: inline (serviceAccount) або через файл (serviceAccountFile).
  • Також підтримується SecretRef для service account (serviceAccountRef).
  • Резервні env: GOOGLE_CHAT_SERVICE_ACCOUNT або GOOGLE_CHAT_SERVICE_ACCOUNT_FILE.
  • Використовуйте spaces/<spaceId> або users/<userId> як target доставки.
  • channels.googlechat.dangerouslyAllowNameMatching повторно вмикає зіставлення за змінним email principal (режим сумісності break-glass).

Slack

{
  channels: {
    slack: {
      enabled: true,
      botToken: "xoxb-...",
      appToken: "xapp-...",
      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, // використовувати нативний streaming API Slack, коли mode=partial
      },
      mediaMaxMb: 20,
      execApprovals: {
        enabled: "auto", // true | false | "auto"
        approvers: ["U123"],
        agentFilter: ["default"],
        sessionFilter: ["slack:"],
        target: "dm", // dm | channel | both
      },
    },
  },
}
  • Socket mode потребує і botToken, і appToken (SLACK_BOT_TOKEN + SLACK_APP_TOKEN для резервного env типового облікового запису).
  • HTTP mode потребує botToken плюс signingSecret (у корені або для окремого облікового запису).
  • botToken, appToken, signingSecret і userToken приймають plaintext рядки або об’єкти SecretRef.
  • Snapshot облікових записів Slack показують поля джерела/статусу для кожного облікового даного, такі як botTokenSource, botTokenStatus, appTokenStatus, а в режимі HTTP — signingSecretStatus. configured_unavailable означає, що обліковий запис налаштовано через SecretRef, але поточний шлях команди/runtime не зміг визначити значення секрету.
  • configWrites: false блокує записи конфігурації, ініційовані зі Slack.
  • Необов’язковий channels.slack.defaultAccount перевизначає вибір типового облікового запису, якщо він збігається з налаштованим ID облікового запису.
  • channels.slack.streaming.mode — канонічний ключ режиму streaming у Slack. channels.slack.streaming.nativeTransport керує нативним transport streaming у Slack. Застарілі streamMode, булеві streaming і nativeStreaming мігруються автоматично.
  • Використовуйте user:<id> (DM) або channel:<id> як target доставки.
Режими сповіщень про реакції: off, own (типово), all, allowlistreactionAllowlist). Ізоляція сесій тредів: thread.historyScope — на рівні треду (типово) або спільно на рівні каналу. thread.inheritParent копіює transcript батьківського каналу в нові треди.
  • Нативний streaming Slack плюс статус треду Slack у стилі assistant “is typing…” потребують target треду для відповіді. DM верхнього рівня типово залишаються поза тредом, тому вони використовують typingReaction або звичайну доставку замість preview у стилі треду.
  • typingReaction додає тимчасову реакцію до вхідного повідомлення Slack, поки виконується відповідь, а потім видаляє її після завершення. Використовуйте shortcode emoji Slack, наприклад "hourglass_flowing_sand".
  • channels.slack.execApprovals: нативна доставка погоджень exec у Slack і авторизація тих, хто погоджує. Та сама схема, що і в Discord: enabled (true/false/"auto"), approvers (ID користувачів Slack), agentFilter, sessionFilter і target ("dm", "channel" або "both").
Action groupDefaultNotes
reactionsувімкненоРеакції + список реакцій
messagesувімкненоЧитання/надсилання/редагування/видалення
pinsувімкненоЗакріплення/відкріплення/список
memberInfoувімкненоІнформація про учасника
emojiListувімкненоСписок кастомних emoji

Mattermost

Mattermost постачається як Plugin: openclaw plugins install @openclaw/mattermost.
{
  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",
        // Необов’язковий явний URL для reverse-proxy/публічних розгортань
        callbackUrl: "https://gateway.example.com/api/channels/mattermost/command",
      },
      textChunkLimit: 4000,
      chunkMode: "length",
    },
  },
}
Режими чату: oncall (відповідати на @-згадування, типово), onmessage (кожне повідомлення), onchar (повідомлення, що починаються з trigger prefix). Коли нативні команди Mattermost увімкнені:
  • commands.callbackPath має бути шляхом (наприклад /api/channels/mattermost/command), а не повним URL.
  • commands.callbackUrl має вказувати на endpoint Gateway OpenClaw і бути досяжним із сервера Mattermost.
  • Нативні slash callback автентифікуються за допомогою per-command токенів, які Mattermost повертає під час реєстрації slash command. Якщо реєстрація не вдалася або не активовано жодної команди, OpenClaw відхиляє callback з Unauthorized: invalid command token.
  • Для приватних/tailnet/internal host callback Mattermost може вимагати, щоб ServiceSettings.AllowedUntrustedInternalConnections включав host/domain callback. Використовуйте значення host/domain, а не повні URL.
  • channels.mattermost.configWrites: дозволити або заборонити записи конфігурації, ініційовані з Mattermost.
  • channels.mattermost.requireMention: вимагати @mention перед відповіддю в каналах.
  • channels.mattermost.groups.<channelId>.requireMention: перевизначення обмеження за згадуванням для окремого каналу ("*" для типового значення).
  • Необов’язковий channels.mattermost.defaultAccount перевизначає вибір типового облікового запису, якщо він збігається з налаштованим ID облікового запису.

Signal

{
  channels: {
    signal: {
      enabled: true,
      account: "+15555550123", // необов’язкова прив’язка облікового запису
      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,
    },
  },
}
Режими сповіщень про реакції: off, own (типово), all, allowlistreactionAllowlist).
  • channels.signal.account: прив’язати запуск каналу до конкретної identity облікового запису Signal.
  • channels.signal.configWrites: дозволити або заборонити записи конфігурації, ініційовані із Signal.
  • Необов’язковий channels.signal.defaultAccount перевизначає вибір типового облікового запису, якщо він збігається з налаштованим ID облікового запису.

BlueBubbles

BlueBubbles — рекомендований шлях для iMessage (на основі Plugin, налаштовується в channels.bluebubbles).
{
  channels: {
    bluebubbles: {
      enabled: true,
      dmPolicy: "pairing",
      // serverUrl, password, webhookPath, group controls і розширені дії:
      // див. /channels/bluebubbles
    },
  },
}
  • Ключові шляхи ядра, що описані тут: channels.bluebubbles, channels.bluebubbles.dmPolicy.
  • Необов’язковий channels.bluebubbles.defaultAccount перевизначає вибір типового облікового запису, якщо він збігається з налаштованим ID облікового запису.
  • Записи верхнього рівня bindings[] з type: "acp" можуть прив’язувати розмови BlueBubbles до постійних сесій ACP. Використовуйте handle BlueBubbles або рядок target (chat_id:*, chat_guid:*, chat_identifier:*) у match.peer.id. Спільна семантика полів: ACP Agents.
  • Повну конфігурацію каналу BlueBubbles задокументовано в BlueBubbles.

iMessage

OpenClaw запускає imsg rpc (JSON-RPC через stdio). Daemon або port не потрібні.
{
  channels: {
    imessage: {
      enabled: true,
      cliPath: "imsg",
      dbPath: "~/Library/Messages/chat.db",
      remoteHost: "user@gateway-host",
      dmPolicy: "pairing",
      allowFrom: ["+15555550123", "user@example.com", "chat_id:123"],
      historyLimit: 50,
      includeAttachments: false,
      attachmentRoots: ["/Users/*/Library/Messages/Attachments"],
      remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],
      mediaMaxMb: 16,
      service: "auto",
      region: "US",
    },
  },
}
  • Необов’язковий channels.imessage.defaultAccount перевизначає вибір типового облікового запису, якщо він збігається з налаштованим ID облікового запису.
  • Потрібен Full Disk Access до DB Messages.
  • Віддавайте перевагу target chat_id:<id>. Використовуйте imsg chats --limit 20, щоб переглянути список чатів.
  • cliPath може вказувати на обгортку SSH; задайте remoteHost (host або user@host) для отримання вкладень через SCP.
  • attachmentRoots і remoteAttachmentRoots обмежують шляхи вхідних вкладень (типово: /Users/*/Library/Messages/Attachments).
  • SCP використовує сувору перевірку host key, тож переконайтеся, що ключ relay host уже є в ~/.ssh/known_hosts.
  • channels.imessage.configWrites: дозволити або заборонити записи конфігурації, ініційовані з iMessage.
  • Записи верхнього рівня bindings[] з type: "acp" можуть прив’язувати розмови iMessage до постійних сесій ACP. Використовуйте нормалізований handle або явний target чату (chat_id:*, chat_guid:*, chat_identifier:*) у match.peer.id. Спільна семантика полів: ACP Agents.
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"

Matrix

Matrix використовує Plugin і налаштовується в 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",
        },
      },
    },
  },
}
  • Автентифікація токеном використовує accessToken; автентифікація паролем — userId + password.
  • channels.matrix.proxy маршрутизує HTTP-трафік Matrix через явний HTTP(S) proxy. Іменовані облікові записи можуть перевизначати його через channels.matrix.accounts.<id>.proxy.
  • channels.matrix.network.dangerouslyAllowPrivateNetwork дозволяє приватні/internal homeserver. proxy і цей мережевий opt-in — незалежні механізми керування.
  • channels.matrix.defaultAccount вибирає пріоритетний обліковий запис у multi-account конфігураціях.
  • channels.matrix.autoJoin типово має значення off, тому запрошені кімнати й нові запрошення у стилі DM ігноруються, доки ви не задасте autoJoin: "allowlist" з autoJoinAllowlist або autoJoin: "always".
  • channels.matrix.execApprovals: нативна доставка погоджень exec у Matrix і авторизація тих, хто погоджує.
    • enabled: true, false або "auto" (типово). У режимі auto погодження exec активуються, коли тих, хто погоджує, можна визначити з approvers або commands.ownerAllowFrom.
    • approvers: ID користувачів Matrix (наприклад @owner:example.org), яким дозволено погоджувати запити exec.
    • agentFilter: необов’язковий allowlist ID агентів. Якщо опущено, погодження пересилаються для всіх агентів.
    • sessionFilter: необов’язкові шаблони ключів сесій (підрядок або regex).
    • target: куди надсилати запити на погодження. "dm" (типово), "channel" (початкова кімната) або "both".
    • Перевизначення для окремого облікового запису: channels.matrix.accounts.<id>.execApprovals.
  • channels.matrix.dm.sessionScope керує тим, як DM Matrix групуються в сесії: per-user (типово) спільно використовує сесію за маршрутизованим peer, тоді як per-room ізолює кожну DM-кімнату.
  • Перевірки статусу Matrix і live-пошук у directory використовують ту саму політику proxy, що й runtime-трафік.
  • Повну конфігурацію Matrix, правила target і приклади налаштування задокументовано в Matrix.

Microsoft Teams

Microsoft Teams використовує Plugin і налаштовується в channels.msteams.
{
  channels: {
    msteams: {
      enabled: true,
      configWrites: true,
      // appId, appPassword, tenantId, webhook, політики team/channel:
      // див. /channels/msteams
    },
  },
}
  • Ключові шляхи ядра, що описані тут: channels.msteams, channels.msteams.configWrites.
  • Повну конфігурацію Teams (облікові дані, Webhook, політика DM/груп, перевизначення для окремих команд/каналів) задокументовано в Microsoft Teams.

IRC

IRC використовує Plugin і налаштовується в channels.irc.
{
  channels: {
    irc: {
      enabled: true,
      dmPolicy: "pairing",
      configWrites: true,
      nickserv: {
        enabled: true,
        service: "NickServ",
        password: "${IRC_NICKSERV_PASSWORD}",
        register: false,
        registerEmail: "bot@example.com",
      },
    },
  },
}
  • Ключові шляхи ядра, що описані тут: channels.irc, channels.irc.dmPolicy, channels.irc.configWrites, channels.irc.nickserv.*.
  • Необов’язковий channels.irc.defaultAccount перевизначає вибір типового облікового запису, якщо він збігається з налаштованим ID облікового запису.
  • Повну конфігурацію каналу IRC (host/port/TLS/channels/allowlists/обмеження за згадуванням) задокументовано в IRC.

Multi-account (усі канали)

Запускайте кілька облікових записів для одного каналу (кожен із власним accountId):
{
  channels: {
    telegram: {
      accounts: {
        default: {
          name: "Основний бот",
          botToken: "123456:ABC...",
        },
        alerts: {
          name: "Бот для сповіщень",
          botToken: "987654:XYZ...",
        },
      },
    },
  },
}
  • default використовується, коли accountId пропущено (CLI + маршрутизація).
  • Env-токени застосовуються лише до облікового запису default.
  • Базові налаштування каналу застосовуються до всіх облікових записів, якщо їх не перевизначено для окремого облікового запису.
  • Використовуйте bindings[].match.accountId, щоб маршрутизувати кожен обліковий запис до іншого агента.
  • Якщо ви додаєте не-default обліковий запис через openclaw channels add (або onboarding каналу), поки ще використовуєте топ-рівневу конфігурацію каналу для одного облікового запису, OpenClaw спочатку переносить значення верхнього рівня для одного облікового запису, прив’язані до account, у мапу облікових записів каналу, щоб початковий обліковий запис продовжив працювати. Більшість каналів переміщують їх у channels.<channel>.accounts.default; Matrix натомість може зберегти наявний відповідний іменований/default target.
  • Наявні прив’язки лише каналу (без accountId) і далі відповідають обліковому запису default; прив’язки з областю облікового запису залишаються необов’язковими.
  • openclaw doctor --fix також виправляє змішані форми, переміщуючи верхньорівневі значення для одного облікового запису, прив’язані до account, у просунутий обліковий запис, вибраний для цього каналу. Більшість каналів використовують accounts.default; Matrix натомість може зберегти наявний відповідний іменований/default target.

Інші канали Plugin

Багато каналів Plugin налаштовуються як channels.<id> і задокументовані на окремих сторінках каналів (наприклад Feishu, Matrix, LINE, Nostr, Zalo, Nextcloud Talk, Synology Chat і Twitch). Див. повний індекс каналів: Channels.

Обмеження за згадуванням у групових чатах

Для групових повідомлень типово потрібне згадування (згадування в metadata або безпечні regex-патерни). Це застосовується до групових чатів WhatsApp, Telegram, Discord, Google Chat та iMessage. Типи згадувань:
  • Згадування в metadata: нативні @-згадування платформи. Ігноруються в режимі self-chat WhatsApp.
  • Текстові патерни: безпечні regex-патерни в agents.list[].groupChat.mentionPatterns. Некоректні патерни й небезпечні вкладені повторення ігноруються.
  • Обмеження за згадуванням застосовується лише тоді, коли виявлення можливе (нативні згадування або принаймні один патерн).
{
  messages: {
    groupChat: { historyLimit: 50 },
  },
  agents: {
    list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }],
  },
}
messages.groupChat.historyLimit задає глобальне типове значення. Канали можуть перевизначати його через channels.<channel>.historyLimit (або для окремого облікового запису). Задайте 0, щоб вимкнути.

Обмеження історії DM

{
  channels: {
    telegram: {
      dmHistoryLimit: 30,
      dms: {
        "123456789": { historyLimit: 50 },
      },
    },
  },
}
Порядок визначення: перевизначення для окремого DM → типове значення провайдера → без обмеження (зберігається все). Підтримується: telegram, whatsapp, discord, slack, signal, imessage, msteams.

Режим self-chat

Додайте власний номер до allowFrom, щоб увімкнути режим self-chat (ігнорує нативні @-згадування, відповідає лише на текстові патерни):
{
  channels: {
    whatsapp: {
      allowFrom: ["+15555550123"],
      groups: { "*": { requireMention: true } },
    },
  },
  agents: {
    list: [
      {
        id: "main",
        groupChat: { mentionPatterns: ["reisponde", "@openclaw"] },
      },
    ],
  },
}

Команди (обробка команд чату)

{
  commands: {
    native: "auto", // реєструвати нативні команди, коли це підтримується
    nativeSkills: "auto", // реєструвати нативні команди Skills, коли це підтримується
    text: true, // розбирати /commands у повідомленнях чату
    bash: false, // дозволити ! (псевдонім: /bash)
    bashForegroundMs: 2000,
    config: false, // дозволити /config
    mcp: false, // дозволити /mcp
    plugins: false, // дозволити /plugins
    debug: false, // дозволити /debug
    restart: true, // дозволити /restart + інструмент перезапуску gateway
    ownerAllowFrom: ["discord:123456789012345678"],
    ownerDisplay: "raw", // raw | hash
    ownerDisplaySecret: "${OWNER_ID_HASH_SECRET}",
    allowFrom: {
      "*": ["user1"],
      discord: ["user:123"],
    },
    useAccessGroups: true,
  },
}
  • Цей блок налаштовує поверхні команд. Поточний каталог вбудованих + bundled команд див. у Slash Commands.
  • Ця сторінка — довідник ключів конфігурації, а не повний каталог команд. Команди, що належать каналу/Plugin, як-от QQ Bot /bot-ping /bot-help /bot-logs, LINE /card, device-pair /pair, memory /dreaming, phone-control /phone і Talk /voice, задокументовані на сторінках відповідних каналів/Plugin, а також у Slash Commands.
  • Текстові команди мають бути окремими повідомленнями з початковим /.
  • native: "auto" вмикає нативні команди для Discord/Telegram, залишаючи Slack вимкненим.
  • nativeSkills: "auto" вмикає нативні команди Skills для Discord/Telegram, залишаючи Slack вимкненим.
  • Перевизначення для окремого каналу: channels.discord.commands.native (bool або "auto"). false очищає раніше зареєстровані команди.
  • Перевизначуйте реєстрацію нативних Skills для окремого каналу через channels.<provider>.commands.nativeSkills.
  • channels.telegram.customCommands додає додаткові записи меню бота Telegram.
  • bash: true вмикає ! <cmd> для shell хоста. Потрібні tools.elevated.enabled і відправник у tools.elevated.allowFrom.<channel>.
  • config: true вмикає /config (читання/запис openclaw.json). Для клієнтів gateway chat.send постійні записи /config set|unset також потребують operator.admin; доступний лише для читання /config show залишається доступним для звичайних клієнтів operator з правами запису.
  • mcp: true вмикає /mcp для конфігурації MCP-сервера під керуванням OpenClaw у mcp.servers.
  • plugins: true вмикає /plugins для виявлення Plugin, встановлення та керування ввімкненням/вимкненням.
  • channels.<provider>.configWrites керує змінами конфігурації для кожного каналу окремо (типово: true).
  • Для multi-account каналів channels.<provider>.accounts.<id>.configWrites також керує записами, що націлені на цей обліковий запис (наприклад /allowlist --config --account <id> або /config set channels.<provider>.accounts.<id>...).
  • restart: false вимикає /restart і дії інструмента перезапуску gateway. Типове значення: true.
  • ownerAllowFrom — це явний allowlist власника для команд/інструментів лише для власника. Він відокремлений від allowFrom.
  • ownerDisplay: "hash" хешує ID власників у system prompt. Задайте ownerDisplaySecret, щоб керувати хешуванням.
  • allowFrom є окремим для кожного провайдера. Якщо його задано, це єдине джерело авторизації (allowlist/pairing каналу та useAccessGroups ігноруються).
  • useAccessGroups: false дозволяє командам обходити політики access-group, коли allowFrom не задано.
  • Мапа документації команд:
    • каталог вбудованих + bundled: Slash Commands
    • поверхні команд для окремих каналів: Channels
    • команди QQ Bot: QQ Bot
    • команди pairing: Pairing
    • команда карток LINE: LINE
    • memory dreaming: Dreaming

Пов’язане