Перейти до основного вмісту

Довідник з конфігурації

Усі поля, доступні в ~/.openclaw/openclaw.json. Для огляду, орієнтованого на завдання, див. Configuration. Формат конфігурації — JSON5 (дозволені коментарі + кінцеві коми). Усі поля необов’язкові — OpenClaw використовує безпечні значення за замовчуванням, якщо їх не вказано.

Канали

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

Доступ до DM і груп

Усі канали підтримують політики DM і політики груп:
Політика DMПоведінка
pairing (default)Невідомі відправники отримують одноразовий код pairing; власник має підтвердити
allowlistЛише відправники з allowFrom (або зі сховища paired allow)
openДозволити всі вхідні DM (потрібно allowFrom: ["*"])
disabledІгнорувати всі вхідні DM
Політика групПоведінка
allowlist (default)Лише групи, що відповідають налаштованому allowlist
openОбійти allowlist груп (гейтінг згадок усе ще діє)
disabledБлокувати всі повідомлення груп/кімнат
channels.defaults.groupPolicy задає значення за замовчуванням, якщо groupPolicy постачальника не встановлено. Коди pairing спливають через 1 годину. Кількість очікуваних запитів на pairing DM обмежена 3 на канал. Якщо блок постачальника повністю відсутній (channels.<provider> відсутній), політика груп під час виконання повертається до 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 (default, включати весь процитований/потоковий/історичний контекст), allowlist (включати контекст лише від відправників з allowlist), allowlist_quote (те саме, що allowlist, але зберігати явний контекст цитати/відповіді). Перевизначення на рівні каналу: channels.<channel>.contextVisibility.
  • channels.defaults.heartbeat.showOk: включати здорові статуси каналів у вивід heartbeat.
  • channels.defaults.heartbeat.showAlerts: включати деградовані/помилкові статуси у вивід heartbeat.
  • channels.defaults.heartbeat.useIndicator: відображати компактний heartbeat у стилі індикатора.

WhatsApp

WhatsApp працює через web channel gateway (Baileys Web). Він запускається автоматично, коли існує пов’язана сесія.
{
  channels: {
    whatsapp: {
      dmPolicy: "pairing", // pairing | allowlist | open | disabled
      allowFrom: ["+15555550123", "+447700900123"],
      textChunkLimit: 4000,
      chunkMode: "length", // length | newline
      mediaMaxMb: 50,
      sendReadReceipts: true, // blue ticks (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: "Залишай відповіді короткими.",
          topics: {
            "99": {
              requireMention: false,
              skills: ["search"],
              systemPrompt: "Дотримуйся теми.",
            },
          },
        },
      },
      customCommands: [
        { command: "backup", description: "Git backup" },
        { command: "generate", description: "Створити зображення" },
      ],
      historyLimit: 50,
      replyToMode: "first", // off | first | all | batched
      linkPreview: true,
      streaming: "partial", // off | partial | block | progress (default: off; явно вмикайте, щоб уникнути rate limits на preview-edit)
      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 як резервним варіантом для акаунта default.
  • Необов’язковий channels.telegram.defaultAccount перевизначає вибір акаунта за замовчуванням, якщо він збігається з налаштованим ID акаунта.
  • У багатоакаунтних конфігураціях (2+ ID акаунтів) установіть явний default (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.
  • Прев’ю потоку Telegram використовують sendMessage + editMessageText (працює в прямих і групових чатах).
  • Політика retry: див. Retry policy.

Discord

{
  channels: {
    discord: {
      enabled: true,
      token: "your-bot-token",
      mediaMaxMb: 8,
      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: "Лише короткі відповіді.",
            },
          },
        },
      },
      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 як резервним варіантом для акаунта default.
  • Прямі вихідні виклики, що передають явний Discord token, використовують цей токен для виклику; налаштування retry/політики акаунта все одно беруться з вибраного акаунта в активному знімку runtime.
  • Необов’язковий channels.discord.defaultAccount перевизначає вибір акаунта за замовчуванням, якщо він збігається з налаштованим ID акаунта.
  • Використовуйте user:<id> (DM) або channel:<id> (канал guild) як цілі доставки; прості числові ID відхиляються.
  • Slug guild — у нижньому регістрі, пробіли замінено на -; ключі каналів використовують slug-ім’я (без #). Віддавайте перевагу ID guild.
  • Повідомлення, створені ботом, за замовчуванням ігноруються. allowBots: true вмикає їх; використовуйте allowBots: "mentions", щоб приймати лише повідомлення ботів, які згадують бота (власні повідомлення все одно фільтруються).
  • channels.discord.guilds.<id>.ignoreOtherMentions (і перевизначення каналів) відкидає повідомлення, які згадують іншого користувача або роль, але не бота (за винятком @everyone/@here).
  • maxLinesPerMessage (default 17) розбиває довгі повідомлення, навіть якщо вони коротші за 2000 символів.
  • channels.discord.threadBindings керує маршрутизацією, прив’язаною до thread у Discord:
    • enabled: перевизначення Discord для функцій сесій, прив’язаних до thread (/focus, /unfocus, /agents, /session idle, /session max-age та прив’язана доставка/маршрутизація)
    • idleHours: перевизначення Discord для автоматичного unfocus через неактивність у годинах (0 вимикає)
    • maxAgeHours: перевизначення Discord для жорсткого максимального віку в годинах (0 вимикає)
    • spawnSubagentSessions: opt-in перемикач для автоматичного створення/прив’язки thread у sessions_spawn({ thread: true })
  • Записи верхнього рівня bindings[] з type: "acp" налаштовують сталі ACP-прив’язки для каналів і thread (використовуйте ID каналу/thread у match.peer.id). Семантика полів спільна з ACP Agents.
  • channels.discord.ui.components.accentColor задає колір акценту для контейнерів Discord components v2.
  • channels.discord.voice вмикає розмови у voice channel Discord і необов’язкові auto-join + перевизначення TTS.
  • channels.discord.voice.daveEncryption і channels.discord.voice.decryptionFailureTolerance напряму передаються в параметри DAVE @discordjs/voice (true і 24 за замовчуванням).
  • OpenClaw також намагається відновити voice receive, виходячи й повторно приєднуючись до voice session після повторюваних помилок дешифрування.
  • channels.discord.streaming — канонічний ключ режиму потоку. Застарілі streamMode і булеві значення streaming мігруються автоматично.
  • channels.discord.autoPresence зіставляє доступність runtime зі статусом бота (healthy => online, degraded => idle, exhausted => dnd) і дозволяє необов’язкові перевизначення тексту статусу.
  • channels.discord.dangerouslyAllowNameMatching знову вмикає зіставлення за змінюваним ім’ям/tag (режим break-glass для сумісності).
  • channels.discord.execApprovals: доставка native exec approval у Discord і авторизація погоджувачів.
    • enabled: true, false або "auto" (default). У режимі auto exec approvals активуються, коли погоджувачів можна визначити з approvers або commands.ownerAllowFrom.
    • approvers: ID користувачів Discord, яким дозволено схвалювати exec requests. Якщо не вказано, використовується commands.ownerAllowFrom.
    • agentFilter: необов’язковий allowlist ID агентів. Якщо пропустити, approvals пересилаються для всіх агентів.
    • sessionFilter: необов’язкові шаблони ключів сесій (підрядок або regex).
    • target: куди надсилати запити на схвалення. "dm" (default) надсилає в DM погоджувачів, "channel" — у вихідний канал, "both" — в обидва місця. Коли target включає "channel", кнопки можуть використовувати лише визначені погоджувачі.
    • cleanupAfterResolve: якщо true, видаляє approval DM після схвалення, відхилення або timeout.
Режими сповіщень про реакції: off (немає), own (повідомлення бота, default), 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: вбудовано (serviceAccount) або з файла (serviceAccountFile).
  • Також підтримується Service account SecretRef (serviceAccountRef).
  • Резервні env: GOOGLE_CHAT_SERVICE_ACCOUNT або GOOGLE_CHAT_SERVICE_ACCOUNT_FILE.
  • Використовуйте spaces/<spaceId> або users/<userId> як цілі доставки.
  • 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: "Лише короткі відповіді.",
        },
      },
      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: "partial", // off | partial | block | progress (режим прев’ю)
      nativeStreaming: true, // використовувати native streaming API Slack, коли streaming=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 для акаунта default).
  • HTTP mode потребує botToken плюс signingSecret (у корені або для кожного акаунта).
  • botToken, appToken, signingSecret і userToken приймають прості текстові рядки або об’єкти SecretRef.
  • Знімки акаунтів Slack показують поля джерела/статусу для кожного облікового даного, наприклад botTokenSource, botTokenStatus, appTokenStatus, а в HTTP mode — signingSecretStatus. configured_unavailable означає, що акаунт налаштований через SecretRef, але поточний шлях command/runtime не зміг розв’язати значення секрету.
  • configWrites: false блокує записи конфігурації, ініційовані зі Slack.
  • Необов’язковий channels.slack.defaultAccount перевизначає вибір акаунта за замовчуванням, якщо він збігається з налаштованим ID акаунта.
  • channels.slack.streaming — канонічний ключ режиму потоку. Застарілі streamMode і булеві значення streaming мігруються автоматично.
  • Використовуйте user:<id> (DM) або channel:<id> як цілі доставки.
Режими сповіщень про реакції: off, own (default), all, allowlist (із reactionAllowlist). Ізоляція thread session: thread.historyScope — для кожного thread окремо (default) або спільний для каналу. thread.inheritParent копіює transcript батьківського каналу в нові threads.
  • typingReaction додає тимчасову реакцію до вхідного повідомлення Slack, поки виконується відповідь, а після завершення прибирає її. Використовуйте shortcode emoji Slack, наприклад "hourglass_flowing_sand".
  • channels.slack.execApprovals: доставка native exec approval у Slack і авторизація погоджувачів. Та сама схема, що й у Discord: enabled (true/false/"auto"), approvers (ID користувачів Slack), agentFilter, sessionFilter і target ("dm", "channel" або "both").
Група дійDefaultПримітки
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/public deployments
        callbackUrl: "https://gateway.example.com/api/channels/mattermost/command",
      },
      textChunkLimit: 4000,
      chunkMode: "length",
    },
  },
}
Режими чату: oncall (відповідати на @-згадку, default), onmessage (на кожне повідомлення), onchar (повідомлення, що починаються з префікса trigger). Коли native commands Mattermost увімкнено:
  • commands.callbackPath має бути шляхом (наприклад /api/channels/mattermost/command), а не повною URL-адресою.
  • commands.callbackUrl має вказувати на endpoint gateway OpenClaw і бути досяжним із сервера Mattermost.
  • Native slash callbacks автентифікуються токенами кожної команди, які Mattermost повертає під час реєстрації slash command. Якщо реєстрація не вдалася або не активовано жодної команди, OpenClaw відхиляє callbacks із Unauthorized: invalid command token.
  • Для private/tailnet/internal callback hosts Mattermost може вимагати, щоб ServiceSettings.AllowedUntrustedInternalConnections містив callback host/domain. Використовуйте значення host/domain, а не повні URL.
  • channels.mattermost.configWrites: дозволити або заборонити записи конфігурації, ініційовані з Mattermost.
  • channels.mattermost.requireMention: вимагати @mention перед відповіддю в каналах.
  • channels.mattermost.groups.<channelId>.requireMention: перевизначення mention-gating для окремого каналу ("*" для default).
  • Необов’язковий 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 (default), all, allowlist (із reactionAllowlist).
  • channels.signal.account: закріпити запуск каналу за конкретною ідентичністю акаунта Signal.
  • channels.signal.configWrites: дозволити або заборонити записи конфігурації, ініційовані із Signal.
  • Необов’язковий channels.signal.defaultAccount перевизначає вибір акаунта за замовчуванням, якщо він збігається з налаштованим ID акаунта.

BlueBubbles

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

iMessage

OpenClaw запускає imsg rpc (JSON-RPC через stdio). Daemon або порт не потрібні.
{
  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 до БД Messages.
  • Віддавайте перевагу цілям chat_id:<id>. Використовуйте imsg chats --limit 20, щоб переглянути список чатів.
  • cliPath може вказувати на SSH wrapper; установіть remoteHost (host або user@host) для отримання вкладень через SCP.
  • attachmentRoots і remoteAttachmentRoots обмежують шляхи вхідних вкладень (default: /Users/*/Library/Messages/Attachments).
  • SCP використовує сувору перевірку host key, тому переконайтеся, що host key relay уже є в ~/.ssh/known_hosts.
  • channels.imessage.configWrites: дозволити або заборонити записи конфігурації, ініційовані з iMessage.
  • Записи верхнього рівня bindings[] з type: "acp" можуть прив’язувати розмови iMessage до сталих ACP session. Використовуйте нормалізований handle або явну ціль чату (chat_id:*, chat_guid:*, chat_identifier:*) у match.peer.id. Спільна семантика полів: ACP Agents.
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"

Matrix

Matrix підтримується extension і налаштовується в 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.allowPrivateNetwork дозволяє private/internal homeservers. proxy і allowPrivateNetwork — незалежні елементи керування.
  • channels.matrix.defaultAccount вибирає бажаний акаунт у багатоакаунтних конфігураціях.
  • channels.matrix.execApprovals: доставка native exec approval у Matrix і авторизація погоджувачів.
    • enabled: true, false або "auto" (default). У режимі auto exec approvals активуються, коли погоджувачів можна визначити з approvers або commands.ownerAllowFrom.
    • approvers: ID користувачів Matrix (наприклад @owner:example.org), яким дозволено схвалювати exec requests.
    • agentFilter: необов’язковий allowlist ID агентів. Якщо пропустити, approvals пересилаються для всіх агентів.
    • sessionFilter: необов’язкові шаблони ключів сесій (підрядок або regex).
    • target: куди надсилати запити на схвалення. "dm" (default), "channel" (вихідна кімната) або "both".
    • Перевизначення на рівні акаунта: channels.matrix.accounts.<id>.execApprovals.
  • channels.matrix.dm.sessionScope керує тим, як DM Matrix групуються в session: per-user (default) ділить за маршрутизованим peer, а per-room ізолює кожну DM room.
  • Matrix status probes і live directory lookups використовують ту саму політику proxy, що й трафік runtime.
  • Повну конфігурацію Matrix, правила targeting і приклади налаштування задокументовано в Matrix.

Microsoft Teams

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

IRC

IRC підтримується extension і налаштовується в 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/mention gating) задокументовано в IRC.

Багато акаунтів (усі канали)

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

Інші extension channels

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

Гейтінг згадок у групових чатах

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

Ліміти історії DM

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

Режим self-chat

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

Commands (обробка chat command)

{
  commands: {
    native: "auto", // реєструвати native commands, коли підтримується
    text: true, // розбирати /commands у chat messages
    bash: false, // дозволити ! (аліас: /bash)
    bashForegroundMs: 2000,
    config: false, // дозволити /config
    debug: false, // дозволити /debug
    restart: false, // дозволити /restart + інструмент restart gateway
    allowFrom: {
      "*": ["user1"],
      discord: ["user:123"],
    },
    useAccessGroups: true,
  },
}
  • Text commands мають бути окремими повідомленнями з початковим /.
  • native: "auto" вмикає native commands для Discord/Telegram, залишає Slack вимкненим.
  • Перевизначення для каналу: channels.discord.commands.native (bool або "auto"). false очищує раніше зареєстровані commands.
  • 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; read-only /config show залишається доступним для звичайних операторських клієнтів із правом запису.
  • channels.<provider>.configWrites контролює мутації конфігурації для кожного каналу (default: true).
  • Для багатоакаунтних каналів channels.<provider>.accounts.<id>.configWrites також контролює записи, що націлені на цей акаунт (наприклад /allowlist --config --account <id> або /config set channels.<provider>.accounts.<id>...).
  • allowFrom задається для кожного постачальника. Якщо встановлено, це єдине джерело авторизації (allowlist/pairing каналу та useAccessGroups ігноруються).
  • useAccessGroups: false дозволяє commands обходити політики access-group, коли allowFrom не задано.

Значення агента за замовчуванням

agents.defaults.workspace

Default: ~/.openclaw/workspace.
{
  agents: { defaults: { workspace: "~/.openclaw/workspace" } },
}

agents.defaults.repoRoot

Необов’язковий корінь репозиторію, який показується в рядку Runtime системного prompt. Якщо не задано, OpenClaw визначає його автоматично, підіймаючись вгору від workspace.
{
  agents: { defaults: { repoRoot: "~/Projects/openclaw" } },
}

agents.defaults.skills

Необов’язковий default allowlist для Skills для агентів, які не задають agents.list[].skills.
{
  agents: {
    defaults: { skills: ["github", "weather"] },
    list: [
      { id: "writer" }, // успадковує github, weather
      { id: "docs", skills: ["docs-search"] }, // замінює defaults
      { id: "locked-down", skills: [] }, // без skills
    ],
  },
}
  • Пропустіть agents.defaults.skills, щоб за замовчуванням Skills не обмежувалися.
  • Пропустіть agents.list[].skills, щоб успадкувати defaults.
  • Установіть agents.list[].skills: [], щоб не було жодних Skills.
  • Непорожній список agents.list[].skills — це фінальний набір для агента; він не зливається з defaults.

agents.defaults.skipBootstrap

Вимикає автоматичне створення bootstrap-файлів workspace (AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, BOOTSTRAP.md).
{
  agents: { defaults: { skipBootstrap: true } },
}

agents.defaults.bootstrapMaxChars

Максимальна кількість символів у кожному bootstrap-файлі workspace перед обрізанням. Default: 20000.
{
  agents: { defaults: { bootstrapMaxChars: 20000 } },
}

agents.defaults.bootstrapTotalMaxChars

Максимальна загальна кількість символів, що інжектуються в усі bootstrap-файли workspace. Default: 150000.
{
  agents: { defaults: { bootstrapTotalMaxChars: 150000 } },
}

agents.defaults.bootstrapPromptTruncationWarning

Керує видимим для агента текстом попередження, коли bootstrap-контекст обрізано. Default: "once".
  • "off": ніколи не інжектувати текст попередження в system prompt.
  • "once": інжектувати попередження один раз для кожного унікального сигнатурного обрізання (рекомендовано).
  • "always": інжектувати попередження під час кожного запуску, якщо обрізання існує.
{
  agents: { defaults: { bootstrapPromptTruncationWarning: "once" } }, // off | once | always
}

agents.defaults.imageMaxDimensionPx

Максимальний розмір у пікселях для найдовшої сторони зображення в блоках image transcript/tool перед викликами постачальника. Default: 1200. Нижчі значення зазвичай зменшують використання vision-token і розмір payload запиту для сценаріїв із великою кількістю скриншотів. Вищі значення зберігають більше візуальних деталей.
{
  agents: { defaults: { imageMaxDimensionPx: 1200 } },
}

agents.defaults.userTimezone

Часовий пояс для контексту system prompt (не для timestamp повідомлень). Якщо не задано, використовується часовий пояс хоста.
{
  agents: { defaults: { userTimezone: "America/Chicago" } },
}

agents.defaults.timeFormat

Формат часу в system prompt. Default: auto (налаштування ОС).
{
  agents: { defaults: { timeFormat: "auto" } }, // auto | 12 | 24
}

agents.defaults.model

{
  agents: {
    defaults: {
      models: {
        "anthropic/claude-opus-4-6": { alias: "opus" },
        "minimax/MiniMax-M2.7": { alias: "minimax" },
      },
      model: {
        primary: "anthropic/claude-opus-4-6",
        fallbacks: ["minimax/MiniMax-M2.7"],
      },
      imageModel: {
        primary: "openrouter/qwen/qwen-2.5-vl-72b-instruct:free",
        fallbacks: ["openrouter/google/gemini-2.0-flash-vision:free"],
      },
      imageGenerationModel: {
        primary: "openai/gpt-image-1",
        fallbacks: ["google/gemini-3.1-flash-image-preview"],
      },
      videoGenerationModel: {
        primary: "qwen/wan2.6-t2v",
        fallbacks: ["qwen/wan2.6-i2v"],
      },
      pdfModel: {
        primary: "anthropic/claude-opus-4-6",
        fallbacks: ["openai/gpt-5.4-mini"],
      },
      params: { cacheRetention: "long" }, // глобальні default provider params
      pdfMaxBytesMb: 10,
      pdfMaxPages: 20,
      thinkingDefault: "low",
      verboseDefault: "off",
      elevatedDefault: "on",
      timeoutSeconds: 600,
      mediaMaxMb: 5,
      contextTokens: 200000,
      maxConcurrent: 3,
    },
  },
}
  • model: приймає або рядок ("provider/model"), або об’єкт ({ primary, fallbacks }).
    • Рядкова форма задає лише primary model.
    • Форма об’єкта задає primary плюс впорядковані failover models.
  • imageModel: приймає або рядок ("provider/model"), або об’єкт ({ primary, fallbacks }).
    • Використовується шляхом інструмента image як конфігурація vision model.
    • Також використовується як резервна маршрутизація, коли вибрана/default model не може приймати image input.
  • imageGenerationModel: приймає або рядок ("provider/model"), або об’єкт ({ primary, fallbacks }).
    • Використовується спільною можливістю генерації зображень і будь-якою майбутньою поверхнею tool/plugin, що генерує зображення.
    • Типові значення: google/gemini-3.1-flash-image-preview для native Gemini image generation, fal/fal-ai/flux/dev для fal або openai/gpt-image-1 для OpenAI Images.
    • Якщо ви вибираєте конкретний provider/model, також налаштуйте відповідну автентифікацію/API key постачальника (наприклад GEMINI_API_KEY або GOOGLE_API_KEY для google/*, OPENAI_API_KEY для openai/*, FAL_KEY для fal/*).
    • Якщо параметр пропущено, image_generate все одно може вивести default постачальника з автентифікацією. Спочатку він пробує поточного default provider, а потім решту зареєстрованих постачальників image generation у порядку provider-id.
  • videoGenerationModel: приймає або рядок ("provider/model"), або об’єкт ({ primary, fallbacks }).
    • Використовується спільною можливістю генерації відео та вбудованим інструментом video_generate.
    • Типові значення: qwen/wan2.6-t2v, qwen/wan2.6-i2v, qwen/wan2.6-r2v, qwen/wan2.6-r2v-flash або qwen/wan2.7-r2v.
    • Якщо параметр пропущено, video_generate усе одно може вивести default постачальника з автентифікацією. Спочатку він пробує поточного default provider, а потім решту зареєстрованих постачальників генерації відео в порядку provider-id.
    • Якщо ви вибираєте конкретний provider/model, також налаштуйте відповідну автентифікацію/API key постачальника.
    • Вбудований постачальник генерації відео Qwen наразі підтримує до 1 вихідного відео, 1 вхідного зображення, 4 вхідних відео, тривалість 10 секунд і параметри постачальника size, aspectRatio, resolution, audio та watermark.
  • pdfModel: приймає або рядок ("provider/model"), або об’єкт ({ primary, fallbacks }).
    • Використовується інструментом pdf для маршрутизації моделі.
    • Якщо параметр пропущено, PDF tool повертається до imageModel, а потім — до визначеної model session/default.
  • pdfMaxBytesMb: default обмеження розміру PDF для інструмента pdf, коли maxBytesMb не передано під час виклику.
  • pdfMaxPages: default максимальна кількість сторінок, які враховуються режимом fallback extraction в інструменті pdf.
  • verboseDefault: default рівень verbose для агентів. Значення: "off", "on", "full". Default: "off".
  • elevatedDefault: default рівень elevated-output для агентів. Значення: "off", "on", "ask", "full". Default: "on".
  • model.primary: формат provider/model (наприклад openai/gpt-5.4). Якщо пропустити provider, OpenClaw спочатку пробує alias, потім — унікальний match серед налаштованих providers для цього exact model id, і лише потім повертається до налаштованого default provider (застаріла сумісна поведінка, тому краще явно вказувати provider/model). Якщо цей provider більше не пропонує налаштовану default model, OpenClaw повертається до першого налаштованого provider/model, а не показує застарілий default видаленого provider.
  • models: налаштований каталог моделей і allowlist для /model. Кожен запис може містити alias (скорочення) і params (специфічні для provider, наприклад temperature, maxTokens, cacheRetention, context1m).
  • params: глобальні default provider parameters, застосовувані до всіх моделей. Задається через agents.defaults.params (наприклад { cacheRetention: "long" }).
  • Пріоритет злиття params (конфігурація): agents.defaults.params (глобальна база) перевизначається agents.defaults.models["provider/model"].params (для моделі), потім agents.list[].params (для відповідного agent id) перевизначає по ключах. Докладніше див. Prompt Caching.
  • Записувачі конфігурації, які змінюють ці поля (наприклад /models set, /models set-image і команди додавання/видалення fallback), зберігають канонічну форму об’єкта й по можливості зберігають наявні списки fallback.
  • maxConcurrent: максимальна кількість паралельних запусків агентів між сесіями (кожна session усе одно серіалізується). Default: 4.
Вбудовані shorthand aliases (застосовуються лише тоді, коли модель є в agents.defaults.models):
ПсевдонімМодель
opusanthropic/claude-opus-4-6
sonnetanthropic/claude-sonnet-4-6
gptopenai/gpt-5.4
gpt-miniopenai/gpt-5.4-mini
gpt-nanoopenai/gpt-5.4-nano
geminigoogle/gemini-3.1-pro-preview
gemini-flashgoogle/gemini-3-flash-preview
gemini-flash-litegoogle/gemini-3.1-flash-lite-preview
Ваші налаштовані aliases завжди мають пріоритет над defaults. Моделі Z.AI GLM-4.x автоматично вмикають thinking mode, якщо ви не встановите --thinking off або самі не задасте agents.defaults.models["zai/<model>"].params.thinking. Моделі Z.AI за замовчуванням вмикають tool_stream для потокової передачі tool call. Щоб вимкнути це, установіть agents.defaults.models["zai/<model>"].params.tool_stream у false. Для моделей Anthropic Claude 4.6 за замовчуванням використовується adaptive thinking, коли не задано явний рівень thinking.
  • Sessions підтримуються, коли встановлено sessionArg.
  • Пряме передавання image підтримується, коли imageArg приймає file paths.

agents.defaults.heartbeat

Періодичні запуски heartbeat.
{
  agents: {
    defaults: {
      heartbeat: {
        every: "30m", // 0m вимикає
        model: "openai/gpt-5.4-mini",
        includeReasoning: false,
        lightContext: false, // default: false; true зберігає лише HEARTBEAT.md із bootstrap-файлів workspace
        isolatedSession: false, // default: false; true запускає кожен heartbeat у свіжій session (без історії розмови)
        session: "main",
        to: "+15555550123",
        directPolicy: "allow", // allow (default) | block
        target: "none", // default: none | options: last | whatsapp | telegram | discord | ...
        prompt: "Прочитай HEARTBEAT.md, якщо він існує...",
        ackMaxChars: 300,
        suppressToolErrorWarnings: false,
      },
    },
  },
}
  • every: рядок тривалості (ms/s/m/h). Default: 30m (автентифікація API key) або 1h (автентифікація OAuth). Установіть 0m, щоб вимкнути.
  • suppressToolErrorWarnings: якщо true, пригнічує payload попереджень про помилки інструментів під час heartbeat runs.
  • directPolicy: політика доставки direct/DM. allow (default) дозволяє доставку в direct targets. block пригнічує доставку в direct target і генерує reason=dm-blocked.
  • lightContext: якщо true, heartbeat runs використовують полегшений bootstrap-контекст і зберігають лише HEARTBEAT.md із bootstrap-файлів workspace.
  • isolatedSession: якщо true, кожен heartbeat run відбувається в новій session без попередньої історії розмов. Той самий шаблон ізоляції, що й у cron sessionTarget: "isolated". Зменшує вартість токенів на heartbeat приблизно зі ~100K до ~2-5K токенів.
  • Для агента: задайте agents.list[].heartbeat. Якщо будь-який агент визначає heartbeat, heartbeat запускаються лише для цих агентів.
  • Heartbeat виконують повні agent turns — коротші інтервали спалюють більше токенів.

agents.defaults.compaction

{
  agents: {
    defaults: {
      compaction: {
        mode: "safeguard", // default | safeguard
        timeoutSeconds: 900,
        reserveTokensFloor: 24000,
        identifierPolicy: "strict", // strict | off | custom
        identifierInstructions: "Точно зберігай deployment IDs, ticket IDs і пари host:port.", // використовується, коли identifierPolicy=custom
        postCompactionSections: ["Session Startup", "Red Lines"], // [] вимикає повторне інжектування
        model: "openrouter/anthropic/claude-sonnet-4-6", // необов’язкове перевизначення моделі лише для compaction
        notifyUser: true, // надсилати коротке повідомлення, коли починається compaction (default: false)
        memoryFlush: {
          enabled: true,
          softThresholdTokens: 6000,
          systemPrompt: "Session наближається до compaction. Збережіть сталі спогади зараз.",
          prompt: "Запиши будь-які тривалі нотатки в memory/YYYY-MM-DD.md; відповідай точним silent token NO_REPLY, якщо зберігати нічого.",
        },
      },
    },
  },
}
  • mode: default або safeguard (узагальнення шматками для довгих історій). Див. Compaction.
  • timeoutSeconds: максимальна кількість секунд для однієї операції compaction, після чого OpenClaw її скасовує. Default: 900.
  • identifierPolicy: strict (default), off або custom. strict додає вбудовані інструкції щодо збереження непрозорих ідентифікаторів під час summarization у compaction.
  • identifierInstructions: необов’язковий власний текст для збереження ідентифікаторів, який використовується, коли identifierPolicy=custom.
  • postCompactionSections: необов’язкові назви секцій AGENTS.md рівня H2/H3 для повторного інжектування після compaction. Default: ["Session Startup", "Red Lines"]; установіть [], щоб вимкнути повторне інжектування. Коли не задано або явно встановлено цю пару за замовчуванням, старіші заголовки Every Session/Safety також приймаються як legacy fallback.
  • model: необов’язкове перевизначення provider/model-id лише для summarization у compaction. Використовуйте це, коли основна session має залишатися на одній моделі, а summaries compaction повинні виконуватися на іншій; якщо не задано, compaction використовує primary model session.
  • notifyUser: якщо true, надсилає коротке повідомлення користувачу, коли починається compaction (наприклад, “Compacting context…”). За замовчуванням вимкнено, щоб compaction відбувався безшумно.
  • memoryFlush: тихий agentic turn перед auto-compaction для збереження тривалих спогадів. Пропускається, якщо workspace тільки для читання.

agents.defaults.contextPruning

Обрізає старі результати інструментів з in-memory контексту перед надсиланням до LLM. Не змінює історію session на диску.
{
  agents: {
    defaults: {
      contextPruning: {
        mode: "cache-ttl", // off | cache-ttl
        ttl: "1h", // тривалість (ms/s/m/h), одиниця за замовчуванням: хвилини
        keepLastAssistants: 3,
        softTrimRatio: 0.3,
        hardClearRatio: 0.5,
        minPrunableToolChars: 50000,
        softTrim: { maxChars: 4000, headChars: 1500, tailChars: 1500 },
        hardClear: { enabled: true, placeholder: "[Вміст старого результату інструмента очищено]" },
        tools: { deny: ["browser", "canvas"] },
      },
    },
  },
}
  • mode: "cache-ttl" вмикає проходи pruning.
  • ttl визначає, як часто pruning може запускатися знову (після останнього cache touch).
  • Pruning спочатку soft-trim обрізає завеликі результати інструментів, а потім hard-clear очищає старіші результати інструментів, якщо потрібно.
Soft-trim зберігає початок + кінець і вставляє ... посередині.Hard-clear замінює весь результат інструмента на placeholder.Примітки:
  • Блоки image ніколи не обрізаються/не очищаються.
  • Співвідношення базуються на символах (приблизно), а не на точній кількості токенів.
  • Якщо існує менше ніж keepLastAssistants assistant messages, pruning пропускається.
Докладніше про поведінку див. у Session Pruning.

Block streaming

{
  agents: {
    defaults: {
      blockStreamingDefault: "off", // on | off
      blockStreamingBreak: "text_end", // text_end | message_end
      blockStreamingChunk: { minChars: 800, maxChars: 1200 },
      blockStreamingCoalesce: { idleMs: 1000 },
      humanDelay: { mode: "natural" }, // off | natural | custom (використовуйте minMs/maxMs)
    },
  },
}
  • Канали, крім Telegram, потребують явного *.blockStreaming: true, щоб увімкнути block replies.
  • Перевизначення на рівні каналу: channels.<channel>.blockStreamingCoalesce (і варіанти для кожного акаунта). Для Signal/Slack/Discord/Google Chat default minChars: 1500.
  • humanDelay: випадкова пауза між block replies. natural = 800–2500ms. Перевизначення для агента: agents.list[].humanDelay.
Докладніше про поведінку та chunking див. у Streaming.

Індикатори набору

{
  agents: {
    defaults: {
      typingMode: "instant", // never | instant | thinking | message
      typingIntervalSeconds: 6,
    },
  },
}
  • Defaults: instant для direct chats/mentions, message для групових чатів без згадки.
  • Перевизначення для session: session.typingMode, session.typingIntervalSeconds.
Див. Typing Indicators.

agents.defaults.sandbox

Необов’язковий sandboxing для вбудованого агента. Повний посібник див. у Sandboxing.
{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main", // off | non-main | all
        backend: "docker", // docker | ssh | openshell
        scope: "agent", // session | agent | shared
        workspaceAccess: "none", // none | ro | rw
        workspaceRoot: "~/.openclaw/sandboxes",
        docker: {
          image: "openclaw-sandbox:bookworm-slim",
          containerPrefix: "openclaw-sbx-",
          workdir: "/workspace",
          readOnlyRoot: true,
          tmpfs: ["/tmp", "/var/tmp", "/run"],
          network: "none",
          user: "1000:1000",
          capDrop: ["ALL"],
          env: { LANG: "C.UTF-8" },
          setupCommand: "apt-get update && apt-get install -y git curl jq",
          pidsLimit: 256,
          memory: "1g",
          memorySwap: "2g",
          cpus: 1,
          ulimits: {
            nofile: { soft: 1024, hard: 2048 },
            nproc: 256,
          },
          seccompProfile: "/path/to/seccomp.json",
          apparmorProfile: "openclaw-sandbox",
          dns: ["1.1.1.1", "8.8.8.8"],
          extraHosts: ["internal.service:10.0.0.5"],
          binds: ["/home/user/source:/source:rw"],
        },
        ssh: {
          target: "user@gateway-host:22",
          command: "ssh",
          workspaceRoot: "/tmp/openclaw-sandboxes",
          strictHostKeyChecking: true,
          updateHostKeys: true,
          identityFile: "~/.ssh/id_ed25519",
          certificateFile: "~/.ssh/id_ed25519-cert.pub",
          knownHostsFile: "~/.ssh/known_hosts",
          // Також підтримуються SecretRefs / вбудований вміст:
          // identityData: { source: "env", provider: "default", id: "SSH_IDENTITY" },
          // certificateData: { source: "env", provider: "default", id: "SSH_CERTIFICATE" },
          // knownHostsData: { source: "env", provider: "default", id: "SSH_KNOWN_HOSTS" },
        },
        browser: {
          enabled: false,
          image: "openclaw-sandbox-browser:bookworm-slim",
          network: "openclaw-sandbox-browser",
          cdpPort: 9222,
          cdpSourceRange: "172.21.0.1/32",
          vncPort: 5900,
          noVncPort: 6080,
          headless: false,
          enableNoVnc: true,
          allowHostControl: false,
          autoStart: true,
          autoStartTimeoutMs: 12000,
        },
        prune: {
          idleHours: 24,
          maxAgeDays: 7,
        },
      },
    },
  },
  tools: {
    sandbox: {
      tools: {
        allow: [
          "exec",
          "process",
          "read",
          "write",
          "edit",
          "apply_patch",
          "sessions_list",
          "sessions_history",
          "sessions_send",
          "sessions_spawn",
          "session_status",
        ],
        deny: ["browser", "canvas", "nodes", "cron", "discord", "gateway"],
      },
    },
  },
}
Backend:
  • docker: локальний runtime Docker (default)
  • ssh: універсальний remote runtime на основі SSH
  • openshell: runtime OpenShell
Коли вибрано backend: "openshell", налаштування, специфічні для runtime, переносяться до plugins.entries.openshell.config.Конфігурація backend SSH:
  • target: ціль SSH у форматі user@host[:port]
  • command: команда SSH client (default: ssh)
  • workspaceRoot: абсолютний remote root, що використовується для workspace кожного scope
  • identityFile / certificateFile / knownHostsFile: наявні локальні файли, передані до OpenSSH
  • identityData / certificateData / knownHostsData: вбудований вміст або SecretRefs, які OpenClaw матеріалізує у тимчасові файли під час runtime
  • strictHostKeyChecking / updateHostKeys: параметри політики host-key OpenSSH
Пріоритет автентифікації SSH:
  • identityData має пріоритет над identityFile
  • certificateData має пріоритет над certificateFile
  • knownHostsData має пріоритет над knownHostsFile
  • Значення *Data, що використовують SecretRef, розв’язуються з активного знімка secrets runtime до старту sandbox session
Поведінка backend SSH:
  • засіває remote workspace один раз після create або recreate
  • після цього зберігає remote SSH workspace як канонічний
  • маршрутизує exec, file tools і media paths через SSH
  • не синхронізує remote changes назад на хост автоматично
  • не підтримує sandbox browser containers
Доступ до workspace:
  • none: workspace sandbox для кожного scope у ~/.openclaw/sandboxes
  • ro: workspace sandbox у /workspace, workspace агента монтується read-only у /agent
  • rw: workspace агента монтується read/write у /workspace
Scope:
  • session: окремий container + workspace для кожної session
  • agent: один container + workspace на агента (default)
  • shared: спільний container і workspace (без ізоляції між session)
Конфігурація plugin OpenShell:
{
  plugins: {
    entries: {
      openshell: {
        enabled: true,
        config: {
          mode: "mirror", // mirror | remote
          from: "openclaw",
          remoteWorkspaceDir: "/sandbox",
          remoteAgentWorkspaceDir: "/agent",
          gateway: "lab", // необов’язково
          gatewayEndpoint: "https://lab.example", // необов’язково
          policy: "strict", // необов’язковий id політики OpenShell
          providers: ["openai"], // необов’язково
          autoProviders: true,
          timeoutSeconds: 120,
        },
      },
    },
  },
}
Режим OpenShell:
  • mirror: засіяти remote із local перед exec, синхронізувати назад після exec; local workspace залишається канонічним
  • remote: засіяти remote один раз під час створення sandbox, після цього remote workspace залишається канонічним
У режимі remote зміни на локальному хості, зроблені поза OpenClaw, не синхронізуються в sandbox автоматично після кроку seed. Транспортом є SSH у sandbox OpenShell, але plugin володіє життєвим циклом sandbox і необов’язковою mirror sync.setupCommand виконується один раз після створення container (через sh -lc). Потребує network egress, writable root, root user.Для containers за замовчуванням використовується network: "none" — установіть "bridge" (або власну bridge network), якщо агенту потрібен вихідний доступ. "host" заблоковано. "container:<id>" також заблоковано за замовчуванням, якщо ви явно не встановите sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true (break-glass).Вхідні вкладення розміщуються у media/inbound/* в активному workspace.docker.binds монтує додаткові каталоги хоста; глобальні binds і binds для конкретного агента зливаються.Sandboxed browser (sandbox.browser.enabled): Chromium + CDP у container. URL noVNC інжектується в system prompt. Не потребує browser.enabled у openclaw.json. Доступ спостерігача noVNC за замовчуванням використовує VNC auth, а OpenClaw видає short-lived token URL (замість того щоб показувати пароль у спільному URL).
  • allowHostControl: false (default) блокує націлювання sandboxed sessions на browser хоста.
  • network за замовчуванням — openclaw-sandbox-browser (виділена bridge network). Установлюйте bridge лише тоді, коли вам справді потрібна глобальна bridge connectivity.
  • cdpSourceRange необов’язково обмежує вхідний CDP на межі container до діапазону CIDR (наприклад 172.21.0.1/32).
  • sandbox.browser.binds монтує додаткові каталоги хоста лише в container sandbox browser. Якщо встановлено (включно з []), це замінює docker.binds для browser container.
  • Значення запуску за замовчуванням визначено в scripts/sandbox-browser-entrypoint.sh і налаштовано для container hosts:
    • --remote-debugging-address=127.0.0.1
    • --remote-debugging-port=<derived from OPENCLAW_BROWSER_CDP_PORT>
    • --user-data-dir=${HOME}/.chrome
    • --no-first-run
    • --no-default-browser-check
    • --disable-3d-apis
    • --disable-gpu
    • --disable-software-rasterizer
    • --disable-dev-shm-usage
    • --disable-background-networking
    • --disable-features=TranslateUI
    • --disable-breakpad
    • --disable-crash-reporter
    • --renderer-process-limit=2
    • --no-zygote
    • --metrics-recording-only
    • --disable-extensions (увімкнено за замовчуванням)
    • --disable-3d-apis, --disable-software-rasterizer і --disable-gpu увімкнені за замовчуванням і можуть бути вимкнені через OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0, якщо для WebGL/3D це потрібно.
    • OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0 знову вмикає extensions, якщо від них залежить ваш workflow.
    • --renderer-process-limit=2 можна змінити через OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>; установіть 0, щоб використовувати стандартне обмеження процесів Chromium.
    • плюс --no-sandbox і --disable-setuid-sandbox, коли увімкнено noSandbox.
    • Defaults — це базовий рівень container image; щоб змінити defaults container, використовуйте власний browser image із власним entrypoint.
Browser sandboxing і sandbox.docker.binds наразі працюють лише з Docker. Створення images:
scripts/sandbox-setup.sh           # основний sandbox image
scripts/sandbox-browser-setup.sh   # необов’язковий browser image

agents.list (перевизначення для агента)

{
  agents: {
    list: [
      {
        id: "main",
        default: true,
        name: "Main Agent",
        workspace: "~/.openclaw/workspace",
        agentDir: "~/.openclaw/agents/main/agent",
        model: "anthropic/claude-opus-4-6", // або { primary, fallbacks }
        thinkingDefault: "high", // перевизначення рівня thinking для агента
        reasoningDefault: "on", // перевизначення видимості reasoning для агента
        fastModeDefault: false, // перевизначення fast mode для агента
        params: { cacheRetention: "none" }, // перевизначає matching defaults.models params за ключем
        skills: ["docs-search"], // замінює agents.defaults.skills, якщо встановлено
        identity: {
          name: "Samantha",
          theme: "helpful sloth",
          emoji: "🦥",
          avatar: "avatars/samantha.png",
        },
        groupChat: { mentionPatterns: ["@openclaw"] },
        sandbox: { mode: "off" },
        runtime: {
          type: "acp",
          acp: {
            agent: "codex",
            backend: "acpx",
            mode: "persistent",
            cwd: "/workspace/openclaw",
          },
        },
        subagents: { allowAgents: ["*"] },
        tools: {
          profile: "coding",
          allow: ["browser"],
          deny: ["canvas"],
          elevated: { enabled: true },
        },
      },
    ],
  },
}
  • id: стабільний id агента (обов’язково).
  • default: коли їх кілька, перший має пріоритет (логуються warnings). Якщо не вказано жодного, default — перший елемент списку.
  • model: рядкова форма перевизначає лише primary; форма об’єкта { primary, fallbacks } перевизначає обидва ([] вимикає глобальні fallbacks). Cron jobs, які перевизначають лише primary, усе одно успадковують default fallbacks, якщо ви не встановите fallbacks: [].
  • params: stream params для агента, що зливаються поверх вибраного запису моделі в agents.defaults.models. Використовуйте це для специфічних перевизначень агента, таких як cacheRetention, temperature або maxTokens, без дублювання всього каталогу моделей.
  • skills: необов’язковий allowlist Skills для агента. Якщо не задано, агент успадковує agents.defaults.skills, якщо вони задані; явний список замінює defaults замість злиття, а [] означає відсутність Skills.
  • thinkingDefault: необов’язковий default рівень thinking для агента (off | minimal | low | medium | high | xhigh | adaptive). Перевизначає agents.defaults.thinkingDefault для цього агента, якщо не встановлено перевизначення для повідомлення або session.
  • reasoningDefault: необов’язкове default перевизначення видимості reasoning для агента (on | off | stream). Застосовується, коли не встановлено перевизначення reasoning для повідомлення або session.
  • fastModeDefault: необов’язкове default перевизначення fast mode (true | false). Застосовується, коли не встановлено перевизначення fast mode для повідомлення або session.
  • runtime: необов’язковий дескриптор runtime для агента. Використовуйте type: "acp" з defaults runtime.acp (agent, backend, mode, cwd), коли агент повинен за замовчуванням використовувати sessions harness ACP.
  • identity.avatar: шлях відносно workspace, http(s) URL або data: URI.
  • identity виводить defaults: ackReaction з emoji, mentionPatterns з name/emoji.
  • subagents.allowAgents: allowlist id агентів для sessions_spawn (["*"] = будь-який; default: лише той самий агент).
  • Sandbox inheritance guard: якщо session запитувача працює в sandbox, sessions_spawn відхиляє цілі, які працювали б без sandbox.
  • subagents.requireAgentId: якщо true, блокує виклики sessions_spawn, у яких пропущено agentId (примушує до явного вибору профілю; default: false).

Маршрутизація кількох агентів

Запускайте кілька ізольованих агентів в одному Gateway. Див. Multi-Agent.
{
  agents: {
    list: [
      { id: "home", default: true, workspace: "~/.openclaw/workspace-home" },
      { id: "work", workspace: "~/.openclaw/workspace-work" },
    ],
  },
  bindings: [
    { agentId: "home", match: { channel: "whatsapp", accountId: "personal" } },
    { agentId: "work", match: { channel: "whatsapp", accountId: "biz" } },
  ],
}

Поля match для binding

  • type (необов’язково): route для звичайної маршрутизації (відсутній type означає route), acp для сталих ACP bindings розмов.
  • match.channel (обов’язково)
  • match.accountId (необов’язково; * = будь-який акаунт; пропущено = default акаунт)
  • match.peer (необов’язково; { kind: direct|group|channel, id })
  • match.guildId / match.teamId (необов’язково; залежить від каналу)
  • acp (необов’язково; лише для type: "acp"): { mode, label, cwd, backend }
Детермінований порядок match:
  1. match.peer
  2. match.guildId
  3. match.teamId
  4. match.accountId (точний, без peer/guild/team)
  5. match.accountId: "*" (на весь канал)
  6. Агент за замовчуванням
У межах кожного рівня перший відповідний запис bindings має пріоритет. Для записів type: "acp" OpenClaw визначає відповідність за точною ідентичністю розмови (match.channel + акаунт + match.peer.id) і не використовує порядок рівнів route binding, описаний вище.

Профілі доступу для кожного агента

{
  agents: {
    list: [
      {
        id: "personal",
        workspace: "~/.openclaw/workspace-personal",
        sandbox: { mode: "off" },
      },
    ],
  },
}
{
  agents: {
    list: [
      {
        id: "family",
        workspace: "~/.openclaw/workspace-family",
        sandbox: { mode: "all", scope: "agent", workspaceAccess: "ro" },
        tools: {
          allow: [
            "read",
            "sessions_list",
            "sessions_history",
            "sessions_send",
            "sessions_spawn",
            "session_status",
          ],
          deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],
        },
      },
    ],
  },
}
{
  agents: {
    list: [
      {
        id: "public",
        workspace: "~/.openclaw/workspace-public",
        sandbox: { mode: "all", scope: "agent", workspaceAccess: "none" },
        tools: {
          allow: [
            "sessions_list",
            "sessions_history",
            "sessions_send",
            "sessions_spawn",
            "session_status",
            "whatsapp",
            "telegram",
            "slack",
            "discord",
            "gateway",
          ],
          deny: [
            "read",
            "write",
            "edit",
            "apply_patch",
            "exec",
            "process",
            "browser",
            "canvas",
            "nodes",
            "cron",
            "gateway",
            "image",
          ],
        },
      },
    ],
  },
}
Докладніше про пріоритети див. у Multi-Agent Sandbox & Tools.

Session

{
  session: {
    scope: "per-sender",
    dmScope: "main", // main | per-peer | per-channel-peer | per-account-channel-peer
    identityLinks: {
      alice: ["telegram:123456789", "discord:987654321012345678"],
    },
    reset: {
      mode: "daily", // daily | idle
      atHour: 4,
      idleMinutes: 60,
    },
    resetByType: {
      thread: { mode: "daily", atHour: 4 },
      direct: { mode: "idle", idleMinutes: 240 },
      group: { mode: "idle", idleMinutes: 120 },
    },
    resetTriggers: ["/new", "/reset"],
    store: "~/.openclaw/agents/{agentId}/sessions/sessions.json",
    parentForkMaxTokens: 100000, // пропускати fork батьківського thread вище за цю кількість токенів (0 вимикає)
    maintenance: {
      mode: "warn", // warn | enforce
      pruneAfter: "30d",
      maxEntries: 500,
      rotateBytes: "10mb",
      resetArchiveRetention: "30d", // тривалість або false
      maxDiskBytes: "500mb", // необов’язковий жорсткий бюджет
      highWaterBytes: "400mb", // необов’язкова ціль очищення
    },
    threadBindings: {
      enabled: true,
      idleHours: 24, // default auto-unfocus через неактивність у годинах (`0` вимикає)
      maxAgeHours: 0, // default жорсткий максимум віку в годинах (`0` вимикає)
    },
    mainKey: "main", // legacy (runtime завжди використовує "main")
    agentToAgent: { maxPingPongTurns: 5 },
    sendPolicy: {
      rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }],
      default: "allow",
    },
  },
}
  • scope: базова стратегія групування session для контекстів group chat.
    • per-sender (default): кожен відправник отримує ізольовану session в межах контексту каналу.
    • global: усі учасники в контексті каналу спільно використовують одну session (використовуйте лише коли справді потрібен спільний контекст).
  • dmScope: як групуються DM.
    • main: усі DM спільно використовують main session.
    • per-peer: ізоляція за sender id між каналами.
    • per-channel-peer: ізоляція за каналом + sender (рекомендовано для inbox із кількома користувачами).
    • per-account-channel-peer: ізоляція за акаунтом + каналом + sender (рекомендовано для багатоакаунтних конфігурацій).
  • identityLinks: мапа канонічних id до peer із префіксами постачальника для спільного використання session між каналами.
  • reset: основна політика reset. daily скидає о atHour за локальним часом; idle скидає після idleMinutes. Якщо налаштовано обидва, спрацьовує той, у якого раніше настає строк.
  • resetByType: перевизначення для типів (direct, group, thread). Legacy dm приймається як alias для direct.
  • parentForkMaxTokens: максимальна кількість totalTokens у батьківській session, дозволена під час створення forked thread session (default 100000).
    • Якщо totalTokens батьківської session перевищує це значення, OpenClaw починає нову thread session замість успадкування історії transcript батьківської session.
    • Установіть 0, щоб вимкнути цей захист і завжди дозволяти parent forking.
  • mainKey: legacy field. Runtime тепер завжди використовує "main" для основного bucket direct-chat.
  • agentToAgent.maxPingPongTurns: максимальна кількість reply-back turns між агентами під час обміну agent-to-agent (ціле число, діапазон: 05). 0 вимикає ping-pong chaining.
  • sendPolicy: match за channel, chatType (direct|group|channel, з legacy alias dm), keyPrefix або rawKeyPrefix. Перший deny має пріоритет.
  • maintenance: очищення сховища session + керування зберіганням.
    • mode: warn лише показує попередження; enforce застосовує очищення.
    • pruneAfter: поріг віку для застарілих записів (default 30d).
    • maxEntries: максимальна кількість записів у sessions.json (default 500).
    • rotateBytes: ротує sessions.json, коли його розмір перевищує це значення (default 10mb).
    • resetArchiveRetention: зберігання для архівів transcript *.reset.<timestamp>. За замовчуванням дорівнює pruneAfter; установіть false, щоб вимкнути.
    • maxDiskBytes: необов’язковий дисковий бюджет для каталогу sessions. У режимі warn логуються попередження; у режимі enforce спочатку видаляються найстаріші artifacts/sessions.
    • highWaterBytes: необов’язкова ціль після очищення бюджету. За замовчуванням 80% від maxDiskBytes.
  • threadBindings: глобальні defaults для функцій session, прив’язаних до thread.
    • enabled: основний default-перемикач (providers можуть перевизначати; Discord використовує channels.discord.threadBindings.enabled)
    • idleHours: default auto-unfocus через неактивність у годинах (0 вимикає; providers можуть перевизначати)
    • maxAgeHours: default жорсткий максимум віку в годинах (0 вимикає; providers можуть перевизначати)

Messages

{
  messages: {
    responsePrefix: "🦞", // або "auto"
    ackReaction: "👀",
    ackReactionScope: "group-mentions", // group-mentions | group-all | direct | all
    removeAckAfterReply: false,
    queue: {
      mode: "collect", // steer | followup | collect | steer-backlog | steer+backlog | queue | interrupt
      debounceMs: 1000,
      cap: 20,
      drop: "summarize", // old | new | summarize
      byChannel: {
        whatsapp: "collect",
        telegram: "collect",
      },
    },
    inbound: {
      debounceMs: 2000, // 0 вимикає
      byChannel: {
        whatsapp: 5000,
        slack: 1500,
      },
    },
  },
}

Префікс відповіді

Перевизначення для каналу/акаунта: channels.<channel>.responsePrefix, channels.<channel>.accounts.<id>.responsePrefix. Розв’язання (найбільш специфічне перемагає): акаунт → канал → глобальний. "" вимикає й зупиняє cascade. "auto" виводить [{identity.name}]. Змінні шаблону:
ЗміннаОписПриклад
{model}Коротка назва моделіclaude-opus-4-6
{modelFull}Повний ідентифікатор моделіanthropic/claude-opus-4-6
{provider}Назва постачальникаanthropic
{thinkingLevel}Поточний рівень thinkinghigh, low, off
{identity.name}Ім’я ідентичності агента(те саме, що "auto")
Змінні нечутливі до регістру. {think} — alias для {thinkingLevel}.

Ack reaction

  • За замовчуванням використовується identity.emoji активного агента, інакше "👀". Установіть "", щоб вимкнути.
  • Перевизначення для каналу: channels.<channel>.ackReaction, channels.<channel>.accounts.<id>.ackReaction.
  • Порядок розв’язання: акаунт → канал → messages.ackReaction → fallback ідентичності.
  • Scope: group-mentions (default), group-all, direct, all.
  • removeAckAfterReply: видаляє ack після reply у Slack, Discord і Telegram.
  • messages.statusReactions.enabled: вмикає lifecycle status reactions у Slack, Discord і Telegram. У Slack і Discord, якщо параметр не встановлено, status reactions залишаються увімкненими, коли активні ack reactions. У Telegram задайте його явно як true, щоб увімкнути lifecycle status reactions.

Inbound debounce

Об’єднує швидкі текстові повідомлення від того самого відправника в один agent turn. Media/attachments скидаються негайно. Control commands обходять debouncing.

TTS (text-to-speech)

{
  messages: {
    tts: {
      auto: "always", // off | always | inbound | tagged
      mode: "final", // final | all
      provider: "elevenlabs",
      summaryModel: "openai/gpt-4.1-mini",
      modelOverrides: { enabled: true },
      maxTextLength: 4000,
      timeoutMs: 30000,
      prefsPath: "~/.openclaw/settings/tts.json",
      elevenlabs: {
        apiKey: "elevenlabs_api_key",
        baseUrl: "https://api.elevenlabs.io",
        voiceId: "voice_id",
        modelId: "eleven_multilingual_v2",
        seed: 42,
        applyTextNormalization: "auto",
        languageCode: "en",
        voiceSettings: {
          stability: 0.5,
          similarityBoost: 0.75,
          style: 0.0,
          useSpeakerBoost: true,
          speed: 1.0,
        },
      },
      openai: {
        apiKey: "openai_api_key",
        baseUrl: "https://api.openai.com/v1",
        model: "gpt-4o-mini-tts",
        voice: "alloy",
      },
    },
  },
}
  • auto керує auto-TTS. /tts off|always|inbound|tagged перевизначає значення для кожної session.
  • summaryModel перевизначає agents.defaults.model.primary для auto-summary.
  • modelOverrides увімкнено за замовчуванням; modelOverrides.allowProvider за замовчуванням дорівнює false (потрібне явне вмикання).
  • API keys використовують fallback до ELEVENLABS_API_KEY/XI_API_KEY і OPENAI_API_KEY.
  • openai.baseUrl перевизначає endpoint OpenAI TTS. Порядок розв’язання: конфігурація, потім OPENAI_TTS_BASE_URL, потім https://api.openai.com/v1.
  • Коли openai.baseUrl вказує на endpoint, що не належить OpenAI, OpenClaw трактує його як OpenAI-compatible TTS server і послаблює перевірку model/voice.

Talk

Defaults для режиму Talk (macOS/iOS/Android).
{
  talk: {
    provider: "elevenlabs",
    providers: {
      elevenlabs: {
        voiceId: "elevenlabs_voice_id",
        voiceAliases: {
          Clawd: "EXAVITQu4vr4xnSDxMaL",
          Roger: "CwhRBWXzGAHq8TQ4Fs17",
        },
        modelId: "eleven_v3",
        outputFormat: "mp3_44100_128",
        apiKey: "elevenlabs_api_key",
      },
    },
    silenceTimeoutMs: 1500,
    interruptOnSpeech: true,
  },
}
  • talk.provider має збігатися з ключем у talk.providers, коли налаштовано кілька Talk providers.
  • Legacy flat ключі Talk (talk.voiceId, talk.voiceAliases, talk.modelId, talk.outputFormat, talk.apiKey) підтримуються лише для сумісності й автоматично мігруються в talk.providers.<provider>.
  • Для Voice ID fallback — ELEVENLABS_VOICE_ID або SAG_VOICE_ID.
  • providers.*.apiKey приймає прості текстові рядки або об’єкти SecretRef.
  • Fallback ELEVENLABS_API_KEY застосовується лише коли не налаштовано API key для Talk.
  • providers.*.voiceAliases дозволяє директивам Talk використовувати дружні імена.
  • silenceTimeoutMs визначає, скільки режим Talk чекатиме після тиші користувача перед надсиланням transcript. Якщо не встановлено, зберігається стандартне вікно паузи для платформи (700 ms на macOS і Android, 900 ms на iOS).

Інструменти

Профілі інструментів

tools.profile задає базовий allowlist перед tools.allow/tools.deny: Локальний onboarding за замовчуванням встановлює tools.profile: "coding" для нових локальних конфігурацій, якщо значення не задано (наявні явні профілі зберігаються).
ПрофільМістить
minimalлише session_status
codinggroup:fs, group:runtime, group:web, group:sessions, group:memory, cron, image, image_generate, video_generate
messaginggroup:messaging, sessions_list, sessions_history, sessions_send, session_status
fullБез обмежень (те саме, що не задано)

Групи інструментів

ГрупаІнструменти
group:runtimeexec, process, code_execution (bash приймається як alias для exec)
group:fsread, write, edit, apply_patch
group:sessionssessions_list, sessions_history, sessions_send, sessions_spawn, sessions_yield, subagents, session_status
group:memorymemory_search, memory_get
group:webweb_search, x_search, web_fetch
group:uibrowser, canvas
group:automationcron, gateway
group:messagingmessage
group:nodesnodes
group:agentsagents_list
group:mediaimage, image_generate, video_generate, tts
group:openclawУсі вбудовані інструменти (не включає provider plugins)

tools.allow / tools.deny

Глобальна політика allow/deny для інструментів (deny має пріоритет). Нечутлива до регістру, підтримує wildcard *. Застосовується, навіть коли sandbox Docker вимкнено.
{
  tools: { deny: ["browser", "canvas"] },
}

tools.byProvider

Додатково обмежує інструменти для конкретних providers або моделей. Порядок: базовий профіль → профіль provider → allow/deny.
{
  tools: {
    profile: "coding",
    byProvider: {
      "google-antigravity": { profile: "minimal" },
      "openai/gpt-5.4": { allow: ["group:fs", "sessions_list"] },
    },
  },
}

tools.elevated

Керує підвищеним доступом exec поза sandbox:
{
  tools: {
    elevated: {
      enabled: true,
      allowFrom: {
        whatsapp: ["+15555550123"],
        discord: ["1234567890123", "987654321098765432"],
      },
    },
  },
}
  • Перевизначення для агента (agents.list[].tools.elevated) може лише ще більше обмежити.
  • /elevated on|off|ask|full зберігає стан для кожної session; inline directives застосовуються до одного повідомлення.
  • Elevated exec обходить sandboxing і використовує налаштований шлях escape (gateway за замовчуванням або node, коли exec target — node).

tools.exec

{
  tools: {
    exec: {
      backgroundMs: 10000,
      timeoutSec: 1800,
      cleanupMs: 1800000,
      notifyOnExit: true,
      notifyOnExitEmptySuccess: false,
      applyPatch: {
        enabled: false,
        allowModels: ["gpt-5.4"],
      },
    },
  },
}

tools.loopDetection

Перевірки безпеки циклів інструментів вимкнені за замовчуванням. Щоб увімкнути виявлення, задайте enabled: true. Налаштування можна визначати глобально в tools.loopDetection і перевизначати для кожного агента в agents.list[].tools.loopDetection.
{
  tools: {
    loopDetection: {
      enabled: true,
      historySize: 30,
      warningThreshold: 10,
      criticalThreshold: 20,
      globalCircuitBreakerThreshold: 30,
      detectors: {
        genericRepeat: true,
        knownPollNoProgress: true,
        pingPong: true,
      },
    },
  },
}
  • historySize: максимальна історія tool-call, що зберігається для аналізу циклів.
  • warningThreshold: поріг повторюваного шаблону без прогресу для попереджень.
  • criticalThreshold: вищий поріг повторення для блокування критичних циклів.
  • globalCircuitBreakerThreshold: жорсткий поріг зупинки для будь-якого запуску без прогресу.
  • detectors.genericRepeat: попереджати про повторні виклики того самого інструмента з тими самими аргументами.
  • detectors.knownPollNoProgress: попереджати/блокувати відомі poll tools без прогресу (process.poll, command_status тощо).
  • detectors.pingPong: попереджати/блокувати шаблони чергування пар без прогресу.
  • Якщо warningThreshold >= criticalThreshold або criticalThreshold >= globalCircuitBreakerThreshold, перевірка валідації завершується помилкою.

tools.web

{
  tools: {
    web: {
      search: {
        enabled: true,
        apiKey: "brave_api_key", // або BRAVE_API_KEY env
        maxResults: 5,
        timeoutSeconds: 30,
        cacheTtlMinutes: 15,
      },
      fetch: {
        enabled: true,
        provider: "firecrawl", // необов’язково; пропустіть для auto-detect
        maxChars: 50000,
        maxCharsCap: 50000,
        maxResponseBytes: 2000000,
        timeoutSeconds: 30,
        cacheTtlMinutes: 15,
        maxRedirects: 3,
        readability: true,
        userAgent: "custom-ua",
      },
    },
  },
}

tools.media

Налаштовує розуміння вхідних media (image/audio/video):
{
  tools: {
    media: {
      concurrency: 2,
      audio: {
        enabled: true,
        maxBytes: 20971520,
        scope: {
          default: "deny",
          rules: [{ action: "allow", match: { chatType: "direct" } }],
        },
        models: [
          { provider: "openai", model: "gpt-4o-mini-transcribe" },
          { type: "cli", command: "whisper", args: ["--model", "base", "{{MediaPath}}"] },
        ],
      },
      video: {
        enabled: true,
        maxBytes: 52428800,
        models: [{ provider: "google", model: "gemini-3-flash-preview" }],
      },
    },
  },
}
Запис provider (type: "provider" або пропущено):
  • provider: API provider id (openai, anthropic, google/gemini, groq тощо)
  • model: перевизначення id моделі
  • profile / preferredProfile: вибір профілю auth-profiles.json
Запис CLI (type: "cli"):
  • command: виконуваний файл
  • args: параметризовані args (підтримує {{MediaPath}}, {{Prompt}}, {{MaxChars}} тощо)
Спільні поля:
  • capabilities: необов’язковий список (image, audio, video). Defaults: openai/anthropic/minimax → image, google → image+audio+video, groq → audio.
  • prompt, maxChars, maxBytes, timeoutSeconds, language: перевизначення для конкретного запису.
  • У разі помилок використовується наступний запис.
Автентифікація provider follows standard order: auth-profiles.json → env vars → models.providers.*.apiKey.

tools.agentToAgent

{
  tools: {
    agentToAgent: {
      enabled: false,
      allow: ["home", "work"],
    },
  },
}

tools.sessions

Керує тим, які sessions можуть бути цілями для session tools (sessions_list, sessions_history, sessions_send). Default: tree (поточна session + sessions, породжені нею, наприклад subagents).
{
  tools: {
    sessions: {
      // "self" | "tree" | "agent" | "all"
      visibility: "tree",
    },
  },
}
Примітки:
  • self: лише поточний session key.
  • tree: поточна session + sessions, породжені поточною session (subagents).
  • agent: будь-яка session, що належить поточному agent id (може включати інших користувачів, якщо ви запускаєте per-sender sessions під тим самим agent id).
  • all: будь-яка session. Націлення між агентами все одно потребує tools.agentToAgent.
  • Sandbox clamp: коли поточна session працює в sandbox і agents.defaults.sandbox.sessionToolsVisibility="spawned", видимість примусово встановлюється в tree, навіть якщо tools.sessions.visibility="all".

tools.sessions_spawn

Керує підтримкою inline attachments для sessions_spawn.
{
  tools: {
    sessions_spawn: {
      attachments: {
        enabled: false, // opt-in: установіть true, щоб дозволити inline file attachments
        maxTotalBytes: 5242880, // 5 MB сумарно для всіх файлів
        maxFiles: 50,
        maxFileBytes: 1048576, // 1 MB на файл
        retainOnSessionKeep: false, // зберігати attachments, коли cleanup="keep"
      },
    },
  },
}
Примітки:
  • Attachments підтримуються лише для runtime: "subagent". Runtime ACP відхиляє їх.
  • Файли матеріалізуються в child workspace у .openclaw/attachments/<uuid>/ разом із .manifest.json.
  • Вміст attachment автоматично редагується з transcript persistence.
  • Base64 inputs проходять перевірку за суворими правилами alphabet/padding і з перевіркою розміру до декодування.
  • Права файлів: 0700 для каталогів і 0600 для файлів.
  • Очищення дотримується політики cleanup: delete завжди видаляє attachments; keep зберігає їх лише коли retainOnSessionKeep: true.

tools.experimental

Експериментальні прапори вбудованих інструментів. За замовчуванням вимкнені, якщо не діє auto-enable rule, специфічне для runtime.
{
  tools: {
    experimental: {
      planTool: true, // увімкнути експериментальний update_plan
    },
  },
}
Примітки:
  • planTool: вмикає структурований інструмент update_plan для відстеження нетривіальної багатокрокової роботи.
  • Default: false для не-OpenAI providers. OpenAI і OpenAI Codex runs вмикають його автоматично.
  • Коли інструмент увімкнено, system prompt також додає підказки щодо використання, щоб модель застосовувала його лише для суттєвої роботи й підтримувала не більше одного кроку in_progress.

agents.defaults.subagents

{
  agents: {
    defaults: {
      subagents: {
        allowAgents: ["research"],
        model: "minimax/MiniMax-M2.7",
        maxConcurrent: 8,
        runTimeoutSeconds: 900,
        archiveAfterMinutes: 60,
      },
    },
  },
}
  • model: default model для spawned sub-agents. Якщо параметр пропущено, sub-agents успадковують model викликача.
  • allowAgents: default allowlist цільових agent ids для sessions_spawn, коли агент-запитувач не задає власний subagents.allowAgents (["*"] = будь-який; default: лише той самий агент).
  • runTimeoutSeconds: default timeout (секунди) для sessions_spawn, коли у виклику інструмента пропущено runTimeoutSeconds. 0 означає без timeout.
  • Політика інструментів для subagent: tools.subagents.tools.allow / tools.subagents.tools.deny.

Користувацькі providers і base URLs

OpenClaw використовує вбудований каталог моделей. Додавайте користувацьких providers через models.providers у конфігурації або ~/.openclaw/agents/<agentId>/agent/models.json.
{
  models: {
    mode: "merge", // merge (default) | replace
    providers: {
      "custom-proxy": {
        baseUrl: "http://localhost:4000/v1",
        apiKey: "LITELLM_KEY",
        api: "openai-completions", // openai-completions | openai-responses | anthropic-messages | google-generative-ai
        models: [
          {
            id: "llama-3.1-8b",
            name: "Llama 3.1 8B",
            reasoning: false,
            input: ["text"],
            cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
            contextWindow: 128000,
            contextTokens: 96000,
            maxTokens: 32000,
          },
        ],
      },
    },
  },
}
  • Використовуйте authHeader: true + headers для нестандартних вимог автентифікації.
  • Перевизначте корінь конфігурації агента через OPENCLAW_AGENT_DIR (або PI_CODING_AGENT_DIR, застарілий alias environment variable).
  • Пріоритет злиття для відповідних provider IDs:
    • Непорожні значення baseUrl в agent models.json мають пріоритет.
    • Непорожні значення apiKey агента мають пріоритет лише тоді, коли цей provider не керується через SecretRef у поточному контексті config/auth-profile.
    • Для provider apiKey, керованих SecretRef, значення оновлюються з source markers (ENV_VAR_NAME для env refs, secretref-managed для file/exec refs), а не шляхом збереження розв’язаних секретів.
    • Для значень заголовків provider, керованих SecretRef, оновлення також відбувається з source markers (secretref-env:ENV_VAR_NAME для env refs, secretref-managed для file/exec refs).
    • Порожні або відсутні apiKey/baseUrl в agent використовують fallback до models.providers у конфігурації.
    • Для matching models contextWindow/maxTokens використовується вище значення між явною конфігурацією та неявними значеннями каталогу.
    • Для matching model contextTokens зберігається явне runtime cap, якщо воно задане; використовуйте його, щоб обмежити ефективний контекст без зміни native metadata моделі.
    • Використовуйте models.mode: "replace", коли хочете, щоб конфігурація повністю переписала models.json.
    • Збереження marker є source-authoritative: markers записуються з активного source config snapshot (до розв’язання), а не з розв’язаних runtime secret values.

Деталі полів provider

  • models.mode: поведінка каталогу provider (merge або replace).
  • models.providers: мапа користувацьких providers, ключована за provider id.
  • models.providers.*.api: adapter запиту (openai-completions, openai-responses, anthropic-messages, google-generative-ai тощо).
  • models.providers.*.apiKey: credential постачальника (віддавайте перевагу SecretRef/env substitution).
  • models.providers.*.auth: стратегія автентифікації (api-key, token, oauth, aws-sdk).
  • models.providers.*.injectNumCtxForOpenAICompat: для Ollama + openai-completions інжектувати options.num_ctx у запити (default: true).
  • models.providers.*.authHeader: примусово передавати credential у заголовку Authorization, коли це потрібно.
  • models.providers.*.baseUrl: базова URL-адреса upstream API.
  • models.providers.*.headers: додаткові статичні заголовки для proxy/tenant routing.
  • models.providers.*.request: перевизначення transport для HTTP-запитів model-provider.
    • request.headers: додаткові заголовки (зливаються з defaults provider). Значення приймають SecretRef.
    • request.auth: перевизначення стратегії auth. Режими: "provider-default" (використовувати вбудовану auth постачальника), "authorization-bearer"token), "header"headerName, value, необов’язковим prefix).
    • request.proxy: перевизначення HTTP proxy. Режими: "env-proxy" (використовувати env vars HTTP_PROXY/HTTPS_PROXY), "explicit-proxy"url). Обидва режими приймають необов’язковий підоб’єкт tls.
    • request.tls: перевизначення TLS для прямих з’єднань. Поля: ca, cert, key, passphrase (усі приймають SecretRef), serverName, insecureSkipVerify.
  • models.providers.*.models: явні записи каталогу моделей постачальника.
  • models.providers.*.models.*.contextWindow: metadata native context window моделі.
  • models.providers.*.models.*.contextTokens: необов’язкова runtime cap для контексту. Використовуйте це, коли хочете менший ефективний бюджет контексту, ніж native contextWindow моделі.
  • models.providers.*.models.*.compat.supportsDeveloperRole: необов’язкова compatibility hint. Для api: "openai-completions" із непорожнім ненативним baseUrl (host не api.openai.com) OpenClaw примусово встановлює це в false під час runtime. Порожній/пропущений baseUrl зберігає стандартну поведінку OpenAI.
  • plugins.entries.amazon-bedrock.config.discovery: кореневі налаштування auto-discovery Bedrock.
  • plugins.entries.amazon-bedrock.config.discovery.enabled: увімкнути/вимкнути неявне discovery.
  • plugins.entries.amazon-bedrock.config.discovery.region: регіон AWS для discovery.
  • plugins.entries.amazon-bedrock.config.discovery.providerFilter: необов’язковий фільтр provider-id для цільового discovery.
  • plugins.entries.amazon-bedrock.config.discovery.refreshInterval: інтервал опитування для оновлення discovery.
  • plugins.entries.amazon-bedrock.config.discovery.defaultContextWindow: fallback context window для виявлених моделей.
  • plugins.entries.amazon-bedrock.config.discovery.defaultMaxTokens: fallback max output tokens для виявлених моделей.

Приклади provider

{
  env: { CEREBRAS_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: {
        primary: "cerebras/zai-glm-4.7",
        fallbacks: ["cerebras/zai-glm-4.6"],
      },
      models: {
        "cerebras/zai-glm-4.7": { alias: "GLM 4.7 (Cerebras)" },
        "cerebras/zai-glm-4.6": { alias: "GLM 4.6 (Cerebras)" },
      },
    },
  },
  models: {
    mode: "merge",
    providers: {
      cerebras: {
        baseUrl: "https://api.cerebras.ai/v1",
        apiKey: "${CEREBRAS_API_KEY}",
        api: "openai-completions",
        models: [
          { id: "zai-glm-4.7", name: "GLM 4.7 (Cerebras)" },
          { id: "zai-glm-4.6", name: "GLM 4.6 (Cerebras)" },
        ],
      },
    },
  },
}
Використовуйте cerebras/zai-glm-4.7 для Cerebras; zai/glm-4.7 — для прямого Z.AI.
{
  agents: {
    defaults: {
      model: { primary: "opencode/claude-opus-4-6" },
      models: { "opencode/claude-opus-4-6": { alias: "Opus" } },
    },
  },
}
Установіть OPENCODE_API_KEY (або OPENCODE_ZEN_API_KEY). Використовуйте посилання opencode/... для каталогу Zen або opencode-go/... для каталогу Go. Скорочення: openclaw onboard --auth-choice opencode-zen або openclaw onboard --auth-choice opencode-go.
{
  agents: {
    defaults: {
      model: { primary: "zai/glm-4.7" },
      models: { "zai/glm-4.7": {} },
    },
  },
}
Установіть ZAI_API_KEY. z.ai/* і z-ai/* приймаються як aliases. Скорочення: openclaw onboard --auth-choice zai-api-key.
  • Загальний endpoint: https://api.z.ai/api/paas/v4
  • Endpoint для кодування (default): https://api.z.ai/api/coding/paas/v4
  • Для загального endpoint визначте користувацького provider із перевизначенням base URL.
{
  env: { MOONSHOT_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: { primary: "moonshot/kimi-k2.5" },
      models: { "moonshot/kimi-k2.5": { alias: "Kimi K2.5" } },
    },
  },
  models: {
    mode: "merge",
    providers: {
      moonshot: {
        baseUrl: "https://api.moonshot.ai/v1",
        apiKey: "${MOONSHOT_API_KEY}",
        api: "openai-completions",
        models: [
          {
            id: "kimi-k2.5",
            name: "Kimi K2.5",
            reasoning: false,
            input: ["text", "image"],
            cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
            contextWindow: 262144,
            maxTokens: 262144,
          },
        ],
      },
    },
  },
}
Для endpoint у Китаї: baseUrl: "https://api.moonshot.cn/v1" або openclaw onboard --auth-choice moonshot-api-key-cn.Native endpoints Moonshot заявляють сумісність із використанням streaming на спільному транспорті openai-completions, і OpenClaw тепер визначає це за можливостями endpoint, а не лише за id вбудованого provider.
{
  env: { KIMI_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: { primary: "kimi/kimi-code" },
      models: { "kimi/kimi-code": { alias: "Kimi Code" } },
    },
  },
}
Сумісний з Anthropic, вбудований provider. Скорочення: openclaw onboard --auth-choice kimi-code-api-key.
{
  env: { SYNTHETIC_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: { primary: "synthetic/hf:MiniMaxAI/MiniMax-M2.5" },
      models: { "synthetic/hf:MiniMaxAI/MiniMax-M2.5": { alias: "MiniMax M2.5" } },
    },
  },
  models: {
    mode: "merge",
    providers: {
      synthetic: {
        baseUrl: "https://api.synthetic.new/anthropic",
        apiKey: "${SYNTHETIC_API_KEY}",
        api: "anthropic-messages",
        models: [
          {
            id: "hf:MiniMaxAI/MiniMax-M2.5",
            name: "MiniMax M2.5",
            reasoning: true,
            input: ["text"],
            cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
            contextWindow: 192000,
            maxTokens: 65536,
          },
        ],
      },
    },
  },
}
Base URL має бути без /v1 (клієнт Anthropic додає його сам). Скорочення: openclaw onboard --auth-choice synthetic-api-key.
{
  agents: {
    defaults: {
      model: { primary: "minimax/MiniMax-M2.7" },
      models: {
        "minimax/MiniMax-M2.7": { alias: "Minimax" },
      },
    },
  },
  models: {
    mode: "merge",
    providers: {
      minimax: {
        baseUrl: "https://api.minimax.io/anthropic",
        apiKey: "${MINIMAX_API_KEY}",
        api: "anthropic-messages",
        models: [
          {
            id: "MiniMax-M2.7",
            name: "MiniMax M2.7",
            reasoning: true,
            input: ["text", "image"],
            cost: { input: 0.3, output: 1.2, cacheRead: 0.06, cacheWrite: 0.375 },
            contextWindow: 204800,
            maxTokens: 131072,
          },
        ],
      },
    },
  },
}
Установіть MINIMAX_API_KEY. Скорочення: openclaw onboard --auth-choice minimax-global-api або openclaw onboard --auth-choice minimax-cn-api. Тепер каталог моделей за замовчуванням використовує лише M2.7. На Anthropic-compatible streaming path OpenClaw вимикає thinking MiniMax за замовчуванням, якщо ви самі явно не встановите thinking. /fast on або params.fastMode: true переписує MiniMax-M2.7 на MiniMax-M2.7-highspeed.
Див. Local Models. Коротко: запускайте велику локальну модель через LM Studio Responses API на потужному обладнанні; залишайте hosted models злитими для fallback.

Skills

{
  skills: {
    allowBundled: ["gemini", "peekaboo"],
    load: {
      extraDirs: ["~/Projects/agent-scripts/skills"],
    },
    install: {
      preferBrew: true,
      nodeManager: "npm", // npm | pnpm | yarn | bun
    },
    entries: {
      "image-lab": {
        apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" }, // або простий текстовий рядок
        env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" },
      },
      peekaboo: { enabled: true },
      sag: { enabled: false },
    },
  },
}
  • allowBundled: необов’язковий allowlist лише для bundled Skills (керовані/workspace Skills не зачіпає).
  • load.extraDirs: додаткові спільні корені Skills (найнижчий пріоритет).
  • install.preferBrew: коли true, віддає перевагу інсталяторам Homebrew, якщо brew доступний, перш ніж переходити до інших типів інсталяторів.
  • install.nodeManager: бажаний менеджер інсталяції node для специфікацій metadata.openclaw.install (npm | pnpm | yarn | bun).
  • entries.<skillKey>.enabled: false вимикає Skill, навіть якщо він bundled/installed.
  • entries.<skillKey>.apiKey: спрощене поле API key для Skills, які оголошують основну env variable (простий текстовий рядок або об’єкт SecretRef).

Plugins

{
  plugins: {
    enabled: true,
    allow: ["voice-call"],
    deny: [],
    load: {
      paths: ["~/Projects/oss/voice-call-extension"],
    },
    entries: {
      "voice-call": {
        enabled: true,
        hooks: {
          allowPromptInjection: false,
        },
        config: { provider: "twilio" },
      },
    },
  },
}
  • Завантажуються з ~/.openclaw/extensions, <workspace>/.openclaw/extensions і plugins.load.paths.
  • Discovery приймає native plugins OpenClaw, а також сумісні bundles Codex і Claude, включно з bundle Claude без manifest у стандартному layout.
  • Зміни конфігурації потребують restart gateway.
  • allow: необов’язковий allowlist (завантажуються лише вказані plugins). deny має пріоритет.
  • plugins.entries.<id>.apiKey: спрощене plugin-level поле API key (коли це підтримується plugin).
  • plugins.entries.<id>.env: мапа env vars у межах plugin.
  • plugins.entries.<id>.hooks.allowPromptInjection: коли false, core блокує before_prompt_build і ігнорує поля зі зміною prompt із legacy before_agent_start, зберігаючи legacy modelOverride і providerOverride. Застосовується до native plugin hooks і підтримуваних директорій hooks, наданих bundles.
  • plugins.entries.<id>.subagent.allowModelOverride: явно довіряти цьому plugin запитувати перевизначення provider і model для кожного запуску background subagent.
  • plugins.entries.<id>.subagent.allowedModels: необов’язковий allowlist канонічних цілей provider/model для довірених перевизначень subagent. Використовуйте "*" лише тоді, коли свідомо хочете дозволити будь-яку модель.
  • plugins.entries.<id>.config: об’єкт конфігурації, визначений plugin (валідується native OpenClaw plugin schema, коли вона доступна).
  • plugins.entries.firecrawl.config.webFetch: налаштування постачальника web-fetch Firecrawl.
    • apiKey: API key Firecrawl (приймає SecretRef). Використовує fallback до plugins.entries.firecrawl.config.webSearch.apiKey, legacy tools.web.fetch.firecrawl.apiKey або env var FIRECRAWL_API_KEY.
    • baseUrl: базова URL-адреса API Firecrawl (default: https://api.firecrawl.dev).
    • onlyMainContent: витягувати лише основний вміст сторінок (default: true).
    • maxAgeMs: максимальний вік кешу в мілісекундах (default: 172800000 / 2 дні).
    • timeoutSeconds: timeout запиту scrape у секундах (default: 60).
  • plugins.entries.xai.config.xSearch: налаштування xAI X Search (вебпошук Grok).
    • enabled: увімкнути постачальника X Search.
    • model: модель Grok для пошуку (наприклад "grok-4-1-fast").
  • plugins.entries.memory-core.config.dreaming: налаштування dreaming пам’яті (експериментально). Режими і пороги див. у Dreaming.
    • mode: preset cadence для dreaming ("off", "core", "rem", "deep"). Default: "off".
    • cron: необов’язкове перевизначення cron expression для розкладу dreaming.
    • timezone: часовий пояс для оцінки розкладу (fallback до agents.defaults.userTimezone).
    • limit: максимальна кількість кандидатів на просування за цикл.
    • minScore: мінімальний поріг зваженого score для просування.
    • minRecallCount: мінімальний поріг кількості recall.
    • minUniqueQueries: мінімальна кількість різних запитів.
    • recencyHalfLifeDays: кількість днів, за які recency score зменшується вдвічі. Default: 14.
    • maxAgeDays: необов’язковий максимальний вік daily note у днях, дозволений для просування.
    • verboseLogging: виводити детальні dreaming logs для кожного запуску у звичайний потік log gateway.
  • Увімкнені Claude bundle plugins також можуть додавати вбудовані Pi defaults із settings.json; OpenClaw застосовує їх як санітизовані agent settings, а не як сирі patches конфігурації OpenClaw.
  • plugins.slots.memory: виберіть id активного plugin пам’яті або "none", щоб вимкнути memory plugins.
  • plugins.slots.contextEngine: виберіть id активного plugin context engine; default — "legacy", якщо ви не встановили й не вибрали інший engine.
  • plugins.installs: метадані інсталяції, керовані CLI, які використовує openclaw plugins update.
    • Містить source, spec, sourcePath, installPath, version, resolvedName, resolvedVersion, resolvedSpec, integrity, shasum, resolvedAt, installedAt.
    • Розглядайте plugins.installs.* як керований стан; віддавайте перевагу командам CLI, а не ручному редагуванню.
Див. Plugins.

Browser

{
  browser: {
    enabled: true,
    evaluateEnabled: true,
    defaultProfile: "user",
    ssrfPolicy: {
      dangerouslyAllowPrivateNetwork: true, // default trusted-network mode
      // allowPrivateNetwork: true, // legacy alias
      // hostnameAllowlist: ["*.example.com", "example.com"],
      // allowedHostnames: ["localhost"],
    },
    profiles: {
      openclaw: { cdpPort: 18800, color: "#FF4500" },
      work: { cdpPort: 18801, color: "#0066CC" },
      user: { driver: "existing-session", attachOnly: true, color: "#00AA00" },
      brave: {
        driver: "existing-session",
        attachOnly: true,
        userDataDir: "~/Library/Application Support/BraveSoftware/Brave-Browser",
        color: "#FB542B",
      },
      remote: { cdpUrl: "http://10.0.0.42:9222", color: "#00AA00" },
    },
    color: "#FF4500",
    // headless: false,
    // noSandbox: false,
    // extraArgs: [],
    // executablePath: "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
    // attachOnly: false,
  },
}
  • evaluateEnabled: false вимикає act:evaluate і wait --fn.
  • ssrfPolicy.dangerouslyAllowPrivateNetwork за замовчуванням дорівнює true, якщо не встановлено (модель довіреної мережі).
  • Установіть ssrfPolicy.dangerouslyAllowPrivateNetwork: false для суворої навігації browser лише по public endpoints.
  • У суворому режимі endpoints remote CDP profile (profiles.*.cdpUrl) підпадають під ті самі обмеження private-network під час reachability/discovery checks.
  • ssrfPolicy.allowPrivateNetwork залишається підтримуваним як legacy alias.
  • У суворому режимі використовуйте ssrfPolicy.hostnameAllowlist і ssrfPolicy.allowedHostnames для явних винятків.
  • Remote profiles доступні лише для attach (start/stop/reset вимкнено).
  • profiles.*.cdpUrl приймає http://, https://, ws:// і wss://. Використовуйте HTTP(S), коли хочете, щоб OpenClaw виявив /json/version; використовуйте WS(S), коли ваш provider дає вам прямий DevTools WebSocket URL.
  • Профілі existing-session працюють лише на хості та використовують Chrome MCP замість CDP.
  • Профілі existing-session можуть задавати userDataDir, щоб націлюватися на конкретний профіль Chromium-based browser, наприклад Brave або Edge.
  • Проф