81 KiB
| read_when | summary | title | x-i18n | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Довідник з конфігурації Gateway для основних ключів OpenClaw, значень за замовчуванням і посилань на окремі довідники підсистем | Довідник з конфігурації |
|
Основний довідник конфігурації для ~/.openclaw/openclaw.json. Для огляду, орієнтованого на завдання, див. Configuration.
Охоплює основні поверхні конфігурації OpenClaw і містить посилання назовні, коли підсистема має власний докладніший довідник. Каталоги команд, що належать каналам і Plugin, а також детальні параметри пам’яті/QMD винесені на окремі сторінки, а не описуються тут.
Джерело істини в коді:
openclaw config schemaвиводить актуальну JSON Schema, яка використовується для валідації та Control UI, із вбудованими метаданими bundled/plugin/channel, об’єднаними за наявностіconfig.schema.lookupповертає один вузол схеми з прив’язкою до шляху для інструментів детального переглядуpnpm config:docs:check/pnpm config:docs:genперевіряють хеш базового стану документації конфігурації щодо поточної поверхні схеми
Окремі поглиблені довідники:
- Memory configuration reference для
agents.defaults.memorySearch.*,memory.qmd.*,memory.citationsі конфігурації dreaming уplugins.entries.memory-core.config.dreaming - Slash commands для поточного вбудованого + bundled каталогу команд
- сторінки каналу/Plugin-власника для специфічних для каналу поверхонь команд
Формат конфігурації — JSON5 (дозволені коментарі й кінцеві коми). Усі поля необов’язкові — OpenClaw використовує безпечні значення за замовчуванням, якщо їх пропущено.
Канали
Ключі конфігурації для кожного каналу перенесено на окрему сторінку — див.
Configuration — channels для channels.*,
зокрема Slack, Discord, Telegram, WhatsApp, Matrix, iMessage та інших
вбудованих каналів (автентифікація, контроль доступу, кілька облікових записів, керування згадками).
Типові значення агента, multi-agent, сесії та повідомлення
Перенесено на окрему сторінку — див. Configuration — agents для:
agents.defaults.*(робочий простір, модель, thinking, heartbeat, пам’ять, медіа, skills, sandbox)multiAgent.*(маршрутизація та прив’язки multi-agent)session.*(життєвий цикл сесії, Compaction, обрізання)messages.*(доставка повідомлень, TTS, рендеринг markdown)talk.*(режим Talk)talk.speechLocale: необов’язковий ідентифікатор локалі BCP 47 для розпізнавання мовлення Talk на iOS/macOStalk.silenceTimeoutMs: якщо не задано, Talk зберігає стандартне для платформи вікно паузи перед надсиланням транскрипту (700 ms на macOS і Android, 900 ms на iOS)
Інструменти та власні провайдери
Політика інструментів, експериментальні перемикачі, конфігурація інструментів із підтримкою провайдерів і налаштування власних провайдерів / base-URL перенесені на окрему сторінку — див. Configuration — tools and custom providers.
MCP
Визначення MCP-серверів, керованих OpenClaw, знаходяться в mcp.servers і
використовуються вбудованим Pi та іншими адаптерами середовища виконання. Команди openclaw mcp list,
show, set і unset керують цим блоком без підключення до
цільового сервера під час редагування конфігурації.
{
mcp: {
// Optional. Default: 600000 ms (10 minutes). Set 0 to disable idle eviction.
sessionIdleTtlMs: 600000,
servers: {
docs: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-fetch"],
},
remote: {
url: "https://example.com/mcp",
transport: "streamable-http", // streamable-http | sse
headers: {
Authorization: "Bearer ${MCP_REMOTE_TOKEN}",
},
},
},
},
}
mcp.servers: іменовані визначення stdio або віддалених MCP-серверів для середовищ виконання, які надають налаштовані MCP-інструменти.mcp.sessionIdleTtlMs: idle TTL для MCP-середовищ виконання в межах сесії. Одноразові вбудовані запуски запитують очищення після завершення запуску; цей TTL є резервним механізмом для довготривалих сесій і майбутніх викликів.- Зміни в
mcp.*застосовуються гаряче через вивільнення кешованих MCP-середовищ виконання сесії. Наступне виявлення/використання інструменту створює їх заново з нової конфігурації, тому видалені записиmcp.serversприбираються негайно, а не очікують завершення idle TTL.
Див. MCP і CLI backends для поведінки середовища виконання.
Skills
{
skills: {
allowBundled: ["gemini", "peekaboo"],
load: {
extraDirs: ["~/Projects/agent-scripts/skills"],
},
install: {
preferBrew: true,
nodeManager: "npm", // npm | pnpm | yarn | bun
},
entries: {
"image-lab": {
apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" }, // or plaintext string
env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" },
},
peekaboo: { enabled: true },
sag: { enabled: false },
},
},
}
allowBundled: необов’язковий список дозволу лише для bundled skills (керовані/робочі skills не зачіпаються).load.extraDirs: додаткові спільні кореневі каталоги skills (найнижчий пріоритет).install.preferBrew: якщоtrue, надавати перевагу інсталяторам Homebrew, колиbrewдоступний, перш ніж переходити до інших типів інсталяторів.install.nodeManager: пріоритет менеджера Node для специфікаційmetadata.openclaw.install(npm|pnpm|yarn|bun).entries.<skillKey>.enabled: falseвимикає skill, навіть якщо він bundled/installed.entries.<skillKey>.apiKey: зручне поле для skills, які оголошують основну змінну середовища (звичайний рядок або об’єкт SecretRef).
Plugins
{
plugins: {
enabled: true,
allow: ["voice-call"],
deny: [],
load: {
paths: ["~/Projects/oss/voice-call-plugin"],
},
entries: {
"voice-call": {
enabled: true,
hooks: {
allowPromptInjection: false,
},
config: { provider: "twilio" },
},
},
},
}
- Завантажуються з
~/.openclaw/extensions,<workspace>/.openclaw/extensionsіplugins.load.paths. - Виявлення підтримує нативні OpenClaw Plugins, а також сумісні пакети Codex і Claude, включно з пакетами Claude без manifest із типовою структурою каталогів.
- Зміни конфігурації потребують перезапуску gateway.
allow: необов’язковий список дозволу (завантажуються лише перелічені Plugins).denyмає пріоритет.plugins.entries.<id>.apiKey: зручне поле API-ключа на рівні Plugin (коли Plugin це підтримує).plugins.entries.<id>.env: карта змінних середовища в межах Plugin.plugins.entries.<id>.hooks.allowPromptInjection: колиfalse, ядро блокуєbefore_prompt_buildта ігнорує поля, що змінюють prompt, із застарілогоbefore_agent_start, водночас зберігаючи застаріліmodelOverrideіproviderOverride. Застосовується до нативних hooks Plugin і підтримуваних каталогів hooks, наданих пакетами.plugins.entries.<id>.hooks.allowConversationAccess: колиtrue, довірені небудовані Plugins можуть читати необроблений вміст розмови з типізованих hooks, таких якllm_input,llm_output,before_agent_finalizeіagent_end.plugins.entries.<id>.subagent.allowModelOverride: явно довіряти цьому Plugin запитувати перевизначенняproviderіmodelдля окремого запуску фонових підзапусків subagent.plugins.entries.<id>.subagent.allowedModels: необов’язковий список дозволу канонічних цілейprovider/modelдля довірених перевизначень subagent. Використовуйте"*"лише тоді, коли навмисно хочете дозволити будь-яку модель.plugins.entries.<id>.config: об’єкт конфігурації, визначений Plugin (валідується схемою нативного OpenClaw Plugin, якщо вона доступна).- Налаштування облікового запису/середовища виконання для канальних Plugins знаходяться в
channels.<id>і мають бути описані метаданимиchannelConfigsу manifest Plugin-власника, а не центральним реєстром параметрів OpenClaw. plugins.entries.firecrawl.config.webFetch: налаштування провайдера Firecrawl web-fetch.apiKey: API-ключ Firecrawl (приймає SecretRef). Використовуєplugins.entries.firecrawl.config.webSearch.apiKey, застарілийtools.web.fetch.firecrawl.apiKeyабо змінну середовищаFIRECRAWL_API_KEY, якщо не задано.baseUrl: базовий URL API Firecrawl (типово:https://api.firecrawl.dev).onlyMainContent: витягувати лише основний вміст зі сторінок (типово:true).maxAgeMs: максимальний вік кешу в мілісекундах (типово:172800000/ 2 дні).timeoutSeconds: тайм-аут запиту зчитування в секундах (типово:60).
plugins.entries.xai.config.xSearch: налаштування xAI X Search (Grok web search).enabled: увімкнути провайдера X Search.model: модель Grok для пошуку (наприклад,"grok-4-1-fast").
plugins.entries.memory-core.config.dreaming: налаштування memory dreaming. Див. Dreaming щодо фаз і порогів.enabled: головний перемикач dreaming (типовоfalse).frequency: Cron-розклад для кожного повного циклу dreaming (типово"0 3 * * *").- політика фаз і пороги є деталями реалізації (не користувацькими ключами конфігурації).
- Повна конфігурація пам’яті наведена в Memory configuration reference:
agents.defaults.memorySearch.*memory.backendmemory.citationsmemory.qmd.*plugins.entries.memory-core.config.dreaming
- Увімкнені Plugins-пакети Claude також можуть додавати вбудовані типові значення Pi із
settings.json; OpenClaw застосовує їх як санітизовані налаштування агента, а не як необроблені патчі конфігурації OpenClaw. plugins.slots.memory: вибрати ідентифікатор активного Plugin пам’яті або"none", щоб вимкнути Plugins пам’яті.plugins.slots.contextEngine: вибрати ідентифікатор активного Plugin рушія контексту; типово"legacy", якщо ви не встановите й не виберете інший рушій.
Див. Plugins.
Браузер
{
browser: {
enabled: true,
evaluateEnabled: true,
defaultProfile: "user",
ssrfPolicy: {
// dangerouslyAllowPrivateNetwork: true, // opt in only for trusted private-network access
// allowPrivateNetwork: true, // legacy alias
// hostnameAllowlist: ["*.example.com", "example.com"],
// allowedHostnames: ["localhost"],
},
tabCleanup: {
enabled: true,
idleMinutes: 120,
maxTabsPerSession: 8,
sweepMinutes: 5,
},
profiles: {
openclaw: { cdpPort: 18800, color: "#FF4500" },
work: {
cdpPort: 18801,
color: "#0066CC",
executablePath: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
},
user: { driver: "existing-session", attachOnly: true, color: "#00AA00" },
brave: {
driver: "existing-session",
attachOnly: true,
userDataDir: "~/Library/Application Support/BraveSoftware/Brave-Browser",
color: "#FB542B",
},
remote: { cdpUrl: "http://10.0.0.42:9222", color: "#00AA00" },
},
color: "#FF4500",
// headless: false,
// noSandbox: false,
// extraArgs: [],
// executablePath: "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
// attachOnly: false,
},
}
evaluateEnabled: falseвимикаєact:evaluateіwait --fn.tabCleanupзвільняє відстежувані вкладки основного агента після простою або коли сесія перевищує свій ліміт. УстановітьidleMinutes: 0абоmaxTabsPerSession: 0, щоб вимкнути ці окремі режими очищення.ssrfPolicy.dangerouslyAllowPrivateNetworkвимкнено, якщо не задано, тож навігація браузера типово залишається суворо обмеженою.- Установлюйте
ssrfPolicy.dangerouslyAllowPrivateNetwork: trueлише тоді, коли ви свідомо довіряєте навігації браузера в приватній мережі. - У суворому режимі кінцеві точки віддалених профілів CDP (
profiles.*.cdpUrl) підпадають під те саме блокування приватної мережі під час перевірок доступності/виявлення. ssrfPolicy.allowPrivateNetworkі далі підтримується як застарілий псевдонім.- У суворому режимі використовуйте
ssrfPolicy.hostnameAllowlistіssrfPolicy.allowedHostnamesдля явних винятків. - Віддалені профілі працюють лише в режимі attach-only (start/stop/reset вимкнені).
profiles.*.cdpUrlприймаєhttp://,https://,ws://іwss://. Використовуйте HTTP(S), якщо хочете, щоб OpenClaw виявляв/json/version; використовуйте WS(S), якщо ваш провайдер надає вам прямий URL DevTools WebSocket.remoteCdpTimeoutMsіremoteCdpHandshakeTimeoutMsзастосовуються до віддалених іattachOnlyперевірок доступності CDP, а також до запитів на відкриття вкладок. Керовані loopback- профілі зберігають локальні значення CDP за замовчуванням.- Якщо керований зовні сервіс CDP доступний через loopback, установіть для цього
профілю
attachOnly: true; інакше OpenClaw трактуватиме loopback-порт як локальний керований профіль браузера й може повідомляти про помилки володіння локальним портом. - Профілі
existing-sessionвикористовують Chrome MCP замість CDP і можуть підключатися на вибраному хості або через підключений вузол браузера. - Профілі
existing-sessionможуть задаватиuserDataDir, щоб націлюватися на конкретний профіль браузера на базі Chromium, наприклад Brave або Edge. - Профілі
existing-sessionзберігають поточні обмеження маршруту Chrome MCP: дії на основі snapshot/ref замість націлювання через CSS-селектори, hooks для завантаження одного файла, без перевизначення тайм-аутів діалогів, безwait --load networkidle, а також безresponsebody, експорту PDF, перехоплення завантажень чи пакетних дій. - Локальні керовані профілі
openclawавтоматично призначаютьcdpPortіcdpUrl; явно задавайтеcdpUrlлише для віддаленого CDP. - Локальні керовані профілі можуть задавати
executablePath, щоб перевизначити глобальнийbrowser.executablePathдля цього профілю. Використовуйте це, щоб запускати один профіль у Chrome, а інший — у Brave. - Локальні керовані профілі використовують
browser.localLaunchTimeoutMsдля HTTP-виявлення Chrome CDP після запуску процесу таbrowser.localCdpReadyTimeoutMsдля перевірки готовності CDP websocket після запуску. Збільшуйте їх на повільніших хостах, де Chrome запускається успішно, але перевірки готовності випереджають завершення запуску. Обидва значення мають бути додатними цілими числами до120000мс; некоректні значення конфігурації відхиляються. - Порядок автовиявлення: типовий браузер, якщо він на базі Chromium → Chrome → Brave → Edge → Chromium → Chrome Canary.
- І
browser.executablePath, іbrowser.profiles.<name>.executablePathприймають~і~/...для домашнього каталогу вашої ОС перед запуском Chromium.userDataDirдля профілівexisting-sessionна рівні профілю також розгортається з тильдою. - Служба керування: лише loopback (порт виводиться з
gateway.port, типово18791). extraArgsдодає додаткові прапорці запуску до локального старту Chromium (наприклад--disable-gpu, розмір вікна або прапорці налагодження).
UI
{
ui: {
seamColor: "#FF4500",
assistant: {
name: "OpenClaw",
avatar: "CB", // emoji, short text, image URL, or data URI
},
},
}
seamColor: колір акценту для chrome інтерфейсу нативного застосунку (відтінок бульбашки режиму Talk тощо).assistant: перевизначення ідентичності для Control UI. Якщо не задано, використовується ідентичність активного агента.
Gateway
{
gateway: {
mode: "local", // local | remote
port: 18789,
bind: "loopback",
auth: {
mode: "token", // none | token | password | trusted-proxy
token: "your-token",
// password: "your-password", // or OPENCLAW_GATEWAY_PASSWORD
// trustedProxy: { userHeader: "x-forwarded-user" }, // for mode=trusted-proxy; see /gateway/trusted-proxy-auth
allowTailscale: true,
rateLimit: {
maxAttempts: 10,
windowMs: 60000,
lockoutMs: 300000,
exemptLoopback: true,
},
},
tailscale: {
mode: "off", // off | serve | funnel
resetOnExit: false,
},
controlUi: {
enabled: true,
basePath: "/openclaw",
// root: "dist/control-ui",
// embedSandbox: "scripts", // strict | scripts | trusted
// allowExternalEmbedUrls: false, // dangerous: allow absolute external http(s) embed URLs
// allowedOrigins: ["https://control.example.com"], // required for non-loopback Control UI
// dangerouslyAllowHostHeaderOriginFallback: false, // dangerous Host-header origin fallback mode
// allowInsecureAuth: false,
// dangerouslyDisableDeviceAuth: false,
},
remote: {
url: "ws://gateway.tailnet:18789",
transport: "ssh", // ssh | direct
token: "your-token",
// password: "your-password",
},
trustedProxies: ["10.0.0.1"],
// Optional. Default false.
allowRealIpFallback: false,
nodes: {
pairing: {
// Optional. Default unset/disabled.
autoApproveCidrs: ["192.168.1.0/24", "fd00:1234:5678::/64"],
},
allowCommands: ["canvas.navigate"],
denyCommands: ["system.run"],
},
tools: {
// Additional /tools/invoke HTTP denies
deny: ["browser"],
// Remove tools from the default HTTP deny list
allow: ["gateway"],
},
push: {
apns: {
relay: {
baseUrl: "https://relay.example.com",
timeoutMs: 10000,
},
},
},
},
}
mode:local(запустити gateway) абоremote(підключитися до віддаленого gateway). Gateway відмовляється запускатися, якщо неlocal.port: єдиний мультиплексований порт для WS + HTTP. Пріоритет:--port>OPENCLAW_GATEWAY_PORT>gateway.port>18789.bind:auto,loopback(типово),lan(0.0.0.0),tailnet(лише IP Tailscale) абоcustom.- Застарілі псевдоніми bind: використовуйте значення режиму bind у
gateway.bind(auto,loopback,lan,tailnet,custom), а не псевдоніми хоста (0.0.0.0,127.0.0.1,localhost,::,::1). - Примітка щодо Docker: типовий bind
loopbackслухає127.0.0.1усередині контейнера. Із bridge-мережею Docker (-p 18789:18789) трафік надходить черезeth0, тому gateway недоступний. Використовуйте--network hostабо встановітьbind: "lan"(абоbind: "custom"зcustomBindHost: "0.0.0.0"), щоб слухати на всіх інтерфейсах. - Auth: типово обов’язкова. Для bind не на loopback потрібна auth gateway. На практиці це означає спільний token/password або reverse proxy з підтримкою ідентичності з
gateway.auth.mode: "trusted-proxy". Майстер початкового налаштування типово генерує token. - Якщо налаштовано і
gateway.auth.token, іgateway.auth.password(включно з SecretRef), явно задайтеgateway.auth.modeякtokenабоpassword. Потоки запуску та встановлення/відновлення сервісу завершуються помилкою, коли налаштовано обидва, а mode не задано. gateway.auth.mode: "none": явний режим без auth. Використовуйте лише для довірених локальних налаштувань loopback; цей варіант навмисно не пропонується в підказках початкового налаштування.gateway.auth.mode: "trusted-proxy": делегувати auth reverse proxy з підтримкою ідентичності та довіряти заголовкам ідентичності зgateway.trustedProxies(див. Trusted Proxy Auth). Цей режим очікує джерело proxy не на loopback; reverse proxy loopback на тому самому хості не задовольняють auth trusted-proxy.gateway.auth.allowTailscale: колиtrue, заголовки ідентичності Tailscale Serve можуть задовольняти auth для Control UI/WebSocket (перевіряється черезtailscale whois). Кінцеві точки HTTP API не використовують цю auth через заголовки Tailscale; вони натомість дотримуються звичайного режиму HTTP auth gateway. Цей потік без token передбачає, що хост gateway є довіреним. Типовоtrue, колиtailscale.mode = "serve".gateway.auth.rateLimit: необов’язковий обмежувач невдалих спроб auth. Застосовується для кожного IP клієнта та для кожної області auth (shared-secret і device-token відстежуються незалежно). Заблоковані спроби повертають429+Retry-After.- На асинхронному шляху Tailscale Serve Control UI невдалі спроби для того самого
{scope, clientIp}серіалізуються перед записом невдачі. Тому одночасні невдалі спроби від того самого клієнта можуть спрацювати на обмежувач уже на другому запиті, замість того щоб обидві пройшли паралельно як звичайні невідповідності. gateway.auth.rateLimit.exemptLoopbackтипово має значенняtrue; установітьfalse, якщо навмисно хочете, щоб трафік localhost теж підпадав під обмеження швидкості (для тестових налаштувань або суворих розгортань через proxy).
- На асинхронному шляху Tailscale Serve Control UI невдалі спроби для того самого
- Спроби WS auth із джерелом browser завжди обмежуються без звільнення для loopback (додатковий захист від brute force localhost через browser).
- На loopback ці блокування для джерел browser ізолюються за нормалізованим значенням
Origin, тому повторні невдачі з одного localhost origin не призводять автоматично до блокування іншого origin. tailscale.mode:serve(лише tailnet, bind на loopback) абоfunnel(публічно, потребує auth).controlUi.allowedOrigins: явний список дозволених browser-origin для підключень Gateway WebSocket. Обов’язковий, коли очікуються browser-клієнти з origin не на loopback.controlUi.dangerouslyAllowHostHeaderOriginFallback: небезпечний режим, який вмикає fallback origin через заголовок Host для розгортань, що навмисно покладаються на політику origin через заголовок Host.remote.transport:ssh(типово) абоdirect(ws/wss). Дляdirectremote.urlмає бутиws://абоwss://.OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1: аварійне перевизначення через змінну середовища процесу на стороні клієнта, яке дозволяє незашифрованийws://до довірених IP приватної мережі; типово незашифрований трафік і далі дозволено лише для loopback. Еквівалента вopenclaw.jsonнемає, а конфігурація приватної мережі browser, така якbrowser.ssrfPolicy.dangerouslyAllowPrivateNetwork, не впливає на клієнти Gateway WebSocket.gateway.remote.token/.password— це поля облікових даних віддаленого клієнта. Вони самі по собі не налаштовують auth gateway.gateway.push.apns.relay.baseUrl: базовий HTTPS URL зовнішнього APNs relay, який використовують офіційні/TestFlight збірки iOS після публікації реєстрацій relay-backed до gateway. Цей URL має збігатися з URL relay, вбудованим у збірку iOS.gateway.push.apns.relay.timeoutMs: тайм-аут надсилання від gateway до relay у мілісекундах. Типово10000.- Реєстрації relay-backed делегуються конкретній ідентичності gateway. Пов’язаний застосунок iOS отримує
gateway.identity.get, включає цю ідентичність у реєстрацію relay і передає до gateway право надсилання в межах реєстрації. Інший gateway не може повторно використати цю збережену реєстрацію. OPENCLAW_APNS_RELAY_BASE_URL/OPENCLAW_APNS_RELAY_TIMEOUT_MS: тимчасові перевизначення через env для наведеної вище конфігурації relay.OPENCLAW_APNS_RELAY_ALLOW_HTTP=true: лише для розробки, аварійний дозвіл для URL relay HTTP на loopback. У production URL relay мають лишатися на HTTPS.gateway.channelHealthCheckMinutes: інтервал моніторингу стану каналів у хвилинах. Установіть0, щоб глобально вимкнути перезапуски health-monitor. Типово:5.gateway.channelStaleEventThresholdMinutes: поріг застарілого сокета в хвилинах. Зберігайте це значення більшим або рівнимgateway.channelHealthCheckMinutes. Типово:30.gateway.channelMaxRestartsPerHour: максимальна кількість перезапусків health-monitor на канал/обліковий запис у ковзній годині. Типово:10.channels.<provider>.healthMonitor.enabled: відмова на рівні каналу від перезапусків health-monitor зі збереженням глобального монітора увімкненим.channels.<provider>.accounts.<accountId>.healthMonitor.enabled: перевизначення на рівні облікового запису для каналів із кількома обліковими записами. Якщо задано, має пріоритет над перевизначенням на рівні каналу.- Локальні шляхи виклику gateway можуть використовувати
gateway.remote.*як fallback лише тоді, колиgateway.auth.*не задано. - Якщо
gateway.auth.token/gateway.auth.passwordявно налаштовано через SecretRef і не вдається розв’язати, розв’язання завершується fail closed (без маскування через fallback до remote). trustedProxies: IP reverse proxy, які завершують TLS або вставляють заголовки forwarded-client. Перелічуйте лише proxy, які ви контролюєте. Записи loopback усе ще допустимі для налаштувань proxy на тому самому хості/визначення локального джерела (наприклад, Tailscale Serve або локальний reverse proxy), але вони не роблять запити loopback придатними дляgateway.auth.mode: "trusted-proxy".allowRealIpFallback: колиtrue, gateway приймаєX-Real-IP, якщоX-Forwarded-Forвідсутній. Типовоfalseдля поведінки fail closed.gateway.nodes.pairing.autoApproveCidrs: необов’язковий список дозволених CIDR/IP для автоматичного схвалення першого pairing вузла пристрою без запитаних областей доступу. Якщо не задано, вимкнено. Це не схвалює автоматично pairing operator/browser/Control UI/WebChat і не схвалює автоматично підвищення ролі, областей доступу, метаданих або відкритого ключа.gateway.nodes.allowCommands/gateway.nodes.denyCommands: глобальне налаштування allow/deny для оголошених команд вузла після pairing і оцінювання списку дозволу.gateway.tools.deny: додаткові назви інструментів, заблоковані для HTTPPOST /tools/invoke(розширює типовий список deny).gateway.tools.allow: прибрати назви інструментів із типового списку deny HTTP.
Кінцеві точки, сумісні з OpenAI
- Chat Completions: типово вимкнено. Увімкніть через
gateway.http.endpoints.chatCompletions.enabled: true. - Responses API:
gateway.http.endpoints.responses.enabled. - Посилення безпеки URL-входу Responses:
gateway.http.endpoints.responses.maxUrlPartsgateway.http.endpoints.responses.files.urlAllowlistgateway.http.endpoints.responses.images.urlAllowlistПорожні списки дозволу трактуються як незадані; використовуйтеgateway.http.endpoints.responses.files.allowUrl=falseі/абоgateway.http.endpoints.responses.images.allowUrl=false, щоб вимкнути отримання URL.
- Необов’язковий заголовок посилення безпеки відповіді:
gateway.http.securityHeaders.strictTransportSecurity(установлюйте лише для HTTPS origin, які ви контролюєте; див. Trusted Proxy Auth)
Ізоляція кількох екземплярів
Запускайте кілька gateway на одному хості з унікальними портами та каталогами стану:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
OPENCLAW_STATE_DIR=~/.openclaw-a \
openclaw gateway --port 19001
Зручні прапорці: --dev (використовує ~/.openclaw-dev + порт 19001), --profile <name> (використовує ~/.openclaw-<name>).
Див. Multiple Gateways.
gateway.tls
{
gateway: {
tls: {
enabled: false,
autoGenerate: false,
certPath: "/etc/openclaw/tls/server.crt",
keyPath: "/etc/openclaw/tls/server.key",
caPath: "/etc/openclaw/tls/ca-bundle.crt",
},
},
}
enabled: вмикає завершення TLS на слухачі gateway (HTTPS/WSS) (типово:false).autoGenerate: автоматично генерує локальну самопідписану пару cert/key, коли явні файли не налаштовано; лише для локального/dev використання.certPath: шлях файлової системи до файла сертифіката TLS.keyPath: шлях файлової системи до файла приватного ключа TLS; зберігайте його з обмеженими дозволами.caPath: необов’язковий шлях до набору CA для перевірки клієнтів або нестандартних ланцюжків довіри.
gateway.reload
{
gateway: {
reload: {
mode: "hybrid", // off | restart | hot | hybrid
debounceMs: 500,
deferralTimeoutMs: 0,
},
},
}
mode: керує тим, як зміни конфігурації застосовуються під час виконання."off": ігнорувати зміни в реальному часі; зміни потребують явного перезапуску."restart": завжди перезапускати процес gateway при зміні конфігурації."hot": застосовувати зміни в процесі без перезапуску."hybrid"(типово): спочатку спробувати hot reload; за потреби перейти до перезапуску.
debounceMs: вікно debounce у мс перед застосуванням змін конфігурації (невід’ємне ціле число).deferralTimeoutMs: необов’язковий максимальний час у мс очікування завершення операцій у польоті перед примусовим перезапуском. Пропустіть його або встановіть0, щоб чекати безстроково й періодично журналювати попередження про те, що ще є незавершені операції.
Hooks
{
hooks: {
enabled: true,
token: "shared-secret",
path: "/hooks",
maxBodyBytes: 262144,
defaultSessionKey: "hook:ingress",
allowRequestSessionKey: true,
allowedSessionKeyPrefixes: ["hook:", "hook:gmail:"],
allowedAgentIds: ["hooks", "main"],
presets: ["gmail"],
transformsDir: "~/.openclaw/hooks/transforms",
mappings: [
{
match: { path: "gmail" },
action: "agent",
agentId: "hooks",
wakeMode: "now",
name: "Gmail",
sessionKey: "hook:gmail:{{messages[0].id}}",
messageTemplate: "From: {{messages[0].from}}\nSubject: {{messages[0].subject}}\n{{messages[0].snippet}}",
deliver: true,
channel: "last",
model: "openai/gpt-5.4-mini",
},
],
},
}
Auth: Authorization: Bearer <token> або x-openclaw-token: <token>.
Hook-token у рядку запиту відхиляються.
Примітки щодо валідації та безпеки:
hooks.enabled=trueпотребує непорожньогоhooks.token.hooks.tokenмає відрізнятися відgateway.auth.token; повторне використання token Gateway відхиляється.hooks.pathне може бути/; використовуйте окремий підшлях, наприклад/hooks.- Якщо
hooks.allowRequestSessionKey=true, обмежтеhooks.allowedSessionKeyPrefixes(наприклад["hook:"]). - Якщо mapping або preset використовує шаблонізований
sessionKey, задайтеhooks.allowedSessionKeyPrefixesіhooks.allowRequestSessionKey=true. Статичні ключі mapping не потребують цього явного дозволу.
Кінцеві точки:
POST /hooks/wake→{ text, mode?: "now"|"next-heartbeat" }POST /hooks/agent→{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }sessionKeyіз тіла запиту приймається лише тоді, колиhooks.allowRequestSessionKey=true(типово:false).
POST /hooks/<name>→ визначається черезhooks.mappings- Значення
sessionKeyу mapping, згенеровані через шаблон, вважаються наданими ззовні й також потребуютьhooks.allowRequestSessionKey=true.
- Значення
match.pathвідповідає підшляху після/hooks(наприклад,/hooks/gmail→gmail).match.sourceвідповідає полю payload для узагальнених шляхів.- Шаблони на кшталт
{{messages[0].subject}}читають дані з payload. transformможе вказувати на модуль JS/TS, який повертає дію hook.transform.moduleмає бути відносним шляхом і залишатися в межахhooks.transformsDir(абсолютні шляхи та traversal відхиляються).
agentIdмаршрутизує до конкретного агента; невідомі ID повертаються до типового.allowedAgentIds: обмежує явну маршрутизацію (*або пропущено = дозволити всі,[]= заборонити всі).defaultSessionKey: необов’язковий фіксований ключ сесії для запусків hook-агента без явногоsessionKey.allowRequestSessionKey: дозволяє викликачам/hooks/agentі ключам сесії mapping, керованим шаблонами, задаватиsessionKey(типово:false).allowedSessionKeyPrefixes: необов’язковий список дозволених префіксів для явних значеньsessionKey(запит + mapping), наприклад["hook:"]. Стає обов’язковим, коли будь-який mapping або preset використовує шаблонізованийsessionKey.deliver: trueнадсилає фінальну відповідь у канал;channelтипово має значенняlast.modelперевизначає LLM для цього запуску hook (має бути дозволений, якщо налаштовано каталог моделей).
Інтеграція Gmail
- Вбудований preset Gmail використовує
sessionKey: "hook:gmail:{{messages[0].id}}". - Якщо ви зберігаєте цю маршрутизацію для кожного повідомлення, установіть
hooks.allowRequestSessionKey: trueі обмежтеhooks.allowedSessionKeyPrefixes, щоб вони відповідали простору імен Gmail, наприклад["hook:", "hook:gmail:"]. - Якщо вам потрібен
hooks.allowRequestSessionKey: false, перевизначте preset статичнимsessionKeyзамість типового шаблонізованого значення.
{
hooks: {
gmail: {
account: "openclaw@gmail.com",
topic: "projects/<project-id>/topics/gog-gmail-watch",
subscription: "gog-gmail-watch-push",
pushToken: "shared-push-token",
hookUrl: "http://127.0.0.1:18789/hooks/gmail",
includeBody: true,
maxBytes: 20000,
renewEveryMinutes: 720,
serve: { bind: "127.0.0.1", port: 8788, path: "/" },
tailscale: { mode: "funnel", path: "/gmail-pubsub" },
model: "openrouter/meta-llama/llama-3.3-70b-instruct:free",
thinking: "off",
},
},
}
- Gateway автоматично запускає
gog gmail watch serveпід час старту, якщо його налаштовано. УстановітьOPENCLAW_SKIP_GMAIL_WATCHER=1, щоб вимкнути це. - Не запускайте окремий
gog gmail watch serveпаралельно з Gateway.
Хост Canvas
{
canvasHost: {
root: "~/.openclaw/workspace/canvas",
liveReload: true,
// enabled: false, // or OPENCLAW_SKIP_CANVAS_HOST=1
},
}
- Обслуговує HTML/CSS/JS, редаговані агентом, і A2UI через HTTP на порту Gateway:
http://<gateway-host>:<gateway.port>/__openclaw__/canvas/http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
- Лише локально: залишайте
gateway.bind: "loopback"(типово). - Для bind не на loopback: маршрути canvas потребують auth Gateway (token/password/trusted-proxy), як і інші HTTP-поверхні Gateway.
- Node WebViews зазвичай не надсилають заголовки auth; після pairing і підключення вузла Gateway оголошує URL можливостей із областю вузла для доступу до canvas/A2UI.
- URL можливостей прив’язані до активної WS-сесії вузла й швидко спливають. Fallback на основі IP не використовується.
- Впроваджує клієнт live-reload у HTML, що обслуговується.
- Автоматично створює стартовий
index.html, якщо каталог порожній. - Також обслуговує A2UI за адресою
/__openclaw__/a2ui/. - Зміни потребують перезапуску gateway.
- Вимикайте live reload для великих каталогів або при помилках
EMFILE.
Виявлення
mDNS (Bonjour)
{
discovery: {
mdns: {
mode: "minimal", // minimal | full | off
},
},
}
minimal(типово): не включаєcliPath+sshPortдо записів TXT.full: включаєcliPath+sshPort.- Назва хоста типово
openclaw. Перевизначайте черезOPENCLAW_MDNS_HOSTNAME.
Wide-area (DNS-SD)
{
discovery: {
wideArea: { enabled: true },
},
}
Записує зону unicast DNS-SD у ~/.openclaw/dns/. Для виявлення між мережами поєднуйте з DNS-сервером (рекомендовано CoreDNS) + split DNS Tailscale.
Налаштування: openclaw dns setup --apply.
Середовище
env (вбудовані змінні середовища)
{
env: {
OPENROUTER_API_KEY: "sk-or-...",
vars: {
GROQ_API_KEY: "gsk-...",
},
shellEnv: {
enabled: true,
timeoutMs: 15000,
},
},
}
- Вбудовані змінні середовища застосовуються лише тоді, коли в середовищі процесу бракує ключа.
- Файли
.env:.envпоточного робочого каталогу +~/.openclaw/.env(жоден із них не перевизначає наявні змінні). shellEnv: імпортує відсутні очікувані ключі з профілю вашої оболонки входу.- Див. Environment для повного пріоритету.
Підстановка змінних середовища
Посилайтеся на змінні середовища в будь-якому рядку конфігурації через ${VAR_NAME}:
{
gateway: {
auth: { token: "${OPENCLAW_GATEWAY_TOKEN}" },
},
}
- Зіставляються лише назви у верхньому регістрі:
[A-Z_][A-Z0-9_]*. - Відсутні/порожні змінні спричиняють помилку під час завантаження конфігурації.
- Екрануйте як
$${VAR}для буквального${VAR}. - Працює з
$include.
Секрети
Посилання на секрети є адитивними: звичайні текстові значення також і далі працюють.
SecretRef
Використовуйте одну форму об’єкта:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }
Валідація:
- шаблон
provider:^[a-z][a-z0-9_-]{0,63}$ - шаблон id для
source: "env":^[A-Z][A-Z0-9_]{0,127}$ source: "file"id: абсолютний JSON pointer (наприклад"/providers/openai/apiKey")- шаблон id для
source: "exec":^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$ source: "exec"id не повинні містити сегменти шляху.або.., розділені/(наприклад,a/../bвідхиляється)
Підтримувана поверхня облікових даних
- Канонічна матриця: SecretRef Credential Surface
secrets applyнацілюється на підтримувані шляхи облікових даних уopenclaw.json.- Посилання
auth-profiles.jsonвключено до розв’язання під час виконання та покриття аудиту.
Конфігурація провайдерів секретів
{
secrets: {
providers: {
default: { source: "env" }, // optional explicit env provider
filemain: {
source: "file",
path: "~/.openclaw/secrets.json",
mode: "json",
timeoutMs: 5000,
},
vault: {
source: "exec",
command: "/usr/local/bin/openclaw-vault-resolver",
passEnv: ["PATH", "VAULT_ADDR"],
},
},
defaults: {
env: "default",
file: "filemain",
exec: "vault",
},
},
}
Примітки:
- Провайдер
fileпідтримуєmode: "json"іmode: "singleValue"(у режимі singleValueidмає бути"value"). - Шляхи провайдерів file і exec завершуються fail closed, коли перевірка Windows ACL недоступна. Установлюйте
allowInsecurePath: trueлише для довірених шляхів, які неможливо перевірити. - Провайдер
execвимагає абсолютний шляхcommandі використовує payload протоколу через stdin/stdout. - Типово шляхи команд-символічних посилань відхиляються. Установіть
allowSymlinkCommand: true, щоб дозволити шляхи-символічні посилання з перевіркою шляху розв’язаного цільового файла. - Якщо налаштовано
trustedDirs, перевірка довірених каталогів застосовується до шляху розв’язаної цілі. - Дочірнє середовище
execтипово мінімальне; передавайте потрібні змінні явно черезpassEnv. - Посилання на секрети розв’язуються під час активації в знімок у пам’яті, після чого шляхи запитів читають лише цей знімок.
- Фільтрація активної поверхні застосовується під час активації: нерозв’язані посилання на ввімкнених поверхнях призводять до помилки запуску/перезавантаження, тоді як неактивні поверхні пропускаються з діагностикою.
Сховище auth
{
auth: {
profiles: {
"anthropic:default": { provider: "anthropic", mode: "api_key" },
"anthropic:work": { provider: "anthropic", mode: "api_key" },
"openai-codex:personal": { provider: "openai-codex", mode: "oauth" },
},
order: {
anthropic: ["anthropic:default", "anthropic:work"],
"openai-codex": ["openai-codex:personal"],
},
},
}
- Профілі для кожного агента зберігаються в
<agentDir>/auth-profiles.json. auth-profiles.jsonпідтримує посилання на рівні значень (keyRefдляapi_key,tokenRefдляtoken) для статичних режимів облікових даних.- Профілі режиму OAuth (
auth.profiles.<id>.mode = "oauth") не підтримують облікові дані профілів auth із підтримкою SecretRef. - Статичні облікові дані під час виконання надходять зі знімків, розв’язаних у пам’яті; застарілі статичні записи
auth.jsonочищуються при виявленні. - Застарілі імпорти OAuth беруться з
~/.openclaw/credentials/oauth.json. - Див. OAuth.
- Поведінка секретів під час виконання та інструменти
audit/configure/apply: Secrets Management.
auth.cooldowns
{
auth: {
cooldowns: {
billingBackoffHours: 5,
billingBackoffHoursByProvider: { anthropic: 3, openai: 8 },
billingMaxHours: 24,
authPermanentBackoffMinutes: 10,
authPermanentMaxMinutes: 60,
failureWindowHours: 24,
overloadedProfileRotations: 1,
overloadedBackoffMs: 0,
rateLimitedProfileRotations: 1,
},
},
}
billingBackoffHours: базовий backoff у годинах, коли профіль зазнає невдачі через справжні помилки білінгу/недостатнього кредиту (типово:5). Явний текст про білінг усе ще може потрапити сюди навіть для відповідей401/403, але провайдер-специфічні засоби зіставлення тексту залишаються обмеженими провайдером, якому вони належать (наприклад, OpenRouterKey limit exceeded). Повторювані HTTP402повідомлення про вікно використання або ліміт витрат організації/робочого простору натомість залишаються в шляхуrate_limit.billingBackoffHoursByProvider: необов’язкові перевизначення годин backoff для білінгу на рівні провайдера.billingMaxHours: обмеження в годинах для експоненційного зростання backoff білінгу (типово:24).authPermanentBackoffMinutes: базовий backoff у хвилинах для збоївauth_permanentіз високою впевненістю (типово:10).authPermanentMaxMinutes: обмеження в хвилинах для зростання backoffauth_permanent(типово:60).failureWindowHours: ковзне вікно в годинах, яке використовується для лічильників backoff (типово:24).overloadedProfileRotations: максимальна кількість ротацій auth-профілю в межах того самого провайдера для помилок перевантаження перед переходом до fallback моделі (типово:1). Сюди потрапляють форми на кшталтModelNotReadyException, коли провайдер зайнятий.overloadedBackoffMs: фіксована затримка перед повторною спробою ротації перевантаженого провайдера/профілю (типово:0).rateLimitedProfileRotations: максимальна кількість ротацій auth-профілю в межах того самого провайдера для помилок rate-limit перед переходом до fallback моделі (типово:1). До цього кошика rate-limit входить текст у формах провайдерів, як-отToo many concurrent requests,ThrottlingException,concurrency limit reached,workers_ai ... quota limit exceededіresource exhausted.
Журналювання
{
logging: {
level: "info",
file: "/tmp/openclaw/openclaw.log",
consoleLevel: "info",
consoleStyle: "pretty", // pretty | compact | json
redactSensitive: "tools", // off | tools
redactPatterns: ["\\bTOKEN\\b\\s*[=:]\\s*([\"']?)([^\\s\"']+)\\1"],
},
}
- Типовий файл журналу:
/tmp/openclaw/openclaw-YYYY-MM-DD.log. - Установіть
logging.fileдля стабільного шляху. consoleLevelпідвищується доdebugіз--verbose.maxFileBytes: максимальний розмір файла журналу в байтах, після якого записи пригнічуються (додатне ціле число; типово:524288000= 500 MB). Для production-розгортань використовуйте зовнішню ротацію журналів.
Діагностика
{
diagnostics: {
enabled: true,
flags: ["telegram.*"],
stuckSessionWarnMs: 30000,
otel: {
enabled: false,
endpoint: "https://otel-collector.example.com:4318",
tracesEndpoint: "https://traces.example.com/v1/traces",
metricsEndpoint: "https://metrics.example.com/v1/metrics",
logsEndpoint: "https://logs.example.com/v1/logs",
protocol: "http/protobuf", // http/protobuf | grpc
headers: { "x-tenant-id": "my-org" },
serviceName: "openclaw-gateway",
traces: true,
metrics: true,
logs: false,
sampleRate: 1.0,
flushIntervalMs: 5000,
captureContent: {
enabled: false,
inputMessages: false,
outputMessages: false,
toolInputs: false,
toolOutputs: false,
systemPrompt: false,
},
},
cacheTrace: {
enabled: false,
filePath: "~/.openclaw/logs/cache-trace.jsonl",
includeMessages: true,
includePrompt: true,
includeSystem: true,
},
},
}
enabled: головний перемикач для виводу інструментування (типово:true).flags: масив рядків-прапорців, що вмикають цільовий вивід журналів (підтримує шаблони з підстановками, як-от"telegram.*"або"*").stuckSessionWarnMs: поріг віку в мс для виводу попереджень про завислі сесії, поки сесія залишається в стані обробки.otel.enabled: вмикає конвеєр експорту OpenTelemetry (типово:false). Повну конфігурацію, каталог сигналів і модель конфіденційності див. у OpenTelemetry export.otel.endpoint: URL колектора для експорту OTel.otel.tracesEndpoint/otel.metricsEndpoint/otel.logsEndpoint: необов’язкові OTLP-адреси для окремих сигналів. Якщо задано, вони перевизначаютьotel.endpointлише для відповідного сигналу.otel.protocol:"http/protobuf"(типово) або"grpc".otel.headers: додаткові заголовки метаданих HTTP/gRPC, що надсилаються із запитами експорту OTel.otel.serviceName: назва сервісу для атрибутів ресурсу.otel.traces/otel.metrics/otel.logs: увімкнути експорт trace, metrics або logs.otel.sampleRate: частота семплювання trace0–1.otel.flushIntervalMs: інтервал періодичного скидання telemetry у мс.otel.captureContent: явний дозвіл на захоплення необробленого вмісту для атрибутів span OTEL. Типово вимкнено. Булеве значенняtrueзахоплює вміст повідомлень/інструментів, крім system; форма об’єкта дає змогу явно вмикатиinputMessages,outputMessages,toolInputs,toolOutputsіsystemPrompt.OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental: перемикач середовища для найновіших експериментальних атрибутів провайдера span GenAI. Типово span зберігають застарілий атрибутgen_ai.systemдля сумісності; metrics GenAI використовують обмежені семантичні атрибути.OPENCLAW_OTEL_PRELOADED=1: перемикач середовища для хостів, які вже зареєстрували глобальний SDK OpenTelemetry. Тоді OpenClaw пропускає запуск/завершення SDK, що належить Plugin, але зберігає активними слухачі діагностики.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,OTEL_EXPORTER_OTLP_METRICS_ENDPOINTіOTEL_EXPORTER_OTLP_LOGS_ENDPOINT: змінні середовища адрес для окремих сигналів, які використовуються, коли відповідний ключ конфігурації не задано.cacheTrace.enabled: журналювати знімки трасування кешу для вбудованих запусків (типово:false).cacheTrace.filePath: шлях виводу для JSONL трасування кешу (типово:$OPENCLAW_STATE_DIR/logs/cache-trace.jsonl).cacheTrace.includeMessages/includePrompt/includeSystem: керують тим, що включається до виводу трасування кешу (усі типово:true).
Оновлення
{
update: {
channel: "stable", // stable | beta | dev
checkOnStart: true,
auto: {
enabled: false,
stableDelayHours: 6,
stableJitterHours: 12,
betaCheckIntervalHours: 1,
},
},
}
channel: канал релізів для встановлень npm/git —"stable","beta"або"dev".checkOnStart: перевіряти оновлення npm під час запуску gateway (типово:true).auto.enabled: увімкнути фонове автооновлення для встановлень пакета (типово:false).auto.stableDelayHours: мінімальна затримка в годинах перед автозастосуванням на каналі stable (типово:6; максимум:168).auto.stableJitterHours: додаткове вікно розподілу розгортання для каналу stable в годинах (типово:12; максимум:168).auto.betaCheckIntervalHours: як часто виконуються перевірки каналу beta, у годинах (типово:1; максимум:24).
ACP
{
acp: {
enabled: true,
dispatch: { enabled: true },
backend: "acpx",
defaultAgent: "main",
allowedAgents: ["main", "ops"],
maxConcurrentSessions: 10,
stream: {
coalesceIdleMs: 50,
maxChunkChars: 1000,
repeatSuppression: true,
deliveryMode: "live", // live | final_only
hiddenBoundarySeparator: "paragraph", // none | space | newline | paragraph
maxOutputChars: 50000,
maxSessionUpdateChars: 500,
},
runtime: {
ttlMinutes: 30,
},
},
}
enabled: глобальний feature gate для ACP (типово:true; установітьfalse, щоб приховати можливості dispatch і spawn ACP).dispatch.enabled: незалежний gate для dispatch ходу сесії ACP (типово:true). Установітьfalse, щоб зберегти команди ACP доступними, але заблокувати виконання.backend: типовий ідентифікатор backend середовища виконання ACP (має відповідати зареєстрованому Plugin середовища виконання ACP). Якщо заданоplugins.allow, включіть ідентифікатор Plugin backend (наприкладacpx), інакше bundled Plugin за замовчуванням не завантажиться.defaultAgent: резервний ідентифікатор цільового агента ACP, коли spawn не задають явну ціль.allowedAgents: список дозволених ідентифікаторів агентів для сесій середовища виконання ACP; порожнє значення означає відсутність додаткового обмеження.maxConcurrentSessions: максимальна кількість одночасно активних сесій ACP.stream.coalesceIdleMs: вікно idle-flush у мс для потокового тексту.stream.maxChunkChars: максимальний розмір фрагмента перед розбиттям проєкції потокового блока.stream.repeatSuppression: пригнічувати повторювані рядки status/tool у межах одного ходу (типово:true).stream.deliveryMode:"live"транслює поступово;"final_only"буферизує до термінальних подій ходу.stream.hiddenBoundarySeparator: роздільник перед видимим текстом після прихованих подій tool (типово:"paragraph").stream.maxOutputChars: максимальна кількість символів виводу асистента, що проєктуються за один хід ACP.stream.maxSessionUpdateChars: максимальна кількість символів для проєктованих рядків status/update ACP.stream.tagVisibility: запис назв тегів до булевих перевизначень видимості для потокових подій.runtime.ttlMinutes: idle TTL у хвилинах для worker сесій ACP до можливого очищення.runtime.installCommand: необов’язкова команда встановлення для запуску під час bootstrap середовища виконання ACP.
CLI
{
cli: {
banner: {
taglineMode: "off", // random | default | off
},
},
}
cli.banner.taglineModeкерує стилем підзаголовка banner:"random"(типово): ротаційні кумедні/сезонні підзаголовки."default": фіксований нейтральний підзаголовок (Усі ваші чати, один OpenClaw.)."off": без тексту підзаголовка (назва/версія banner усе ще показуються).
- Щоб приховати весь banner (а не лише підзаголовки), установіть env
OPENCLAW_HIDE_BANNER=1.
Wizard
Метадані, які записуються керованими потоками налаштування CLI (onboard, configure, doctor):
{
wizard: {
lastRunAt: "2026-01-01T00:00:00.000Z",
lastRunVersion: "2026.1.4",
lastRunCommit: "abc1234",
lastRunCommand: "configure",
lastRunMode: "local",
},
}
Ідентичність
Див. поля ідентичності agents.list у Agent defaults.
Bridge (застарілий, вилучений)
Поточні збірки більше не містять TCP bridge. Nodes підключаються через Gateway WebSocket. Ключі bridge.* більше не є частиною схеми конфігурації (валідація завершується помилкою, доки їх не буде видалено; openclaw doctor --fix може прибрати невідомі ключі).
{
"bridge": {
"enabled": true,
"port": 18790,
"bind": "tailnet",
"tls": {
"enabled": true,
"autoGenerate": true
}
}
}
Cron
{
cron: {
enabled: true,
maxConcurrentRuns: 2,
webhook: "https://example.invalid/legacy", // deprecated fallback for stored notify:true jobs
webhookToken: "replace-with-dedicated-token", // optional bearer token for outbound webhook auth
sessionRetention: "24h", // duration string or false
runLog: {
maxBytes: "2mb", // default 2_000_000 bytes
keepLines: 2000, // default 2000
},
},
}
sessionRetention: як довго зберігати завершені ізольовані сесії запусків Cron перед очищенням ізsessions.json. Також керує очищенням архівованих видалених транскриптів Cron. Типово:24h; установітьfalse, щоб вимкнути.runLog.maxBytes: максимальний розмір файла журналу одного запуску (cron/runs/<jobId>.jsonl) перед очищенням. Типово:2_000_000байт.runLog.keepLines: найновіші рядки, що зберігаються при спрацюванні очищення журналу запуску. Типово:2000.webhookToken: bearer token, що використовується для доставки POST Webhook Cron (delivery.mode = "webhook"); якщо пропущено, заголовок auth не надсилається.webhook: застарілий резервний URL Webhook (http/https), який використовується лише для збережених завдань, у яких усе ще єnotify: true.
cron.retry
{
cron: {
retry: {
maxAttempts: 3,
backoffMs: [30000, 60000, 300000],
retryOn: ["rate_limit", "overloaded", "network", "timeout", "server_error"],
},
},
}
maxAttempts: максимальна кількість повторних спроб для одноразових завдань при тимчасових помилках (типово:3; діапазон:0–10).backoffMs: масив затримок backoff у мс для кожної повторної спроби (типово:[30000, 60000, 300000]; 1–10 записів).retryOn: типи помилок, що запускають повторні спроби —"rate_limit","overloaded","network","timeout","server_error". Пропустіть, щоб повторювати всі тимчасові типи.
Застосовується лише до одноразових завдань Cron. Періодичні завдання використовують окрему обробку збоїв.
cron.failureAlert
{
cron: {
failureAlert: {
enabled: false,
after: 3,
cooldownMs: 3600000,
mode: "announce",
accountId: "main",
},
},
}
enabled: увімкнути сповіщення про збої для завдань Cron (типово:false).after: кількість послідовних збоїв перед спрацюванням сповіщення (додатне ціле число, мінімум:1).cooldownMs: мінімальна кількість мілісекунд між повторними сповіщеннями для того самого завдання (невід’ємне ціле число).mode: режим доставки —"announce"надсилає через повідомлення каналу;"webhook"надсилає POST на налаштований Webhook.accountId: необов’язковий ідентифікатор облікового запису або каналу для обмеження доставки сповіщення.
cron.failureDestination
{
cron: {
failureDestination: {
mode: "announce",
channel: "last",
to: "channel:C1234567890",
accountId: "main",
},
},
}
- Типове місце призначення для сповіщень про збої Cron для всіх завдань.
mode:"announce"або"webhook"; типово"announce", коли є достатньо даних цілі.channel: перевизначення каналу для доставки announce."last"повторно використовує останній відомий канал доставки.to: явна ціль announce або URL Webhook. Обов’язкове для режиму webhook.accountId: необов’язкове перевизначення облікового запису для доставки.delivery.failureDestinationдля конкретного завдання перевизначає це глобальне значення за замовчуванням.- Коли не задано ні глобальне, ні індивідуальне місце призначення збою, завдання, які вже доставляють через
announce, у разі збою повертаються до цієї основної цілі announce. delivery.failureDestinationпідтримується лише для завданьsessionTarget="isolated", якщо тільки основнийdelivery.modeзавдання не дорівнює"webhook".
Див. Cron Jobs. Ізольовані виконання Cron відстежуються як background tasks.
Змінні шаблону медіамоделі
Заповнювачі шаблону, що розгортаються в tools.media.models[].args:
| Змінна | Опис |
|---|---|
{{Body}} |
Повний текст вхідного повідомлення |
{{RawBody}} |
Необроблений текст (без обгорток історії/відправника) |
{{BodyStripped}} |
Текст без згадок у групі |
{{From}} |
Ідентифікатор відправника |
{{To}} |
Ідентифікатор призначення |
{{MessageSid}} |
Ідентифікатор повідомлення каналу |
{{SessionId}} |
UUID поточної сесії |
{{IsNewSession}} |
"true", коли створено нову сесію |
{{MediaUrl}} |
Псевдо-URL вхідного медіа |
{{MediaPath}} |
Локальний шлях до медіа |
{{MediaType}} |
Тип медіа (image/audio/document/…) |
{{Transcript}} |
Транскрипт аудіо |
{{Prompt}} |
Розв’язаний prompt медіа для записів CLI |
{{MaxChars}} |
Розв’язана максимальна кількість символів виводу для записів CLI |
{{ChatType}} |
"direct" або "group" |
{{GroupSubject}} |
Назва групи (best effort) |
{{GroupMembers}} |
Попередній перегляд учасників групи (best effort) |
{{SenderName}} |
Відображуване ім’я відправника (best effort) |
{{SenderE164}} |
Номер телефону відправника (best effort) |
{{Provider}} |
Підказка провайдера (whatsapp, telegram, discord тощо) |
Include конфігурації ($include)
Розділяйте конфігурацію на кілька файлів:
// ~/.openclaw/openclaw.json
{
gateway: { port: 18789 },
agents: { $include: "./agents.json5" },
broadcast: {
$include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
},
}
Поведінка злиття:
- Один файл: замінює об’єкт, що його містить.
- Масив файлів: глибоко зливається в порядку (пізніші перевизначають попередні).
- Сусідні ключі: зливаються після include (перевизначають включені значення).
- Вкладені include: до 10 рівнів глибини.
- Шляхи: розв’язуються відносно файла, що включає, але мають залишатися в межах каталогу конфігурації верхнього рівня (
dirnameдляopenclaw.json). Абсолютні форми/../дозволені лише тоді, коли після розв’язання вони все ще залишаються в межах цієї границі. - Записи, керовані OpenClaw, які змінюють лише один розділ верхнього рівня, підкріплений include одного файла, записуються безпосередньо в цей включений файл. Наприклад,
plugins installоновлюєplugins: { $include: "./plugins.json5" }уplugins.json5і залишаєopenclaw.jsonнедоторканим. - Кореневі include, масиви include та include із сусідніми перевизначеннями є лише для читання для записів, керованих OpenClaw; такі записи завершуються fail closed замість сплощення конфігурації.
- Помилки: зрозумілі повідомлення для відсутніх файлів, помилок парсингу та циклічних include.
Пов’язане: Configuration · Configuration Examples · Doctor