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

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

Основний довідник конфігурації для ~/.openclaw/openclaw.json. Огляд, орієнтований на завдання, див. у Configuration. Ця сторінка охоплює основні поверхні конфігурації OpenClaw і дає посилання назовні, коли підсистема має власний, глибший довідник. Вона не намагається вбудувати на одну сторінку кожен каталог команд, що належить каналу/плагіну, або кожен глибокий параметр пам’яті/QMD. Джерело істини в коді:
  • openclaw config schema виводить актуальну JSON Schema, що використовується для валідації та Control UI, з об’єднаними метаданими bundled/plugin/channel, коли вони доступні
  • config.schema.lookup повертає один вузол схеми з обмеженням за шляхом для інструментів деталізації
  • pnpm config:docs:check / pnpm config:docs:gen перевіряють хеш базового рівня документації конфігурації щодо поточної поверхні схеми
Окремі поглиблені довідники:
  • Memory configuration reference для agents.defaults.memorySearch.*, memory.qmd.*, memory.citations і конфігурації dreaming у plugins.entries.memory-core.config.dreaming
  • Slash Commands для поточного каталогу вбудованих + bundled команд
  • сторінки відповідного каналу/плагіну для поверхонь команд, специфічних для каналу
Формат конфігурації — JSON5 (дозволені коментарі + кінцеві коми). Усі поля необов’язкові — OpenClaw використовує безпечні значення за замовчуванням, якщо їх не вказано.

Канали

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

Доступ до особистих повідомлень і груп

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

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

Використовуйте channels.modelByChannel, щоб прив’язати конкретні ідентифікатори каналів до моделі. Значення приймають provider/model або налаштовані псевдоніми моделей. Відображення каналу застосовується, коли сеанс ще не має перевизначення моделі (наприклад, встановленого через /model).
{
  channels: {
    modelByChannel: {
      discord: {
        "123456789012345678": "anthropic/claude-opus-4-6",
      },
      slack: {
        C1234567890: "openai/gpt-4.1",
      },
      telegram: {
        "-1001234567890": "openai/gpt-4.1-mini",
        "-1001234567890:topic:99": "anthropic/claude-sonnet-4-6",
      },
    },
  },
}

Типові значення каналу та heartbeat

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

WhatsApp

WhatsApp працює через web-канал шлюзу (Baileys Web). Він запускається автоматично, коли існує прив’язаний сеанс.
{
  channels: {
    whatsapp: {
      dmPolicy: "pairing", // pairing | allowlist | open | disabled
      allowFrom: ["+15555550123", "+447700900123"],
      textChunkLimit: 4000,
      chunkMode: "length", // length | newline
      mediaMaxMb: 50,
      sendReadReceipts: true, // сині галочки (false у режимі чату із самим собою)
      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, якщо він існує; інакше — перший налаштований ідентифікатор облікового запису (відсортований).
  • Необов’язковий channels.whatsapp.defaultAccount перевизначає цей резервний вибір типового облікового запису, коли він збігається з налаштованим ідентифікатором облікового запису.
  • Застарілий каталог автентифікації Baileys для одного облікового запису мігрується командою openclaw doctor у whatsapp/default.
  • Перевизначення на рівні облікового запису: channels.whatsapp.accounts.<id>.sendReadReceipts, channels.whatsapp.accounts.<id>.dmPolicy, channels.whatsapp.accounts.<id>.allowFrom.

Telegram

{
  channels: {
    telegram: {
      enabled: true,
      botToken: "your-bot-token",
      dmPolicy: "pairing",
      allowFrom: ["tg:123456789"],
      groups: {
        "*": { requireMention: true },
        "-1001234567890": {
          allowFrom: ["@admin"],
          systemPrompt: "Keep answers brief.",
          topics: {
            "99": {
              requireMention: false,
              skills: ["search"],
              systemPrompt: "Stay on topic.",
            },
          },
        },
      },
      customCommands: [
        { command: "backup", description: "Git backup" },
        { command: "generate", description: "Create an image" },
      ],
      historyLimit: 50,
      replyToMode: "first", // off | first | all | batched
      linkPreview: true,
      streaming: "partial", // off | partial | block | progress (типово: off; увімкніть явно, щоб уникнути обмежень частоти preview-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 (лише звичайний файл; символьні посилання відхиляються), з TELEGRAM_BOT_TOKEN як резервним варіантом для типового облікового запису.
  • Необов’язковий channels.telegram.defaultAccount перевизначає вибір типового облікового запису, коли він збігається з налаштованим ідентифікатором облікового запису.
  • У багатооблікових конфігураціях (2+ ідентифікаторів облікових записів) задайте явний типово вибраний обліковий запис (channels.telegram.defaultAccount або channels.telegram.accounts.default), щоб уникнути резервної маршрутизації; openclaw doctor попереджає, якщо його немає або він некоректний.
  • configWrites: false блокує ініційовані з Telegram записи конфігурації (міграції ID супергруп, /config set|unset).
  • Записи верхнього рівня bindings[] із type: "acp" налаштовують постійні ACP-прив’язки для тем форуму (використовуйте канонічний chatId:topic:topicId у match.peer.id). Семантика полів є спільною в ACP Agents.
  • Попередній перегляд потокової передачі в Telegram використовує sendMessage + editMessageText (працює в особистих і групових чатах).
  • Політика повторних спроб: див. Retry policy.

Discord

{
  channels: {
    discord: {
      enabled: true,
      token: "your-bot-token",
      mediaMaxMb: 100,
      allowBots: false,
      actions: {
        reactions: true,
        stickers: true,
        polls: true,
        permissions: true,
        messages: true,
        threads: true,
        pins: true,
        search: true,
        memberInfo: true,
        roleInfo: true,
        roles: false,
        channelInfo: true,
        voiceStatus: true,
        events: true,
        moderation: false,
      },
      replyToMode: "off", // off | first | all | batched
      dmPolicy: "pairing",
      allowFrom: ["1234567890", "123456789012345678"],
      dm: { enabled: true, groupEnabled: false, groupChannels: ["openclaw-dm"] },
      guilds: {
        "123456789012345678": {
          slug: "friends-of-openclaw",
          requireMention: false,
          ignoreOtherMentions: true,
          reactionNotifications: "own",
          users: ["987654321098765432"],
          channels: {
            general: { allow: true },
            help: {
              allow: true,
              requireMention: true,
              users: ["987654321098765432"],
              skills: ["docs"],
              systemPrompt: "Short answers only.",
            },
          },
        },
      },
      historyLimit: 20,
      textChunkLimit: 2000,
      chunkMode: "length", // length | newline
      streaming: "off", // off | partial | block | progress (progress відповідає partial у Discord)
      maxLinesPerMessage: 17,
      ui: {
        components: {
          accentColor: "#5865F2",
        },
      },
      threadBindings: {
        enabled: true,
        idleHours: 24,
        maxAgeHours: 0,
        spawnSubagentSessions: false, // увімкнення за бажанням для sessions_spawn({ thread: true })
      },
      voice: {
        enabled: true,
        autoJoin: [
          {
            guildId: "123456789012345678",
            channelId: "234567890123456789",
          },
        ],
        daveEncryption: true,
        decryptionFailureTolerance: 24,
        tts: {
          provider: "openai",
          openai: { voice: "alloy" },
        },
      },
      execApprovals: {
        enabled: "auto", // true | false | "auto"
        approvers: ["987654321098765432"],
        agentFilter: ["default"],
        sessionFilter: ["discord:"],
        target: "dm", // dm | channel | both
        cleanupAfterResolve: false,
      },
      retry: {
        attempts: 3,
        minDelayMs: 500,
        maxDelayMs: 30000,
        jitter: 0.1,
      },
    },
  },
}
  • Токен: channels.discord.token, з DISCORD_BOT_TOKEN як резервним варіантом для типового облікового запису.
  • Прямі вихідні виклики, що надають явний Discord token, використовують цей токен для виклику; налаштування повторних спроб/політик облікового запису все одно беруться з вибраного облікового запису в активному знімку runtime.
  • Необов’язковий channels.discord.defaultAccount перевизначає вибір типового облікового запису, коли він збігається з налаштованим ідентифікатором облікового запису.
  • Використовуйте user:<id> (DM) або channel:<id> (канал guild) для цілей доставки; прості числові ID відхиляються.
  • Slug-и guild — у нижньому регістрі, а пробіли замінюються на -; ключі каналів використовують slug-ім’я (без #). Надавайте перевагу ID guild.
  • Повідомлення, створені ботом, типово ігноруються. allowBots: true вмикає їх; використовуйте allowBots: "mentions", щоб приймати лише повідомлення ботів, які згадують бота (власні повідомлення все одно відфільтровуються).
  • channels.discord.guilds.<id>.ignoreOtherMentions (і перевизначення каналу) відкидає повідомлення, які згадують іншого користувача або роль, але не бота (крім @everyone/@here).
  • maxLinesPerMessage (типово 17) розбиває високі повідомлення навіть тоді, коли вони не перевищують 2000 символів.
  • channels.discord.threadBindings керує маршрутизацією, прив’язаною до гілок Discord:
    • enabled: перевизначення Discord для функцій сеансів, прив’язаних до гілок (/focus, /unfocus, /agents, /session idle, /session max-age і прив’язана доставка/маршрутизація)
    • idleHours: перевизначення Discord для автоматичного зняття фокуса через неактивність у годинах (0 вимикає)
    • maxAgeHours: перевизначення Discord для жорсткого максимального віку в годинах (0 вимикає)
    • spawnSubagentSessions: перемикач opt-in для автоматичного створення/прив’язки гілок у sessions_spawn({ thread: true })
  • Записи верхнього рівня bindings[] із type: "acp" налаштовують постійні ACP-прив’язки для каналів і гілок (використовуйте id каналу/гілки в match.peer.id). Семантика полів є спільною в ACP Agents.
  • channels.discord.ui.components.accentColor задає колір акценту для контейнерів компонентів Discord v2.
  • channels.discord.voice вмикає розмови в голосових каналах Discord і необов’язкові перевизначення auto-join + TTS.
  • channels.discord.voice.daveEncryption і channels.discord.voice.decryptionFailureTolerance напряму передаються до параметрів DAVE у @discordjs/voice (типово true і 24).
  • OpenClaw також намагається відновити голосовий прийом, виходячи та повторно приєднуючись до голосового сеансу після повторних збоїв дешифрування.
  • channels.discord.streaming — це канонічний ключ режиму потоку. Застарілі streamMode і булеві значення streaming мігруються автоматично.
  • channels.discord.autoPresence відображає доступність runtime на присутність бота (healthy => online, degraded => idle, exhausted => dnd) і дозволяє необов’язкові перевизначення тексту статусу.
  • channels.discord.dangerouslyAllowNameMatching знову вмикає зіставлення за змінюваними іменами/тегами (режим сумісності break-glass).
  • channels.discord.execApprovals: доставка схвалень exec у стилі Discord і авторизація тих, хто схвалює.
    • enabled: true, false або "auto" (типово). У режимі auto схвалення exec активуються, коли тих, хто схвалює, можна визначити з approvers або commands.ownerAllowFrom.
    • approvers: ID користувачів Discord, яким дозволено схвалювати запити exec. Якщо не вказано, використовується commands.ownerAllowFrom.
    • agentFilter: необов’язковий список дозволених ID агентів. Не вказуйте, щоб пересилати схвалення для всіх агентів.
    • sessionFilter: необов’язкові шаблони ключів сеансів (підрядок або regex).
    • target: куди надсилати запити на схвалення. "dm" (типово) надсилає в DM тим, хто схвалює, "channel" надсилає у вихідний канал, "both" надсилає в обидва місця. Коли target включає "channel", кнопками можуть користуватися лише визначені як такі, що схвалюють.
    • cleanupAfterResolve: якщо true, видаляє DM зі схваленням після схвалення, відхилення або тайм-ауту.
Режими сповіщень про реакції: off (немає), own (повідомлення бота, типово), all (усі повідомлення), allowlist (від guilds.<id>.users для всіх повідомлень).

Google Chat

{
  channels: {
    googlechat: {
      enabled: true,
      serviceAccountFile: "/path/to/service-account.json",
      audienceType: "app-url", // app-url | project-number
      audience: "https://gateway.example.com/googlechat",
      webhookPath: "/googlechat",
      botUser: "users/1234567890",
      dm: {
        enabled: true,
        policy: "pairing",
        allowFrom: ["users/1234567890"],
      },
      groupPolicy: "allowlist",
      groups: {
        "spaces/AAAA": { allow: true, requireMention: true },
      },
      actions: { reactions: true },
      typingIndicator: "message",
      mediaMaxMb: 20,
    },
  },
}
  • JSON облікового запису служби: вбудований (serviceAccount) або з файла (serviceAccountFile).
  • Також підтримується 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: "Short answers only.",
        },
      },
      historyLimit: 50,
      allowBots: false,
      reactionNotifications: "own",
      reactionAllowlist: ["U123"],
      replyToMode: "off", // off | first | all | batched
      thread: {
        historyScope: "thread", // thread | channel
        inheritParent: false,
      },
      actions: {
        reactions: true,
        messages: true,
        pins: true,
        memberInfo: true,
        emojiList: true,
      },
      slashCommand: {
        enabled: true,
        name: "openclaw",
        sessionPrefix: "slack:slash",
        ephemeral: true,
      },
      typingReaction: "hourglass_flowing_sand",
      textChunkLimit: 4000,
      chunkMode: "length",
      streaming: {
        mode: "partial", // off | partial | block | progress
        nativeTransport: true, // використовувати власний streaming API Slack, коли mode=partial
      },
      mediaMaxMb: 20,
      execApprovals: {
        enabled: "auto", // true | false | "auto"
        approvers: ["U123"],
        agentFilter: ["default"],
        sessionFilter: ["slack:"],
        target: "dm", // dm | channel | both
      },
    },
  },
}
  • Режим Socket вимагає і botToken, і appToken (SLACK_BOT_TOKEN + SLACK_APP_TOKEN як резервний варіант env для типового облікового запису).
  • Режим HTTP вимагає botToken плюс signingSecret (у корені або для кожного облікового запису).
  • botToken, appToken, signingSecret і userToken приймають відкриті рядки або об’єкти SecretRef.
  • Знімки облікових записів Slack показують поля джерела/статусу для кожного облікового даного, наприклад botTokenSource, botTokenStatus, appTokenStatus, а в режимі HTTP — signingSecretStatus. configured_unavailable означає, що обліковий запис налаштований через SecretRef, але поточний шлях команди/runtime не зміг визначити значення секрету.
  • configWrites: false блокує записи конфігурації, ініційовані зі Slack.
  • Необов’язковий channels.slack.defaultAccount перевизначає вибір типового облікового запису, коли він збігається з налаштованим ідентифікатором облікового запису.
  • channels.slack.streaming.mode — канонічний ключ режиму потоку Slack. channels.slack.streaming.nativeTransport керує власним транспортом потокової передачі Slack. Застарілі streamMode, булеві значення streaming і nativeStreaming мігруються автоматично.
  • Використовуйте user:<id> (DM) або channel:<id> для цілей доставки.
Режими сповіщень про реакції: off, own (типово), all, allowlistreactionAllowlist). Ізоляція сеансів гілок: thread.historyScope — окремо для кожної гілки (типово) або спільно на рівні каналу. thread.inheritParent копіює стенограму батьківського каналу в нові гілки.
  • Власна потокова передача Slack разом зі статусом гілки Slack у стилі помічника “is typing…” вимагають ціль відповіді у гілці. DM верхнього рівня типово залишаються поза гілкою, тому вони використовують typingReaction або звичайну доставку замість попереднього перегляду у стилі гілки.
  • typingReaction додає тимчасову реакцію до вхідного повідомлення Slack, поки виконується відповідь, а потім видаляє її після завершення. Використовуйте shortcode емодзі Slack, наприклад "hourglass_flowing_sand".
  • channels.slack.execApprovals: доставка схвалень exec у стилі Slack і авторизація тих, хто схвалює. Та сама схема, що й у Discord: enabled (true/false/"auto"), approvers (ID користувачів Slack), agentFilter, sessionFilter і target ("dm", "channel" або "both").
Група дійТиповоПримітки
reactionsувімкненоРеакції + список реакцій
messagesувімкненоЧитання/надсилання/редагування/видалення
pinsувімкненоЗакріпити/відкріпити/список
memberInfoувімкненоІнформація про учасника
emojiListувімкненоСписок користувацьких емодзі

Mattermost

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

Signal

{
  channels: {
    signal: {
      enabled: true,
      account: "+15555550123", // необов’язкова прив’язка облікового запису
      dmPolicy: "pairing",
      allowFrom: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"],
      configWrites: true,
      reactionNotifications: "own", // off | own | all | allowlist
      reactionAllowlist: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"],
      historyLimit: 50,
    },
  },
}
Режими сповіщень про реакції: off, own (типово), all, allowlistreactionAllowlist).
  • channels.signal.account: прив’язати запуск каналу до конкретної ідентичності облікового запису Signal.
  • channels.signal.configWrites: дозволяти або забороняти записи конфігурації, ініційовані з Signal.
  • Необов’язковий channels.signal.defaultAccount перевизначає вибір типового облікового запису, коли він збігається з налаштованим ідентифікатором облікового запису.

BlueBubbles

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

iMessage

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

Matrix

Matrix підтримується розширенням і налаштовується в channels.matrix.
{
  channels: {
    matrix: {
      enabled: true,
      homeserver: "https://matrix.example.org",
      accessToken: "syt_bot_xxx",
      proxy: "http://127.0.0.1:7890",
      encryption: true,
      initialSyncLimit: 20,
      defaultAccount: "ops",
      accounts: {
        ops: {
          name: "Ops",
          userId: "@ops:example.org",
          accessToken: "syt_ops_xxx",
        },
        alerts: {
          userId: "@alerts:example.org",
          password: "secret",
          proxy: "http://127.0.0.1:7891",
        },
      },
    },
  },
}
  • Автентифікація за токеном використовує accessToken; автентифікація за паролем використовує userId + password.
  • channels.matrix.proxy маршрутизує HTTP-трафік Matrix через явний HTTP(S) proxy. Іменовані облікові записи можуть перевизначити це через channels.matrix.accounts.<id>.proxy.
  • channels.matrix.network.dangerouslyAllowPrivateNetwork дозволяє приватні/internal homeserver-и. proxy і цей мережевий opt-in — незалежні елементи керування.
  • channels.matrix.defaultAccount вибирає бажаний обліковий запис у багатооблікових конфігураціях.
  • channels.matrix.autoJoin типово має значення off, тому запрошені кімнати й нові запрошення у стилі DM ігноруються, доки ви не встановите autoJoin: "allowlist" разом із autoJoinAllowlist або autoJoin: "always".
  • channels.matrix.execApprovals: доставка схвалень exec у стилі Matrix і авторизація тих, хто схвалює.
    • enabled: true, false або "auto" (типово). У режимі auto схвалення exec активуються, коли тих, хто схвалює, можна визначити з approvers або commands.ownerAllowFrom.
    • approvers: ID користувачів Matrix (наприклад @owner:example.org), яким дозволено схвалювати запити exec.
    • agentFilter: необов’язковий список дозволених ID агентів. Не вказуйте, щоб пересилати схвалення для всіх агентів.
    • sessionFilter: необов’язкові шаблони ключів сеансів (підрядок або regex).
    • target: куди надсилати запити на схвалення. "dm" (типово), "channel" (вихідна кімната) або "both".
    • Перевизначення для облікового запису: channels.matrix.accounts.<id>.execApprovals.
  • channels.matrix.dm.sessionScope керує тим, як DM у Matrix групуються в сеанси: per-user (типово) спільний для маршрутизованого peer, тоді як per-room ізолює кожну DM-кімнату.
  • Перевірки статусу Matrix і live-пошуки в каталозі використовують ту саму політику proxy, що й runtime-трафік.
  • Повну конфігурацію Matrix, правила таргетингу й приклади налаштування описано в Matrix.

Microsoft Teams

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

IRC

IRC підтримується розширенням і налаштовується в 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 перевизначає вибір типового облікового запису, коли він збігається з налаштованим ідентифікатором облікового запису.
  • Повну конфігурацію каналу IRC (host/port/TLS/channels/allowlists/контроль згадувань) описано в IRC.

Багато облікових записів (усі канали)

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

Інші канали розширень

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

Контроль згадувань у групових чатах

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

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

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

Режим self-chat

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

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

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

Типові значення агента

agents.defaults.workspace

Типове значення: ~/.openclaw/workspace.
{
  agents: { defaults: { workspace: "~/.openclaw/workspace" } },
}

agents.defaults.repoRoot

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

agents.defaults.skills

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

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.contextInjection

Керує тим, коли bootstrap-файли workspace вставляються в системний prompt. Типове значення: "always".
  • "continuation-skip": безпечні ходи продовження (після завершеної відповіді асистента) пропускають повторну вставку bootstrap workspace, зменшуючи розмір prompt. Запуски heartbeat і повторні спроби після ущільнення все одно перебудовують контекст.
{
  agents: { defaults: { contextInjection: "continuation-skip" } },
}

agents.defaults.bootstrapMaxChars

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

agents.defaults.bootstrapTotalMaxChars

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

agents.defaults.bootstrapPromptTruncationWarning

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

agents.defaults.imageMaxDimensionPx

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

agents.defaults.userTimezone

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

agents.defaults.timeFormat

Формат часу в системному prompt. Типове значення: 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" }, // глобальні типові параметри постачальника
      embeddedHarness: {
        runtime: "auto", // auto | pi | зареєстрований id harness, наприклад codex
        fallback: "pi", // pi | none
      },
      pdfMaxBytesMb: 10,
      pdfMaxPages: 20,
      thinkingDefault: "low",
      verboseDefault: "off",
      elevatedDefault: "on",
      timeoutSeconds: 600,
      mediaMaxMb: 5,
      contextTokens: 200000,
      maxConcurrent: 3,
    },
  },
}
  • model: приймає або рядок ("provider/model"), або об’єкт ({ primary, fallbacks }).
    • Рядкова форма задає лише основну модель.
    • Об’єктна форма задає основну модель плюс упорядковані failover-моделі.
  • imageModel: приймає або рядок ("provider/model"), або об’єкт ({ primary, fallbacks }).
    • Використовується шляхом інструмента image як його конфігурація vision-моделі.
    • Також використовується як резервна маршрутизація, коли вибрана/типова модель не може приймати вхідні зображення.
  • imageGenerationModel: приймає або рядок ("provider/model"), або об’єкт ({ primary, fallbacks }).
    • Використовується спільною можливістю генерації зображень і будь-якою майбутньою поверхнею інструмента/плагіна, що генерує зображення.
    • Типові значення: google/gemini-3.1-flash-image-preview для нативної генерації зображень Gemini, 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 усе одно може визначити типове значення постачальника з автентифікацією. Спочатку він пробує поточного типового постачальника, а потім — решту зареєстрованих постачальників генерації зображень у порядку provider-id.
  • musicGenerationModel: приймає або рядок ("provider/model"), або об’єкт ({ primary, fallbacks }).
    • Використовується спільною можливістю генерації музики та вбудованим інструментом music_generate.
    • Типові значення: google/lyria-3-clip-preview, google/lyria-3-pro-preview або minimax/music-2.5+.
    • Якщо не вказано, music_generate усе одно може визначити типове значення постачальника з автентифікацією. Спочатку він пробує поточного типового постачальника, а потім — решту зареєстрованих постачальників генерації музики в порядку provider-id.
    • Якщо ви вибираєте provider/model напряму, також налаштуйте відповідну автентифікацію постачальника/API key.
  • 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 усе одно може визначити типове значення постачальника з автентифікацією. Спочатку він пробує поточного типового постачальника, а потім — решту зареєстрованих постачальників генерації відео в порядку provider-id.
    • Якщо ви вибираєте provider/model напряму, також налаштуйте відповідну автентифікацію постачальника/API key.
    • Вбудований постачальник генерації відео Qwen підтримує до 1 вихідного відео, 1 вхідного зображення, 4 вхідних відео, тривалість до 10 секунд і параметри рівня постачальника size, aspectRatio, resolution, audio та watermark.
  • pdfModel: приймає або рядок ("provider/model"), або об’єкт ({ primary, fallbacks }).
    • Використовується інструментом pdf для маршрутизації моделі.
    • Якщо не вказано, інструмент PDF резервно використовує imageModel, а потім визначену модель сеансу/типову модель.
  • pdfMaxBytesMb: типовий ліміт розміру PDF для інструмента pdf, коли maxBytesMb не передано під час виклику.
  • pdfMaxPages: типова максимальна кількість сторінок, що враховуються в режимі резервного вилучення інструмента pdf.
  • verboseDefault: типовий рівень verbose для агентів. Значення: "off", "on", "full". Типове значення: "off".
  • elevatedDefault: типовий рівень elevated-output для агентів. Значення: "off", "on", "ask", "full". Типове значення: "on".
  • model.primary: формат provider/model (наприклад openai/gpt-5.4). Якщо ви пропускаєте постачальника, OpenClaw спочатку намагається знайти псевдонім, потім — унікальний збіг точно цього model id серед налаштованих постачальників, і лише після цього резервно використовує налаштованого типового постачальника (застаріла поведінка сумісності, тому надавайте перевагу явному provider/model). Якщо цей постачальник більше не надає налаштовану типову модель, OpenClaw резервно переходить до першого налаштованого provider/model замість показу застарілого типового значення видаленого постачальника.
  • models: налаштований каталог моделей і список дозволів для /model. Кожен запис може містити alias (скорочення) і params (специфічні для постачальника, наприклад temperature, maxTokens, cacheRetention, context1m).
  • params: глобальні типові параметри постачальника, які застосовуються до всіх моделей. Задаються в agents.defaults.params (наприклад { cacheRetention: "long" }).
  • Пріоритет злиття params (конфігурація): agents.defaults.params (глобальна база) перевизначається agents.defaults.models["provider/model"].params (для конкретної моделі), а потім agents.list[].params (для відповідного id агента) перевизначає за ключем. Докладніше див. у Prompt Caching.
  • embeddedHarness: типова політика низькорівневого runtime вбудованого агента. Використовуйте runtime: "auto", щоб дозволити зареєстрованим plugin harness-ам перехоплювати підтримувані моделі, runtime: "pi" — щоб примусово використовувати вбудований PI harness, або зареєстрований id harness, наприклад runtime: "codex". Встановіть fallback: "none", щоб вимкнути автоматичний резервний перехід на PI.
  • Засоби запису конфігурації, які змінюють ці поля (наприклад /models set, /models set-image і команди додавання/видалення fallback), зберігають канонічну об’єктну форму та за можливості зберігають наявні списки fallback.
  • maxConcurrent: максимальна кількість паралельних запусків агентів між сеансами (кожен сеанс усе одно серіалізується). Типове значення: 4.

agents.defaults.embeddedHarness

embeddedHarness керує тим, який низькорівневий виконавець запускає ходи вбудованого агента. Для більшості розгортань слід залишити типове значення { runtime: "auto", fallback: "pi" }. Використовуйте це, коли довірений плагін надає нативний harness, наприклад bundled harness app-server Codex.
{
  agents: {
    defaults: {
      model: "codex/gpt-5.4",
      embeddedHarness: {
        runtime: "codex",
        fallback: "none",
      },
    },
  },
}
  • runtime: "auto", "pi" або id зареєстрованого plugin harness. Bundled плагін Codex реєструє codex.
  • fallback: "pi" або "none". "pi" зберігає вбудований PI harness як резервний варіант сумісності. "none" змушує помилку при відсутньому або непідтримуваному виборі plugin harness замість тихого переходу на PI.
  • Перевизначення через середовище: OPENCLAW_AGENT_RUNTIME=<id|auto|pi> перевизначає runtime; OPENCLAW_AGENT_HARNESS_FALLBACK=none вимикає резервний перехід на PI для цього процесу.
  • Для розгортань лише з Codex встановіть model: "codex/gpt-5.4", embeddedHarness.runtime: "codex" і embeddedHarness.fallback: "none".
  • Це керує лише вбудованим chat harness. Генерація медіа, vision, PDF, музика, відео та TTS усе одно використовують власні налаштування provider/model.
Вбудовані скорочення псевдонімів (застосовуються лише тоді, коли модель є в 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
Ваші налаштовані псевдоніми завжди мають пріоритет над типовими. Для моделей Z.AI GLM-4.x режим thinking вмикається автоматично, якщо ви не встановите --thinking off або самостійно не визначите agents.defaults.models["zai/<model>"].params.thinking. Для моделей Z.AI tool_stream типово ввімкнено для потокової передачі викликів інструментів. Установіть agents.defaults.models["zai/<model>"].params.tool_stream у false, щоб вимкнути його. Для моделей Anthropic Claude 4.6 типово використовується adaptive thinking, коли явний рівень thinking не задано.

agents.defaults.cliBackends

Необов’язкові CLI-бекенди для резервних запусків лише з текстом (без викликів інструментів). Корисно як запасний варіант, коли API-постачальники не працюють.
{
  agents: {
    defaults: {
      cliBackends: {
        "codex-cli": {
          command: "/opt/homebrew/bin/codex",
        },
        "my-cli": {
          command: "my-cli",
          args: ["--json"],
          output: "json",
          modelArg: "--model",
          sessionArg: "--session",
          sessionMode: "existing",
          systemPromptArg: "--system",
          systemPromptWhen: "first",
          imageArg: "--image",
          imageMode: "repeat",
        },
      },
    },
  },
}
  • CLI-бекенди орієнтовані насамперед на текст; інструменти завжди вимкнені.
  • Сеанси підтримуються, коли встановлено sessionArg.
  • Передача зображень підтримується, коли imageArg приймає шляхи до файлів.

agents.defaults.systemPromptOverride

Замінює весь системний prompt, зібраний OpenClaw, на фіксований рядок. Задається на типовому рівні (agents.defaults.systemPromptOverride) або для окремого агента (agents.list[].systemPromptOverride). Значення для окремого агента мають пріоритет; порожнє значення або значення лише з пробілами ігнорується. Корисно для контрольованих експериментів із prompt.
{
  agents: {
    defaults: {
      systemPromptOverride: "You are a helpful assistant.",
    },
  },
}

agents.defaults.heartbeat

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

agents.defaults.compaction

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

agents.defaults.contextPruning

Обрізає старі результати інструментів із контексту в пам’яті перед надсиланням до LLM. Не змінює історію сеансу на диску.
{
  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" вмикає проходи обрізання.
  • ttl керує тим, як часто обрізання може запускатися знову (після останнього торкання кешу).
  • Обрізання спочатку м’яко скорочує завеликі результати інструментів, а потім за потреби повністю очищує старіші результати інструментів.
М’яке обрізання зберігає початок і кінець та вставляє посередині ....Повне очищення замінює весь результат інструмента заповнювачем.Примітки:
  • Блоки зображень ніколи не обрізаються й не очищуються.
  • Співвідношення рахуються за символами (приблизно), а не за точною кількістю токенів.
  • Якщо повідомлень assistant менше, ніж keepLastAssistants, обрізання пропускається.
Докладніше про поведінку див. у Session Pruning.

Блокова потокова передача

{
  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, щоб увімкнути блокові відповіді.
  • Перевизначення для каналу: channels.<channel>.blockStreamingCoalesce (і варіанти для окремих облікових записів). Для Signal/Slack/Discord/Google Chat типово minChars: 1500.
  • humanDelay: випадкова пауза між блоковими відповідями. natural = 800–2500 мс. Перевизначення для окремого агента: agents.list[].humanDelay.
Докладніше про поведінку й поділ на фрагменти див. у Streaming.

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

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

agents.defaults.sandbox

Необов’язкова ізоляція для вбудованого агента. Повний посібник див. у 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",
          // Також підтримуються SecretRef / вбудований вміст:
          // 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"],
      },
    },
  },
}
Бекенд:
  • docker: локальний Docker runtime (типово)
  • ssh: універсальний віддалений runtime на базі SSH
  • openshell: runtime OpenShell
Коли вибрано backend: "openshell", налаштування, специфічні для runtime, переносяться в plugins.entries.openshell.config.Конфігурація SSH-бекенда:
  • target: SSH-ціль у форматі user@host[:port]
  • command: команда SSH-клієнта (типово: ssh)
  • workspaceRoot: абсолютний віддалений корінь, що використовується для workspace за кожною областю
  • identityFile / certificateFile / knownHostsFile: наявні локальні файли, що передаються в OpenSSH
  • identityData / certificateData / knownHostsData: вбудований вміст або SecretRef, які OpenClaw матеріалізує у тимчасові файли під час runtime
  • strictHostKeyChecking / updateHostKeys: параметри політики ключів хоста OpenSSH
Пріоритет автентифікації SSH:
  • identityData має пріоритет над identityFile
  • certificateData має пріоритет над certificateFile
  • knownHostsData має пріоритет над knownHostsFile
  • Значення *Data на базі SecretRef визначаються з активного знімка runtime secrets до початку сеансу sandbox
Поведінка SSH-бекенда:
  • один раз ініціалізує віддалений workspace після створення або повторного створення
  • далі зберігає віддалений SSH-workspace як канонічний
  • маршрутизує exec, файлові інструменти й шляхи медіа через SSH
  • не синхронізує віддалені зміни назад на хост автоматично
  • не підтримує браузерні контейнери sandbox
Доступ до workspace:
  • none: workspace sandbox для кожної області в ~/.openclaw/sandboxes
  • ro: workspace sandbox у /workspace, workspace агента монтується лише для читання в /agent
  • rw: workspace агента монтується для читання/запису в /workspace
Область:
  • session: контейнер + workspace для кожного сеансу
  • agent: один контейнер + workspace на агента (типово)
  • shared: спільний контейнер і workspace (без міжсеансової ізоляції)
Конфігурація плагіна 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: ініціалізувати віддалений із локального перед exec, синхронізувати назад після exec; локальний workspace залишається канонічним
  • remote: один раз ініціалізувати віддалений при створенні sandbox, далі віддалений workspace залишається канонічним
У режимі remote локальні правки на хості, зроблені поза OpenClaw, не синхронізуються в sandbox автоматично після етапу початкової ініціалізації. Транспорт — SSH до sandbox OpenShell, але життєвим циклом sandbox і необов’язковою синхронізацією mirror керує плагін.setupCommand виконується один раз після створення контейнера (через sh -lc). Потребує вихідного доступу в мережу, кореневої файлової системи для запису та користувача root.Контейнери типово мають network: "none" — встановіть "bridge" (або користувацьку bridge-мережу), якщо агенту потрібен вихідний доступ. "host" заблоковано. "container:<id>" типово заблоковано, якщо ви явно не встановите sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true (режим break-glass).Вхідні вкладення розміщуються в media/inbound/* в активному workspace.docker.binds монтує додаткові каталоги хоста; глобальні прив’язки та прив’язки для окремих агентів об’єднуються.Браузер у sandbox (sandbox.browser.enabled): Chromium + CDP у контейнері. URL noVNC вставляється в системний prompt. Не потребує browser.enabled у openclaw.json. Доступ спостерігача через noVNC типово використовує VNC-автентифікацію, а OpenClaw видає URL із короткоживучим токеном (замість розкриття пароля в спільному URL).
  • allowHostControl: false (типово) блокує для сеансів у sandbox націлювання на браузер хоста.
  • network типово має значення openclaw-sandbox-browser (виділена bridge-мережа). Встановлюйте bridge лише тоді, коли вам явно потрібна глобальна bridge-зв’язність.
  • cdpSourceRange за бажанням обмежує вхідний CDP-трафік на межі контейнера діапазоном CIDR (наприклад 172.21.0.1/32).
  • sandbox.browser.binds монтує додаткові каталоги хоста лише в контейнер браузера sandbox. Якщо встановлено (включно з []), воно замінює docker.binds для контейнера браузера.
  • Типові параметри запуску визначено в scripts/sandbox-browser-entrypoint.sh і налаштовано для хостів контейнерів:
    • --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 знову вмикає розширення, якщо ваш робочий процес залежить від них.
    • --renderer-process-limit=2 можна змінити через OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>; встановіть 0, щоб використовувати типове обмеження кількості процесів Chromium.
    • а також --no-sandbox і --disable-setuid-sandbox, коли ввімкнено noSandbox.
    • Типові значення є базовим рівнем образу контейнера; використовуйте власний образ браузера з власним entrypoint, щоб змінити типові значення контейнера.
Ізоляція браузера та sandbox.docker.binds підтримуються лише для Docker. Зібрати образи:
scripts/sandbox-setup.sh           # основний образ sandbox
scripts/sandbox-browser-setup.sh   # необов’язковий образ браузера

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 для окремого агента
        embeddedHarness: { runtime: "auto", fallback: "pi" },
        params: { cacheRetention: "none" }, // перевизначає params відповідних defaults.models за ключем
        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: якщо встановлено для кількох агентів, перемагає перший (записується попередження). Якщо не встановлено ніде, типово використовується перший елемент списку.
  • model: рядкова форма перевизначає лише primary; об’єктна форма { primary, fallbacks } перевизначає обидва ([] вимикає глобальні fallback-и). Cron jobs, які перевизначають лише primary, усе ще успадковують типові fallback-и, якщо ви не встановите fallbacks: [].
  • params: параметри потоку для окремого агента, що зливаються поверх вибраного запису моделі в agents.defaults.models. Використовуйте це для перевизначень на рівні агента, таких як cacheRetention, temperature або maxTokens, без дублювання всього каталогу моделей.
  • skills: необов’язковий список дозволів Skills для окремого агента. Якщо не вказано, агент успадковує agents.defaults.skills, коли їх задано; явний список замінює типові значення замість злиття, а [] означає відсутність Skills.
  • thinkingDefault: необов’язковий типовий рівень thinking для окремого агента (off | minimal | low | medium | high | xhigh | adaptive). Перевизначає agents.defaults.thinkingDefault для цього агента, коли не задано перевизначення для повідомлення або сеансу.
  • reasoningDefault: необов’язковий типовий рівень видимості reasoning для окремого агента (on | off | stream). Застосовується, коли не задано перевизначення reasoning для повідомлення або сеансу.
  • fastModeDefault: необов’язкове типове значення fast mode для окремого агента (true | false). Застосовується, коли не задано перевизначення fast-mode для повідомлення або сеансу.
  • embeddedHarness: необов’язкове перевизначення політики низькорівневого harness для окремого агента. Використовуйте { runtime: "codex", fallback: "none" }, щоб зробити один агент лише Codex, тоді як інші агенти зберігатимуть типовий резервний варіант PI.
  • runtime: необов’язковий дескриптор runtime для окремого агента. Використовуйте type: "acp" з типовими значеннями runtime.acp (agent, backend, mode, cwd), коли агент має типово використовувати сеанси ACP harness.
  • identity.avatar: шлях відносно workspace, URL http(s) або URI data:.
  • identity виводить типові значення: ackReaction із emoji, mentionPatterns із name/emoji.
  • subagents.allowAgents: список дозволених id агентів для sessions_spawn (["*"] = будь-який; типово: лише той самий агент).
  • Захист успадкування sandbox: якщо сеанс-запитувач виконується в sandbox, sessions_spawn відхиляє цілі, які працювали б без sandbox.
  • subagents.requireAgentId: якщо true, блокує виклики sessions_spawn, у яких пропущено agentId (примушує явний вибір профілю; типово: 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" } },
  ],
}

Поля відповідності binding

  • type (необов’язково): route для звичайної маршрутизації (якщо тип не вказано, використовується route), acp для постійних ACP-прив’язок розмов.
  • match.channel (обов’язково)
  • match.accountId (необов’язково; * = будь-який обліковий запис; якщо пропущено = типовий обліковий запис)
  • match.peer (необов’язково; { kind: direct|group|channel, id })
  • match.guildId / match.teamId (необов’язково; специфічно для каналу)
  • acp (необов’язково; лише для записів type: "acp"): { mode, label, cwd, backend }
Детермінований порядок відповідності:
  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: {
    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 батьківської гілки вище цього ліміту токенів (0 вимикає)
    maintenance: {
      mode: "warn", // warn | enforce
      pruneAfter: "30d",
      maxEntries: 500,
      rotateBytes: "10mb",
      resetArchiveRetention: "30d", // тривалість або false
      maxDiskBytes: "500mb", // необов’язковий жорсткий бюджет
      highWaterBytes: "400mb", // необов’язкова ціль очищення
    },
    threadBindings: {
      enabled: true,
      idleHours: 24, // типове автоматичне зняття фокуса через неактивність у годинах (`0` вимикає)
      maxAgeHours: 0, // типовий жорсткий максимальний вік у годинах (`0` вимикає)
    },
    mainKey: "main", // застаріле (runtime завжди використовує "main")
    agentToAgent: { maxPingPongTurns: 5 },
    sendPolicy: {
      rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }],
      default: "allow",
    },
  },
}
  • scope: базова стратегія групування сеансів для контекстів групового чату.
    • per-sender (типово): кожен відправник отримує ізольований сеанс у межах контексту каналу.
    • global: усі учасники в контексті каналу спільно використовують один сеанс (використовуйте лише тоді, коли потрібен спільний контекст).
  • dmScope: спосіб групування DM.
    • main: усі DM використовують спільний основний сеанс.
    • per-peer: ізоляція за id відправника між каналами.
    • per-channel-peer: ізоляція за каналом + відправником (рекомендовано для спільних вхідних скриньок кількох користувачів).
    • per-account-channel-peer: ізоляція за обліковим записом + каналом + відправником (рекомендовано для багатооблікових конфігурацій).
  • identityLinks: відображає канонічні id на peers із префіксом постачальника для спільного використання сеансів між каналами.
  • reset: основна політика скидання. daily скидає о atHour за місцевим часом; idle скидає після idleMinutes. Якщо налаштовано обидва, перемагає те, що спливає раніше.
  • resetByType: перевизначення за типом (direct, group, thread). Застаріле dm приймається як псевдонім для direct.
  • parentForkMaxTokens: максимальне значення totalTokens батьківського сеансу, дозволене під час створення fork-сеансу гілки (типово 100000).
    • Якщо totalTokens батьківського сеансу перевищує це значення, OpenClaw запускає новий сеанс гілки замість успадкування історії стенограми батьківського сеансу.
    • Встановіть 0, щоб вимкнути цей захист і завжди дозволяти fork від батьківського сеансу.
  • mainKey: застаріле поле. Runtime завжди використовує "main" для основного сегмента прямого чату.
  • agentToAgent.maxPingPongTurns: максимальна кількість зворотних ходів відповіді між агентами під час обміну agent-to-agent (ціле число, діапазон: 05). 0 вимикає ланцюжки ping-pong.
  • sendPolicy: зіставлення за channel, chatType (direct|group|channel, із застарілим псевдонімом dm), keyPrefix або rawKeyPrefix. Перша заборона перемагає.
  • maintenance: керування очищенням сховища сеансів + збереженням.
    • mode: warn видає лише попередження; enforce застосовує очищення.
    • pruneAfter: віковий поріг для застарілих записів (типово 30d).
    • maxEntries: максимальна кількість записів у sessions.json (типово 500).
    • rotateBytes: ротує sessions.json, коли він перевищує цей розмір (типово 10mb).
    • resetArchiveRetention: строк зберігання для архівів стенограм *.reset.<timestamp>. Типово дорівнює pruneAfter; встановіть false, щоб вимкнути.
    • maxDiskBytes: необов’язковий бюджет диска для каталогу сеансів. У режимі warn записує попередження в журнал; у режимі enforce спочатку видаляє найстаріші артефакти/сеанси.
    • highWaterBytes: необов’язкова ціль після очищення бюджету. Типово 80% від maxDiskBytes.
  • threadBindings: глобальні типові значення для функцій сеансу, прив’язаних до гілок.
    • enabled: головний типовий перемикач (постачальники можуть перевизначати; Discord використовує channels.discord.threadBindings.enabled)
    • idleHours: типове автоматичне зняття фокуса через неактивність у годинах (0 вимикає; постачальники можуть перевизначати)
    • maxAgeHours: типовий жорсткий максимальний вік у годинах (0 вимикає; постачальники можуть перевизначати)

Повідомлення

{
  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. Вирішення (перемагає найспецифічніше): обліковий запис → канал → глобальний. "" вимикає і зупиняє каскад. "auto" виводить [{identity.name}]. Змінні шаблону:
ЗміннаОписПриклад
{model}Коротка назва моделіclaude-opus-4-6
{modelFull}Повний ідентифікатор моделіanthropic/claude-opus-4-6
{provider}Назва постачальникаanthropic
{thinkingLevel}Поточний рівень thinkinghigh, low, off
{identity.name}Назва identity агента(те саме, що "auto")
Змінні нечутливі до регістру. {think} є псевдонімом для {thinkingLevel}.

Реакція-підтвердження

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

Debounce для вхідних повідомлень

Об’єднує швидкі текстові повідомлення від того самого відправника в один хід агента. Медіа/вкладення скидаються негайно. Керувальні команди обходять debounce.

TTS (перетворення тексту на мовлення)

{
  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: off, always, inbound або tagged. /tts on|off може перевизначити локальні налаштування, а /tts status показує ефективний стан.
  • summaryModel перевизначає agents.defaults.model.primary для auto-summary.
  • modelOverrides типово ввімкнено; modelOverrides.allowProvider типово має значення false (потрібне явне увімкнення).
  • Для API key використовуються резервні значення 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-сумісний TTS-сервер і послаблює валідацію моделі/голосу.

Talk

Типові значення для режиму 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.
  • Застарілі плоскі ключі Talk (talk.voiceId, talk.voiceAliases, talk.modelId, talk.outputFormat, talk.apiKey) призначені лише для сумісності й автоматично мігруються в talk.providers.<provider>.
  • Для Voice ID використовуються резервні значення ELEVENLABS_VOICE_ID або SAG_VOICE_ID.
  • providers.*.apiKey приймає відкриті рядки або об’єкти SecretRef.
  • Резервне значення ELEVENLABS_API_KEY застосовується лише тоді, коли не налаштовано API key для Talk.
  • providers.*.voiceAliases дозволяє директивам Talk використовувати дружні імена.
  • silenceTimeoutMs керує тим, як довго режим Talk чекає після тиші користувача, перш ніж надіслати стенограму. Якщо не встановлено, зберігається типове вікно паузи платформи (700 ms на macOS і Android, 900 ms на iOS).

Інструменти

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

tools.profile задає базовий список дозволів перед 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 приймається як псевдонім для 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

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

tools.byProvider

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

tools.elevated

Керує elevated-доступом exec поза sandbox:
{
  tools: {
    elevated: {
      enabled: true,
      allowFrom: {
        whatsapp: ["+15555550123"],
        discord: ["1234567890123", "987654321098765432"],
      },
    },
  },
}
  • Перевизначення для окремого агента (agents.list[].tools.elevated) може лише додатково обмежувати.
  • /elevated on|off|ask|full зберігає стан для кожного сеансу; вбудовані директиви застосовуються до одного повідомлення.
  • Elevated exec обходить sandbox і використовує налаштований шлях виходу (gateway типово або node, коли ціллю exec є 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: максимальний обсяг історії викликів інструментів, що зберігається для аналізу циклів.
  • warningThreshold: поріг повторюваного шаблону без прогресу для попереджень.
  • criticalThreshold: вищий поріг повторення для блокування критичних циклів.
  • globalCircuitBreakerThreshold: поріг жорсткої зупинки для будь-якого запуску без прогресу.
  • detectors.genericRepeat: попереджати про повторні виклики того самого інструмента з тими самими аргументами.
  • detectors.knownPollNoProgress: попереджати/блокувати відомі poll-інструменти (process.poll, command_status тощо).
  • detectors.pingPong: попереджати/блокувати шаблони чергування пар без прогресу.
  • Якщо warningThreshold >= criticalThreshold або criticalThreshold >= globalCircuitBreakerThreshold, валідація завершується помилкою.

tools.web

{
  tools: {
    web: {
      search: {
        enabled: true,
        apiKey: "brave_api_key", // або env BRAVE_API_KEY
        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

Налаштовує розуміння вхідних медіа (зображення/аудіо/відео):
{
  tools: {
    media: {
      concurrency: 2,
      asyncCompletion: {
        directSend: false, // опціонально: надсилати готові асинхронні музичні/відео результати безпосередньо в канал
      },
      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" }],
      },
    },
  },
}
Запис постачальника (type: "provider" або пропущено):
  • provider: id API-постачальника (openai, anthropic, google/gemini, groq тощо)
  • model: перевизначення id моделі
  • profile / preferredProfile: вибір профілю auth-profiles.json
CLI-запис (type: "cli"):
  • command: виконуваний файл для запуску
  • args: шаблонізовані аргументи (підтримуються {{MediaPath}}, {{Prompt}}, {{MaxChars}} тощо)
Спільні поля:
  • capabilities: необов’язковий список (image, audio, video). Типові значення: openai/anthropic/minimax → image, google → image+audio+video, groq → audio.
  • prompt, maxChars, maxBytes, timeoutSeconds, language: перевизначення для окремого запису.
  • У разі збою використовується наступний запис.
Автентифікація постачальника дотримується стандартного порядку: auth-profiles.json → env vars → models.providers.*.apiKey.Поля асинхронного завершення:
  • asyncCompletion.directSend: коли true, завершені асинхронні завдання music_generate і video_generate спочатку намагаються доставлятися безпосередньо в канал. Типове значення: false (застарілий шлях пробудження requester-session/model-delivery).

tools.agentToAgent

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

tools.sessions

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

tools.sessions_spawn

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

tools.experimental

Експериментальні прапорці вбудованих інструментів. Типово вимкнено, якщо не застосовується правило автоматичного ввімкнення strict-agentic GPT-5.
{
  tools: {
    experimental: {
      planTool: true, // увімкнути експериментальний update_plan
    },
  },
}
Примітки:
  • planTool: вмикає структурований інструмент update_plan для відстеження нетривіальної багатокрокової роботи.
  • Типове значення: false, якщо тільки agents.defaults.embeddedPi.executionContract (або перевизначення для окремого агента) не встановлено в "strict-agentic" для запуску OpenAI або OpenAI Codex сімейства GPT-5. Встановіть true, щоб примусово ввімкнути інструмент поза цією областю, або false, щоб залишити його вимкненим навіть для запусків strict-agentic GPT-5.
  • Коли інструмент увімкнено, системний prompt також додає вказівки з використання, щоб модель застосовувала його лише для суттєвої роботи і тримала не більше одного кроку in_progress.

agents.defaults.subagents

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

Власні постачальники та base URL

OpenClaw використовує вбудований каталог моделей. Додавайте власних постачальників через models.providers у конфігурації або ~/.openclaw/agents/<agentId>/agent/models.json.
{
  models: {
    mode: "merge", // merge (типово) | 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, застарілий псевдонім змінної середовища).
  • Пріоритет злиття для provider ID, що збігаються:
    • Непорожні значення baseUrl в agent models.json мають пріоритет.
    • Непорожні значення apiKey агента мають пріоритет лише тоді, коли цей постачальник не керується через SecretRef у поточному контексті config/auth-profile.
    • Значення apiKey постачальника, керовані SecretRef, оновлюються з маркерів джерела (ENV_VAR_NAME для env-посилань, secretref-managed для file/exec-посилань) замість збереження визначених секретів.
    • Значення заголовків постачальника, керовані SecretRef, оновлюються з маркерів джерела (secretref-env:ENV_VAR_NAME для env-посилань, secretref-managed для file/exec-посилань).
    • Порожні або відсутні apiKey/baseUrl агента резервно беруться з models.providers у конфігурації.
    • Для однакових моделей contextWindow/maxTokens використовують вище значення між явною конфігурацією та неявними значеннями каталогу.
    • Для однакових моделей contextTokens зберігають явне обмеження runtime, якщо воно задано; використовуйте це, щоб обмежити ефективний контекст без зміни нативних метаданих моделі.
    • Використовуйте models.mode: "replace", коли хочете, щоб конфігурація повністю переписала models.json.
    • Збереження маркерів є авторитетним на рівні джерела: маркери записуються з активного знімка конфігурації джерела (до визначення значень), а не з визначених значень секретів під час runtime.

Деталі полів постачальника

  • models.mode: поведінка каталогу постачальників (merge або replace).
  • models.providers: карта власних постачальників, ключем якої є id постачальника.
  • models.providers.*.api: адаптер запитів (openai-completions, openai-responses, anthropic-messages, google-generative-ai тощо).
  • models.providers.*.apiKey: облікові дані постачальника (надавайте перевагу SecretRef/env substitution).
  • models.providers.*.auth: стратегія автентифікації (api-key, token, oauth, aws-sdk).
  • models.providers.*.injectNumCtxForOpenAICompat: для Ollama + openai-completions вставляє options.num_ctx у запити (типово: true).
  • models.providers.*.authHeader: примусово передавати облікові дані в заголовку Authorization, коли це потрібно.
  • models.providers.*.baseUrl: базова URL-адреса API upstream.
  • models.providers.*.headers: додаткові статичні заголовки для маршрутизації proxy/tenant.
  • models.providers.*.request: перевизначення транспорту для HTTP-запитів model-provider.
    • request.headers: додаткові заголовки (об’єднуються з типовими значеннями постачальника). Значення приймають SecretRef.
    • request.auth: перевизначення стратегії автентифікації. Режими: "provider-default" (використовувати вбудовану автентифікацію постачальника), "authorization-bearer"token), "header"headerName, value, необов’язковим prefix).
    • request.proxy: перевизначення HTTP proxy. Режими: "env-proxy" (використовувати змінні середовища HTTP_PROXY/HTTPS_PROXY), "explicit-proxy"url). Обидва режими приймають необов’язковий підоб’єкт tls.
    • request.tls: перевизначення TLS для прямих з’єднань. Поля: ca, cert, key, passphrase (усі приймають SecretRef), serverName, insecureSkipVerify.
    • request.allowPrivateNetwork: коли true, дозволяє HTTPS до baseUrl, якщо DNS резолвиться в приватні, CGNAT або подібні діапазони, через HTTP fetch guard постачальника (operator opt-in для довірених self-hosted OpenAI-сумісних endpoint-ів). WebSocket використовує той самий request для заголовків/TLS, але не цей SSRF gate fetch. Типове значення false.
  • models.providers.*.models: явні записи каталогу моделей постачальника.
  • models.providers.*.models.*.contextWindow: метадані нативного контекстного вікна моделі.
  • models.providers.*.models.*.contextTokens: необов’язкове обмеження контексту runtime. Використовуйте це, коли хочете менший ефективний бюджет контексту, ніж нативне contextWindow моделі.
  • models.providers.*.models.*.compat.supportsDeveloperRole: необов’язкова підказка сумісності. Для api: "openai-completions" із непорожнім ненативним baseUrl (host не api.openai.com) OpenClaw примусово встановлює це в false під час runtime. Порожнє/пропущене baseUrl зберігає типову поведінку OpenAI.
  • models.providers.*.models.*.compat.requiresStringContent: необов’язкова підказка сумісності для OpenAI-сумісних chat endpoint-ів, що приймають лише рядок. Коли true, OpenClaw сплющує масиви messages[].content, що містять лише текст, у звичайні рядки перед надсиланням запиту.
  • plugins.entries.amazon-bedrock.config.discovery: кореневий розділ налаштувань auto-discovery Bedrock.
  • plugins.entries.amazon-bedrock.config.discovery.enabled: увімкнути/вимкнути неявне виявлення.
  • plugins.entries.amazon-bedrock.config.discovery.region: AWS region для виявлення.
  • plugins.entries.amazon-bedrock.config.discovery.providerFilter: необов’язковий фільтр provider-id для цільового виявлення.
  • plugins.entries.amazon-bedrock.config.discovery.refreshInterval: інтервал опитування для оновлення виявлення.
  • plugins.entries.amazon-bedrock.config.discovery.defaultContextWindow: резервне контекстне вікно для виявлених моделей.
  • plugins.entries.amazon-bedrock.config.discovery.defaultMaxTokens: резервний максимум вихідних токенів для виявлених моделей.

Приклади постачальників

{
  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/* приймаються як псевдоніми. Скорочення: openclaw onboard --auth-choice zai-api-key.
  • Загальний endpoint: https://api.z.ai/api/paas/v4
  • Endpoint для кодування (типовий): https://api.z.ai/api/coding/paas/v4
  • Для загального endpoint визначте власного постачальника з перевизначенням 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.Нативні endpoint-и Moonshot оголошують сумісність використання потокової передачі на спільному транспорті openai-completions, і OpenClaw спирається на можливості endpoint-а, а не лише на вбудований id постачальника.
{
  env: { KIMI_API_KEY: "sk-..." },
  agents: {
    defaults: {
      model: { primary: "kimi/kimi-code" },
      models: { "kimi/kimi-code": { alias: "Kimi Code" } },
    },
  },
}
Сумісний з Anthropic, вбудований постачальник. Скорочення: 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-сумісному шляху потокової передачі OpenClaw типово вимикає thinking MiniMax, якщо ви явно не встановите thinking самостійно. /fast on або params.fastMode: true переписує MiniMax-M2.7 на MiniMax-M2.7-highspeed.
Див. Local Models. Коротко: запускайте велику локальну модель через LM Studio Responses API на серйозному обладнанні; залишайте hosted models об’єднаними для резервного використання.

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: необов’язковий список дозволів лише для 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/встановлений.
  • entries.<skillKey>.apiKey: зручний спосіб для Skills, які оголошують основну env-змінну (відкритий рядок або об’єкт SecretRef).

Плагіни

{
  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.
  • Виявлення приймає нативні плагіни OpenClaw, а також сумісні bundles Codex і Claude, включно з bundle Claude стандартного макета без маніфесту.
  • Зміни конфігурації потребують перезапуску шлюзу.
  • allow: необов’язковий список дозволів (завантажуються лише перелічені плагіни). deny має пріоритет.
  • plugins.entries.<id>.apiKey: зручне поле API key на рівні плагіна (коли це підтримує плагін).
  • plugins.entries.<id>.env: карта env-змінних в області плагіна.
  • plugins.entries.<id>.hooks.allowPromptInjection: коли false, core блокує before_prompt_build та ігнорує поля, що змінюють prompt, зі застарілого before_agent_start, зберігаючи при цьому застарілі modelOverride і providerOverride. Застосовується до нативних plugin hooks і підтримуваних каталогів hooks, наданих bundle.
  • plugins.entries.<id>.subagent.allowModelOverride: явно довіряти цьому плагіну запитувати перевизначення provider і model для одного запуску фонових subagent.
  • plugins.entries.<id>.subagent.allowedModels: необов’язковий список дозволених канонічних цілей provider/model для довірених перевизначень subagent. Використовуйте "*" лише тоді, коли свідомо хочете дозволити будь-яку модель.
  • plugins.entries.<id>.config: об’єкт конфігурації, визначений плагіном (валідується за схемою нативного плагіна OpenClaw, якщо вона доступна).
  • plugins.entries.firecrawl.config.webFetch: налаштування постачальника web-fetch Firecrawl.
    • apiKey: API key Firecrawl (приймає SecretRef). Резервно береться з plugins.entries.firecrawl.config.webSearch.apiKey, застарілого tools.web.fetch.firecrawl.apiKey або env var FIRECRAWL_API_KEY.
    • baseUrl: базова URL-адреса API Firecrawl (типово: https://api.firecrawl.dev).
    • onlyMainContent: витягувати лише основний вміст сторінок (типово: true).
    • maxAgeMs: максимальний вік кешу в мілісекундах (типово: 172800000 / 2 дні).
    • timeoutSeconds: тайм-аут запиту scrape у секундах (типово: 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: налаштування memory dreaming (експериментально). Фази й пороги див. у Dreaming.
    • enabled: головний перемикач dreaming (типово false).
    • frequency: cron-каденція для кожного повного проходу dreaming ("0 3 * * *" типово).
    • політика фаз і пороги є деталями реалізації (не користувацькими ключами конфігурації).
  • Повна конфігурація пам’яті міститься в Memory configuration reference:
    • agents.defaults.memorySearch.*
    • memory.backend
    • memory.citations
    • memory.qmd.*
    • plugins.entries.memory-core.config.dreaming
  • Увімкнені Claude bundle plugins також можуть вносити вбудовані типові значення Pi із settings.json; OpenClaw застосовує їх як санітизовані налаштування агента, а не як сирі патчі конфігурації OpenClaw.
  • plugins.slots.memory: вибрати id активного плагіна пам’яті або "none", щоб вимкнути плагіни пам’яті.
  • plugins.slots.contextEngine: вибрати id активного плагіна рушія контексту; типово "legacy", якщо ви не встановите й не виберете інший рушій.
  • 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, // увімкнення лише для довіреного доступу до приватної мережі
      // allowPrivateNetwork: true, // застарілий псевдонім
      // 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 вимкнено, якщо не встановлено, тому навігація browser типово залишається суворою.
  • Встановлюйте ssrfPolicy.dangerouslyAllowPrivateNetwork: true лише тоді, коли ви свідомо довіряєте навігації browser у приватній мережі.
  • У суворому режимі endpoint-и віддалених CDP-профілів (profiles.*.cdpUrl) підлягають тому самому блокуванню приватної мережі під час перевірок досяжності/виявлення.
  • ssrfPolicy.allowPrivateNetwork залишається підтримуваним як застарілий псевдонім.
  • У суворому режимі використовуйте ssrfPolicy.hostnameAllowlist і ssrfPolicy.allowedHostnames для явних винятків.
  • Віддалені профілі є лише attach-only (start/stop/reset вимкнено).
  • profiles.*.cdpUrl приймає http://, https://, ws:// і wss://. Використовуйте HTTP(S), коли хочете, щоб OpenClaw виявив /json/version; використовуйте WS(S), коли ваш постачальник дає вам пряму URL DevTools WebSocket.
  • Профілі existing-session працюють лише на хості та використовують Chrome MCP замість CDP.
  • Профілі existing-session можуть задавати userDataDir, щоб націлюватися на конкретний профіль браузера на базі Chromium, наприклад Brave або Edge.
  • Профілі existing-session зберігають поточні обмеження маршруту Chrome MCP: дії на основі snapshot/ref замість націлювання CSS-селекторами, хуки для завантаження одного файла, відсутність перевизначення тайм-аутів діалогів, відсутність wait --load networkidle, а також відсутність responsebody, експорту PDF, перехоплення завантажень або пакетних дій.
  • Локальні керовані профілі openclaw автоматично призначають cdpPort і cdpUrl; явно задавайте cdpUrl лише для віддаленого CDP.
  • Порядок auto-detect: типовий браузер, якщо він на базі Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary.
  • Служба керування: лише loopback (порт виводиться з gateway.port, типово 18791).
  • extraArgs додає додаткові прапорці запуску до локального старту Chromium (наприклад --disable-gpu, розміри вікна або прапорці налагодження).

UI

{
  ui: {
    seamColor: "#FF4500",
    assistant: {
      name: "OpenClaw",
      avatar: "CB", // emoji, короткий текст, URL зображення або data URI
    },
  },
}
  • seamColor: колір акценту для chrome нативного UI застосунку (відтінок бульбашки Talk Mode тощо).
  • assistant: перевизначення identity для Control UI. Якщо не задано, використовується identity активного агента.

Gateway

{
  gateway: {
    mode: "local", // local | remote
    port: 18789,
    bind: "loopback",
    auth: {
      mode: "token", // none | token | password | trusted-proxy
      token: "your-token",
      // password: "your-password", // або OPENCLAW_GATEWAY_PASSWORD
      // trustedProxy: { userHeader: "x-forwarded-user" }, // для mode=trusted-proxy; див. /gateway/trusted-proxy-auth
      allowTailscale: true,
      rateLimit: {
        maxAttempts: 10,
        windowMs: 60000,
        lockoutMs: 300000,
        exemptLoopback: true,
      },
    },
    tailscale: {
      mode: "off", // off | serve | funnel
      resetOnExit: false,
    },
    controlUi: {
      enabled: true,
      basePath: "/openclaw",
      // root: "dist/control-ui",
      // embedSandbox: "scripts", // strict | scripts | trusted
      // allowExternalEmbedUrls: false, // небезпечно: дозволити абсолютні зовнішні URL вбудовування http(s)
      // allowedOrigins: ["https://control.example.com"], // обов’язково для не-loopback Control UI
      // dangerouslyAllowHostHeaderOriginFallback: false, // небезпечний режим резервного визначення origin через Host-header
      // allowInsecureAuth: false,
      // dangerouslyDisableDeviceAuth: false,
    },
    remote: {
      url: "ws://gateway.tailnet:18789",
      transport: "ssh", // ssh | direct
      token: "your-token",
      // password: "your-password",
    },
    trustedProxies: ["10.0.0.1"],
    // Необов’язково. Типово false.
    allowRealIpFallback: false,
    tools: {
      // Додаткові HTTP-заборони для /tools/invoke
      deny: ["browser"],
      // Прибрати інструменти зі стандартного HTTP-списку заборон
      allow: ["gateway"],
    },
    push: {
      apns: {
        relay: {
          baseUrl: "https://relay.example.com",
          timeoutMs: 10000,
        },
      },
    },
  },
}
  • mode: local (запустити gateway) або remote (підключитися до віддаленого gateway). Gateway відмовляється запускатися, якщо не local.
  • port: один мультиплексований порт для WS + HTTP. Пріоритет: --port > OPENCLAW_GATEWAY_PORT > gateway.port > 18789.
  • bind: auto, loopback (типово), lan (0.0.0.0), tailnet (лише IP Tailscale) або custom.
  • Застарілі псевдоніми bind: використовуйте значення режиму bind у gateway.bind (auto, loopback, lan, tailnet, custom), а не псевдоніми host (0.0.0.0, 127.0.0.1, localhost, ::, ::1).
  • Примітка про Docker: типовий bind loopback слухає 127.0.0.1 усередині контейнера. Із bridge-мережею Docker (-p 18789:18789) трафік надходить через eth0, тому gateway недосяжний. Використовуйте --network host або встановіть bind: "lan" (або bind: "custom" з customBindHost: "0.0.0.0"), щоб слухати на всіх інтерфейсах.
  • Auth: типово обов’язкова. Для bind, відмінного від loopback, потрібна auth gateway. На практиці це означає спільний token/password або reverse proxy з урахуванням identity з gateway.auth.mode: "trusted-proxy". Майстер onboarding типово генерує token.
  • Якщо налаштовано і gateway.auth.token, і gateway.auth.password (включно з SecretRef), явно встановіть gateway.auth.mode у token або password. Під час запуску та у потоках встановлення/відновлення сервісу виникає помилка, якщо обидва налаштовані, а mode не встановлено.
  • gateway.auth.mode: "none": явний режим без auth. Використовуйте лише для довірених локальних конфігурацій loopback; цей варіант навмисно не пропонується в підказках onboarding.
  • gateway.auth.mode: "trusted-proxy": делегувати auth reverse proxy з урахуванням identity та довіряти заголовкам identity від gateway.trustedProxies (див. Trusted Proxy Auth). Цей режим очікує не-loopback джерело proxy; reverse proxy loopback на тому самому хості не задовольняє auth trusted-proxy.
  • gateway.auth.allowTailscale: коли true, заголовки identity Tailscale Serve можуть задовольняти auth для Control UI/WebSocket (перевіряється через tailscale whois). Endpoint-и HTTP API не використовують цю auth за заголовками Tailscale; вони дотримуються звичайного режиму HTTP auth gateway. Цей безтокеновий потік передбачає, що хост gateway є довіреним. Типово true, коли tailscale.mode = "serve".
  • gateway.auth.rateLimit: необов’язковий лімітатор невдалих спроб auth. Застосовується для кожної IP-адреси клієнта і для кожної області auth (спільний секрет і токен пристрою відстежуються окремо). Заблоковані спроби повертають 429 + Retry-After.
    • На асинхронному шляху Control UI через Tailscale Serve невдалі спроби для того самого {scope, clientIp} серіалізуються перед записом про збій. Тому паралельні хибні спроби від одного клієнта можуть спровокувати лімітатор на другому запиті, замість того щоб обидва пройшли як звичайні невідповідності.
    • gateway.auth.rateLimit.exemptLoopback типово має значення true; установіть false, якщо ви свідомо хочете також обмежувати localhost-трафік (для тестових конфігурацій або суворих розгортань через proxy).
  • Спроби WS auth із browser-origin завжди обмежуються без винятку для loopback (захист у глибину від брутфорсу localhost через браузер).
  • На loopback ці блокування для browser-origin ізолюються за нормалізованим значенням Origin, тому повторні збої з одного localhost origin не блокують автоматично інший origin.
  • tailscale.mode: serve (лише tailnet, bind loopback) або funnel (публічний доступ, потрібна auth).
  • controlUi.allowedOrigins: явний список дозволених browser-origin для підключень Gateway WebSocket. Обов’язковий, коли клієнти браузера очікуються не з loopback-origin.
  • controlUi.dangerouslyAllowHostHeaderOriginFallback: небезпечний режим, який вмикає резервне визначення origin через Host-header для розгортань, що навмисно покладаються на політику origin на основі Host-header.
  • remote.transport: ssh (типово) або direct (ws/wss). Для direct remote.url має бути ws:// або wss://.
  • OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1: клієнтське перевизначення break-glass, яке дозволяє відкритий ws:// до довірених IP приватної мережі; типовим значенням для відкритого з’єднання залишається лише loopback.
  • gateway.remote.token / .password — це поля облікових даних віддаленого клієнта. Вони самі по собі не налаштовують auth gateway.
  • gateway.push.apns.relay.baseUrl: базова HTTPS URL зовнішнього APNs relay, який використовують офіційні/TestFlight збірки iOS після публікації gateway реєстрацій на основі relay. Ця URL має збігатися з URL relay, вбудованою в збірку iOS.
  • gateway.push.apns.relay.timeoutMs: тайм-аут надсилання gateway-to-relay у мілісекундах. Типове значення: 10000.
  • Реєстрації на основі relay делегуються конкретній identity gateway. Спарений застосунок iOS викликає gateway.identity.get, включає цю identity в реєстрацію relay і передає gateway дозвіл на надсилання в межах реєстрації. Інший gateway не може повторно використати цю збережену реєстрацію.
  • OPENCLAW_APNS_RELAY_BASE_URL / OPENCLAW_APNS_RELAY_TIMEOUT_MS: тимчасові перевизначення через env для наведеної вище конфігурації relay.
  • OPENCLAW_APNS_RELAY_ALLOW_HTTP=true: escape hatch лише для розробки для loopback HTTP relay URL. У production URL relay мають залишатися на HTTPS.
  • gateway.channelHealthCheckMinutes: інтервал моніторингу здоров’я каналів у хвилинах. Встановіть 0, щоб глобально вимкнути перезапуски health-monitor. Типове значення: 5.
  • gateway.channelStaleEventThresholdMinutes: поріг застарілого сокета в хвилинах. Тримайте це значення більшим або рівним gateway.channelHealthCheckMinutes. Типове значення: 30.
  • gateway.channelMaxRestartsPerHour: максимальна кількість перезапусків health-monitor на канал/обліковий запис у ковзній годині. Типове значення: 10.
  • channels.<provider>.healthMonitor.enabled: відмова для конкретного каналу від перезапусків health-monitor зі збереженням глобального монітора.
  • channels.<provider>.accounts.<accountId>.healthMonitor.enabled: перевизначення для окремого облікового запису в багатооблікових каналах. Якщо встановлено, воно має пріоритет над перевизначенням рівня каналу.
  • Локальні шляхи викликів gateway можуть використовувати gateway.remote.* як резервний варіант лише тоді, коли gateway.auth.* не встановлено.
  • Якщо gateway.auth.token / gateway.auth.password явно налаштовано через SecretRef і не визначено, визначення завершується fail-closed (без маскування резервним переходом на remote).
  • trustedProxies: IP-адреси reverse proxy, які завершують TLS або вставляють заголовки forwarded-client. Додавайте лише proxy, якими ви керуєте. Записи loopback усе ще коректні для налаштувань proxy на тому самому хості/локального виявлення (наприклад Tailscale Serve або локальний reverse proxy), але вони не роблять loopback-запити придатними для gateway.auth.mode: "trusted-proxy".
  • allowRealIpFallback: коли true, gateway приймає X-Real-IP, якщо X-Forwarded-For відсутній. Типове значення false для fail-closed-поведінки.
  • gateway.tools.deny: додаткові назви інструментів, заблоковані для HTTP POST /tools/invoke (розширює типовий список заборон).
  • gateway.tools.allow: прибрати назви інструментів із типового HTTP-списку заборон.

OpenAI-сумісні endpoint-и

  • Chat Completions: типово вимкнено. Увімкніть через gateway.http.endpoints.chatCompletions.enabled: true.
  • Responses API: gateway.http.endpoints.responses.enabled.
  • Захист URL-входів Responses:
    • gateway.http.endpoints.responses.maxUrlParts
    • gateway.http.endpoints.responses.files.urlAllowlist
    • gateway.http.endpoints.responses.images.urlAllowlist Порожні allowlist-и трактуються як не встановлені; використовуйте gateway.http.endpoints.responses.files.allowUrl=false та/або gateway.http.endpoints.responses.images.allowUrl=false, щоб вимкнути вибірку URL.
  • Необов’язковий заголовок захисту відповіді:
    • gateway.http.securityHeaders.strictTransportSecurity (встановлюйте лише для HTTPS-origin, якими ви керуєте; див. Trusted Proxy Auth)

Ізоляція кількох екземплярів

Запускайте кілька gateway на одному хості з унікальними портами й каталогами стану:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
OPENCLAW_STATE_DIR=~/.openclaw-a \
openclaw gateway --port 19001
Зручні прапорці: --dev (використовує ~/.openclaw-dev + порт 19001), --profile <name> (використовує ~/.openclaw-<name>). Див. Multiple Gateways.

gateway.tls

{
  gateway: {
    tls: {
      enabled: false,
      autoGenerate: false,
      certPath: "/etc/openclaw/tls/server.crt",
      keyPath: "/etc/openclaw/tls/server.key",
      caPath: "/etc/openclaw/tls/ca-bundle.crt",
    },
  },
}
  • enabled: вмикає завершення TLS на слухачі gateway (HTTPS/WSS) (типово: false).
  • autoGenerate: автоматично генерує локальну самопідписану пару cert/key, коли явні файли не налаштовано; лише для локального/dev використання.
  • certPath: шлях файлової системи до файла сертифіката TLS.
  • keyPath: шлях файлової системи до файла приватного ключа TLS; обмежте доступ правами.
  • caPath: необов’язковий шлях до bundle CA для перевірки клієнта або власних ланцюжків довіри.

gateway.reload

{
  gateway: {
    reload: {
      mode: "hybrid", // off | restart | hot | hybrid
      debounceMs: 500,
      deferralTimeoutMs: 300000,
    },
  },
}
  • mode: керує тим, як зміни конфігурації застосовуються під час runtime.
    • "off": ігнорувати live-редагування; зміни потребують явного перезапуску.
    • "restart": завжди перезапускати процес gateway при зміні конфігурації.
    • "hot": застосовувати зміни в процесі без перезапуску.
    • "hybrid" (типово): спочатку намагатися виконати hot reload; за потреби переходити до перезапуску.
  • debounceMs: вікно debounce у мс перед застосуванням змін конфігурації (невід’ємне ціле число).
  • deferralTimeoutMs: максимальний час у мс очікування завершення активних операцій перед примусовим перезапуском (типово: 300000 = 5 хвилин).

Hooks

{
  hooks: {
    enabled: true,
    token: "shared-secret",
    path: "/hooks",
    maxBodyBytes: 262144,
    defaultSessionKey: "hook:ingress",
    allowRequestSessionKey: false,
    allowedSessionKeyPrefixes: ["hook:"],
    allowedAgentIds: ["hooks", "main"],
    presets: ["gmail"],
    transformsDir: "~/.openclaw/hooks/transforms",
    mappings: [
      {
        match: { path: "gmail" },
        action: "agent",
        agentId: "hooks",
        wakeMode: "now",
        name: "Gmail",
        sessionKey: "hook:gmail:{{messages[0].id}}",
        messageTemplate: "From: {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}",
        deliver: true,
        channel: "last",
        model: "openai/gpt-5.4-mini",
      },
    ],
  },
}
Auth: Authorization: Bearer <token> або x-openclaw-token: <token>. Токени hook у рядку запиту відхиляються. Примітки щодо валідації та безпеки:
  • hooks.enabled=true вимагає непорожній hooks.token.
  • hooks.token має відрізнятися від gateway.auth.token; повторне використання Gateway token відхиляється.
  • hooks.path не може бути /; використовуйте окремий підшлях, наприклад /hooks.
  • Якщо hooks.allowRequestSessionKey=true, обмежте hooks.allowedSessionKeyPrefixes (наприклад ["hook:"]).
Endpoint-и:
  • POST /hooks/wake{ text, mode?: "now"|"next-heartbeat" }
  • POST /hooks/agent{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }
    • sessionKey з payload запиту приймається лише тоді, коли hooks.allowRequestSessionKey=true (типово: false).
  • POST /hooks/<name> → визначається через hooks.mappings
  • match.path зіставляє підшлях після /hooks (наприклад /hooks/gmailgmail).
  • match.source зіставляє поле payload для узагальнених шляхів.
  • Шаблони на кшталт {{messages[0].subject}} читаються з payload.
  • transform може вказувати на модуль JS/TS, що повертає дію hook.
    • transform.module має бути відносним шляхом і залишатися в межах hooks.transformsDir (абсолютні шляхи й traversal відхиляються).
  • agentId маршрутизує до конкретного агента; невідомі ID резервно переходять до типового.
  • allowedAgentIds: обмежує явну маршрутизацію (* або пропущено = дозволити все, [] = заборонити все).
  • defaultSessionKey: необов’язковий фіксований ключ сеансу для запусків hook agent без явного sessionKey.
  • allowRequestSessionKey: дозволити викликачам /hooks/agent задавати sessionKey (типово: false).
  • allowedSessionKeyPrefixes: необов’язковий список дозволених префіксів для явних значень sessionKey (запит + mapping), наприклад ["hook:"].
  • deliver: true надсилає фінальну відповідь у канал; channel типово має значення last.
  • model перевизначає LLM для цього запуску hook (має бути дозволено, якщо налаштовано каталог моделей).

Інтеграція Gmail

{
  hooks: {
    gmail: {
      account: "openclaw@gmail.com",
      topic: "projects/<project-id>/topics/gog-gmail-watch",
      subscription: "gog-gmail-watch-push",
      pushToken: "shared-push-token",
      hookUrl: "http://127.0.0.1:18789/hooks/gmail",
      includeBody: true,
      maxBytes: 20000,
      renewEveryMinutes: 720,
      serve: { bind: "127.0.0.1", port: 8788, path: "/" },
      tailscale: { mode: "funnel", path: "/gmail-pubsub" },
      model: "openrouter/meta-llama/llama-3.3-70b-instruct:free",
      thinking: "off",
    },
  },
}
  • Gateway автоматично запускає gog gmail watch serve під час завантаження, якщо його налаштовано. Установіть OPENCLAW_SKIP_GMAIL_WATCHER=1, щоб вимкнути.
  • Не запускайте окремий gog gmail watch serve паралельно з Gateway.

Canvas host

{
  canvasHost: {
    root: "~/.openclaw/workspace/canvas",
    liveReload: true,
    // enabled: false, // або OPENCLAW_SKIP_CANVAS_HOST=1
  },
}
  • Обслуговує HTML/CSS/JS, які може редагувати агент, і A2UI через HTTP на порту Gateway:
    • http://<gateway-host>:<gateway.port>/__openclaw__/canvas/
    • http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
  • Лише локально: залишайте gateway.bind: "loopback" (типово).
  • Для bind, відмінних від loopback: маршрути canvas потребують auth Gateway (token/password/trusted-proxy), так само як і інші HTTP-поверхні Gateway.
  • Node WebViews зазвичай не надсилають заголовки auth; після сполучення та підключення вузла Gateway рекламує URL можливостей, прив’язані до вузла, для доступу до canvas/A2UI.
  • URL можливостей прив’язані до активного WS-сеансу вузла і швидко спливають. Резервний варіант на основі IP не використовується.
  • Вставляє клієнт live-reload в HTML, що обслуговується.
  • Автоматично створює стартовий index.html, якщо каталог порожній.
  • Також обслуговує A2UI за адресою /__openclaw__/a2ui/.
  • Зміни потребують перезапуску gateway.
  • Вимкніть live reload для великих каталогів або при помилках EMFILE.

Discovery

mDNS (Bonjour)

{
  discovery: {
    mdns: {
      mode: "minimal", // minimal | full | off
    },
  },
}
  • minimal (типово): пропускає cliPath + sshPort із TXT-записів.
  • full: включає cliPath + sshPort.
  • Ім’я хоста типово openclaw. Перевизначається через OPENCLAW_MDNS_HOSTNAME.

Wide-area (DNS-SD)

{
  discovery: {
    wideArea: { enabled: true },
  },
}
Записує unicast DNS-SD zone у ~/.openclaw/dns/. Для виявлення між мережами поєднуйте з DNS-сервером (рекомендовано CoreDNS) + split DNS Tailscale. Налаштування: openclaw dns setup --apply.

Environment

env (вбудовані env vars)

{
  env: {
    OPENROUTER_API_KEY: "sk-or-...",
    vars: {
      GROQ_API_KEY: "gsk-...",
    },
    shellEnv: {
      enabled: true,
      timeoutMs: 15000,
    },
  },
}
  • Вбудовані env vars застосовуються лише тоді, коли у process env відсутній ключ.
  • Файли .env: .env поточної робочої теки + ~/.openclaw/.env (жоден із них не перевизначає наявні змінні).
  • shellEnv: імпортує відсутні очікувані ключі з профілю вашої login shell.
  • Повний пріоритет див. у Environment.

Підстановка env var

Посилайтеся на env vars у будь-якому рядку конфігурації через ${VAR_NAME}:
{
  gateway: {
    auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" },
  },
}
  • Зіставляються лише назви у верхньому регістрі: [A-Z_][A-Z0-9_]*.
  • Відсутні/порожні змінні спричиняють помилку під час завантаження конфігурації.
  • Екрануйте через $${VAR} для буквального ${VAR}.
  • Працює з $include.

Секрети

Посилання на секрети є адитивними: відкриті значення теж продовжують працювати.

SecretRef

Використовуйте одну форму об’єкта:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }
Валідація:
  • шаблон provider: ^[a-z][a-z0-9_-]{0,63}$
  • шаблон id для source: "env": ^[A-Z][A-Z0-9_]{0,127}$
  • source: "file" id: абсолютний JSON pointer (наприклад "/providers/openai/apiKey")
  • шаблон id для source: "exec": ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$
  • source: "exec" id не мають містити сегменти шляху . або .., розділені / (наприклад a/../b відхиляється)

Підтримувана поверхня облікових даних

  • Канонічна матриця: SecretRef Credential Surface
  • secrets apply націлюється на підтримувані шляхи облікових даних у openclaw.json.
  • Посилання auth-profiles.json включені у визначення під час runtime та в покриття аудиту.

Конфігурація постачальників секретів

{
  secrets: {
    providers: {
      default: { source: "env" }, // необов’язковий явний env-постачальник
      filemain: {
        source: "file",
        path: "~/.openclaw/secrets.json",
        mode: "json",
        timeoutMs: 5000,
      },
      vault: {
        source: "exec",
        command: "/usr/local/bin/openclaw-vault-resolver",
        passEnv: ["PATH", "VAULT_ADDR"],
      },
    },
    defaults: {
      env: "default",
      file: "filemain",
      exec: "vault",
    },
  },
}
Примітки:
  • Постачальник file підтримує mode: "json" і mode: "singleValue" (у режимі singleValue id має бути "value").
  • Постачальник exec вимагає абсолютний шлях command і використовує протокольні payload-и через stdin/stdout.
  • Типово шляхи команд-символічних посилань відхиляються. Установіть allowSymlinkCommand: true, щоб дозволити шляхи-символічні посилання з перевіркою визначеного цільового шляху.
  • Якщо налаштовано trustedDirs, перевірка trusted-dir застосовується до визначеного цільового шляху.
  • Середовище дочірнього процесу exec типово мінімальне; явно передавайте потрібні змінні через passEnv.
  • Посилання на секрети визначаються під час активації в знімок у пам’яті, після чого шляхи запитів читають лише цей знімок.
  • Під час активації застосовується фільтрація активної поверхні: невизначені посилання на увімкнених поверхнях спричиняють помилку запуску/перезавантаження, тоді як неактивні поверхні пропускаються з діагностикою.

Сховище auth

{
  auth: {
    profiles: {
      "anthropic:default": { provider: "anthropic", mode: "api_key" },
      "anthropic:work": { provider: "anthropic", mode: "api_key" },
      "openai-codex:personal": { provider: "openai-codex", mode: "oauth" },
    },
    order: {
      anthropic: ["anthropic:default", "anthropic:work"],
      "openai-codex": ["openai-codex:personal"],
    },
  },
}
  • Профілі для окремого агента зберігаються в <agentDir>/auth-profiles.json.
  • auth-profiles.json підтримує посилання на рівні значень (keyRef для api_key, tokenRef для token) для статичних режимів облікових даних.
  • Профілі режиму OAuth (auth.profiles.<id>.mode = "oauth") не підтримують облікові дані auth-profile на базі SecretRef.
  • Статичні облікові дані runtime беруться з визначених знімків у пам’яті; застарілі статичні записи auth.json очищаються при виявленні.
  • Застарілий імпорт OAuth — з ~/.openclaw/credentials/oauth.json.
  • Див. OAuth.
  • Поведінка runtime секретів і інструменти audit/configure/apply: Secrets Management.

auth.cooldowns

{
  auth: {
    cooldowns: {
      billingBackoffHours: 5,
      billingBackoffHoursByProvider: { anthropic: 3, openai: 8 },
      billingMaxHours: 24,
      authPermanentBackoffMinutes: 10,
      authPermanentMaxMinutes: 60,
      failureWindowHours: 24,
      overloadedProfileRotations: 1,
      overloadedBackoffMs: 0,
      rateLimitedProfileRotations: 1,
    },
  },
}
  • billingBackoffHours: базовий backoff у годинах, коли профіль завершується помилкою через справжні помилки білінгу/недостатнього кредиту (типово: 5). Явний текст про білінг усе ще може потрапляти сюди навіть при відповідях 401/403, але зіставлення тексту, специфічне для постачальника, залишається обмеженим постачальником, якому воно належить (наприклад OpenRouter Key limit exceeded). Повідомлення retryable HTTP 402 про вікно використання або ліміт витрат організації/workspace натомість залишаються в шляху rate_limit.
  • billingBackoffHoursByProvider: необов’язкові перевизначення годин billing backoff для окремих постачальників.
  • billingMaxHours: обмеження в годинах для експоненційного зростання billing backoff (типово: 24).
  • authPermanentBackoffMinutes: базовий backoff у хвилинах для високодовірених збоїв auth_permanent (типово: 10).
  • authPermanentMaxMinutes: обмеження в хвилинах для зростання backoff auth_permanent (типово: 60).
  • failureWindowHours: ковзне вікно в годинах, яке використовується для лічильників backoff (типово: 24).
  • overloadedProfileRotations: максимальна кількість ротацій auth-profile того самого постачальника для помилок перевантаження перед переходом до резервної моделі (типово: 1). Сюди потрапляють форми на кшталт ModelNotReadyException, коли постачальник зайнятий.
  • overloadedBackoffMs: фіксована затримка перед повторною спробою ротації перевантаженого постачальника/профілю (типово: 0).
  • rateLimitedProfileRotations: максимальна кількість ротацій auth-profile того самого постачальника для помилок rate-limit перед переходом до резервної моделі (типово: 1). Цей bucket rate-limit включає текстові форми, характерні для постачальника, такі як Too many concurrent requests, ThrottlingException, concurrency limit reached, workers_ai ... quota limit exceeded і resource exhausted.

Логування

{
  logging: {
    level: "info",
    file: "/tmp/openclaw/openclaw.log",
    consoleLevel: "info",
    consoleStyle: "pretty", // pretty | compact | json
    redactSensitive: "tools", // off | tools
    redactPatterns: ["\\bTOKEN\\b\\s*[=:]\\s*([\"']?)([^\\s\"']+)\\1"],
  },
}
  • Типовий файл журналу: /tmp/openclaw/openclaw-YYYY-MM-DD.log.
  • Встановіть logging.file для стабільного шляху.
  • consoleLevel підвищується до debug при --verbose.
  • maxFileBytes: максимальний розмір файла журналу в байтах, після якого запис припиняється (додатне ціле число; типово: 524288000 = 500 MB). Для production-розгортань використовуйте зовнішню ротацію журналів.

Діагностика

{
  diagnostics: {
    enabled: true,
    flags: ["telegram.*"],
    stuckSessionWarnMs: 30000,

    otel: {
      enabled: false,
      endpoint: "https://otel-collector.example.com:4318",
      protocol: "http/protobuf", // http/protobuf | grpc
      headers: { "x-tenant-id": "my-org" },
      serviceName: "openclaw-gateway",
      traces: true,
      metrics: true,
      logs: false,
      sampleRate: 1.0,
      flushIntervalMs: 5000,
    },

    cacheTrace: {
      enabled: false,
      filePath: "~/.openclaw/logs/cache-trace.jsonl",
      includeMessages: true,
      includePrompt: true,
      includeSystem: true,
    },
  },
}
  • enabled: головний перемикач виводу інструментування (типово: true).
  • flags: масив рядків прапорців, що вмикають цільовий вивід журналів (підтримує шаблони з підстановкою, як-от "telegram.*" або "*").
  • stuckSessionWarnMs: поріг віку в мс для виведення попереджень про завислий сеанс, поки сеанс залишається в стані обробки.
  • otel.enabled: вмикає конвеєр експорту OpenTelemetry (типово: false).
  • otel.endpoint: URL колектора для експорту OTel.
  • otel.protocol: "http/protobuf" (типово) або "grpc".
  • otel.headers: додаткові заголовки метаданих HTTP/gRPC, що надсилаються із запитами експорту OTel.
  • otel.serviceName: назва сервісу для атрибутів ресурсу.
  • otel.traces / otel.metrics / otel.logs: увімкнути експорт trace, metrics або logs.
  • otel.sampleRate: частота вибірки trace 01.
  • otel.flushIntervalMs: інтервал періодичного скидання телеметрії в мс.
  • cacheTrace.enabled: журналювати знімки cache trace для вбудованих запусків (типово: false).
  • cacheTrace.filePath: шлях виводу для JSONL cache trace (типово: $OPENCLAW_STATE_DIR/logs/cache-trace.jsonl).
  • cacheTrace.includeMessages / includePrompt / includeSystem: керують тим, що включається у вивід cache trace (усі типово: true).

Оновлення

{
  update: {
    channel: "stable", // stable | beta | dev
    checkOnStart: true,

    auto: {
      enabled: false,
      stableDelayHours: 6,
      stableJitterHours: 12,
      betaCheckIntervalHours: 1,
    },
  },
}
  • channel: канал випусків для npm/git-установок — "stable", "beta" або "dev".
  • checkOnStart: перевіряти оновлення npm під час запуску gateway (типово: true).
  • auto.enabled: увімкнути фонове автооновлення для пакетних установок (типово: false).
  • auto.stableDelayHours: мінімальна затримка в годинах перед автоматичним застосуванням stable-каналу (типово: 6; максимум: 168).
  • auto.stableJitterHours: додаткове вікно розподілу в годинах для розгортання stable-каналу (типово: 12; максимум: 168).
  • auto.betaCheckIntervalHours: як часто виконуються перевірки beta-каналу, у годинах (типово: 1; максимум: 24).

ACP

{
  acp: {
    enabled: false,
    dispatch: { enabled: true },
    backend: "acpx",
    defaultAgent: "main",
    allowedAgents: ["main", "ops"],
    maxConcurrentSessions: 10,

    stream: {
      coalesceIdleMs: 50,
      maxChunkChars: 1000,
      repeatSuppression: true,
      deliveryMode: "live", // live | final_only
      hiddenBoundarySeparator: "paragraph", // none | space | newline | paragraph
      maxOutputChars: 50000,
      maxSessionUpdateChars: 500,
    },

    runtime: {
      ttlMinutes: 30,
    },
  },
}
  • enabled: глобальний feature gate для ACP (типово: false).
  • dispatch.enabled: незалежний перемикач для диспетчеризації ходів ACP-сеансу (типово: true). Установіть false, щоб команди ACP залишалися доступними, але виконання блокувалося.
  • backend: id типового runtime-бекенда ACP (має збігатися із зареєстрованим плагіном ACP runtime).
  • defaultAgent: резервний id цільового агента ACP, коли spawn-и не задають явну ціль.
  • allowedAgents: список дозволених id агентів для ACP runtime-сеансів; порожнє значення означає відсутність додаткових обмежень.
  • maxConcurrentSessions: максимальна кількість одночасно активних ACP-сеансів.
  • stream.coalesceIdleMs: вікно idle flush у мс для потокового тексту.
  • stream.maxChunkChars: максимальний розмір фрагмента перед розбиттям проєкції потокового блока.
  • stream.repeatSuppression: пригнічувати повторювані рядки статусу/інструментів на хід (типово: true).
  • stream.deliveryMode: "live" передає потік поступово; "final_only" буферизує до термінальних подій ходу.
  • stream.hiddenBoundarySeparator: роздільник перед видимим текстом після прихованих подій інструментів (типово: "paragraph").
  • stream.maxOutputChars: максимальна кількість символів виводу assistant, проєктованих на хід ACP.
  • stream.maxSessionUpdateChars: максимальна кількість символів для проєктованих рядків статусу/оновлення ACP.
  • stream.tagVisibility: запис відповідності назв тегів булевим перевизначенням видимості для потокових подій.
  • runtime.ttlMinutes: idle TTL у хвилинах для робітників ACP-сеансу до можливого очищення.
  • runtime.installCommand: необов’язкова команда встановлення для запуску під час початкового налаштування середовища ACP runtime.

CLI

{
  cli: {
    banner: {
      taglineMode: "off", // random | default | off
    },
  },
}
  • cli.banner.taglineMode керує стилем слогана банера:
    • "random" (типово): змінні кумедні/сезонні слогани.
    • "default": фіксований нейтральний слоган (Усі ваші чати, один OpenClaw.).
    • "off": без тексту слогана (заголовок/версія банера все одно показуються).
  • Щоб приховати весь банер (а не лише слогани), встановіть env OPENCLAW_HIDE_BANNER=1.

Wizard

Метадані, які записують потоки покрокового налаштування CLI (onboard, configure, doctor):
{
  wizard: {
    lastRunAt: "2026-01-01T00:00:00.000Z",
    lastRunVersion: "2026.1.4",
    lastRunCommit: "abc1234",
    lastRunCommand: "configure",
    lastRunMode: "local",
  },
}

Identity

Див. поля identity в agents.list у розділі Типові значення агента.

Bridge (застарілий, вилучений)

Поточні збірки більше не містять TCP bridge. Вузли підключаються через Gateway WebSocket. Ключі bridge.* більше не є частиною схеми конфігурації (валідація завершується помилкою, доки їх не буде видалено; openclaw doctor --fix може прибрати невідомі ключі).
{
  "bridge": {
    "enabled": true,
    "port": 18790,
    "bind": "tailnet",
    "tls": {
      "enabled": true,
      "autoGenerate": true
    }
  }
}

Cron

{
  cron: {
    enabled: true,
    maxConcurrentRuns: 2,
    webhook: "https://example.invalid/legacy", // застарілий резервний варіант для збережених завдань notify:true
    webhookToken: "replace-with-dedicated-token", // необов’язковий bearer token для вихідної webhook auth
    sessionRetention: "24h", // рядок тривалості або false
    runLog: {
      maxBytes: "2mb", // типово 2_000_000 байтів
      keepLines: 2000, // типово 2000
    },
  },
}
  • sessionRetention: як довго зберігати завершені сеанси ізольованих запусків cron перед очищенням із sessions.json. Також керує очищенням архівованих видалених стенограм cron. Типове значення: 24h; установіть false, щоб вимкнути.
  • runLog.maxBytes: максимальний розмір файла журналу одного запуску (cron/runs/<jobId>.jsonl) перед очищенням. Типове значення: 2_000_000 байтів.
  • runLog.keepLines: кількість найновіших рядків, що зберігаються під час очищення журналу запуску. Типове значення: 2000.
  • webhookToken: bearer token, який використовується для доставлення cron webhook через POST (delivery.mode = "webhook"); якщо пропущено, заголовок auth не надсилається.
  • webhook: застаріла резервна URL webhook (http/https), яка використовується лише для збережених завдань, що все ще мають notify: true.

cron.retry

{
  cron: {
    retry: {
      maxAttempts: 3,
      backoffMs: [30000, 60000, 300000],
      retryOn: ["rate_limit", "overloaded", "network", "timeout", "server_error"],
    },
  },
}
  • maxAttempts: максимальна кількість повторних спроб для одноразових завдань при тимчасових помилках (типово: 3; діапазон: 010).
  • backoffMs: масив затримок backoff у мс для кожної повторної спроби (типово: [30000, 60000, 300000]; 1–10 записів).
  • retryOn: типи помилок, що запускають повторні спроби — "rate_limit", "overloaded", "network", "timeout", "server_error". Пропустіть, щоб повторювати всі тимчасові типи.
Застосовується лише до одноразових cron jobs. Повторювані jobs використовують окрему обробку збоїв.

cron.failureAlert

{
  cron: {
    failureAlert: {
      enabled: false,
      after: 3,
      cooldownMs: 3600000,
      mode: "announce",
      accountId: "main",
    },
  },
}
  • enabled: увімкнути сповіщення про збої для cron jobs (типово: false).
  • after: кількість послідовних збоїв перед спрацюванням сповіщення (додатне ціле число, мінімум: 1).
  • cooldownMs: мінімальна кількість мілісекунд між повторними сповіщеннями для тієї самої job.
  • mode: режим доставки — "announce" надсилає через повідомлення каналу; "webhook" надсилає POST на налаштований webhook.
  • accountId: необов’язковий id облікового запису або каналу для обмеження області доставки сповіщення.

cron.failureDestination

{
  cron: {
    failureDestination: {
      mode: "announce",
      channel: "last",
      to: "channel:C1234567890",
      accountId: "main",
    },
  },
}
  • Типова ціль для сповіщень про збої cron для всіх jobs.
  • mode: "announce" або "webhook"; типово "announce", коли є достатньо даних про ціль.
  • channel: перевизначення каналу для доставки announce. "last" повторно використовує останній відомий канал доставки.
  • to: явна ціль announce або URL webhook. Обов’язково для режиму webhook.
  • accountId: необов’язкове перевизначення облікового запису для доставки.
  • delivery.failureDestination для конкретної job перевизначає це глобальне типове значення.
  • Коли не задано ні глобальної, ні специфічної для job цілі збою, jobs, які вже доставляють через announce, у разі збою резервно використовують цю основну announce-ціль.
  • delivery.failureDestination підтримується лише для jobs із sessionTarget="isolated", якщо тільки основний delivery.mode job не дорівнює "webhook".
Див. Cron Jobs. Ізольовані виконання cron відстежуються як background tasks.

Змінні шаблону моделі медіа

Заповнювачі шаблонів, що розгортаються в tools.media.models[].args:
ЗміннаОпис
{{Body}}Повне тіло вхідного повідомлення
{{RawBody}}Сире тіло (без обгорток історії/відправника)
{{BodyStripped}}Тіло без згадок у групі
{{From}}Ідентифікатор відправника
{{To}}Ідентифікатор призначення
{{MessageSid}}ID повідомлення каналу
{{SessionId}}UUID поточного сеансу
{{IsNewSession}}"true", коли створено новий сеанс
{{MediaUrl}}Псевдо-URL вхідного медіа
{{MediaPath}}Локальний шлях до медіа
{{MediaType}}Тип медіа (image/audio/document/…)
{{Transcript}}Стенограма аудіо
{{Prompt}}Визначений media prompt для записів CLI
{{MaxChars}}Визначений максимум вихідних символів для записів CLI
{{ChatType}}"direct" або "group"
{{GroupSubject}}Назва групи (best effort)
{{GroupMembers}}Попередній список учасників групи (best effort)
{{SenderName}}Відображуване ім’я відправника (best effort)
{{SenderE164}}Номер телефону відправника (best effort)
{{Provider}}Підказка постачальника (whatsapp, telegram, discord тощо)

Включення конфігурації ($include)

Розділяйте конфігурацію на кілька файлів:
// ~/.openclaw/openclaw.json
{
  gateway: { port: 18789 },
  agents: { $include: "./agents.json5" },
  broadcast: {
    $include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
  },
}
Поведінка злиття:
  • Один файл: замінює об’єкт, у якому міститься.
  • Масив файлів: глибоко зливається по порядку (пізніші перевизначають раніші).
  • Сусідні ключі: зливаються після включень (перевизначають включені значення).
  • Вкладені включення: до 10 рівнів глибини.
  • Шляхи: визначаються відносно файла, що включає, але мають залишатися в межах каталогу конфігурації верхнього рівня (dirname від openclaw.json). Абсолютні форми/форми з ../ дозволені лише тоді, коли вони все одно визначаються в межах цієї границі.
  • Помилки: зрозумілі повідомлення для відсутніх файлів, помилок розбору та циклічних включень.

Пов’язане: Configuration · Configuration Examples · Doctor