Конфигурация 🔧¶
OpenClaw читает необязательный конфиг JSON5 из ~/.openclaw/openclaw.json (разрешены комментарии и висячие запятые).
Если файл отсутствует, OpenClaw использует «достаточно безопасные» значения по умолчанию (встроенный агент Pi + сессии на отправителя + рабочее пространство ~/.openclaw/workspace). Обычно конфиг нужен, чтобы:
- ограничить, кто может вызывать бота (
channels.whatsapp.allowFrom,channels.telegram.allowFromи т. д.) - управлять allowlist’ами групп и поведением упоминаний (
channels.whatsapp.groups,channels.telegram.groups,channels.discord.guilds,agents.list[].groupChat) - настраивать префиксы сообщений (
messages) - задать рабочее пространство агента (
agents.defaults.workspaceилиagents.list[].workspace) - настроить значения по умолчанию встроенного агента (
agents.defaults) и поведение сессий (session) - задать идентичность для каждого агента (
agents.list[].identity)
Новичкам в конфигурации? Посмотрите руководство Configuration Examples с полными примерами и подробными объяснениями!
Строгая проверка конфигурации¶
OpenClaw принимает только конфигурации, полностью соответствующие схеме. Неизвестные ключи, неверные типы или недопустимые значения приводят к тому, что Gateway отказывается запускаться из соображений безопасности.
При неудачной проверке:
- Gateway не загружается.
- Разрешены только диагностические команды (например:
openclaw doctor,openclaw logs,openclaw health,openclaw status,openclaw service,openclaw help). - Запустите
openclaw doctor, чтобы увидеть точные проблемы. - Запустите
openclaw doctor --fix(или--yes) для применения миграций/исправлений.
Doctor никогда не записывает изменения, если вы явно не выбрали --fix/--yes.
Схема + подсказки UI¶
Gateway предоставляет представление JSON Schema для конфига через config.schema для UI‑редакторов.
Control UI рендерит форму из этой схемы и предлагает редактор Raw JSON как запасной вариант.
Плагины каналов и расширения могут регистрировать схему и UI‑подсказки для своего конфига, чтобы настройки каналов оставались schema‑driven во всех приложениях без жёстко заданных форм.
Подсказки (метки, группировка, чувствительные поля) поставляются вместе со схемой, чтобы клиенты могли рендерить лучшие формы без жёстко закодированных знаний о конфиге.
Применение + перезапуск (RPC)¶
Используйте config.apply, чтобы проверить и записать полный конфиг и перезапустить Gateway за один шаг.
Он записывает «сторожок» перезапуска и пингует последнюю активную сессию после возврата Gateway.
Предупреждение: config.apply заменяет весь конфиг. Если нужно изменить лишь несколько ключей,
используйте config.patch или openclaw config set. Храните резервную копию ~/.openclaw/openclaw.json.
Params:
raw(string) — полезная нагрузка JSON5 для всего конфигаbaseHash(необязательно) — хэш конфига изconfig.get(обязателен, если конфиг уже существует)sessionKey(необязательно) — ключ последней активной сессии для «пробуждающего» пингаnote(необязательно) — примечание для сторожка перезапускаrestartDelayMs(необязательно) — задержка перед перезапуском (по умолчанию 2000)
Пример (через gateway call):
openclaw gateway call config.get --params '{}' # capture payload.hash
openclaw gateway call config.apply --params '{
"raw": "{\\n agents: { defaults: { workspace: \\"~/.openclaw/workspace\\" } }\\n}\\n",
"baseHash": "<hash-from-config.get>",
"sessionKey": "agent:main:whatsapp:dm:+15555550123",
"restartDelayMs": 1000
}'
Частичные обновления (RPC)¶
Используйте config.patch, чтобы объединить частичное обновление с существующим конфигом, не затирая
несвязанные ключи. Применяется семантика JSON merge patch:
- объекты объединяются рекурсивно
nullудаляет ключ- массивы заменяются
Как и
config.apply, выполняется валидация, запись конфига, сохранение сторожка перезапуска и планирование перезапуска Gateway (с необязательным «пробуждением», если указанsessionKey).
Params:
raw(string) — полезная нагрузка JSON5 только с изменяемыми ключамиbaseHash(обязательно) — хэш конфига изconfig.getsessionKey(необязательно) — ключ последней активной сессии для пингаnote(необязательно) — примечание для сторожка перезапускаrestartDelayMs(необязательно) — задержка перед перезапуском (по умолчанию 2000)
Пример:
openclaw gateway call config.get --params '{}' # capture payload.hash
openclaw gateway call config.patch --params '{
"raw": "{\\n channels: { telegram: { groups: { \\"*\\": { requireMention: false } } } }\\n}\\n",
"baseHash": "<hash-from-config.get>",
"sessionKey": "agent:main:whatsapp:dm:+15555550123",
"restartDelayMs": 1000
}'
Минимальный конфиг (рекомендуемая отправная точка)¶
{
agents: { defaults: { workspace: "~/.openclaw/workspace" } },
channels: { whatsapp: { allowFrom: ["+15555550123"] } },
}
Один раз соберите образ по умолчанию:
scripts/sandbox-setup.sh
Режим самочата (рекомендуется для контроля групп)¶
Чтобы бот не отвечал на WhatsApp @‑упоминания в группах (отвечать только на конкретные текстовые триггеры):
{
agents: {
defaults: { workspace: "~/.openclaw/workspace" },
list: [
{
id: "main",
groupChat: { mentionPatterns: ["@openclaw", "reisponde"] },
},
],
},
channels: {
whatsapp: {
// Allowlist is DMs only; including your own number enables self-chat mode.
allowFrom: ["+15555550123"],
groups: { "*": { requireMention: true } },
},
},
}
Включения конфига ($include)¶
Разделяйте конфиг на несколько файлов с помощью директивы $include. Это полезно для:
- организации больших конфигов (например, определения агентов по клиентам)
- совместного использования общих настроек между окружениями
- раздельного хранения чувствительных настроек
Базовое использование¶
// ~/.openclaw/openclaw.json
{
gateway: { port: 18789 },
// Include a single file (replaces the key's value)
agents: { $include: "./agents.json5" },
// Include multiple files (deep-merged in order)
broadcast: {
$include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
},
}
// ~/.openclaw/agents.json5
{
defaults: { sandbox: { mode: "all", scope: "session" } },
list: [{ id: "main", workspace: "~/.openclaw/workspace" }],
}
Поведение слияния¶
- Один файл: заменяет объект, содержащий
$include - Массив файлов: глубокое слияние по порядку (поздние файлы переопределяют ранние)
- С соседними ключами: соседние ключи объединяются после include (переопределяют включённые значения)
- Соседние ключи + массивы/примитивы: не поддерживается (включаемое содержимое должно быть объектом)
// Sibling keys override included values
{
$include: "./base.json5", // { a: 1, b: 2 }
b: 99, // Result: { a: 1, b: 99 }
}
Вложенные включения¶
Включаемые файлы сами могут содержать директивы $include (до 10 уровней):
// clients/mueller.json5
{
agents: { $include: "./mueller/agents.json5" },
broadcast: { $include: "./mueller/broadcast.json5" },
}
Разрешение путей¶
- Относительные пути: разрешаются относительно включающего файла
- Абсолютные пути: используются как есть
- Родительские каталоги: ссылки
../работают как ожидается
{ "$include": "./sub/config.json5" } // relative
{ "$include": "/etc/openclaw/base.json5" } // absolute
{ "$include": "../shared/common.json5" } // parent dir
Обработка ошибок¶
- Отсутствующий файл: понятная ошибка с разрешённым путём
- Ошибка парсинга: показывает, какой включённый файл не прошёл
- Циклические включения: обнаруживаются и сообщаются с цепочкой include
Пример: мультиклиентская юридическая конфигурация¶
// ~/.openclaw/openclaw.json
{
gateway: { port: 18789, auth: { token: "secret" } },
// Common agent defaults
agents: {
defaults: {
sandbox: { mode: "all", scope: "session" },
},
// Merge agent lists from all clients
list: { $include: ["./clients/mueller/agents.json5", "./clients/schmidt/agents.json5"] },
},
// Merge broadcast configs
broadcast: {
$include: ["./clients/mueller/broadcast.json5", "./clients/schmidt/broadcast.json5"],
},
channels: { whatsapp: { groupPolicy: "allowlist" } },
}
// ~/.openclaw/clients/mueller/agents.json5
[
{ id: "mueller-transcribe", workspace: "~/clients/mueller/transcribe" },
{ id: "mueller-docs", workspace: "~/clients/mueller/docs" },
]
// ~/.openclaw/clients/mueller/broadcast.json5
{
"120363403215116621@g.us": ["mueller-transcribe", "mueller-docs"],
}
Общие параметры¶
Env vars + .env¶
OpenClaw читает переменные окружения из родительского процесса (shell, launchd/systemd, CI и т. п.).
Дополнительно загружается:
.envиз текущего рабочего каталога (если присутствует)- глобальный fallback
.envиз~/.openclaw/.env(также известен как$OPENCLAW_STATE_DIR/.env)
Ни один файл .env не переопределяет уже существующие переменные окружения.
Также можно задать inline‑переменные окружения в конфиге. Они применяются только если переменной нет в окружении процесса (то же правило непереопределения):
{
env: {
OPENROUTER_API_KEY: "sk-or-...",
vars: {
GROQ_API_KEY: "gsk-...",
},
},
}
См. /environment для полного порядка приоритета и источников.
env.shellEnv (необязательно)¶
Опциональное удобство: если включено и ни один из ожидаемых ключей ещё не задан, OpenClaw запускает ваш login‑shell и импортирует только отсутствующие ожидаемые ключи (никогда не переопределяет). Фактически это «source» вашего профиля shell.
{
env: {
shellEnv: {
enabled: true,
timeoutMs: 15000,
},
},
}
Env var эквивалент:
OPENCLAW_LOAD_SHELL_ENV=1OPENCLAW_SHELL_ENV_TIMEOUT_MS=15000
Подстановка env‑переменных в конфиге¶
Вы можете ссылаться на переменные окружения прямо в любом строковом значении конфига,
используя синтаксис ${VAR_NAME}. Подстановка выполняется при загрузке конфига, до валидации.
{
models: {
providers: {
"vercel-gateway": {
apiKey: "${VERCEL_GATEWAY_API_KEY}",
},
},
},
gateway: {
auth: {
token: "${OPENCLAW_GATEWAY_TOKEN}",
},
},
}
Правила:
- Сопоставляются только имена env‑переменных в верхнем регистре:
[A-Z_][A-Z0-9_]* - Отсутствующие или пустые env‑переменные вызывают ошибку при загрузке конфига
- Экранируйте с помощью
$${VAR}, чтобы вывести литерал${VAR} - Работает с
$include(включённые файлы тоже проходят подстановку)
Встроенная подстановка:
{
models: {
providers: {
custom: {
baseUrl: "${CUSTOM_API_BASE}/v1", // → "https://api.example.com/v1"
},
},
},
}
Хранилище аутентификации (OAuth + ключи API)¶
OpenClaw хранит для каждого агента профили аутентификации (OAuth + ключи API) в:
<agentDir>/auth-profiles.json(по умолчанию:~/.openclaw/agents/<agentId>/agent/auth-profiles.json)
См. также: /concepts/oauth
Импорт устаревшего OAuth:
~/.openclaw/credentials/oauth.json(или$OPENCLAW_STATE_DIR/credentials/oauth.json)
Встроенный агент Pi поддерживает runtime‑кэш по адресу:
<agentDir>/auth.json(управляется автоматически; не редактируйте вручную)
Каталог устаревшего агента (до multi‑agent):
~/.openclaw/agent/*(мигрируетсяopenclaw doctorв~/.openclaw/agents/<defaultAgentId>/agent/*)
Переопределяет:
- Каталог OAuth (только импорт устаревшего):
OPENCLAW_OAUTH_DIR - Каталог агента (переопределение корня агента по умолчанию):
OPENCLAW_AGENT_DIR(предпочтительно),PI_CODING_AGENT_DIR(устар.)
При первом использовании OpenClaw импортирует записи oauth.json в auth-profiles.json.
auth¶
Необязательные метаданные для профилей аутентификации. Секреты не хранятся; сопоставляются ID профилей с провайдером и режимом (и опциональным email) и задаётся порядок ротации провайдеров для failover.
{
auth: {
profiles: {
"anthropic:me@example.com": { provider: "anthropic", mode: "oauth", email: "me@example.com" },
"anthropic:work": { provider: "anthropic", mode: "api_key" },
},
order: {
anthropic: ["anthropic:me@example.com", "anthropic:work"],
},
},
}
agents.list[].identity¶
Необязательная идентичность для каждого агента, используемая для значений по умолчанию и UX. Записывается помощником онбординга для macOS.
Если задано, OpenClaw выводит значения по умолчанию (только если вы не задали их явно):
messages.ackReactionизidentity.emojiактивного агента (fallback 👀)agents.list[].groupChat.mentionPatternsизidentity.name/identity.emojiагента (чтобы «@Samantha» работало в группах Telegram/Slack/Discord/Google Chat/iMessage/WhatsApp)identity.avatarпринимает путь к изображению относительно workspace или удалённый URL/data URL. Локальные файлы должны находиться внутри workspace агента.
identity.avatar принимает:
- путь относительно workspace (должен оставаться внутри workspace агента)
- URL
http(s) - URI
data:
{
agents: {
list: [
{
id: "main",
identity: {
name: "Samantha",
theme: "helpful sloth",
emoji: "🦥",
avatar: "avatars/samantha.png",
},
},
],
},
}
wizard¶
Метаданные, записываемые мастерами CLI (onboard, configure, doctor).
{
wizard: {
lastRunAt: "2026-01-01T00:00:00.000Z",
lastRunVersion: "2026.1.4",
lastRunCommit: "abc1234",
lastRunCommand: "configure",
lastRunMode: "local",
},
}
logging¶
- Файл логов по умолчанию:
/tmp/openclaw/openclaw-YYYY-MM-DD.log - Если нужен стабильный путь, задайте
logging.fileравным/tmp/openclaw/openclaw.log. - Вывод в консоль настраивается отдельно через:
logging.consoleLevel(по умолчаниюinfo, повышается доdebugпри--verbose)logging.consoleStyle(pretty|compact|json)- Сводки инструментов можно редактировать, чтобы избежать утечки секретов:
logging.redactSensitive(off|tools, по умолчанию:tools)logging.redactPatterns(массив regex‑строк; переопределяет значения по умолчанию)
{
logging: {
level: "info",
file: "/tmp/openclaw/openclaw.log",
consoleLevel: "info",
consoleStyle: "pretty",
redactSensitive: "tools",
redactPatterns: [
// Example: override defaults with your own rules.
"\\bTOKEN\\b\\s*[=:]\\s*([\"']?)([^\\s\"']+)\\1",
"/\\bsk-[A-Za-z0-9_-]{8,}\\b/gi",
],
},
}
channels.whatsapp.dmPolicy¶
Управляет обработкой личных чатов WhatsApp (DMs):
"pairing"(по умолчанию): неизвестные отправители получают код сопряжения; владелец должен одобрить"allowlist": разрешать только отправителей изchannels.whatsapp.allowFrom(или хранилища сопряжений)"open": разрешить все входящие DM (требуется, чтобыchannels.whatsapp.allowFromвключал"*")"disabled": игнорировать все входящие DM
Коды сопряжения истекают через 1 час; бот отправляет код только при создании нового запроса. Ожидающие запросы сопряжения DM по умолчанию ограничены 3 на канал.
Одобрения сопряжения:
openclaw pairing list whatsappopenclaw pairing approve whatsapp <code>
channels.whatsapp.allowFrom¶
Allowlist номеров E.164, которые могут запускать автоответы WhatsApp (только DMs).
Если пусто и channels.whatsapp.dmPolicy="pairing", неизвестные отправители получат код сопряжения.
Для групп используйте channels.whatsapp.groupPolicy + channels.whatsapp.groupAllowFrom.
{
channels: {
whatsapp: {
dmPolicy: "pairing", // pairing | allowlist | open | disabled
allowFrom: ["+15555550123", "+447700900123"],
textChunkLimit: 4000, // optional outbound chunk size (chars)
chunkMode: "length", // optional chunking mode (length | newline)
mediaMaxMb: 50, // optional inbound media cap (MB)
},
},
}
channels.whatsapp.sendReadReceipts¶
Определяет, помечаются ли входящие сообщения WhatsApp как прочитанные (синие галочки). По умолчанию: true.
Режим самочата всегда пропускает квитанции о прочтении, даже если включены.
Переопределение для аккаунта: channels.whatsapp.accounts.<id>.sendReadReceipts.
{
channels: {
whatsapp: { sendReadReceipts: false },
},
}
channels.whatsapp.accounts (multi‑account)¶
Запуск нескольких аккаунтов WhatsApp в одном Gateway:
{
channels: {
whatsapp: {
accounts: {
default: {}, // optional; keeps the default id stable
personal: {},
biz: {
// Optional override. Default: ~/.openclaw/credentials/whatsapp/biz
// authDir: "~/.openclaw/credentials/whatsapp/biz",
},
},
},
},
}
Примечания:
- Исходящие команды по умолчанию используют аккаунт
default, если присутствует; иначе — первый настроенный id (по сортировке). - Устаревший single‑account каталог Baileys мигрируется
openclaw doctorвwhatsapp/default.
channels.telegram.accounts / channels.discord.accounts / channels.googlechat.accounts / channels.slack.accounts / channels.mattermost.accounts / channels.signal.accounts / channels.imessage.accounts¶
Запуск нескольких аккаунтов на канал (у каждого аккаунта свои accountId и необязательные name):
{
channels: {
telegram: {
accounts: {
default: {
name: "Primary bot",
botToken: "123456:ABC...",
},
alerts: {
name: "Alerts bot",
botToken: "987654:XYZ...",
},
},
},
},
}
Примечания:
defaultиспользуется, когдаaccountIdопущен (CLI + маршрутизация).- Токены из env применяются только к аккаунту по умолчанию.
- Базовые настройки канала (политика групп, gating упоминаний и т. п.) применяются ко всем аккаунтам, если не переопределены для аккаунта.
- Используйте
bindings[].match.accountId, чтобы направлять каждый аккаунт к разным agents.defaults.
Gating упоминаний в групповых чатах (agents.list[].groupChat + messages.groupChat)¶
Сообщения в группах по умолчанию требуют упоминания (метаданные упоминаний или regex‑шаблоны). Применяется к групповым чатам WhatsApp, Telegram, Discord, Google Chat и iMessage.
Типы упоминаний:
- Упоминания метаданных: нативные @‑упоминания платформы (например, WhatsApp tap‑to‑mention). Игнорируются в режиме самочата WhatsApp (см.
channels.whatsapp.allowFrom). - Текстовые шаблоны: regex‑шаблоны, определённые в
agents.list[].groupChat.mentionPatterns. Проверяются всегда, независимо от режима самочата. - Gating упоминаний применяется только когда обнаружение упоминаний возможно (нативные упоминания или хотя бы один
mentionPattern).
{
messages: {
groupChat: { historyLimit: 50 },
},
agents: {
list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }],
},
}
messages.groupChat.historyLimit задаёт глобальное значение по умолчанию для контекста истории групп. Каналы могут переопределять через channels.<channel>.historyLimit (или channels.<channel>.accounts.*.historyLimit для multi‑account). Установите 0, чтобы отключить оборачивание истории.
Лимиты истории DMs¶
Диалоги DMs используют историю на основе сессий, управляемую агентом. Можно ограничить число пользовательских ходов, сохраняемых на сессию DM:
{
channels: {
telegram: {
dmHistoryLimit: 30, // limit DM sessions to 30 user turns
dms: {
"123456789": { historyLimit: 50 }, // per-user override (user ID)
},
},
},
}
Порядок разрешения:
- Переопределение для конкретного DM:
channels.<provider>.dms[userId].historyLimit - Значение провайдера по умолчанию:
channels.<provider>.dmHistoryLimit - Без ограничений (вся история сохраняется)
Поддерживаемые провайдеры: telegram, whatsapp, discord, slack, signal, imessage, msteams.
Переопределение для агента (имеет приоритет при установке, даже над []):
{
agents: {
list: [
{ id: "work", groupChat: { mentionPatterns: ["@workbot", "\\+15555550123"] } },
{ id: "personal", groupChat: { mentionPatterns: ["@homebot", "\\+15555550999"] } },
],
},
}
Значения gating упоминаний по умолчанию задаются для каждого канала (channels.whatsapp.groups, channels.telegram.groups, channels.imessage.groups, channels.discord.guilds). Когда задан *.groups, он также действует как allowlist групп; включите "*", чтобы разрешить все группы.
Чтобы отвечать только на конкретные текстовые триггеры (игнорируя нативные @‑упоминания):
{
channels: {
whatsapp: {
// Include your own number to enable self-chat mode (ignore native @-mentions).
allowFrom: ["+15555550123"],
groups: { "*": { requireMention: true } },
},
},
agents: {
list: [
{
id: "main",
groupChat: {
// Only these text patterns will trigger responses
mentionPatterns: ["reisponde", "@openclaw"],
},
},
],
},
}
Политика групп (по каналам)¶
Используйте channels.*.groupPolicy, чтобы управлять тем, принимаются ли сообщения из групп/комнат вообще:
{
channels: {
whatsapp: {
groupPolicy: "allowlist",
groupAllowFrom: ["+15551234567"],
},
telegram: {
groupPolicy: "allowlist",
groupAllowFrom: ["tg:123456789", "@alice"],
},
signal: {
groupPolicy: "allowlist",
groupAllowFrom: ["+15551234567"],
},
imessage: {
groupPolicy: "allowlist",
groupAllowFrom: ["chat_id:123"],
},
msteams: {
groupPolicy: "allowlist",
groupAllowFrom: ["user@org.com"],
},
discord: {
groupPolicy: "allowlist",
guilds: {
GUILD_ID: {
channels: { help: { allow: true } },
},
},
},
slack: {
groupPolicy: "allowlist",
channels: { "#general": { allow: true } },
},
},
}
Примечания:
"open": группы обходят allowlist’ы; gating упоминаний всё ещё применяется."disabled": блокировать все сообщения из групп/комнат."allowlist": разрешать только группы/комнаты, соответствующие allowlist’у.channels.defaults.groupPolicyзадаёт значение по умолчанию, когдаgroupPolicyпровайдера не задан.- WhatsApp/Telegram/Signal/iMessage/Microsoft Teams используют
groupAllowFrom(fallback: явныйallowFrom). - Discord/Slack используют allowlist’ы каналов (
channels.discord.guilds.*.channels,channels.slack.channels). - Групповые DMs (Discord/Slack) всё ещё управляются через
dm.groupEnabled+dm.groupChannels. - Значение по умолчанию —
groupPolicy: "allowlist"(если не переопределеноchannels.defaults.groupPolicy); если allowlist не настроен, сообщения групп блокируются.
Мульти-агентская маршрутизация (agents.list + bindings)¶
Запускать несколько изолированных агентов (отдельное рабочее пространство, agentDir, сессии) внутри одного шлюза.
Входящие сообщения направляются в агент через привязки.
- gateway/configuration.md
id: стабильный идентификатор агента (требуется).default: необязательно; когда установлено несколько побед, регистрируются первые победы и предупреждение. Если ничего не установлено, первая запись в списке является агентом по умолчанию.name: отображаемое имя агента.workspace: по умолчанию~/.openclaw/workspace-<agentId>(дляmain, вернется кagents.defaults.workspace).agentDir: по умолчанию~/.openclaw/agents/<agentId>/agent.model: модель по умолчанию для агента, переопределяетagents.defaults.modelдля этого агента.- строка формы:
"provider/model", переопределяет толькоagents.defaults.model.primary - объектная форма:
{ primary, fallbacks }(опции, переопределяющиеagents.defaults.model.fallbacks;[]отключает глобальные запасы для этого агента)
- строка формы:
identity: имя каждого агента/тема/эмодзи (используется для шаблонов упоминаний + реакции на экран).groupChat: упоминание в качестве агента (mentionPatterns).sandbox: конфигурация per-agent sandbox (переопределяетagents.defaults.sandbox).mode:"off"|"non-main"|"all"workspaceAccess:"none"|"ro"|"rw"scope:"session"|"агент"|"Shared"workspaceRoot: пользовательский корень рабочей области песочницыdocker: per-agent docker перезаписывает (например,image,network,env,setupCommand, ограничения; игнорировать когдаscope: "shared")browser: переопределения браузера для агента (игнорируются приscope: "shared")prune: песочница для каждого агента, вызвавшего перегрузку (игнорировались приscope: "shared")
subagents: субагент по умолчанию.allowAgents: список идентификаторов агентов дляsessions_spawnэтого агента (["*"]= разрешить любое; по умолчанию: только тот же агент)
tools: ограничения инструментальных средств для каждого агента (применяемые до политики инструментов "песочница").profile: профиль базовых инструментов (применяется перед разрешением/отрицанием)allow: массив допустимых названий инструментовdeny: массив запрещенных названий инструментов (запретить победы)
agents.defaults: общие настройки агентов (модель, рабочая среда, песочница и т.д.).bindings[]: направляет входящие сообщения кagentId.match.channel(обязательно)match.accountId(опционально;*= любой аккаунт; пропущен = аккаунт по умолчанию)match.peer(опционально;{ kind: direct|group|channel, id })match.guildId/match.teamId(опционально; канал конкретный)
Порядок совпадения с определениями:
match.peermatch.guildIdmatch.teamIdmatch.accountId(точно, нет пира/гильдия/команда)match.accountId: "*"(канал по ширине, нет пира/гильдия/команда)- агент по умолчанию (
agents.list[].default, ещё первая запись списка, иначе"main")
В каждом матче выигрывает первая совпадающая запись в «bindings».
Профили доступа к агентам (многоагентный)¶
Каждый агент может иметь свою собственную систему "песочница" + инструментальную политику. Используйте это для смешивания доступа к уровней в одном шлюзе:
- Полный доступ (персональный агент)
- Только чтение инструментов + рабочей области
- Нет доступа к файловой системе (только для сообщений/сессий)
См. Multi-Agent Sandbox & Tools для сравнения и для дополнительных примеров.
Полный доступ (без песочницы):
{
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",
],
},
},
],
},
}
Пример: две учетные записи WhatsApp → два агента:
{
agents: {
list: [
{ id: "home", по умолчанию: true, workspace: "~/. penclaw/workspace-home" },
{ id: "work", workspace: "~/. penclaw/workspace-work" },
],
},
bindings: [
{ agentId: "home", match: { channel: "whatsapp", accountId: "personal" } },
{ agentId: "work", match: { channel: "whatsapp", ID аккаунта: "biz" } },
],
каналов: {
whatsapp: {
accounts: {
personal: {},
байт: {},
},
},
},
}
tools.agentToAgent (опционально)¶
Агент отправляет сообщения агента по запросу:
{
tools: {
agentToAgent: {
enabled: false,
allow: ["home", "work"],
},
},
}
«messages.queue»¶
Определяет поведение входящих сообщений при запуске агента уже активно.
{
messages: {
queue: {
режим: "collect", // steer | followup | collect | steer-backlog (steer+backlog ok) | interrupt (queue=steer legacy)
debounceMs: 1000,
cap: 20,
: "Суммарное", // old | new | summarize
byChannel: {
whatsapp: "collect",
телеграмма: "собирать",
диспропорция: "собирать",
изображение: "collect",
webchat: "collect",
},
},
},
}
messages.inbound¶
Подавляет частые входящие сообщения от одного и того же отправителя, чтобы несколько сообщений подряд превращались в один ход агента. Дебаунсинг применяется в рамках канала + диалога и использует самое последнее сообщение для трединга ответов/ID.
{
messages: {
inbound: {
debounceMs: 2000, // 0 отключает
byChannel: {
whatsapp: 5000,
штрих: 1500,
дискос: 1500,
},
},
},
}
Notes:
- Пакеты Debounce только текстовые сообщений; медиа/прикрепленные файлы немедленно сброшены.
- Команды управления (например:
/queue,/new) обойдуются, так что они останутся в автономном режиме.
команды (обработка команд чата)¶
Управляет включением команд чата между коннекторами.
{
commands: {
native: "auto", // регистрировать родные команды при их поддержке (auto)
текст: true, // разбор косой черты команд в сообщениях в чате
bash: false, // allow ! (псевдонимы: /bash) (только для хоста; требует инструментов. levated allowlists)
bashForegroundMs: 2000, // bash foreground window (0 backgrounds immediate)
: false, // разрешить /config (запись на диск)
отлаживать: false, // разрешить /debug (переопределение только runtime-only)
перезапустить: false, // разрешить /restart + инструмент перезапуска шлюза
useAccessGroups: true, Принудительно использовать разрешенные группы разрешить/политики для команд
},
}
Notes:
- Текстовые команды должны быть отправлены как стандартные сообщения и использовать ведущий
/(нет псевдонимов обычного текста). commands.text: falseотключает парсинг сообщений для команд.commands.native: "auto"(по умолчанию) включает родные команды для Discord/Telegram и оставляет Slack выключен; неподдерживаемые каналы остаются только текстовыми.- Установите
commands.native: true|falseчтобы заставить всех или переопределить для каждого каналаchannels.discord.commands.native,channels.telegram.commands.native,channels.slack.commands.native(bool илиauto").falseочищает ранее зарегистрированные команды при запуске Discord/Telegram; Команды Slack управляются в Slack app. channels.telegram.customCommandsдобавляет дополнительные записи меню Telegram. Имена нормализируются; конфликты с родными командами игнорируются.commands.bash: trueразрешает! <cmd>для запуска команд оболочки хоста (алиас/bash <cmd>также работает). Требуетсяtools.elevated.enabledи разрешает отправителя вtools.elevated.allowFrom.<channel>.commands.bashForegroundMsуправляет, сколько ожиданий bash перед фоном. Пока bash работает, новая! Запросы` отклоняются (по одному за раз). commands.config: trueподдерживает/config(reads/writesopenclaw.json).каналы.<provider>.configWritesпереключает мутации, инициированные этим каналом (по умолчанию: true). Это применимо к/config set|unsetплюс специфические автомиграции провайдера (изменения ID супергруппы Telegram, изменения ID канала Slack ).commands.debug: trueактивирует/debug(только для runtime-overrides).commands.restart: trueвключает/restartи действие перезапуска инструмента шлюза.commands.useAccessGroups: falseпозволяет командам обойти access-group allowlists/policies.- Slash‑команды и директивы обрабатываются только для авторизованных отправителей. Авторизация определяется на основе allowlist/спаривания каналов плюс
commands.useAccessGroups.
web (время работы веб-канала WhatsApp)¶
WhatsApp работает через веб-канал шлюза (Baileys Web). Она запускается автоматически при наличии связанного сеанса.
Установите web.enabled: false, чтобы отключить его по умолчанию.
{
web: {
включен: true,
heartbeatSeconds: 60,
переподключение: {
initialMs: 2000,
maxMs: 120000,
фактор: 1. ,
jitter: 0. ,
maxAttemps: 0,
},
},
}
channels.telegram (транспорт бота)¶
OpenClaw запускает Telegram только при наличии секции конфигурации «channels.telegram». Токен бота разрешен из channels.telegram.botToken (или channels.telegram.tokenFile), а TELEGRAM_BOT_TOKEN - из резервной копии по умолчанию.
Установите channels.telegram.enabled: false, чтобы отключить автоматический запуск.
Поддержка нескольких аккаунтов живет в channels.telegram.accounts (см. раздел мультиаккаунтов выше). Маркеры Env применяются только к учетной записи по умолчанию.
Установите channels.telegram.configWrites: false чтобы блокировать записи настроек, созданных по инициативе Telegram, (включая перенос ID супергруппы и /config set|unset).
{
каналов: {
телеграмма: {
включен: true,
botToken: "your-bot-token",
dmPolicy: "Объединение", // сопряжение | allowlist | open | disabled
allowFrom: ["tg:123456789"], // необязательно; "open" требует ["*"]
групп: {
"*": { requireMention: true },
"-1001234567890": {
allowFrom: ["@admin"],
Системная подсказка: "Храните ответы краткими. ,
темы: {
"99": {
requireMention: false,
навыков: ["искать"],
Системная подсказка: "Оставайтесь на теме. ,
},
},
},
},
customCommands: [
{ command: "backup", description: "Git backup" },
{ command: "generate", описание: "Создать изображение" },
],
Ограничение истории: 50, // включаем последние N групповые сообщения в виде контекста (0 отключений)
replyToMode: "first", // выкл | первый | все
linkPreview: true, // переключение просмотра исходящей ссылки
streamMode: "partial", // off | partial | block (draft streaming; separate from block streaming)
draftChunk: {
// optional; только для streamMode=block
minChars: 200,
maxChars: 800,
breakпредпочтение: "paragraph ", // параграф | newline | sentence
},
actions: { reactions: true, sendMessage: true }, // инструментальные ворота (ложные отключения)
reactionNotifications: "own", // выкл | все
mediaMaxMb: 5,
retry: {
// политика исходящих повторов
попытки: 3,
минуты задержки: 400,
maxDelayMs: 30000,
jitter: 0. ,
},
network: {
// транспортное переопределение
autoSelectFamily: false,
},
прокси: "socks5://localhost:9050",
webhookUrl: "https://example. om/telegram-webhook", // Требуется webhookSecret
webhookSecret: "secret",
webhookPath: "/telegram-webhook",
},
},
}
Проект потоковых примечаний:
- Использует Telegram
sendMessageDraft(черновик, а не настоящее сообщение). - Требует приватные темы (message_thread_id в DMs; у бота есть включенные темы).
/reasoning streamпоток, рассуждая в черновик, затем отправляет окончательный ответ. Повторная политика по умолчанию и поведение описаны в Retry policy.
channels.discord (транспорт бота)¶
Настройте бота Discord, установив токен бота и опционально:
Поддержка нескольких аккаунтов живет под channels.discord.accounts (см. раздел multi-account выше). Маркеры Env применяются только к учетной записи по умолчанию.
{
channels: {
discord: {
enabled: true,
token: "your-bot-token",
mediaMaxMb: 8, // clamp inbound media size
allowBots: false, // allow bot-authored messages
actions: {
// tool action gates (false disables)
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
dm: {
enabled: true, // disable all DMs when false
policy: "pairing", // pairing | allowlist | open | disabled
allowFrom: ["1234567890", "steipete"], // optional DM allowlist ("open" requires ["*"])
groupEnabled: false, // enable group DMs
groupChannels: ["openclaw-dm"], // optional group DM allowlist
},
guilds: {
"123456789012345678": {
// guild id (preferred) or slug
slug: "friends-of-openclaw",
requireMention: false, // per-guild default
reactionNotifications: "own", // off | own | all | allowlist
users: ["987654321098765432"], // optional per-guild user allowlist
channels: {
general: { allow: true },
help: {
allow: true,
requireMention: true,
users: ["987654321098765432"],
skills: ["docs"],
systemPrompt: "Short answers only.",
},
},
},
},
historyLimit: 20, // include last N guild messages as context
textChunkLimit: 2000, // optional outbound text chunk size (chars)
chunkMode: "length", // optional chunking mode (length | newline)
maxLinesPerMessage: 17, // soft max lines per message (Discord UI clipping)
retry: {
// outbound retry policy
attempts: 3,
minDelayMs: 500,
maxDelayMs: 30000,
jitter: 0.1,
},
},
},
}
OpenClaw запускает Discord только при наличии секции конфигурации channels.discord. Токен разрешен из channels.discord.token, с именем DISCORD_BOT_TOKEN как резервный вариант для учетной записи по умолчанию (если channels.discord.enabled не является false). Используйте user:<id>(DM) илиchannel:(канал гильдии), чтобы указать цели доставки для команд cron/CLI; пустые числовые ID являются неоднозначными и отвергнуты.
Спучки гильдии - строчные буквы, где пробелы заменены на-; клавиши каналов используют название слайд-канала (нет ведущего#). Предпочитайте идентификаторы гильдии как ключи во избежание неоднозначности переименования.
Бот авторы сообщений игнорируются по умолчанию. Включите сchannels.discord.allowBots` (собственные сообщения все еще фильтруются для предотвращения циклов самоответа).
Режимы оповещения о реакции:
off: без событий реакций.own: реакции на собственные сообщения бота (по умолчанию).all: все реакции на все сообщения.allowlist: реакции отguilds.<id>.usersна всех сообщениях (пустой список отключает). Исходящий текст обрезаетсяchannels.discord.textChunkLimit(по умолчанию 2000). Установитеchannels.discord.chunkMode="newline", чтобы разделить на пустые строки (границы параграфов) до длины куски. Клиенты Discord могут кликать очень высокие сообщения, поэтомуchannels.discord.maxLinesPerMessage(по умолчанию 17) делится длинными многострочными ответами даже при менее 2000 символов. Повторная политика по умолчанию и поведение описаны в Retry policy.
channels.googlechat (webhook)¶
Google Chat запускается через HTTP-вебхуки с пользовательским идентификатором (сервисная учетная запись).
Поддержка нескольких аккаунтов живет в channels.googlechat.accounts (см. раздел multi-account выше). Env vars применимы только к учетной записи по умолчанию.
{
каналов: {
googlechat: {
включен: true,
serviceAccountFile: "/path/to/service-account. son",
аудитория: "app-url", // app-url | project-number
аудитория: "https://gateway.example. om/googlechat",
webhookPath: "/googlechat",
botUser: "users/1234567890", // optional; улучшает определение упоминания
dm: {
включен: true,
Политика "пары данных", // парсинг | allowlist | open | disabled
allowFrom: ["users/1234567890"], // необязательно; "open" требует ["*"]
},
groupPolicy: "allowlist",
группы: {
"spaces/AAA": { allow: true, requireMention: true },
},
действий: { reactions: true },
Индикатор печати: "message",
mediaMaxMb: 20,
},
},
}
Notes:
- Счет службы JSON может быть встроенным (
serviceAccount) или основанным на файлах (serviceAccountFile). - Env fallbackback for the default account:
GOOGLE_CHAT_SERVICE_ACCOUNTorGOOGLE_CHAT_SERVICE_ACCOUNT_FILE. audienceType+audienceдолжен соответствовать настройке аутентификации webhook в чате.- Используйте "spaces/
" или "users/ для задания целей доставки.
channels.slack (режим сокета)¶
Slack запускается в режиме сокета и требует как токен бота, так и токен приложения:
{
каналов: {
slack: {
enabled: true,
botToken: "xoxb-. .",
appToken: "xapp-... ,
dm: {
включен: true,
политика: "парниковый", // сопряжение | allowlist | open | disabled
allowFrom: ["U123", "U456", "*"], // необязательно; "open" требует ["*"]
groupabled: false,
групповые каналы: ["G123"],
},
каналы: {
C123: { allow: true, requireMention: true, allowBots: false },
"#general": {
allow: true,
Требования: true,
allowBots: false,
пользователей: ["U123"],
навыки: ["Документы"],
systemPrompt: "Только короткие ответы. ,
},
},
Ограничение истории: 50, // включаем последние N каналы/групповые сообщения в виде контекста (0 отключений)
allowBots: false,
Уведомления о реакции: "собственные", // выкл | все | список
реакций Разрешить: ["U123"],
ответитьToMode: "выкл", // off | first | all
thread: {
historyScope: "thread", // поток | канал
inheritParent: false,
},
действия: {
реакции: true,
сообщений: true,
значений: true,
членская информация: true,
emojiList: true,
},
slashCommand: {
включен: true,
имя: "openclaw",
префикс сессии: "slack:slash",
эфемер: true,
},
textChunkLimit: 4000,
chunkMode: "длина",
mediaMaxMb: 20,
},
},
}
Поддержка нескольких аккаунтов живет в channels.slack.accounts (см. раздел multi-account выше). Маркеры Env применяются только к учетной записи по умолчанию.
OpenClaw запускает Slack при включенном провайдере и задаются оба токена (через конфигурацию или SLACK_BOT_TOKEN + SLACK_APP_TOKEN). Используйте user:<id>(DM) илиchannel:channels.slack.configWrites: false на блокировку сценария конфигурации с Slack-запросом (включая миграцию ID канала и /config set|unset).
Бот авторы сообщений игнорируются по умолчанию. Включить с channels.slack.allowBots или channels.slack.channels.<id>.allowBots.
Режимы оповещения о реакции:
off: без событий реакций.own: реакции на собственные сообщения бота (по умолчанию).all: все реакции на все сообщения.allowlist: реакции отchannels.slack.reactionAllowlistна всех сообщениях (пустой список выключен).
Изоляция сессии в нитях:
channels.slack.thread.historyScopeконтролирует является ли история ветви в каждом потоке (thread, по умолчанию) или поделится ею по всему каналу (channel).channels.slack.thread.inheritParentконтролирует унаследование новых сессий потока, родительских субтитров (по умолчанию: false).
Группы действий недостатка (действия по инструментам slack):
| Группа действий | Значение по умолчанию | Notes |
|---|---|---|
| reactions | enabled | Реакции + список реакций |
| messages | enabled | Чтение/отправка/редактирование/удаление |
| pins | enabled | Закрепить/открепить/список |
| memberInfo | enabled | Информация об участниках |
| emojiList | enabled | Список кастомных emoji |
channels.mattermost (токен бота)¶
Mattermost поставляется как плагин и не входит в состав основной установки.
Сначала установите openclaw plugins install @openclaw/mattermost (или ./extensions/mattermost из git checkout).
Самая важная проблема требует токена бота плюс базовый URL-адрес для вашего сервера:
{
каналов: {
mattermost: {
включен: true,
botToken: "mm-token",
baseUrl: "https://chat. xample. om",
dmPolicy: "сопряжение",
chatmode: "oncall", // oncall | onmessage | onchar
oncharfixes: [">", "! ],
textChunkLimit: 4000,
chunkMode: "length",
},
},
}
OpenClaw запускает Mattermost когда учетная запись настроена (токен бота + базовый URL) и включена. Токен + базовый URL разрешается из channels.mattermost.botToken + channels.mattermost.baseUrl или MATTERMOST_BOT_TOKEN + MATTERMOST_URL для учетной записи по умолчанию (если channels.mattermost.enabled не является false).
Режим чата:
oncall(по умолчанию): отвечать на сообщения канала только когда @упоминается.onmessage: отвечать на каждое сообщение в канале.onchar: отвечать, когда сообщение начинается с префикса триггера (channels.mattermost.oncharPrefixes, по умолчанию[">", "!"]).
Контроль доступа:
- По умолчанию:
channels.mattermost.dmPolicy="pairing"(неизвестные отправители получают код сопряжения). - Публичные личные сообщения:
channels.mattermost.dmPolicy="open"плюсchannels.mattermost.allowFrom=["*"]. - Группа:
channels.mattermost.groupPolicy="allowlist"по умолчанию (mention-gated). Используйтеchannels.mattermost.groupAllowFromдля ограничения отправителей.
Поддержка нескольких аккаунтов живет в channels.mattermost.accounts (см. раздел multi-account выше). Env vars применимы только к учетной записи по умолчанию.
Используйте «channel:
channels.signal (сигнал-cli)¶
Сигнальные реакции могут излучать системные события (общая утилита реакции):
{
каналов: {
signal: {
reactionNotifications: "own", // выкл | все | список
реакции Разрешить: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"],
Limit: 50, // включаем последние N групповых сообщений в виде контекста (0 отключений)
},
},
}
Режимы оповещения о реакции:
off: без событий реакций.own: реакции на собственные сообщения бота (по умолчанию).all: все реакции на все сообщения.allowlist: реакции изchannels.signal.reactionAllowlistна всех сообщениях (пустой список выключен).
channels.imessage (imsg CLI)¶
OpenClaw создает imsg rpc (JSON-RPC над stdio). Демон или порт не требуется.
{
channels: {
imessage: {
enabled: true,
cliPath: "imsg",
dbPath: "~/Library/Messages/chat. b",
remoteHost: "user@gateway-host", // SCP для удаленных вложений при использовании оболочки SSH
dmPolicy: "pairing", // сопряжение | allowlist | open | disabled
allowFrom: ["+15555550123", "user@example. om", "chat_id:123"],
Ограничение истории: 50, // включать последние N групповые сообщения как контекстные (0 отключений)
includeAttachments: false,
mediaMaxMb: 16,
Услуги: "Авто",
регион: "США",
},
},
}
Поддержка нескольких аккаунтов живет в channels.imessage.accounts (см. раздел multi-account выше).
Notes:
- Требуется полный доступ к БД сообщений.
- Первая отправка будет запрашивать разрешение на автоматизацию сообщений.
- Предпочитайте
chat_id:<id>. Используйтеimsg chats --limit 20для списка чатов. channels.imessage.cliPathможет указывать на сценарий wrapper (например,sshна Mac, который запускаетimsg rpc); используйте ключи SSH во избежание запроса пароля.- Для удаленных оболочек SSH установите
channels.imessage.remoteHostчтобы получать вложения через SCP при включенииincludeAttachments.
Пример обёртки:
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"
agents.defaults.workspace¶
Устанавливает единую глобальную директорию, используемую агентом для работы с файлами.
По умолчанию: ~/.openclaw/workspace.
{
agents: { defaults: { workspace: "~/.openclaw/workspace" } },
}
Если включена agents.defaults.sandbox, не-главные сессии могут переопределить это с помощью
собственных областей в разделе agents.defaults.sandbox.workspaceRoot.
agents.defaults.repoRoot¶
Необязательный корень репозитория, чтобы показать в системной строке Runtime подсказки. Если не установлено, OpenClaw
пытается обнаружить каталог .git, выйдя вверх из рабочей области (и текущий рабочий каталог
). Этот путь должен быть использован.
{
agents: { defaults: { repoRoot: "~/Projects/openclaw" } },
}
agents.defaults.skipBootstrap¶
Отключает автоматическое создание загрузочных файлов рабочего пространства (AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, BOOTSTRAP.md).
Используйте это для предварительного развертывания, в котором ваши файлы рабочей области приходят из репозитория.
{
agents: { defaults: { skipBootstrap: true } },
}
agents.defaults.bootstrapMaxChars¶
Максимальное количество символов каждого загрузочного файла рабочей области вставки в системную подсказку
перед усечением. По умолчанию: 20000.
Когда файл превышает этот лимит, OpenClaw записывает предупреждение и вводит усеченные головы/хвост с маркером.
{
agents: { defaults: { bootstrapMaxChars: 20000 } },
}
agents.defaults.userTimezone¶
Устанавливает часовой пояс пользователя для контекста системного промпта (не для временных меток в конвертах сообщений). Если не установлено, OpenClaw использует часовой пояс хоста во время запуска.
{
agents: { defaults: { userTimezone: "America/Chicago" } },
}
agents.defaults.timeFormat¶
Контролирует формат времени, отображаемый в разделе Текущая дата и время.
По умолчанию: auto (настройки ОС).
Эквиваленты в переменных окружения:
сообщения¶
Контролирует входящие/исходящие префиксы и необязательные реакции ack . Смотрите Messages для очереди, сессий и потокового контекста.
{
messages: {
responsePrefix: "🦞", // or "auto"
ackReaction: "👀",
ackReactionScope: "group-mentions",
removeAckAfterReply: false,
},
}
responsePrefix применяется к всем исходящим ответам (сводки инструментов, блок
потокового вещания, окончательные ответы) по каналам, если они еще не присутствуют.
Переопределения можно настроить для каждого канала и для каждого аккаунта:
channels.<channel>.responsePrefixchannels.<channel>.accounts.<id>.responsePrefix
Порядок разрешения (самый специфичный имеет приоритет):
channels.<channel>.accounts.<id>.responsePrefixchannels.<channel>.responsePrefixmessages.responsePrefix
При сбое валидации:
undefinedпроходит на следующий уровень.""явно отключает префикс и останавливает каскад."auto"получает[{identity.name}]для маршрутизированного агента.
Переопределения применяются ко всем каналам, включая расширения, и ко всем исходящим ответам.
Если messages.responsePrefix отключен, префикс не применяется по умолчанию. WhatsApp self-chat
Ответы являются исключением: по умолчанию они [{identity.name}] при установке, в противном случае
[openclaw], поэтому разные разговоры остаются разборчивыми.
Установите его в "auto" для получения [{identity.name}] для маршрутизированного агента (когда установлен).
Переменные шаблона¶
Строка responsePrefix может включать в себя переменные шаблона, которые динамически преобразуются:
| Переменная | Description | Пример |
|---|---|---|
| `{model} | Короткое название модели | claude-opus-4-6, gpt-4o |
| `{modelFull} | Полный идентификатор модели | anthropic/claude-opus-4-6 |
| `{provider} | Имя провайдера | антропия, openai |
| `{thinkingLevel} | Текущий уровень мышления | high, low, off |
| `{identity.name} | Имя сотрудника | (так же как и "auto"`) |
Переменные не чувствительны к регистру ({MODEL} = {model}). {think} — это псевдоним для {thinkingLevel}.
Неразрешенные переменные остаются буквальным текстом.
{
messages: {
responsePrefix: "[{model} | думает:{thinkingLevel}]",
},
}
Пример: [claude-opus-4-6 | think:high] Вот мой ответ...
WhatsApp настроен на входящий префикс через channels.whatsapp.messagePrefix (устарело:
messages.messagePrefix). По умолчанию остается неизменным: "[openclaw]", когда
channels.whatsapp.allowFrom пуст, иначе "" (без префикса). При использовании
"[openclaw]", OpenClaw будет использовать [{identity.name}], когда маршрутизатор
агент имеет набор identity.name.
ackReaction посылает реакцию эмодзи на распознавание входящих сообщений
на каналах, поддерживающих реакции (Slack/Discord/Telegram/Google Chat). По умолчанию используется identity.emoji активного агента, если задано, иначе "👀". Установил "" для отключения.
ackReactionScope управляет при огне реакций:
group-mentions(по умолчанию): только когда группа/комната требует упоминаний и бот был упомянутgroup-все: все сообщения группы/комнатыdirect: только личные сообщениявсе: все сообщения
removeAckAfterReply удаляет реакцию на ack бота после отправки ответа
(Только Sack/Discord/Telegram/Google чат). По умолчанию: false.
messages.tts¶
Включить синтезатор речи для исходящих ответов. Если включено, OpenClaw генерирует аудио с помощью ElevenLabs или OpenAI и прикрепляет его к ответам. Telegram использует Opus голосовые заметки; другие каналы отправляют MP3 аудио.
{
messages: {
tts: {
auto: "always", // off | always | inbound | tagged
mode: "final", // final | all (include tool/block replies)
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",
model: "gpt-4o-mini-tts",
voice: "alloy",
},
},
},
}
Notes:
messages.tts.autoуправляет auto-TTS (off,always,inbound,tagged)./tts off|always|inbound|taggedустанавливает режим автоматического перехода в пер-сессии (переопределяет конфигурацию).messages.tts.enabled- доктор мигрирует вmessages.tts.auto.prefsPathхранит локальные переопределения (provider/limit/summarize).maxTextLength— жесткая колпачка для TTS; резюме усекаются по форме.summaryModelпереопределяетagents.defaults.model.primaryдля авторезюме.- Принимает
provider/modelили алиас изagents.defaults.models. modelOverridesвключает переопределения моделей типа[[tts:...]]тегов (по умолчанию)./tts limitи/tts summaryпараметры контроля за суммированием каждого пользователя.- Значения
apiKeyотносятся кELEVENLABS_API_KEY/XI_API_KEYиOPENAI_API_KEY. elevenlabs.baseUrlпереопределяет базовый URL API ElevenLabs.elevenlabs.voiceSettingsподдерживаетstability/similarityBoost/style(0..1),useSpeakerBoost, иspeed(0.5..2.0).
говорить¶
По умолчанию для режима Talk (macOS/iOS/Android). Голосовые идентификаторы возвращаются в ELEVENLABS_VOICE_ID или SAG_VOICE_ID при отключении.
apiKey возвращается к ELEVENLABS_API_KEY (или профилю оболочки шлюза), когда он отключен.
voiceAliases позволяет говорить директивы использовать дружественные имена (например "voice":"Clawd").
{
talk: {
voiceId: "elevenlabs_voice_id",
voiceAliases: {
Clawd: "EXAVITQu4vr4xnSDxMaL",
Роджер: "CwhRBWXzGAHq8TQ4Fs17",
},
modelId: "eleven_v3",
outputFormat: "mp3_44100_128",
apiKey: "elevenlabs_api_key",
interruptOnSpeech: true,
},
}
agents.defaults¶
Управление временем работы встроенного агента (модели/мышление/подробности/тайм-ауты).
agents.defaults.models определяет конфигурационный каталог моделей (и выступает в качестве допустимого списка для /model).
agents.defaults.model.primary устанавливает стандартную модель; agents.defaults.model.fallbacks - глобальные отказы.
agents.defaults.imageModel является необязательным и используется только в том случае, если в основной модели отсутствует образ ввода.
Каждая запись agents.defaults.models может включать:
alias(ярлык факультативной модели, например/opus).params(опциональные параметры API, переданные через запрос модели).
params также применяется к потоковым запускам (embedded agent + compaction). Поддерживаемые сегодня ключи: temperature, maxTokens. Это слияние с опциями времени вызова; значения, предоставленные звонящим, выиграли. temperature — это расширенный узел — оставьте поле пустым, если не знаете значения по умолчанию модели и не нужно изменить.
Пример:
{
agents: {
defaults: {
models: {
"anthropic/claude-sonnet-4-5-20250929": {
params: { temperature: 0.6 },
},
"openai/gpt-5. ": {
параметры: { maxTokens: 8192 },
},
},
},
},
}
Модели GLM-4.x Z.AI автоматически включают режим мышления, если вы:
- установите
--thinking off, или - определите
agents.defaults.models["zai/<model>"].params.thinkingсебя.
OpenClaw также поставляет несколько встроенных короткошерстей алиаса. Значения по умолчанию применяются только если модель уже присутствует в agents.defaults.models.
opus->anthropic/claude-opus-4-6sonnet->anthropic/claude-sonnet-4-5gpt->openai/gpt-5.2gpt-mini->openai/gpt-5-minigemini->google/gemini-3-pro-previewgemini-flash->google/gemini-3-flash-preview
Если вы настраиваете одно и то же имя (без учета регистра), то ваше значение выигрывает (по умолчанию никогда не переопределение).
Пример: Opus 4.6 первичная с резервным вариантом MiniMax M2.1 (hosted MiniMax):
{
agents: {
defaults: {
models: {
"anthropic/claude-opus-4-6": { alias: "opus" },
"minimax/MiniMax-M2. ": { alias: "minimax" },
},
модель: {
primary: "anthropic/claude-opus-4-6",
fallbacks: ["minimax/MiniMax-M2. "],
},
},
},
}
MiniMax Автор: установите MINIMAX_API_KEY (ruv) или настройте models.providers.minimax.
agents.defaults.cliBackends (CLI fallback)¶
Необязательные CLI backends для резервного запуска (без вызовов инструментов). Это полезно в качестве пути резервного копирования
при сбое поставщиков API. Прохождение изображения поддерживается при настройке
imageArg, который принимает пути к файлам.
Notes:
- Бэкэнды CLI text-first; инструменты всегда отключены.
- Сессии поддерживаются при установке «sessionArg»; идентификаторы сессий сохраняются на одном бэкэнде.
- Для
claude-cliпо умолчанию встраивается. Переопределяет путь к команде, если PATH минимальный (launchd/systemd).
Пример:
{
agents: {
defaults: {
cliBackends: {
"claude-cli": {
command: "/opt/homebrew/bin/claude",
},
"my-cli": {
команда: "my-cli",
аргов: ["--json"],
Выход: "json",
Образец модели: "--model",
Сессия: "--session",
сессионный режим: "существует",
системная подсказка: "--system",
systemPromptкогда: "first",
imageArg: "--image",
imageMode: "repeat",
},
},
},
},
}
{
agents: {
defaults: {
models: {
"anthropic/claude-opus-4-6": { alias: "Opus" },
"anthropic/claude-sonnet-4-1": { alias: "Sonnet" },
"openrouter/deepseek/deepseek-r1:free": {},
"zai/glm-4. ": {
алиас: "GLM",
params: {
thinking: {
type: "enabled",
clear_think : false,
},
},
},
},
модель: {
primary: "anthropic/claude-opus-4-6",
fallbacks: [
"openrouter/deepseek/deepseek-r1:free",
"Открытый роутер/meta-llama/lama-3. -70b-instruct:free",
],
},
imageModel: {
primary: "openrouter/qwen/qwen-2. -vl-72b-instruct:free",
fallbacks: ["openrouter/google/gemini-2. -flash-vision:free"],
},
думает: "low",
verboseПо умолчанию: "off", "off",
по умолчанию: "в",
таймааут секунд: 600,
mediaMaxMb: 5,
heartbeat: {
every: "30m",
цель: "последний",
},
maxConcurrent: 3,
subagents: {
модель: "minimax/MiniMax-M2. ",
maxConcurrent: 1,
archiveAfterMinutes: 60,
},
exec: {
backgroundMs: 10000,
timeoutSec: 1800,
очистки: 1800000,
},
Токенов контекста: 200000,
},
},
}
agents.defaults.contextPruning (pruning)¶
agents.defaults.contextPruning prunes старые результаты инструментов из контекста in-memory непосредственно перед отправкой запроса в LLM.
не изменяет историю сессий на диске (*.jsonl остается завершенным).
Предназначен для уменьшения использования токенов для чатных, накапливающих со временем большие инструменты выхода.
Высокий уровень:
- Никогда не касается сообщений пользователя/помощника.
- Защищает последние сообщения помощников keepLastAssistants (никаких результатов после этого не будет).
- Защищает префикс начальной загрузки (ничто не может быть предварительно обработано первым пользовательским сообщением).
- Режимы:
адаптивная: мягкие тримбатические результаты (сохранение головы/хвост) при сметном контекстном соотношении пересекаетsoftTrimRatio. Затем твердый очищает результаты самых старых подходящих инструментов, когда расчетное соотношение контекста пересекаетhardClearRatioи есть достаточный объем результата prunable tool-result (minPrunableToolChars).агрессивный: всегда заменяет подходящий результат перед выходом на "hardClear.placeholder" (без проверки).
Soft vs hard pruning (какие изменения были отправлены LLM):
- Soft-trim: только для _чрезмерных результатов инструментов. Сохраняет начало + конец и вставляет
...в середину. - До:
toolResult("…очень длинный вывод…") - После:
toolResult("HEAD…\n...\n…TAIL\n\n[Результат в инструменте: …]") - Сложно очистить: заменяет результат всего инструмента на место заполнителя.
- До:
toolResult("…очень длинный вывод…") - После:
toolResult("[Old tool result content cleared]")
Примечания/нынешние ограничения:
- Результаты инструментов, содержащие блоки изображений, пропущены (никогда не сокращается/очищается) прямо сейчас.
- Расчетное «соотношение контекста» основано на символах (приблизительно), а не на точном значении.
- Если в сеансе еще нет хотя бы "keepLastAssistants", то пропуск пропущен.
- В режиме
aggressiveигнорируетсяhardClear.enabled(соответствующие результаты инструментов всегда заменяютсяhardClear.placeholder).
По умолчанию (адаптивный):
{
agents: { defaults: { contextPruning: { mode: "adaptive" } },
}
Для отключения:
{
agents: { defaults: { contextPruning: { mode: "off" } },
}
По умолчанию (когда 'режим' является 'адаптивным' или 'агрессивным'):
keepLastAssistants:3softTrimRatio:0.3(адаптивный только)hardClearRatio:0.5(адаптивное только)minPrunableToolChars:50000(только адаптивный)softTrim:{ maxChars: 4000, headChars: 1500, tailChars: 1500 }(только адаптивный)hardClear:{ enabled: true, placeholder: "[Old tool result content cleared]" }
Пример (агрессивный, минимальный):
{
agents: { defaults: { contextPruning: { mode: "aggressive" } },
}
Пример (адаптивная настройка):
{
agents: {
defaults: {
contextPruning: {
mode: "adaptive",
keepLastAssistants: 3,
softTrimRatio: 0. ,
hardClearRatio: 0. ,
minPrunableToolChars: 50000,
softTrim: { maxChars: 4000, headChars: 1500, tailChars: 1500 },
hardClear: { включен: true, placeholder: "[Old tool result content cleared]" },
// Optional: restrict pruning to specific tools (deny wins; поддерживает "*" шаблоны)
инструменты: { deny: ["browser", "canvas"] },
},
},
},
}
См. /concepts/session-pruning для деталей поведения.
agents.defaults.compaction (зарезервировать головной убор + флеш памяти)¶
agents.defaults.compaction.mode выбирает стратегию суммирования. По умолчанию default; установите safeguard, чтобы включить обобщение в чанках для очень длинных историй. См. /concepts/compaction.
agents.defaults.compaction.reserveTokensFloor создает минимальное значение reserveTokens
для Pi уплотнения (по умолчанию: 20000). Установите на «0», чтобы отключить этаж.
agents.defaults.compaction.memoryFlush выполняет тихий агентный ход перед авто-сжатием, инструктируя модель сохранить долговременную память на диск (например, memory/YYYY-MM-DD.md). Срабатывает, когда оценка токенов сессии пересекает мягкий порог ниже лимита сжатия.
По умолчанию:
memoryFlush.enabled:truememoryFlush.softThresholdTokens:4000memoryFlush.prompt/memoryFlush.systemPrompt: встроенный по умолчанию файлNO_REPLY- Примечание: сброс памяти пропускается, когда рабочее пространство сессии доступно только для чтения (
agents.defaults.sandbox.workspaceAccess: "ro"или"none").
Пример (настроенный):
{
agents: {
defaults: {
compaction: {
mode: "safeguard",
reserveTokensFloor: 24000,
memoryFlush: {
включен: true,
Токены с мягким порогом: 6000,
Системная подсказка: "Сессия близка к уплотнению. Сохранять долговечные воспоминания.",
подсказка: "Напишите любые долговечные заметки в памяти/YYY-MM-DD. d; ответьте с NO_REPLY, если нечего хранить. ,
},
},
},
},
}
Блокировка потокового вещания:
-
agents.defaults.blockStreamingDefault:"on"/"off"(по умолчанию выключено). -
Переопределение канала:
*.blockStreaming(и варианты для каждого аккаунта) для принудительного блокирования потокового вещания. Каналы не Telegram требуют явного*.blockStreaming: trueдля включения ответов на блоки. -
agents.defaults.blockStreamingBreak:"text_end"или"message_end"(по умолчанию: text_end). -
agents.defaults.blockStreamingChunk: мягкий кусок для потоковых блоков. По умолчанию 800–1200 символов, предпочитает разрывы параграфа (\n\n), затем новые строки, а затем предложения. Пример:
json5
{
agents: { blockStreamingChunk: { minChars: 800, maxChars: 1200 } } },
}
-
agents.defaults.blockStreamingCoalesce: объединить потоковые блоки перед отправкой. По умолчанию{ idleMs: 1000 }и наследуетminCharsизblockStreamingChunkсmaxCharsограничен в ограничение текста канала. Сигнал/Slack/Discord/Google чат по умолчанию наminChars: 1500без переопределения. Канал перегружен:channels.whatsapp.blockStreamingCoalesce,channels.telegram.blockStreamingCoalesce,channels.discord.blockStreamingCoalesce,channels.slack.blockStreamingCoalesce,channels.mattermost.blockStreamingCoalesce,channels.blockStreamingCoalesce,channels.imessage.blockStreamingCoalesce,channels.msteams.blockStreamingCoalesce,,channels.googlechat.blockStreamingCoalesce` (и варианты-аккаунты). -
agents.defaults.humanDelay: случайная пауза между ответами блока после первого. Режимы:off(по умолчанию),natural(800–2500ms),custom(используйтеminMs/maxMs). Per-agent override:agents.list[].humanDelay. Пример:
json5
{
agents: { humanDelay: { mode: "natural" } },
}
См. /concepts/streaming для информации о поведении + чанках.
Набираемые показатели:
agents.defaults.typingMode:"никогда" | "мгновенный" | "думающий" | "message". По умолчаниюinstantдля прямых чатов/упоминаний иmessageдля неуказанных групповых чатов.session.typingMode: переопределение сеанса для режима.agents.defaults.typingIntervalSeconds: как часто обновляется печатный сигнал (по умолчанию: 6s).session.typingIntervalSeconds: переопределение каждого сеанса для интервала обновления. См. /concepts/typing-indicators для деталей поведения.
Первичное название agents.defaults.model.primary следует задать как provider/model (например, anthropic/claude-opus-4-6).
Псевдонимы получены от agents.defaults.models.*.alias (например Opus).
Если вы опустите провайдера, OpenClaw в настоящее время предполагает, что anthropic является временным
устаревшим вариантом.
Модели Z.AI доступны как zai/<model>(напримерzai/glm-4.7) и требуютZAI_API_KEY(или староеZ_AI_API_KEY`) в окружении.
agents.defaults.heartbeat настраивает периодические настройки heartbeat запуска:
every: длительная строка (ms,s,m,h); единицы измерения по умолчанию. По умолчанию:30m. Установите0mдля отключения.model: факультативная модель переопределения пробегов heartbeat (provider/model).includeReasoning: когдаtrue, heartbeats также доставят отдельное сообщениеReasoning:, когда оно будет доступно (та же фигура, что и/reasoning on). По умолчанию:false.session: факультативный ключ сессии для контроля, на какой сессии работает сердечный бот. По умолчанию:main.to: необязательный получатель переопределен (идентификатор отдельного канала, например E.164 для WhatsApp, идентификатор чата для Telegram).target: факультативный канал доставки (last,whatsapp,telegram,discord,slack,msteams,signal,imessage,none). По умолчанию:last.prompt: опционально переопределить для тела heartbeat (по умолчанию:Read HEARTBEAT.md, если он существует (область рабочей области). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.). Переопределение отправляется дословно; если вы все еще хотите прочитать файл строкойRead HEARTBEAT.md.ackMaxChars: максимум символов, разрешенных послеHEARTBEAT_OKперед доставкой (по умолчанию: 300).
Heartbeat для каждого агента:
- Установите
agents.list[].heartbeat, чтобы включить или переопределить настройки heartbeat для конкретного агента. - Если какая-либо запись агента определяет
heartbeat, только эти агенты выполняют heartbeat; значения по умолчанию становятся общей базой для этих агентов.
Heartbeat выполняют полноценные ходы агента. Более короткие интервалы расходуют больше токенов; учитывайте every, держите HEARTBEAT.md минимальным и/или выбирайте более дешёвую model.
tools.exec настраивает фоновый exec по умолчанию:
backgroundMs: время перед авто-фоном (мс, по умолчанию 10000)timeoutSec: автоматическое завершение после этого времени выполнения (секунды, по умолчанию 1800)cleanupMs: как долго хранить завершенные сессии в памяти (мс, по умолчанию 1800000)notifyOnExit: добавить в очередь системное событие + запрашивать heartbeat при выходах на фоне exec (по умолчанию true)applyPatch.enabled: включить экспериментальныйapply_patch(только OpenAI/OpenAI Codex; false)applyPatch.allowModels: опционально допустимый список идентификаторов модели (например,gpt-5.2илиopenai/gpt-5.2) Примечание:apply yPatchнаходится только вtools.exec.
tools.web настраивает веб-поиск + инструменты выборки:
tools.web.search.enabled(по умолчанию: true когда ключ присутствует)tools.web.search.apiKey(рекомендуется: установить черезopenclaw configure --section web, или использоватьBRAVE_API_KEYruv var)tools.web.search.maxResults(1–10, по умолчанию 5)tools.web.search.timeoutSeconds(по умолчанию 30)tools.web.search.cacheTtlMinutes(по умолчанию 15)tools.web.fetch.enabled(по умолчанию)tools.web.fetch.maxChars(по умолчанию 50000)tools.web.fetch.maxCharsCap(по умолчанию 50000; заклинания maxChars из config/tool calls)tools.web.fetch.timeoutSeconds(по умолчанию 30)tools.web.fetch.cacheTtlMinutes(по умолчанию 15)tools.web.fetch.userAgent(необязательное переопределение)tools.web.fetch.readability(по умолчанию true; отключите, чтобы использовать только базовую HTML-очистку)tools.web.fetch.firecrawl.enabled(по умолчанию, если установлен ключ API)tools.web.fetch.firecrawl.apiKey(опционально; по умолчаниюFIRECRAWL_API_KEY)tools.web.fetch.firecrawl.baseUrl(по умолчанию https://api.firecrawl.dev)tools.web.fetch.firecrawl.onlyMainContent(по умолчанию true)tools.web.fetch.firecrawl.maxAgeMs(необязательно)tools.web.fetch.firecrawl.timeoutSeconds(необязательно)
tools.media настраивает входное понимание медиа (image/audio/video):
tools.media.models: общий список моделей (функционал; используется после списков per-cap).tools.media.concurrency: максимальный параллельный запуск способностей (по умолчанию 2).tools.media.image/tools.media.audio/tools.media.video:включено: отключение переключателя (по умолчанию, когда модели настроены).prompt: необязательное переопределение подсказки (image/video добавьте подсказкуmaxCharsавтоматически).maxChars: макс. символы вывода (по умолчанию 500 для изображения/видео; unset for audio).maxBytes: максимальный размер мультимедиа для отправки (по умолчанию: изображение 10MB, аудио 20MB, видео 50MB).timeoutSeconds: запрос таймаут (по умолчанию: изображение 60s, аудио 60s, видео 120).language: опциональная аудиоподсказка.приложения: политика вложений (режим,maxAttachments,prefer).scope: ворота (первый матч выиграет) сmatch.channel,match.chatType, илиmatch.keyPrefix.models: упорядоченный список элементов модели; неудачи или чрезмерные медиа-файлы возвращаются к следующей записи.- Каждая запись
models[]: - Провайдер (
type: "provider"или опущено):provider: ID API провайдера (openai,anthropic,google/gemini,groqи т.д.).model: идентификатор модели (необходим для изображения; по умолчаниюgpt-4o-mini-transcribe/whisper-large-v3-turboдля аудио провайдеров иgemini-3-flash-previewдля видео).profile/preferredProfile: выбор профиля авторизации.
- Запись CLI (
type: "cli"):command: исполняемый для запуска.args: шаблонные аргументы (поддерживает{{MediaPath}},{{Prompt}},{{MaxChars}}, и т.д.).
capabilities: необязательный список (image,audio,video), чтобы открыть общую запись. По умолчанию при отсутствииopenai/anthropic/minimax→ изображение,google→ image+audio+video,groq→ аудио.prompt,maxChars,maxBytes,timeoutSeconds,languageможно переопределить для каждой записи.
Если ни одна модель не настроена (или включена: false), понимание пропущено; модель все еще получает оригинальные вложения.
Аутентификация провайдера соответствует стандартному порядку (профили auth, env vars OPENAI_API_KEY/GROQ_API_KEY/GEMINI_API_KEY, или models.providers.*.apiKey).
Пример:
{
tools: {
media: {
audio: {
enabled: true,
макс. байт: 20971520,
область: {
по умолчанию: "deny",
правил: [{ Action: "allow", match: { chatType: "direct" } }],
},
модели [
{ провайдер: "openai", модель: "gpt-4o-mini-transcribe" },
{ type: "cli", command: "whisper", args: ["--model", "base", "{{MediaPath}}"] },
],
},
видео: {
включено: true,
maxBytes: 52428800,
модели: [{ provider: "google", модель: "gemini-3-flash-превью" }],
},
},
},
}
agents.defaults.subagents настраивает настройки по умолчанию:
модель: стандартная модель для субагентов (string или{ primary, fallbacks }). Если субагенты унаследовали модель клиента, если только не переопределен по каждому агенту или по звоноку.maxConcurrent: максимальный одновременный запуск подагента (по умолчанию 1)archiveAfterMinutes: автоматическое архивирование сессий субагента после N минут (по умолчанию 60; установите0чтобы выключить)- Политика инструментов подагентства:
tools.subagents.tools.allow/tools.subagents.tools.deny(запретить выигрыш)
tools.profile устанавливает базовый инструмент allowlist перед tools.allow/tools.deny:
minimal: толькоsession_statuscoding:group:fs,group:runtime,group:sessions,group:memory,imagemessaging:group:messaging,sessions_list,sessions_history,sessions_send,session_statusfull: без ограничений (то же, что и unset)
Переопределение для агента: agents.list[].tools.profile.
Пример (по умолчанию только сообщения, дополнительно разрешить инструменты Slack + Discord):
{
tools: {
profile: "messaging",
allow: ["slack", "discord"],
},
}
Пример (профиль для кодинга, но запрет exec/process везде):
{
tools: {
profile: "coding",
deny: ["group:runtime"],
},
}
tools.byProvider позволяет дополнительно ограничивать инструменты для конкретных провайдеров (или один provider/model).
Переопределение для агента: agents.list[].tools.byProvider.
Заказ: базовый профиль → профиль провайдера → разрешить/запретить политики.
Ключи провайдера принимают provider (например, google-antigravity) или provider/model
(например, openai/gpt-5.2).
Пример (сохранить глобальный профиль кодинга, но минимальные инструменты для Google Antigravity):
{
tools: {
profile: "coding",
byProvider: {
"google-antigravity": { profile: "minimal" },
},
},
}
Пример (допустимый список/конкретный модель):
{
tools: {
allow: ["group:fs", "group:runtime", "sessions_list"],
byProvider: {
"openai/gpt-5.2": { allow: ["group:fs", "sessions_list"] },
},
},
}
tools.allow / tools.deny настраивает глобальный инструмент allow/deny policy (запретить победы).
Соответствие не зависит от регистра и поддерживает подстановочные знаки * ("*" означает все инструменты).
Это применимо, даже если песочница Docker выключен.
Пример (отключить браузер/холст везде):
{
tools: { deny: ["browser", "canvas"] },
}
Инструменты (короткие) работают в глобальных и отдельных агентов политиках:
group:runtime:exec,bash,processgroup:fs:read,write,edit,apply_patchgroup:sessions:sessions_list,sessions_history,sessions_send,sessions_spawn,session_statusgroup:memory:memory_search,memory_getgroup:web:web_search,web_fetchgroup:ui:browser,canvasgroup:automation:cron,gatewaygroup:messaging:messagegroup:nodes:nodesgroup:openclaw: все встроенные инструменты OpenClaw (исключая плагины провайдеров)
tools.elevated управление повышен (host) доступ к exec серверу:
включено: разрешить повышенный режим (по умолчанию)allowFrom: для каждого канала допустимые списки (пусто = отключено)whatsapp: Е.164 цифрыtelegram: идентификаторы чата или имена пользователейdiscord: идентификаторы пользователя или имена пользователей (относятся кchannels.discord.dm.allowFrom, если не указано)сигнал: E.164 цифрыimessage: идентификаторы обработки/чатаwebchat: идентификаторы сессии или имена пользователей
Пример:
{
tools: {
elevated: {
enabled: true,
allowFrom: {
whatsapp: ["+15555550123"],
разногласия: ["steipete", "1234567890123"],
},
},
},
}
Переопределение агента (дальнейшее ограничение):
{
agents: {
list: [
{
id: "family",
инструменты: {
повышено: { enabled: false },
},
},
],
},
}
Notes:
tools.elevatedявляется глобальной базой.agents.list[].tools.elevatedможет ограничивать только дальнейшее ограничение (оба должно допускать)./elevated в|off|ask|fullхранит состояние ключа сессии; к одному сообщению применяются встроенные директивы.- Повышенный уровень
execзапускается на хосте и обходит песочницу. - Политика инструментов все еще применяется; если "exec" отрицается, то использование повышенного эффекта невозможно.
agents.defaults.maxConcurrent устанавливает максимальное количество встроенного агента запускает
параллельно выполняться между сессиями. Каждая сессия по-прежнему сериализована (один раз запустить
за один ключ одновременно). По умолчанию: 1.
agents.defaults.sandbox¶
Дополнительный Docker sandboxing для встроенного агента. Предназначено для неосновных сессий, чтобы они не могли получить доступ к вашей хост-системе.
Подробности: Sandboxing
По умолчанию (если включено):
- scope:
"agent"(один контейнер + рабочее пространство для каждого агента) - Образ на основе букворма Debian
- агент: доступ к рабочей области:
workspaceAccess: "none"(по умолчанию) "none": используйте рабочую область для области песочницы с параметром~/.openclaw/sandboxes"ro": сохранить рабочую область песочницы в/workspaceи смонтировать рабочую область агента read-only в папке/agent(отключаетwrite/edit/apply_patch)"rw": монтирование рабочей области агента read/write at/workspace- автоочистка: простой > 24 ч ИЛИ возраст > 7 дн.
- политика инструментов: разрешить только
exec,process,read,write,edit,apply_patch,sessions_list,sessions_history,sessions_send,sessions_spawn,session_status(запретить победы) - configure via
tools.sandbox.tools, override per-agent viaagents.list[].tools.sandbox.tools - короткие названия групп поддерживаются в политике "песочница":
group:runtime,group:fs,group:sessions,group:memory(см. Sandbox vs Tool Policy vs Elevated) - необязательный браузер в песочнице (Chromium + CDP, noVNC наблюдатель)
- упрощение knobs:
network,user,pidsLimit,memory,cpus,ulimits,seccompProfile,apparmorProfile
Предупреждение: scope: "shared" означает общий контейнер и общую рабочую область. Отсутствует межсессионная изоляция. Используйте scope: "session" для межсессионной изоляции.
Legacy: perSession все еще поддерживается (true → scope: "session",
false → scope: "shared").
setupCommand запускается один раз после создания контейнера (внутри контейнера через sh -lc).
Для установки пакетов убедитесь, что сетевые egress, корневой файл, доступный для записи, и пользователь root.
{
agents: {
defaults: {
sandbox: {
mode: "non-main", // выкл | неглавная | вся область
: "агент", // сессия | агент | общий (агент по умолчанию)
workspaceAccess: "none", // ни один | ro | rw
workspaceRoot: "~/. penclaw/sandboxes",
docker: {
image: "openclaw-sandbox:bookworm-slim",
Префикс контейнера: "openclaw-sbx-",
workdir: "/workspace",
readOnlyRoot: true,
тмп: ["/tmp", "/var/tmp", "/run"],
сеть: "нет",
пользователь: "1000:1000",
capDrop: ["ВНИМЬ"],
env: { LANG: "C. TF-8" },
команда setupCommand: "apt-get update && apt-get install -y git curl jq",
// Переопределение агента (многоагент): агенты. ist[].sandbox.docker.
pidsLimit: 256,
память: "1g",
swap: "2g",
cpus: 1,
ulimits: {
nofile: { soft: 1024, hard: 2048 },
nproc: 256,
},
seccompProfile: "/path/to/seccomp. son",
apparmorProfile: "openclaw-sandbox",
днс: ["1. .1.1", "8.8.8. "],
extraHosts: ["internal.service:10.0. "],
binds: ["/var/run/docker.sock:/var/run/docker. ock", "/home/user/source:/source:rw"],
},
browser: {
включено: false,
изображение: "openclaw-sandbox-browser:bookworm-slim",
containerPrefix: "openclaw-sbx-browser-",
cdpPort: 9222,
vncPort: 5900,
noVncPort: 6080,
головоломка: false,
включить NoVnc: true,
allowHostControl: false,
allowedControlUrls: ["http://10. .0.42:18791"],
allowedControlHosts: ["browser.lab.local", "10.0.0. 2"],
allowedControlPorts: [18791],
автозапуск: true,
autoStartTimeoutMs: 12000,
},
prune: {
idleHours: 24, // 0 отключает простаивание
maxAgeDays: 7, // 0 отключает выбрасывание max-age
},
},
},
},
инструментов: {
sandbox: {
tools: {
allow: [
"exec",
"process",
"read", "read",
"писать",
"редактировать",
"apply_patch",
"sessions_list",
"sessions_history",
"sessions_send",
"sessions_spawn",
"session_status",
],
отрицает: ["браузер", "холст", "узлы", "cron", "discord", "шлюз"],
},
},
},
}
Постройте изображение песочницы по умолчанию:
scripts/sandbox-setup.sh
Примечание: песочница по умолчанию содержит network: "none"; установите agents.defaults.sandbox.docker.network
на "bridge" (или вашу пользовательскую сеть), если агенту нужен исходящий доступ.
Примечание: входящие вложения помещаются в активную рабочую среду по адресу media/inbound/*. При помощи `workspaceAccess: "rw" файлы записываются в рабочую среду агента.
Примечание: docker.binds монтирует дополнительные директории хостов; глобальные и персонализированные binds объединены.
Постройте необязательное изображение браузера с:
scripts/sandbox-browser-setup.sh
Когда agents.defaults.sandbox.browser.enabled=true, инструмент браузера использует приложение
Chromium (CDP). Если noVNC включен (по умолчанию при headless=false),
noVNC URL вводится в системную подсказку, чтобы агент мог ссылаться на него.
Это не требует browser.enabled в основной конфигурации; контроль песочницы
URL инъекция в каждую сессию.
agents.defaults.sandbox.browser.allowHostControl (по умолчанию: false) позволяет
сэндоксированных сеансов явно ориентироваться на хост сервер управления браузером
с помощью инструмента браузера (target: "host"). Отключите это, если вы хотите жесткую изоляцию песочницы
.
Разрешенные списки для дистанционного управления:
allowedControlUrls: точные контрольные URL, разрешенные дляtarget: "custom".allowedControlHosts: разрешенные имена хостов (только имя хоста, нет порта).allowedControlPorts: разрешенные порты (по умолчанию: http=80, https=443). По умолчанию: все разрешенные списки удалены (без ограничений).allowHostControlпо умолчанию является false.
Модели (пользовательские провайдеры + базовые URL)¶
OpenClaw использует каталог моделей код-агента. Вы можете добавить пользовательских провайдеров
(LiteLLM, локальные OpenAI-совместимые серверы, Anthropic прокси и т.д.) путём записи в ~/.openclaw/agents/<agentId>/agent/models.json или определения той же схемы внутри конфигурации OpenClaw в разделе models.providers.
Обзор постороннего провайдера + примеры: /concepts/model-providers.
При использовании models.providers OpenClaw записывает/объединяет models.json в
~/.openclaw/agents/<agentId>/agent/ при запуске:
- поведение по умолчанию: слияние (сохранение существующих провайдеров, переопределение имени)
- установите
models.mode: "replace"чтобы перезаписать содержимое файла
Выберите модель через agents.defaults.model.primary (провайдер/модель).
{
agents: {
defaults: {
model: { primary: "custom-proxy/llama-3. -8b" },
модели: {
"custom-proxy/llama-3. -8b": {},
},
},
}, Модели
{
режим: "Объединение",
провайдеров: {
"custom-proxy": {
baseUrl: "http://localhost:4000/v1",
apiKey: "LITELLM_KEY",
api: "openai-completions",
модели: [
{
id: "llama-3. -8b",
название: "Лама 3. 8B",
причина: false,
ввод: ["текст"],
стоимость: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextWindow: 128000,
maxTokens: 32000,
},
],
},
},
},
}
OpenCode Zen (мультимодельный прокси)¶
OpenCode Zen - это многообразный шлюз с конечными точками для моделирования. OpenClaw использует встроенного провайдера opencode из pi-ai; установите OPENCODE_API_KEY (или OPENCODE_ZEN_API_KEY) из https://opencode.ai/auth.
Notes:
- Модель использует
opencode/<modelId>(пример:opencode/claude-opus-4-6). - Если вы включите allowlist через
agents.defaults.models, добавьте каждую модель, которую вы планируете использовать. - Shortcut:
openclaw onboard --auth-choice opencode-zen.
{
agents: {
defaults: {
model: { primary: "opencode/claude-opus-4-6" },
модели: { "opencode/claude-opus-4-6": { alias: "Opus" } },
},
},
}
Z.AI (GLM-4.7) — поддержка псевдонимов провайдеров¶
Модели Z.AI доступны со встроенного поставщика zai. Установите ZAI_API_KEY в окружении и указывайте модель в формате провайдер/модель.
Ярлык: openclaw на борту --auth-choice zai-api-key.
{
agents: {
defaults: {
model: { primary: "zai/glm-4.7" },
models: { "zai/glm-4.7": {} },
},
},
}
Notes:
z.ai/*иz-ai/*допустимы псевдонимы и нормализуйте доzai/*.- Если
ZAI_API_KEYотсутствует, запросы кzai/*не будут удовлетворены при ошибке авторизации во время выполнения. - Пример ошибки:
No API key found for provider "zai". - Общая конечная точка Z.AI API это
https://api.z.ai/api/paas/v4. GLM coding requests use the dedicated Coding endpointhttps://api.z.ai/api/coding/paas/v4. Встроенныйzaiпровайдер использует конечную точку кодирования. Если вам нужна общая конечная точка определите пользовательского провайдера вmodels.providersс базовым URL-адресом (см. раздел пользовательских провайдеров выше). - Используйте поддельный плейсхолдер в документах/конфигурациях; никогда не фиксируйте реальные API ключи.
Moonshot AI (Kimi)¶
Использовать конечную точку OpenAI, совместимую с Лунным шотом:
{
env: { MOONSHOT_API_KEY: "sk-... },
agents: {
defaults: {
model: { primary: "moonshot/kimi-k2. " },
модели: { "moonshot/kimi-k2. ": { alias: "Kimi K2. " } },
},
},
модели: {
режим: "Объединение",
провайдеры: {
moonshot: {
baseUrl: "https://api. oonshot. i/v1",
apiKey: "${MOONSHOT_API_KEY}",
api: "openai-completions",
модели: [
{
id: "kimi-k2. ",
название: "Кими К2. ",
причина: false,
ввод: ["текст"],
стоимость: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextWindow: 256000,
maxTokens: 8192,
},
],
},
},
},
}
Notes:
- Установите
MOONSHOT_API_KEYв окружении или используйтеopenclaw на борту --auth-choice moonshot-api-key. - Модель ref:
moonshot/kimi-k2.5. - Что касается конечной точки Китая, тоже:
- Запустите
openclaw на доске --auth-choice moonshot-api-key-cn(мастер установитhttps://api.moonshot.cn/v1), или - Вручную установите
baseUrl: "https://api.moonshot.cn/v1"вmodels.providers.moonshot.
Kimi Coding¶
Используйте конечную точку кодирования ИИ Луны в режиме Кими (антропический, встроенный провайдер):
{
env: { KIMI_API_KEY: "sk-..." },
agents: {
defaults: {
model: { primary: "kimi-coding/k2p5" },
models: { "kimi-coding/k2p5": { alias: "Kimi K2.5" } },
},
},
}
Notes:
- Установите
KIMI_API_KEYв окружении или используйтеopenclaw на борту --auth-choice kimi-code-api-key. - Модель ref:
kimi-coding/k2p5.
Синтез (Антропическая совместимость)¶
Использовать антропическую конечную точку:
{
env: { SYNTHETIC_API_KEY: "sk-..." },
agents: {
defaults: {
model: { primary: "synthetic/hf:MiniMaxAI/MiniMax-M2.1" },
models: { "synthetic/hf:MiniMaxAI/MiniMax-M2.1": { alias: "MiniMax M2.1" } },
},
},
models: {
mode: "merge",
providers: {
synthetic: {
baseUrl: "https://api.synthetic.new/anthropic",
apiKey: "${SYNTHETIC_API_KEY}",
api: "anthropic-messages",
models: [
{
id: "hf:MiniMaxAI/MiniMax-M2.1",
name: "MiniMax M2.1",
reasoning: false,
input: ["text"],
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextWindow: 192000,
maxTokens: 65536,
},
],
},
},
},
}
Notes:
- Установите
SYNTHETIC_API_KEYили используйтеopenclaw на борту --auth-choice synthetic-api-key. - Модель ref:
synthetic/hf:MiniMaxAI/MiniMax-M2.1. - Базовый URL-адрес не должен быть
/v1, потому что Антропический клиент добавляет его.
Локальные модели (LM Studio) — рекомендуемая установка¶
См. /gateway/local-models для текущего локального руководства. TL;DR: запустить MiniMax M2.1 с помощью LM Studio Responses API на серьёзном оборудовании; хранить размещенные модели объединены для резерва.
MiniMax M2.1¶
Использовать MiniMax M2.1 напрямую без LM Studio:
{
agent: {
model: { primary: "minimax/MiniMax-M2. " },
модели: {
"anthropic/claude-opus-4-6": { alias: "Opus" },
"minimax/MiniMax-M2. ": { alias: "Minimax" },
},
}, Модели
{
режим: "Объединение",
провайдеры: {
minimax: {
baseUrl: "https://api. inimax. o/антроп",
apiKey: "${MINIMAX_API_KEY}",
api: "антропные-сообщения",
модели: [
{
id: "MiniMax-M2. ",
название: "MiniMax M2. ",
причина: false,
ввод: ["текст"],
// Цена: обновление в моделях. сын, если вам нужно точное отслеживание затрат.
Стоимость: { input: 15, output: 60, cacheRead: 2, cacheWrite: 10 },
contextWindow: 200000,
maxTokens: 8192,
},
],
},
},
},
}
Notes:
- Установите переменную окружения
MINIMAX_API_KEYили используйтеopenclaw onboard --auth-choice minimax-api. - Доступная модель:
MiniMax-M2.1(по умолчанию). - Обновите цены в
models.json, если вам нужна точная оценка затрат.
Церебра (GLM 4,6/ 4,7)¶
Использовать Cerebras через их конечную точку, совместимую с OpenAI:
{
env: { CEREBRAS_API_KEY: "sk-... },
agents: {
defaults: {
model: {
primary: "cerebras/zai-glm-4. ",
fallbacks: ["цереброварка/заи-блем-4. "],
},
models: {
"cerebras/zai-glm-4. ": { alias: "GLM 4.7 (Cerebras)" },
"cerebras/zai-glm-4.6": { alias: "GLM 4. (Cerebras)" },
},
},
},
модели: {
режим: "объединение",
провайдеров: {
cerebras: {
baseUrl: "https://api. erebras. i/v1",
apiKey: "${CEREBRAS_API_KEY}",
api: "openai-completions",
models: [
{ id: "zai-glm-4. ", название: "GLM 4. (Cerebras)" },
{ id: "zai-glm-4.6", имя: "GLM 4. (Cerebras)" },
],
},
},
},
}
Notes:
- Используйте
cerebras/zai-glm-4.7для Cerebras; используйтеzai/glm-4.7для прямой Z.AI. - Установите
CEREBRAS_API_KEYв окружении или конфигурации.
Notes:
- Поддерживаемые API:
openai-completions,openai-responses,anthropic-messages,google-generative-ai - Используйте
authHeader: true+headersдля нужд авторизации. - Переопределите корень конфигурации агента используя
OPENCLAW_AGENT_DIR(илиPI_CODING_AGENT_DIR) если вы хотитеmodels.jsonв другом месте (по умолчанию:~/.openclaw/agents/main/agent).
session¶
Контролирует границы сеанса, политику сброса, сброс триггеров и место записи хранилища сессий.
{
session: {
scope: "per-sender",
dmScope: "main",
identityLinks: {
alice: ["telegram:123456789", "discord:987654321012345678"],
},
reset: {
mode: "daily",
atHour: 4,
idleMinutes: 60,
},
resetByType: {
thread: { mode: "daily", atHour: 4 },
direct: { mode: "idle", idleMinutes: 240 },
group: { mode: "idle", idleMinutes: 120 },
},
resetTriggers: ["/new", "/reset"],
// Default is already per-agent under ~/.openclaw/agents/<agentId>/sessions/sessions.json
// You can override with {agentId} templating:
store: "~/.openclaw/agents/{agentId}/sessions/sessions.json",
// Direct chats collapse to agent:<agentId>:<mainKey> (default: "main").
mainKey: "main",
agentToAgent: {
// Max ping-pong reply turns between requester/target (0–5).
maxPingPongTurns: 5,
},
sendPolicy: {
rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }],
default: "allow",
},
},
}
Поля:
mainKey: ключ прямого bucket (по умолчанию:"main"). Полезно, когда вы хотите «переименовать» первичный поток DM без измененияagentId.- Заметка песочницы:
agents.defaults.sandbox.mode: "non-main"использует этот ключ для обнаружения основной сессии. Любой ключ сессии, не соответствующийmainKey(группы/каналы), является в песочнице. dmScope: как группы ТМ (по умолчанию:"основная").главный: все ЛС имеют основную сессию на предмет преемственности.per peer: изолировать ЛС идентификатором отправителя по каналам.per-channel-peer: изолировать ЛС на канал + отправителя (рекомендуется для многопользовательских почтовых ящиков).per-account-channel-peer: изолировать ЛС на аккаунт + канал + отправителя (рекомендуется для нескольких почтовых ящиков).- Безопасный режим DM (рекомендуется): установите
session.dmScope: "per-channel-peer", когда несколько человек могут DM бота (разделяемые входящие, многопользовательские разрешают списки или `dmPolicy: "open"). identityLinks: сопоставить канонические идентификаторы с префиксами провайдера, так что тот же пользователь разделяет сеанс DM по каналам при использованииper-peer,per-channel-peer, илиper-account-channel-peer.- Пример:
alice: ["telegram:123456789", "discord:987654321012345678"]. reset: основная политика сброса. По умолчанию ежедневно сбрасывается в 4:00 местное время на хосте шлюза.mode:dailyилиidle(по умолчанию:dailyкогдаresetприсутствует).atHour: локальный час (0-23) для ежедневной границы сброса.idleMinutes: скользящее простое окно в минутах. Если настроены и ежедневный сброс, и бездействие, срабатывает то, что истекает раньше.resetByType: переопределения для каждой сессии дляdirect,groupиthread. Устаревший ключdmпринимается как алиас дляdirect.- Если вы установите только старый
session.idleMinutesбез каких-либоreset/resetByType, OpenClaw остается в режиме ожидания для обратной совместимости. heartbeatIdleMinutes: опциональное простое переопределение для проверки heartbeat (ежедневный сброс по-прежнему применяется когда включено).agentToAgent.maxPingPongTurns: max reply-back поворачивает между запросом/целью (0–5, по умолчанию 5).sendPolicy.default:allowилиdenyfallback, если правило не совпадает.sendPolicy.rules[]: совпадение поchannel,chatType(direct|group|room) илиkeyPrefix(например,cron:). Первое отрицание побед, в противном случае допускается.
skills (настройки навыков)¶
Управляет встроенным allowlist, предпочтениями установки, дополнительными папками навыков и переопределениями для отдельных навыков. Применяется к встроенным навыкам и ~/.openclaw/skills (навыки рабочего пространства всё равно имеют приоритет при конфликте имён).
Поля:
allowBundled: необязательный список разрешённых только для bundled skills. При наборе только те умения, которые сочетаются с имеют право (навыки управляемого/рабочей области не затрагиваются).load.extraDirs: дополнительные каталоги Skills для сканирования (наименьший приоритет).install.preferBrew: предпочитать установщики brew при наличии (по умолчанию: true).install.nodeManager: настройки установки узла (npm|pnpm|yarn, по умолчанию: npm).entries.<skillKey>: конфигурация для каждого навыка.
Поля навыков:
enabled: установитеfalse, чтобы отключить Skill, даже если он встроенный/установлен.env: переменные окружения, внедряемые для запуска агента (только если ещё не заданы).apiKey: дополнительное удобство для навыков, которые объявляют первичный env вар (например,nano-banana-pro→GEMINI_API_KEY).
Пример:
{
skills: {
allowBundled: ["gemini", "peekaboo"],
load: {
extraDirs: ["~/Projects/agent-scripts/skills", "~/Проекты/oss/some-skill-pack/skills"],
},
install: {
preferBrew: true,
nodeManager: "npm",
},
записи: {
"nano-banana-pro": {
apiKey: "GEMINI_KEY_HERE",
env: {
GEMINI_API_KEY: "GEMINI_KEY_HERE",
},
},
peekaboo: { enabled: true },
мешок: { enabled: false },
},
},
}
plugins (расширения)¶
Обнаружение плагинов управления, разрешить/запретить и для каждого плагина. Плагины загружаются
из ~/.openclaw/extensions, <workspace>/.openclaw/extensions, плюс любые записи
plugins.load.paths. Изменения конфигурации требуют перезапуска gateway.
См. /plugin для полного использования.
Поля:
enabled: мастер-переключатель для загрузки плагина (по умолчанию: true).allow: необязательный список идентификаторов плагинов; если установлено, только перечисленные плагины.deny: необязательный список идентификаторов плагинов (запретить победы).load.paths: дополнительные файлы плагинов или директории для загрузки (абсолютный или~).записей.<pluginId>: для плагинов переопределён.включена: установитеfalseчтобы отключить эту функцию.config: специфичный для плагина объект конфигурации (проверяется плагином при наличии).
Пример:
{
plugins: {
enabled: true,
allow: ["voice-call"],
загрузка: {
пути: ["~/Projects/oss/voice-call-extension"],
},
записи: {
"voice-call": {
включен: true,
config: {
провайдера: "twilio",
},
},
},
},
}
browser (openclaw-managed browser)¶
OpenClaw может запускать выделенный, изолированный Chrome/Brave/Edge/Chromium экземпляр для openclaw и открыть небольшую службу управления петлями.
Профили могут указывать на удаленный браузер на основе Chromium через profiles.<name>.cdpUrl. Удаленные профили
только для прикрепленных файлов (начать/остановить/сброс отключен).
browser.cdpUrl остается для старых конфигураций одного профиля и в качестве базовой
схемы/хоста для профилей, которые только устанавливают cdpPort.
Параметры:
- включено:
true - evaluateEnabled:
true(установитеfalse, чтобы отключитьact:evaluateиwait --fn) - контрольный сервис: только петля (порт получается от
gateway.port, по умолчанию18791) - CDP URL:
http://127.0.0.1:18792(контрольный сервис + 1, унаследованный однопрофиль) - цвет профиля:
#FF4500(lobster-orange) - Примечание: сервер управления запускается запущенным шлюзом (OpenClaw.app menubar, или
openclaw gateway). - Автоматическое определение порядка: браузер по умолчанию, если базируется на Chromium-браузере; в противном случае Chrome → Brave → Edge → Chromium → Chrome Canary.
{
browser: {
включено: true,
evaluateEnabled: true,
// cdpUrl: "http://127. .0. :18792", // старое однопрофильное переопределение
defaultProfile: "chrome",
профилей: {
openclaw: { cdpPort: 18800, цвет: "#FF4500" },
work: { cdpPort: 18801, цвет: "#0066CC" },
remote: { cdpUrl: "http://10. .0.42:9222", цвет: "#00AA00" },
},
цвет: "#FF4500",
// Дополнительно:
// безголовный: false,
// noSandbox: false,
// executablePath: "/Applications/Brave Browser. pp/Contents/MacOS/Brave Browser",
// attachOnly: false, // устанавливаем True при туннелировании удаленного CDP на localhost
},
}
ui (внешний вид)¶
Необязательный цвет акцента, используемый собственными приложениями для UI chrome (например, пузырьки режима разговор).
Если выключено, клиенты возвращаются к заглушенному светло-синему свету.
{
ui: {
seamColor: "#FF4500", // hex (RRGGBB or #RRGGBB)
// Optional: Control UI assistant identity override.
// If unset, the Control UI uses the active agent identity (config or IDENTITY.md).
assistant: {
name: "OpenClaw",
avatar: "CB", // emoji, short text, or image URL/data URI
},
},
}
gateway (Gateway server mode + bind)¶
Используйте gateway.mode для явного объявления о том, должна ли эта машина запускать шлюз.
Переопределения:
- режим: unset (рассматривается как «не автозапускать»)
- bind:
loopback - порт:
18789(единственный порт для WS + HTTP)
{
gateway: {
mode: "local", // or "remote"
port: 18789, // WS + HTTP multiplex
bind: "loopback",
// controlUi: { enabled: true, basePath: "/openclaw" }
// auth: { mode: "token", token: "your-token" } // token gates WS + Control UI access
// tailscale: { mode: "off" | "serve" | "funnel" }
},
}
Базовый путь пользовательского интерфейса:
gateway.controlUi.basePathустанавливает префикс URL для интерфейса управления.- Примеры:
"/ui","/openclaw","/apps/openclaw". - По умолчанию: root (
/) (без изменений). gateway.controlUi.rootустанавливает корень файловой системы для ресурсов интерфейса управления (по умолчанию:dist/control-ui).gateway.controlUi.allowInsecureAuthпозволяет авторизоваться только для token-интерфейса управления, когда отсутствует личность устройства (обычно по HTTP). По умолчанию:false. Предпочитайте HTTPS (сервер в масштабе часа) или127.0.0.1.gateway.controlUi.dangerouslyDisableDeviceAuthотключает проверку личности устройства Control UI (только токен/пароль). По умолчанию:false. Только бутылочное стекло.
Связанная документация:
Доверенные прокси:
gateway.trustedProxies: список обратных прокси IP, которые завершают TLS перед шлюзом.- Когда соединение исходит от одного из этих IP, OpenClaw использует
x-forwarded-for(илиx-real-ip) для определения IP-адреса клиента для локальной проверки сопряжений и аутентичных/локальных проверок HTTP. - Только список прокси под вашим контролем и убедитесь что они перезаписывают входящий
x-forwarded-for.
Примечания:
openclaw gatewayотказывается запускать, еслиgateway.modeне установлен вlocal(или вы пропустили флаг переопределения).gateway.portконтролирует один мультиплексированный порт, используемый для WebSocket + HTTP (интерфейс управления, хуки, A2UI).- OpenAI Chat Completions endpoint: по умолчанию отключено; включите
gateway.http.endpoints.chatCompletions.enabled: true. - Первое:
--port>OPENCLAW_GATEWAY_PORT>gateway.port> по умолчанию18789. - По умолчанию требуется авторизация шлюза (токен/пароль или идентификатор сервера Tailscale Serve). Для нециклических соединений требуется общий токен/пароль.
- Мастер настройки генерирует токен шлюза по умолчанию (даже на цикле).
gateway.remote.tokenтолько для удалённых CLI звонков; это не позволяет использовать имя локального шлюза.gateway.tokenигнорируется.
Auth и хвостовая шкала:
gateway.auth.modeустанавливает требования рукопожатия (tokenилиpassword). При выключенном ключе предполагается авторизация токена.gateway.auth.tokenхранит общий токен для авторизации токена (используется CLI на той же машине).- Когда установлен
gateway.auth.mode, используется только этот метод (плюс дополнительные заголовки Tailscal). - Здесь можно установить
gateway.auth.passwordили черезOPENCLAW_GATEWAY_PASSWORD(рекомендуется). gateway.auth.allowTailscaleпозволяет запрашивать идентификационные заголовки сервера Tailscale (tailscale-user-login) для удовлетворения авторизации по прибытии запроса на loopback с помощьюx-forwarded-for,x-forwarded-protoиx-forwarded-host. OpenClaw проверяет личность, разрешив адресx-forwarded-forчерезtailscale whoisперед принятием. Когдаtrue, серверу не нужен токен/пароль; установитеfalse, чтобы требовать явных учетных данных. По умолчаниюtrueприtailscale.mode = "serve"и auth режим неpassword.gateway.tailscale.mode: "serve"использует сервер Tailscale (только tailnet, loopback bind).gateway.tailscale.mode: "funnel"публично раскрывает приборную панель; требует автора.gateway.tailscale.resetOnExitсбрасывает настройки сервера и функционала при выключении.
Настройки по умолчанию удаленного клиента (CLI):
gateway.remote.urlустанавливает по умолчанию URL шлюза WebSocket для CLI вызовов, когдаgateway.mode = "remote".gateway.remote.transportвыбирает удаленный транспорт macOS (по умолчаниюsshdirectдля ws/wss). Когдаdirect,gateway.remote.urlдолжен бытьws://илиwss://.ws://hostdefaults to port18789.gateway.remote.tokenснабжает токен для удалённых вызовов (оставьте не задан для автора).gateway.remote.passwordпередает пароль для удалённых вызовов (оставьте пустым для неавторизации).
Поведение приложения macOS:
- OpenClaw.app отслеживает
~/.openclaw/openclaw.jsonи переключает режимы в реальном времени при измененииgateway.modeилиgateway.remote.url. - Если
gateway.modeотключен, ноgateway.remote.urlустановлен, macOS приложение считает его удаленным режимом. - При смене режима подключения в macOS приложение записывает
gateway.mode(иgateway.remote.url+gateway.remote.transportв удаленном режиме) обратно в файл конфигурации.
{
gateway: {
mode: "remote",
remote: {
url: "ws://gateway.tailnet:18789",
token: "your-token",
password: "your-password",
},
},
}
Пример прямого переноса (macOS app):
{
gateway: {
mode: "remote",
remote: {
transport: "direct",
url: "wss://gateway.example.ts.net",
token: "your-token",
},
},
}
gateway.reload (настройка горячей перезагрузки)¶
Шлюз следит за ~/.openclaw/openclaw.json (или OPENCLAW_CONFIG_PATH) и автоматически применяет изменения.
Режимы:
hybrid(по умолчанию): горячие безопасные изменения; перезапустите шлюз для критических изменений.hot: применять только горячие изменения; журнал, когда требуется перезапуск.restart: перезапустите шлюз при любом изменении конфигурации.off: отключить горячую перезагрузку.
{
gateway: {
reload: {
mode: "hybrid",
debounceMs: 300,
},
},
}
Обновлять матрицу (файлы + удары)¶
Просмотренные файлы:
~/.openclaw/openclaw.json(илиOPENCLAW_CONFIG_PATH)
Горячее приложение (перезапуск шлюза не полностью):
hooks(webhook auth/path/mappings) +hooks.gmail(Gmail watcher restarted)browser(перезапуск сервера управления браузером)cron(cron сервис перезапускает + обновление в concurrence)agents.defaults.heartbeat(runner heartbeat runner)web(перезапуск веб-канала WhatsApp)телеграмма,discord,signal,imessage` (перезапуск канала)agent,models,routing,messages,session,whatsapp,logging,skills,ui,talk,identity,wizard(динамические чтения)
Требуется перезапуск шлюза:
gateway(port/bind/auth/control UI/tailscale)- «мост» (обычный)
discoverycanvasHostплагины- Любой неизвестный/неподдерживаемый путь конфигурации (по умолчанию для перезапуска в целях безопасности)
Изоляция нескольких экземпляров¶
Для запуска нескольких шлюзов на одном хосте (для избыточности или спасательного бота), изолируйте каждое состояние + конфигурацию и используйте уникальные порты:
OPENCLAW_CONFIG_PATH(конфигурация для каждого экземпляра)OPENCLAW_STATE_DIR(сессии/кредиты)agents.defaults.workspace(memories)gateway.port(уникальное за один экземпляр)
Флаги удобства (CLI):
openclaw --dev …→ использует~/.openclaw-dev+ сдвигает порты из базы19001openclaw --profile <name> …→ использует~/.openclaw-<name>(порт через config/env/flags)
См. Gateway runbook описание производимых портов (gateway/browser/canvas). Смотрите Несколько шлюзов информацию об изоляции браузера/CDP портов.
Пример:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
OPENCLAW_STATE_DIR=~/.openclaw-a \
шлюз openclaw --port 19001
hooks (Gateway webhooks)¶
Включить простой HTTP-веб-хук на HTTP-сервере Шлюза.
Вложенные включения
- включено:
false - путь:
/hooks - maxBodyBytes:
262144(256 KB)
{
hooks: {
enabled: true,
token: "shared-secret",
путь: "/hooks",
пресет: ["gmail"],
transformsDir: "~/. пенклоу/печеньки",
сопоставления: [
{
match: { path: "gmail" },
Действие: "Агент",
Режим пробуждения: "now",
название: "Gmail",
sessionKey: "hook:gmail:{{messages[0].id}}",
шаблона сообщений: "От: {{messages[0].from}}\nТема: {{messages[0].subject}}\n{{messages[0].snippet}}",
доставка: true,
канал: "последний",
модель: "openai/gpt-5. -mini",
},
],
},
}
Запросы должны включать токен хука:
- `Авторизация: носитель
или x-openclaw-token: <token>
Конечные точки:
POST /hooks/wake→{ text, mode?: "now"|"next-heartbeat" }POST /hooks/agent→{ message, name?, sessionKey?, wakeMode?, deliver?, channel?, для?, модели?, думаю?, timeoutSeconds? }POST /hooks/<name>→ разрешено черезhooks.mappings
/hooks/agent всегда публикует резюме в основной сессии (и может при необходимости вызвать немедленное прослушивание через wakeMode: "now").
Сопоставление заметок:
match.pathсоответствует подпути после/hooks(например/hooks/gmail→gmail).match.sourceсоответствует полю payload (например{ source: "gmail" }), так что вы можете использовать общий путь/hooks/ingest.- Такие шаблоны, как
{{messages[0].subject}}, читается из полезной нагрузки. transformможет указывать на модуль JS/TS, который возвращает действие хука.deliver: trueотправляет финальный ответ в канал;channelпо умолчанию передается вlast(возвращается в WhatsApp).- Если раньше маршрута доставки нет, установите
channel+toявно (требуется для Telegram/Discord/Google Chat/Slack/Signal/iMessage/MS команд). modelпереопределяет LLM для этого хука (provider/modelили алиаса; если установлен файлagents.defaults.models).
Конфигурация Gmail помощника (используется openclaw webhooks gmail setup / run):
{
hooks: {
gmail: {
account: "openclaw@gmail. om",
тема: "projects/<project-id>/topics/gog-gmail-watch",
подписка: "gog-gmail-watch-push",
pushToken: "shared-push-token",
hookUrl: "http://127. .0.1:18789/hooks/gmail",
includeBody: true,
maxBytes: 20000,
Обновление EveryMinutes: 720,
serve: { bind: "127. .0. ", port: 8788, путь: "/" },
tailscale: { mode: "funnel", path: "/gmail-pubsub" },
// Необязательно: используйте более дешевую модель для обработки хука Gmail
// Отзывами обратно к агентам. efaults.model. allbacks, затем основной, по auth/rate-limit/timeout
модель: "openrouter/meta-llama/llama-3. -70b-instruct:free",
// Необязательно: уровень мышления по умолчанию для Gmail хуков
думает: "off",
},
},
}
Переопределение модели для хуков Gmail:
hooks.gmail.modelопределяет модель для использования при обработке Gmail хука (по умолчанию - основная сессия).- Принимает
provider/modelrefs or aliases fromagents.defaults.models. - Возвращает
agents.defaults.model.fallbacks, затемagents.defaults.model.primary, on auth/rate-limit/timeouts. - Если установлен
agents.defaults.models, включите в список подходящую модель хуков. - При запуске предупреждает, нет ли настроенная модель в каталоге или списке моделей.
hooks.gmail.thinkingустанавливает стандартный уровень мышления для хуков Gmail и переопределен на каждый хукthink.
Автозапуск шлюза:
- Если у вас установлен
hooks.enabled=trueиhooks.gmail.account, шлюз запускаетсяgog gmail watch serveпри загрузке и автоперезапуск часа. - Установите
OPENCLAW_SKIP_GMAIL_WATCHER=1, чтобы отключить автозапуск (для ручных запуска). - Избегайте выполнения отдельного
gog gmail watch serveвместе с шлюзом; он будет не удаётся сlisten tcp 127.0.0.1:8788: bind: уже используется.
Примечание: когда tailscale.mode включен, OpenClaw по умолчанию использует serve.path в /, так что
Tailscale может правильно проксировать /gmail-pubsub (он разделяет префикс set-path).
Если вам нужен бэкэнд, чтобы получить префиксный путь, установите
hooks.gmail.tailscale.target на полный URL (и выравнивайте serve.path).
canvasHost (LAN/tailnet Canvas file server + live reload)¶
Шлюз служит каталогу HTML/CSS/JS через HTTP, чтобы узлы iOS/Android могли просто canvas.navigate к нему.
Корень по умолчанию: ~/. penclaw/workspace/canvas
Порт по умолчанию: 18793 (выбран, чтобы избежать порта CDP браузера openclaw 18792)
Сервер слушает шлюз (LAN или Tailnet), так что узлы могут достичь его.
Сервер:
- обслуживает файлы в каталоге
canvasHost.root - вводит маленький live-reload клиент в обслуживаемый HTML
- следит за каталогом и транслирует перезагрузку через конечную точку WebSocket в
/__openclaw__/ws - автоматически создает стартовый файл
index.html, когда каталог пуст (так что вы видите что-то немедленно) - также служит A2UI в
/__openclaw__/a2ui/и рекламируется в узлы какcanvasHostUrl(всегда используется узлами для Canvas/A2UI)
Отключить прямую перезагрузку (и просмотр файлов), если каталог большой или вы нажмете EMFILE:
- config:
canvasHost: { liveReload: false }
{
canvasHost: {
root: "~/.openclaw/workspace/canvas",
port: 18793,
liveReload: true,
},
}
Изменения в canvasHost.* требуют перезапуска шлюза (перезагрузка конфигурации перезагрузится).
Отключить:
- config:
canvasHost: { enabled: false } - env:
OPENCLAW_SKIP_CANVAS_HOST=1
мост (устаревший TCP мост, удален)¶
Текущие сборки больше не включают listener; ключи конфигурации bridge.* игнорируются.
Узлы подключаются через WebSocket. Этот раздел хранится для исторической ссылки.
Наследие поведения:
- Шлюз может выдать простой TCP мост для узлов (iOS/Android), как правило, на порту
18790.
Параметры:
- включено:
true - порт:
18790 - bind:
lan(binds to0.0.0.0)
Bind modes:
lan:0.0.0.0(доступно на любом интерфейсе, включая локальную сеть, Wi-Fi и Tailscale)- «хвостовая сеть»: привязывается только к IP-адресу Tailscale (рекомендуется для Вены в Лондоне)
loopback:127.0.0.1(только локально)auto: предпочтительно использовать хвост IP если присутствует, иначеlan
TLS:
bridge.tls.enabled: включить TLS для мостовых соединений (TLS-только, когда включено).bridge.tls.autoGenerate: генерировать самоподписанный сертификат, когда cert/key нет (по умолчанию: true).bridge.tls.certPath/bridge.tls.keyPath: пути к PEM для мостового сертификата + приватный ключ.bridge.tls.caPath: опциональный PEM CA пакет (пользовательские корни или будущие mTLS).
Когда TLS включен, шлюз рекламирует bridgeTls=1 и bridgeTlsSha256 в открытии TXT
записей, чтобы узлы могли прикрепить сертификат. Ручные соединения используют "trust-on-first-us", если отпечаток пальца
пока не сохранен.
Сгенерированные сертификаты требуют openssl на PATH; если генерация не удается, мост не запустится.
{
моста: {
включен: true,
Порт: 18790,
привязка: "хвостовая сеть",
tls: {
включен: true,
// Использует ~/. penclaw/bridge/tls/bridge-{cert,key}. em when omitted.
// certPath: "~/.openclaw/bridge/tls/bridge-cert.pem",
// keyPath: "~/. penclaw/bridge/tls/bridge-key.pem"
},
},
}
discovery.mdns (режим трансляции Bonjour / mDNS)¶
Управляет обнаружением mDNS трансляций (_openclaw-gw._tcp).
minimal(по умолчанию): omitcliPath+sshPortиз TXT записейfull: включитьcliPath+sshPortв TXT записивыкл: полностью отключить трансляции mDNS- Имя хоста: по умолчанию
openclaw(рекламируетopenclaw.local). Переопределить с помощьюOPENCLAW_MDNS_HOSTNAME.
{
discovery: { mdns: { mode: "minimal" } },
}
discovery.wideArea (Wide-Area Bonjour / unicast DNS-SD)¶
Если эта опция включена, шлюз записывает в файл _openclaw-gw._tcp unicast DNS-SD zone для _openclaw-gw._tcp в папке ~/.openclaw/dns/ используя настроенный домен обнаружения (пример: openclaw.internal.).
Чтобы сделать iOS/Android обнаружить через сети (Vienna
- DNS сервер на шлюзе хоста, обслуживающего выбранный домен (CoreDNS рекомендуется)
- Tailscale split DNS для того, чтобы клиенты могли разрешить домен через шлюз DNS сервер
Единоразовый помощник (хост шлюза):
openclaw dns setup --apply
{
discovery: { wideArea: { enabled: true } },
}
Переменные шаблона модели медиафайлов¶
Заполнители шаблонов расширены в tools.media.*.models[].args и tools.media.models[].args (и любых будущих шаблонных полей аргументов).
| Переменная | Описание |
| ----------------------------------------------------------------------------------------------- | ------| ------- | ---------- | ----- | ------ | ------- | ------- | ------- | --- | --- |
| {{Body}} | Полное входящее тело |
| {{RawBody}} | Raw входящее тело сообщения (нет оболочек истории/отправителя; лучшее для команд parsing) |
| {{BodyStripped}} | Тело с упоминаниями в группах полоскано (лучшее по умолчанию для агентов) |
| {{From}} | Отправитель идентификатор (E. 64 для WhatsApp; может отличаться по каналу) |
| {{To}} | Идентификатор назначения |
| {{MessageSid}}| Идентификатор сообщения (когда доступно) | |}| Текущая сессия UUID |
|}|"true"при создании новой сессии |
|}| Inbound media pseudo-URL (если имеется) |
|}| Путь к локальному носителю (если загружено) |
|}| Тип медиа (image/audio/document/…) |
|}| Аудиотранскрипт (когда включено) |
|}| Разрешённый медиапромпт для CLI-записей |
|}| Разрешённый максимум символов вывода для CLI-записей |
|}|"direct"или"group"|
|}| Тема группы (по возможности) |
|}| Предпросмотр участников группы (по возможности) |
|}| Отображаемое имя отправителя (по возможности) |
|}| Телефонный номер отправителя (по возможности) |
|` | Подсказка провайдера (whatsapp | telegram | discord | googlechat | slack | signal | imessage | msteams | webchat | …) |}
Cron (планировщик ворот)¶
Cron - это собственный планировщик шлюзов для пробуждения и запланированных заданий. Смотрите Cron jobs обзор возможностей и примеры CLI.
{
cron: {
enabled: true,
maxConcurrentRuns: 2,
},
}
Далее: Agent Runtime 🦞