快速开始
配置参考
核心配置参考,适用于 ~/.openclaw/openclaw.json。如需面向任务的概览,请参阅 配置。
涵盖主要的 OpenClaw 配置表面,并在某个子系统有自己的更深入参考时链接出去。渠道和插件拥有的命令目录,以及深层记忆/QMD 旋钮,都位于各自页面,而不是此页面。
代码真相:
openclaw config schema会打印用于验证和 Control UI 的实时 JSON Schema;在可用时会合并内置/插件/渠道元数据config.schema.lookup返回一个按路径限定的 schema 节点,供钻取工具使用pnpm config:docs:check/pnpm config:docs:gen会根据当前 schema 表面验证配置文档基线哈希
智能体查找路径:编辑前,使用 gateway 工具动作 config.schema.lookup 获取
精确的字段级文档和约束。使用
配置 查看面向任务的指导,并使用本页面
查看更广泛的字段映射、默认值以及指向子系统参考的链接。
专门的深层参考:
- 记忆配置参考,用于
agents.defaults.memorySearch.*、memory.qmd.*、memory.citations,以及plugins.entries.memory-core.config.dreaming下的 dreaming 配置 - 斜杠命令,用于当前内置 + 捆绑命令目录
- 拥有方渠道/插件页面,用于渠道特定的命令表面
配置格式为 JSON5(允许注释 + 尾随逗号)。所有字段都是可选的 - 省略时 OpenClaw 会使用安全默认值。
渠道
每个渠道的配置键已移至专门页面 - 请参阅
配置 - 渠道,了解 channels.*,
包括 Slack、Discord、Telegram、WhatsApp、Matrix、iMessage 以及其他
内置渠道(凭证、访问控制、多账号、提及门控)。
智能体默认值、多智能体、会话和消息
已移至专门页面 - 请参阅 配置 - 智能体,了解:
agents.defaults.*(工作区、模型、思考、Heartbeat、记忆、媒体、skills、沙箱)multiAgent.*(多智能体路由和绑定)session.*(会话生命周期、压缩、修剪)messages.*(消息投递、TTS、markdown 渲染)talk.*(Talk 模式)talk.speechLocale:可选的 BCP 47 区域设置 ID,用于 iOS/macOS 上的 Talk 语音识别talk.silenceTimeoutMs:未设置时,Talk 会在发送转录稿前保留平台默认暂停窗口(macOS 和 Android 上为 700 ms,iOS 上为 900 ms)
工具和自定义提供商
工具策略、实验性开关、由提供商支持的工具配置,以及自定义 提供商 / base-URL 设置已移至专门页面 - 请参阅 配置 - 工具和自定义提供商。
Models
提供商定义、模型允许列表和自定义提供商设置位于
配置 - 工具和自定义提供商。
models 根也拥有全局模型目录行为。
{
models: {
// Optional. Default: true. Requires a Gateway restart when changed.
pricing: { enabled: false },
},
}
models.mode:提供商目录行为(merge或replace)。models.providers:按提供商 ID 键控的自定义提供商映射。models.pricing.enabled:控制后台定价引导流程,该流程在 sidecar 和渠道进入 Gateway 网关就绪路径后启动。当为false时, Gateway 网关会跳过 OpenRouter 和 LiteLLM 定价目录拉取;已配置的models.providers.*.models[].cost值仍可用于本地成本估算。
MCP
OpenClaw 管理的 MCP 服务器定义位于 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 工具的运行时使用。 远程条目使用transport: "streamable-http"或transport: "sse";type: "http"是 CLI 原生别名,openclaw mcp set和openclaw doctor --fix会将其规范化为标准transport字段。mcp.sessionIdleTtlMs:会话范围内的内置 MCP 运行时的空闲 TTL。 一次性嵌入式运行会请求运行结束清理;此 TTL 是长期会话和未来调用方的兜底机制。mcp.*下的更改会通过释放缓存的会话 MCP 运行时来热应用。 下一次工具发现/使用会根据新配置重新创建它们,因此已移除的mcp.servers条目会立即被回收,而不是等待空闲 TTL。
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:仅用于内置 skills 的可选允许列表(不影响托管/工作区 skills)。load.extraDirs:额外的共享 skill 根(最低优先级)。install.preferBrew:为 true 时,如果brew可用,会先优先使用 Homebrew 安装器,再回退到其他安装器类型。install.nodeManager:metadata.openclaw.install规格的 node 安装器偏好 (npm|pnpm|yarn|bun)。entries.<skillKey>.enabled: false会禁用某个 skill,即使它是内置/已安装的。entries.<skillKey>.apiKey:供声明主环境变量的 skills 使用的便捷项(明文字符串或 SecretRef 对象)。
插件
{
plugins: {
enabled: true,
allow: ["voice-call"],
bundledDiscovery: "allowlist",
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 插件以及兼容的 Codex 包和 Claude 包,包括无清单的 Claude 默认布局包。
- 配置更改需要重启 gateway。
allow:可选允许列表(仅加载列出的插件)。deny优先生效。bundledDiscovery:新配置默认使用"allowlist",因此非空的plugins.allow也会对内置提供商插件生效,包括 Web 搜索 运行时提供商。Doctor 会为迁移后的旧版允许列表 配置写入"compat",以在你选择加入前保留现有内置提供商行为。plugins.entries.<id>.apiKey:插件级 API key 便捷字段(当插件支持时)。plugins.entries.<id>.env:插件范围的环境变量映射。plugins.entries.<id>.hooks.allowPromptInjection:为false时,核心会阻止before_prompt_build,并忽略旧版before_agent_start中会改变提示词的字段,同时保留旧版modelOverride和providerOverride。适用于原生插件钩子和受支持的包提供钩子目录。plugins.entries.<id>.hooks.allowConversationAccess:为true时,受信任的非内置插件可以通过类型化钩子读取原始对话内容,例如llm_input、llm_output、before_model_resolve、before_agent_reply、before_agent_run、before_agent_finalize和agent_end。plugins.entries.<id>.subagent.allowModelOverride:明确信任此插件可为后台 subagent 运行请求每次运行的provider和model覆盖。plugins.entries.<id>.subagent.allowedModels:受信任 subagent 覆盖的标准provider/model目标可选允许列表。仅当你有意允许任何模型时才使用"*"。plugins.entries.<id>.config:插件定义的配置对象(在可用时由原生 OpenClaw 插件 schema 验证)。- 渠道插件账号/运行时设置位于
channels.<id>下,并应由拥有方插件清单的channelConfigs元数据描述,而不是由中央 OpenClaw 选项注册表描述。 plugins.entries.firecrawl.config.webFetch:Firecrawl Web 抓取提供商设置。apiKey:Firecrawl API key(接受 SecretRef)。回退到plugins.entries.firecrawl.config.webSearch.apiKey、旧版tools.web.fetch.firecrawl.apiKey或FIRECRAWL_API_KEY环境变量。baseUrl:Firecrawl API base URL(默认:https://api.firecrawl.dev;自托管覆盖必须指向私有/内部端点)。onlyMainContent:仅从页面提取主要内容(默认:true)。maxAgeMs:最大缓存年龄,单位为毫秒(默认:172800000/ 2 天)。timeoutSeconds:抓取请求超时时间,单位为秒(默认:60)。
plugins.entries.xai.config.xSearch:xAI X Search(Grok Web 搜索)设置。enabled:启用 X Search 提供商。model:用于搜索的 Grok 模型(例如"grok-4-1-fast")。
plugins.entries.memory-core.config.dreaming:记忆 dreaming 设置。参阅 Dreaming 了解阶段和阈值。enabled:dreaming 总开关(默认false)。frequency:每次完整 dreaming 扫描的 cron 节奏(默认"0 3 * * *")。model:可选的 Dream Diary subagent 模型覆盖。需要plugins.entries.memory-core.subagent.allowModelOverride: true;与allowedModels搭配以限制目标。模型不可用错误会使用会话默认模型重试一次;信任或允许列表失败不会静默回退。- 阶段策略和阈值是实现细节(不是面向用户的配置键)。
- 完整记忆配置位于 记忆配置参考:
agents.defaults.memorySearch.*memory.backendmemory.citationsmemory.qmd.*plugins.entries.memory-core.config.dreaming
- 已启用的 Claude 包插件也可以从
settings.json提供嵌入式 Pi 默认值;OpenClaw 会将它们作为经过净化的智能体设置应用,而不是作为原始 OpenClaw 配置补丁。 plugins.slots.memory:选择活动记忆插件 ID,或使用"none"禁用记忆插件。plugins.slots.contextEngine:选择活动上下文引擎插件 ID;默认值为"legacy",除非你安装并选择另一个引擎。
参阅 插件。
跟进承诺
commitments 控制推断式跟进承诺记忆:OpenClaw 可以从对话轮次中检测签到,并通过 Heartbeat 运行投递它们。
commitments.enabled:启用隐藏的 LLM 提取、存储和 Heartbeat 投递,用于推断式跟进承诺。默认值:false。commitments.maxPerDay:滚动日内每个智能体会话投递的最大推断式跟进承诺数。默认值:3。
参阅 推断式跟进承诺。
浏览器
{
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配置显式例外。 - 远程配置文件仅支持附加(禁用启动/停止/重置)。
profiles.*.cdpUrl接受http://、https://、ws://和wss://。当你希望 OpenClaw 发现/json/version时使用 HTTP(S);当你的提供商给出直接的 DevTools WebSocket URL 时使用 WS(S)。remoteCdpTimeoutMs和remoteCdpHandshakeTimeoutMs适用于远程和attachOnlyCDP 可达性以及打开标签页请求。托管的 loopback 配置文件保留本地 CDP 默认值。- 如果外部托管的 CDP 服务可通过 loopback 访问,请将该配置文件的
attachOnly: true;否则 OpenClaw 会把该 loopback 端口视为本地托管的浏览器配置文件,并可能报告本地端口所有权错误。 existing-session配置文件使用 Chrome MCP 而不是 CDP,并且可以在所选主机上或通过已连接的浏览器节点附加。existing-session配置文件可以设置userDataDir,以指向特定的基于 Chromium 的浏览器配置文件,例如 Brave 或 Edge。existing-session配置文件保留当前的 Chrome MCP 路由限制:基于快照/引用驱动的操作,而不是 CSS 选择器定位;单文件上传钩子;无对话框超时覆盖;无wait --load networkidle;并且不支持responsebody、PDF 导出、下载拦截或批量操作。- 本地托管的
openclaw配置文件会自动分配cdpPort和cdpUrl;仅对远程 CDP 显式设置cdpUrl。 - 本地托管配置文件可以设置
executablePath,以覆盖该配置文件的全局browser.executablePath。用它可以让一个配置文件运行 Chrome,另一个运行 Brave。 - 本地托管配置文件在进程启动后使用
browser.localLaunchTimeoutMs进行 Chrome CDP HTTP 发现,并使用browser.localCdpReadyTimeoutMs检查启动后 CDP websocket 就绪状态。在 Chrome 能成功启动但就绪检查与启动过程竞争的较慢主机上提高这些值。两个值都必须是最大为120000毫秒的正整数;无效配置值会被拒绝。 - 自动检测顺序:默认浏览器(如果基于 Chromium)→ Chrome → Brave → Edge → Chromium → Chrome Canary。
browser.executablePath和browser.profiles.<name>.executablePath都接受~和~/...,会在 Chromium 启动前扩展为你的 OS 主目录。existing-session配置文件上的逐配置文件userDataDir也会进行波浪号扩展。- 控制服务:仅 loopback(端口从
gateway.port派生,默认18791)。 extraArgs会向本地 Chromium 启动追加额外启动标志(例如--disable-gpu、窗口大小或调试标志)。
用户界面
{
ui: {
seamColor: "#FF4500",
assistant: {
name: "OpenClaw",
avatar: "CB", // emoji, short text, image URL, or data URI
},
},
}
seamColor:原生应用 UI 边框的强调色(Talk 模式气泡色调等)。assistant:控制 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
// chatMessageMaxWidth: "min(1280px, 82%)", // optional grouped chat message max-width
// 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,
},
},
},
},
}
Gateway 网关字段详情
mode:local(运行 Gateway 网关)或remote(连接到远程 Gateway 网关)。除非为local,否则 Gateway 网关会拒绝启动。port:WS + HTTP 的单个复用端口。优先级:--port>OPENCLAW_GATEWAY_PORT>gateway.port>18789。bind:auto、loopback(默认)、lan(0.0.0.0)、tailnet(仅 Tailscale IP)或custom。- 旧版绑定别名:在
gateway.bind中使用绑定模式值(auto、loopback、lan、tailnet、custom),不要使用主机别名(0.0.0.0、127.0.0.1、localhost、::、::1)。 - Docker 注意事项:默认的
loopback绑定会监听容器内的127.0.0.1。使用 Docker 桥接网络(-p 18789:18789)时,流量会从eth0进入,因此 Gateway 网关无法访问。使用--network host,或设置bind: "lan"(或使用bind: "custom"并设置customBindHost: "0.0.0.0")以监听所有接口。 - 凭证:默认必需。非 loopback 绑定需要 Gateway 网关凭证。实际使用中,这意味着共享令牌/密码,或带
gateway.auth.mode: "trusted-proxy"的身份感知反向代理。新手引导向导默认会生成令牌。 - 如果同时配置了
gateway.auth.token和gateway.auth.password(包括 SecretRefs),请将gateway.auth.mode显式设置为token或password。当两者都已配置且模式未设置时,启动和服务安装/修复流程会失败。 gateway.auth.mode: "none":显式无凭证模式。仅用于受信任的 local loopback 设置;新手引导提示刻意不提供此模式。gateway.auth.mode: "trusted-proxy":将浏览器/用户凭证委托给身份感知反向代理,并信任来自gateway.trustedProxies的身份标头(参见 Trusted Proxy Auth)。此模式默认预期使用非 loopback代理来源;同主机 loopback 反向代理需要显式设置gateway.auth.trustedProxy.allowLoopback = true。内部同主机调用方可使用gateway.auth.password作为本地直连回退;gateway.auth.token仍与 trusted-proxy 模式互斥。gateway.auth.allowTailscale:为true时,Tailscale Serve 身份标头可满足 Control UI/WebSocket 凭证要求(通过tailscale whois验证)。HTTP API 端点不会使用该 Tailscale 标头凭证;它们改为遵循 Gateway 网关的常规 HTTP 凭证模式。此无令牌流程假定 Gateway 网关主机可信。tailscale.mode = "serve"时默认为true。gateway.auth.rateLimit:可选的凭证失败限制器。按客户端 IP 和凭证范围应用(shared-secret 和 device-token 会独立跟踪)。被阻止的尝试会返回429+Retry-After。- 在异步 Tailscale Serve Control UI 路径上,同一
{scope, clientIp}的失败尝试会在写入失败响应之前串行化。因此,来自同一客户端的并发错误尝试可能会在第二个请求触发限制器,而不是两者都作为普通不匹配并发通过。 gateway.auth.rateLimit.exemptLoopback默认为true;如果你有意也要对 localhost 流量限速(用于测试设置或严格代理部署),请设为false。- 浏览器来源的 WS 凭证尝试始终会被节流,并禁用 loopback 豁免(针对基于浏览器的 localhost 暴力破解提供纵深防御)。
- 在 loopback 上,这些浏览器来源锁定会按规范化后的
Origin值隔离,因此一个 localhost 来源的重复失败不会自动 锁定另一个来源。 tailscale.mode:serve(仅 tailnet,loopback 绑定)或funnel(公开,需要凭证)。controlUi.allowedOrigins:Gateway 网关 WebSocket 连接的显式浏览器来源允许列表。当预期浏览器客户端来自非 loopback 来源时必需。controlUi.chatMessageMaxWidth:分组 Control UI 聊天消息的可选最大宽度。接受受约束的 CSS 宽度值,例如960px、82%、min(1280px, 82%)和calc(100% - 2rem)。controlUi.dangerouslyAllowHostHeaderOriginFallback:危险模式,为有意依赖 Host 标头来源策略的部署启用 Host 标头来源回退。remote.transport:ssh(默认)或direct(ws/wss)。对于direct,remote.url必须是ws://或wss://。OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1:客户端进程环境中的 破窗覆盖项,允许对受信任的私有网络 IP 使用明文ws://;明文默认仍仅允许 loopback。没有对应的openclaw.json配置,且浏览器私有网络配置(例如browser.ssrfPolicy.dangerouslyAllowPrivateNetwork)不会影响 Gateway 网关 WebSocket 客户端。gateway.remote.token/.password是远程客户端凭证字段。它们本身不会配置 Gateway 网关凭证。gateway.push.apns.relay.baseUrl:外部 APNs 中继的 HTTPS 基础 URL,官方/TestFlight iOS 构建在将基于中继的注册发布到 Gateway 网关后会使用它。此 URL 必须与编译进 iOS 构建的中继 URL 匹配。gateway.push.apns.relay.timeoutMs:Gateway 网关到中继的发送超时,单位为毫秒。默认为10000。- 基于中继的注册会委托给特定的 Gateway 网关身份。配对的 iOS 应用会获取
gateway.identity.get,在中继注册中包含该身份,并将注册范围的发送授权转发给 Gateway 网关。另一个 Gateway 网关不能复用该已存储注册。 OPENCLAW_APNS_RELAY_BASE_URL/OPENCLAW_APNS_RELAY_TIMEOUT_MS:上述中继配置的临时环境变量覆盖项。OPENCLAW_APNS_RELAY_ALLOW_HTTP=true:仅限开发使用的逃生口,用于 loopback HTTP 中继 URL。生产中继 URL 应保持使用 HTTPS。gateway.handshakeTimeoutMs:预凭证 Gateway 网关 WebSocket 握手超时,单位为毫秒。默认值:15000。设置后,OPENCLAW_HANDSHAKE_TIMEOUT_MS优先。对于负载较高或低功耗主机,如果本地客户端可连接但启动预热仍在稳定中,请增大此值。gateway.channelHealthCheckMinutes:渠道健康监视器间隔,单位为分钟。设为0可全局禁用健康监视器重启。默认值:5。gateway.channelStaleEventThresholdMinutes:陈旧套接字阈值,单位为分钟。保持大于或等于gateway.channelHealthCheckMinutes。默认值:30。gateway.channelMaxRestartsPerHour:每个渠道/账户在滚动一小时内的健康监视器最大重启次数。默认值:10。channels.<provider>.healthMonitor.enabled:按渠道选择退出健康监视器重启,同时保持全局监视器启用。channels.<provider>.accounts.<accountId>.healthMonitor.enabled:多账户渠道的按账户覆盖项。设置后,它会优先于渠道级覆盖项。- 仅当
gateway.auth.*未设置时,本地 Gateway 网关调用路径才能使用gateway.remote.*作为回退。 - 如果
gateway.auth.token/gateway.auth.password通过 SecretRef 显式配置但未解析,则解析会失败关闭(不会用远程回退掩盖)。 trustedProxies:终止 TLS 或注入转发客户端标头的反向代理 IP。只列出你控制的代理。loopback 条目对同主机代理/本地检测设置仍然有效(例如 Tailscale Serve 或本地反向代理),但它们不会让 loopback 请求符合gateway.auth.mode: "trusted-proxy"的条件。allowRealIpFallback:为true时,如果缺少X-Forwarded-For,Gateway 网关会接受X-Real-IP。默认值为false,用于失败关闭行为。gateway.nodes.pairing.autoApproveCidrs:可选的 CIDR/IP 允许列表,用于自动批准首次节点设备配对,且没有请求的范围。未设置时禁用。这不会自动批准操作员/浏览器/Control UI/WebChat 配对,也不会自动批准角色、范围、元数据或公钥升级。gateway.nodes.allowCommands/gateway.nodes.denyCommands:在配对和平台允许列表评估之后,对已声明节点命令进行全局允许/拒绝整形。使用allowCommands选择启用危险节点命令,例如camera.snap、camera.clip和screen.record;即使平台默认值或显式允许本应包含某个命令,denyCommands也会移除它。节点更改其声明的命令列表后,请拒绝并重新批准该设备配对,以便 Gateway 网关存储更新后的命令快照。gateway.tools.deny:针对 HTTPPOST /tools/invoke阻止的额外工具名称(扩展默认拒绝列表)。gateway.tools.allow:从默认 HTTP 拒绝列表中移除工具名称。
OpenAI 兼容端点
- Chat Completions:默认禁用。使用
gateway.http.endpoints.chatCompletions.enabled: true启用。 - Responses API:
gateway.http.endpoints.responses.enabled。 - Responses URL 输入加固:
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 来源设置;参见 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>)。
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:在 Gateway 网关监听器处启用 TLS 终止(HTTPS/WSS)(默认值:false)。autoGenerate:当未配置显式文件时,自动生成本地自签名证书/密钥对;仅用于本地/开发。certPath:TLS 证书文件的文件系统路径。keyPath:TLS 私钥文件的文件系统路径;请保持权限受限。caPath:用于客户端验证或自定义信任链的可选 CA bundle 路径。
gateway.reload
{
gateway: {
reload: {
mode: "hybrid", // off | restart | hot | hybrid
debounceMs: 500,
deferralTimeoutMs: 300000,
},
},
}
mode:控制配置编辑如何在运行时应用。"off":忽略实时编辑;更改需要显式重启。"restart":配置更改时始终重启 Gateway 网关进程。"hot":在进程内应用更改,无需重启。"hybrid"(默认):先尝试热重载;如有需要则回退到重启。
debounceMs:配置更改应用前的防抖窗口,单位为毫秒(非负整数)。deferralTimeoutMs:在强制重启或渠道热重载之前,等待进行中操作的可选最长时间,单位为毫秒。省略它以使用默认的有界等待(300000);设为0可无限期等待,并定期记录仍在等待的警告。
钩子
{
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",
},
],
},
}
认证:Authorization: Bearer <token> 或 x-openclaw-token: <token>。
查询字符串 hook 令牌会被拒绝。
验证与安全注意事项:
hooks.enabled=true需要非空的hooks.token。hooks.token必须与gateway.auth.token不同;复用 Gateway 网关令牌会被拒绝。hooks.path不能是/;请使用专用子路径,例如/hooks。- 如果
hooks.allowRequestSessionKey=true,请限制hooks.allowedSessionKeyPrefixes(例如["hook:"])。 - 如果映射或预设使用模板化的
sessionKey,请设置hooks.allowedSessionKeyPrefixes和hooks.allowRequestSessionKey=true。静态映射键不需要该选择加入。
端点:
POST /hooks/wake→{ text, mode?: "now"|"next-heartbeat" }POST /hooks/agent→{ message, name?, agentId?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }- 只有在
hooks.allowRequestSessionKey=true(默认值:false)时,才接受请求负载中的sessionKey。
- 只有在
POST /hooks/<name>→ 通过hooks.mappings解析- 模板渲染的映射
sessionKey值会被视为外部提供,也需要hooks.allowRequestSessionKey=true。
- 模板渲染的映射
映射详情
match.path匹配/hooks之后的子路径(例如/hooks/gmail→gmail)。match.source匹配通用路径的负载字段。- 类似
{{messages[0].subject}}的模板会从负载中读取。 transform可以指向返回 hook 动作的 JS/TS 模块。transform.module必须是相对路径,并保持在hooks.transformsDir内(绝对路径和路径穿越会被拒绝)。- 将
hooks.transformsDir保持在~/.openclaw/hooks/transforms下;工作区 Skills 目录会被拒绝。如果openclaw doctor报告此路径无效,请将 transform 模块移入 hooks transforms 目录,或移除hooks.transformsDir。 agentId路由到特定智能体;未知 ID 会回退到默认值。allowedAgentIds:限制显式路由(*或省略 = 允许全部,[]= 拒绝全部)。defaultSessionKey:可选的固定会话键,用于没有显式sessionKey的 hook 智能体运行。allowRequestSessionKey:允许/hooks/agent调用方和模板驱动的映射会话键设置sessionKey(默认值:false)。allowedSessionKeyPrefixes:显式sessionKey值(请求 + 映射)的可选前缀允许列表,例如["hook:"]。当任何映射或预设使用模板化的sessionKey时,它会变为必需项。deliver: true会将最终回复发送到某个渠道;channel默认值为last。model会覆盖本次 hook 运行的 LLM(如果设置了模型目录,则必须被允许)。
Gmail 集成
- 内置 Gmail 预设使用
sessionKey: "hook:gmail:{{messages[0].id}}"。 - 如果你保留这种逐消息路由,请设置
hooks.allowRequestSessionKey: true,并限制hooks.allowedSessionKeyPrefixes以匹配 Gmail 命名空间,例如["hook:", "hook:gmail:"]。 - 如果你需要
hooks.allowRequestSessionKey: false,请用静态sessionKey覆盖该预设,而不是使用模板化默认值。
{
hooks: {
gmail: {
account: "[email protected]",
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可禁用。 - 不要在 Gateway 网关旁边单独运行
gog gmail watch serve。
Canvas 插件主机
{
plugins: {
entries: {
canvas: {
config: {
host: {
root: "~/.openclaw/workspace/canvas",
liveReload: true,
// enabled: false, // or OPENCLAW_SKIP_CANVAS_HOST=1
},
},
},
},
},
}
- 在 Gateway 网关端口下通过 HTTP 提供智能体可编辑的 HTML/CSS/JS 和 A2UI:
http://<gateway-host>:<gateway.port>/__openclaw__/canvas/http://<gateway-host>:<gateway.port>/__openclaw__/a2ui/
- 仅限本地:保持
gateway.bind: "loopback"(默认值)。 - 非 loopback 绑定:canvas 路由需要 Gateway 网关认证(令牌/密码/可信代理),与其他 Gateway 网关 HTTP 表面相同。
- Node WebViews 通常不会发送认证标头;节点配对并连接后,Gateway 网关会通告用于 canvas/A2UI 访问的节点范围能力 URL。
- 能力 URL 绑定到活动的节点 WS 会话,并且很快过期。不会使用基于 IP 的回退。
- 将实时重载客户端注入到提供的 HTML 中。
- 为空时自动创建入门
index.html。 - 也在
/__openclaw__/a2ui/提供 A2UI。 - 更改需要重启 Gateway 网关。
- 对于大型目录或
EMFILE错误,请禁用实时重载。
设备发现
mDNS (Bonjour)
{
discovery: {
mdns: {
mode: "minimal", // minimal | full | off
},
},
}
minimal(启用内置bonjour插件时的默认值):从 TXT 记录中省略cliPath+sshPort。full:包含cliPath+sshPort;LAN 组播通告仍需要启用内置bonjour插件。off:在不更改插件启用状态的情况下禁止 LAN 组播通告。- 内置
bonjour插件会在 macOS 主机上自动启动,在 Linux、Windows 和容器化 Gateway 网关部署上需要选择加入。 - 当系统主机名是有效 DNS 标签时,主机名默认使用系统主机名,否则回退到
openclaw。使用OPENCLAW_MDNS_HOSTNAME覆盖。
广域(DNS-SD)
{
discovery: {
wideArea: { enabled: true },
},
}
在 ~/.openclaw/dns/ 下写入单播 DNS-SD 区域。对于跨网络设备发现,请搭配 DNS 服务器(推荐 CoreDNS)+ Tailscale 拆分 DNS 使用。
设置:openclaw dns setup --apply。
环境
env(内联环境变量)
{
env: {
OPENROUTER_API_KEY: "sk-or-...",
vars: {
GROQ_API_KEY: "gsk-...",
},
shellEnv: {
enabled: true,
timeoutMs: 15000,
},
},
}
- 只有在进程环境缺少对应键时,才会应用内联环境变量。
.env文件:CWD.env+~/.openclaw/.env(两者都不会覆盖现有变量)。shellEnv:从你的登录 shell 配置文件导入缺失的预期键名。- 查看 环境 了解完整优先级。
环境变量替换
在任意配置字符串中用 ${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}$source: "env"id 模式:^[A-Z][A-Z0-9_]{0,127}$source: "file"id:绝对 JSON 指针(例如"/providers/openai/apiKey")source: "exec"id 模式:^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$source: "exec"id 不能包含.或..这类以斜杠分隔的路径段(例如a/../b会被拒绝)
支持的凭证范围
- 规范矩阵:SecretRef 凭证范围
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",
},
},
}
说明:
fileprovider 支持mode: "json"和mode: "singleValue"(在 singleValue 模式下,id必须是"value")。- 当 Windows ACL 校验不可用时,file 和 exec provider 路径会按失败关闭处理。仅对无法校验但可信的路径设置
allowInsecurePath: true。 execprovider 要求command使用绝对路径,并通过 stdin/stdout 使用协议载荷。- 默认会拒绝符号链接命令路径。设置
allowSymlinkCommand: true可允许符号链接路径,同时校验解析后的目标路径。 - 如果配置了
trustedDirs,可信目录检查会应用于解析后的目标路径。 exec子进程环境默认是最小化的;用passEnv显式传递所需变量。- 密钥引用会在激活时解析为内存中的快照,随后请求路径只读取该快照。
- 激活期间会应用活动表面过滤:已启用表面上未解析的引用会导致启动或重新加载失败,而非活动表面会被跳过并给出诊断。
凭证存储
{
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支持值级引用(静态凭证模式下,api_key使用keyRef,token使用tokenRef)。- 旧版扁平
auth-profiles.json映射(例如{ "provider": { "apiKey": "..." } })不是运行时格式;openclaw doctor --fix会将其重写为规范的provider:defaultAPI-key 配置档,并生成.legacy-flat.*.bak备份。 - OAuth 模式配置档(
auth.profiles.<id>.mode = "oauth")不支持由 SecretRef 支持的 auth-profile 凭证。 - 静态运行时凭证来自内存中已解析的快照;发现旧版静态
auth.json条目时会清除它们。 - 旧版 OAuth 从
~/.openclaw/credentials/oauth.json导入。 - 参见 OAuth。
- 密钥运行时行为和
audit/configure/apply工具:密钥管理。
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:当某个配置档因真实的账单/余额不足错误失败时,以小时为单位的基础退避时间(默认:5)。明确的账单文本即使出现在401/403响应中,仍可能归入这里,但特定提供商的文本匹配器仍限定在拥有它们的提供商范围内(例如 OpenRouter 的Key limit exceeded)。可重试的 HTTP402使用窗口或组织/工作区消费限额消息则继续走rate_limit路径。billingBackoffHoursByProvider:可选的按提供商覆盖账单退避小时数。billingMaxHours:账单退避指数增长的小时上限(默认:24)。authPermanentBackoffMinutes:高置信度auth_permanent失败的基础退避分钟数(默认:10)。authPermanentMaxMinutes:auth_permanent退避增长的分钟上限(默认:60)。failureWindowHours:用于退避计数器的滚动窗口小时数(默认:24)。overloadedProfileRotations:在切换到模型回退之前,针对过载错误最多进行的同提供商 auth-profile 轮换次数(默认:1)。诸如ModelNotReadyException这样的提供商繁忙形态会归入这里。overloadedBackoffMs:重试过载的提供商/配置档轮换前的固定延迟(默认:0)。rateLimitedProfileRotations:在切换到模型回退之前,针对速率限制错误最多进行的同提供商 auth-profile 轮换次数(默认:1)。该速率限制桶包括提供商形态的文本,例如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可使用稳定路径。 - 使用
--verbose时,consoleLevel会提升为debug。 maxFileBytes:轮转前活动日志文件的最大字节数(正整数;默认:104857600= 100 MB)。OpenClaw 会在活动文件旁保留最多五个编号归档。redactSensitive/redactPatterns:对控制台输出、文件日志、OTLP 日志记录和持久化的会话转录文本进行尽力遮盖。redactSensitive: "off"只会禁用这项通用日志/转录策略;UI/工具/诊断安全表面在发出前仍会遮盖密钥。
诊断
{
diagnostics: {
enabled: true,
flags: ["telegram.*"],
stuckSessionWarnMs: 30000,
stuckSessionAbortMs: 600000,
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:用于将长时间运行的处理会话分类为session.long_running、session.stalled或session.stuck的无进展时长阈值,单位为 ms。回复、工具、Status、分块和 ACP 进度会重置计时器;重复的session.stuck诊断在未变化时会退避。stuckSessionAbortMs:符合条件的停滞活动工作在为恢复而中止排空前的无进展时长阈值,单位为 ms。未设置时,OpenClaw 使用更安全的扩展嵌入运行窗口,即至少 10 分钟且为stuckSessionWarnMs的 5 倍。otel.enabled:启用 OpenTelemetry 导出管道(默认:false)。完整配置、信号目录和隐私模型见 OpenTelemetry 导出。otel.endpoint:用于 OTel 导出的收集器 URL。otel.tracesEndpoint/otel.metricsEndpoint/otel.logsEndpoint:可选的特定信号 OTLP 端点。设置后,它们只会覆盖该信号的otel.endpoint。otel.protocol:"http/protobuf"(默认)或"grpc"。otel.headers:随 OTel 导出请求发送的额外 HTTP/gRPC 元数据头。otel.serviceName:资源属性的服务名称。otel.traces/otel.metrics/otel.logs:启用 trace、metrics 或 log 导出。otel.sampleRate:trace 采样率0-1。otel.flushIntervalMs:周期性遥测刷新间隔,单位为 ms。otel.captureContent:选择启用 OTEL span 属性的原始内容捕获。默认为关闭。布尔值true会捕获非系统消息/工具内容;对象形式允许你显式启用inputMessages、outputMessages、toolInputs、toolOutputs和systemPrompt。OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental:用于最新实验性 GenAI span 提供商属性的环境开关。默认情况下,为兼容性,span 保留旧版gen_ai.system属性;GenAI metrics 使用有界语义属性。OPENCLAW_OTEL_PRELOADED=1:用于已注册全局 OpenTelemetry SDK 的主机的环境开关。随后 OpenClaw 会跳过插件拥有的 SDK 启动/关闭,同时保持诊断监听器活动。OTEL_EXPORTER_OTLP_TRACES_ENDPOINT、OTEL_EXPORTER_OTLP_METRICS_ENDPOINT和OTEL_EXPORTER_OTLP_LOGS_ENDPOINT:当匹配的配置键未设置时使用的特定信号端点环境变量。cacheTrace.enabled:为嵌入式运行记录缓存 trace 快照(默认:false)。cacheTrace.filePath:缓存 trace JSONL 的输出路径(默认:$OPENCLAW_STATE_DIR/logs/cache-trace.jsonl)。cacheTrace.includeMessages/includePrompt/includeSystem:控制缓存 trace 输出中包含的内容(全部默认:true)。
更新
{
update: {
channel: "stable", // stable | beta | dev
checkOnStart: true,
auto: {
enabled: false,
stableDelayHours: 6,
stableJitterHours: 12,
betaCheckIntervalHours: 1,
},
},
}
channel:npm/git 安装的发布渠道 -"stable"、"beta"或"dev"。checkOnStart:Gateway 网关启动时检查 npm 更新(默认: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:全局 ACP 功能门控(默认:true;设为false可隐藏 ACP 分发和生成入口)。dispatch.enabled:ACP 会话轮次分发的独立门控(默认:true)。设为false可保留 ACP 命令可用,同时阻止执行。backend:默认 ACP 运行时后端 ID(必须匹配已注册的 ACP 运行时插件)。 先安装后端插件,并且如果设置了plugins.allow,请包含后端插件 ID(例如acpx),否则 ACP 后端不会加载。defaultAgent:当生成未指定显式目标时的回退 ACP 目标智能体 ID。allowedAgents:允许用于 ACP 运行时会话的智能体 ID 允许列表;为空表示没有额外限制。maxConcurrentSessions:最大并发活动 ACP 会话数。stream.coalesceIdleMs:流式传输文本的空闲刷新窗口,单位为 ms。stream.maxChunkChars:拆分流式传输块投影前的最大块大小。stream.repeatSuppression:按轮次抑制重复的 Status/工具行(默认:true)。stream.deliveryMode:"live"增量流式传输;"final_only"缓冲到轮次终止事件。stream.hiddenBoundarySeparator:隐藏工具事件后、可见文本前的分隔符(默认:"paragraph")。stream.maxOutputChars:每个 ACP 轮次投影的最大助手输出字符数。stream.maxSessionUpdateChars:投影 ACP Status/update 行的最大字符数。stream.tagVisibility:标记名称到流式传输事件布尔可见性覆盖的记录。runtime.ttlMinutes:ACP 会话工作进程符合清理条件前的空闲 TTL,单位为分钟。runtime.installCommand:引导 ACP 运行时环境时运行的可选安装命令。
CLI
{
cli: {
banner: {
taglineMode: "off", // random | default | off
},
},
}
cli.banner.taglineMode控制横幅标语样式:"random"(默认):轮换有趣/季节性标语。"default":固定的中性标语(All your chats, one OpenClaw.)。"off":无标语文本(仍显示横幅标题/版本)。
- 要隐藏整个横幅(而不只是标语),请设置环境变量
OPENCLAW_HIDE_BANNER=1。
向导
CLI 引导式设置流程(onboard、configure、doctor)写入的元数据:
{
wizard: {
lastRunAt: "2026-01-01T00:00:00.000Z",
lastRunVersion: "2026.1.4",
lastRunCommit: "abc1234",
lastRunCommand: "configure",
lastRunMode: "local",
},
}
身份
参见 智能体默认值 下的 agents.list 身份字段。
Bridge(旧版,已移除)
当前构建不再包含 TCP bridge。节点通过 Gateway 网关 WebSocket 连接。bridge.* 键不再是配置 schema 的一部分(验证会失败,直到移除它们;openclaw doctor --fix 可以删除未知键)。
旧版 bridge 配置(历史参考)
{
"bridge": {
"enabled": true,
"port": 18790,
"bind": "tailnet",
"tls": {
"enabled": true,
"autoGenerate": true
}
}
}
Cron
{
cron: {
enabled: true,
maxConcurrentRuns: 2, // cron dispatch + isolated cron agent-turn execution
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:在从sessions.json剪除前,已完成的隔离 cron 运行会话保留多久。还控制已归档、已删除 cron 转录的清理。默认值:24h;设置为false可禁用。runLog.maxBytes:每个运行日志文件(cron/runs/<jobId>.jsonl)在剪除前的最大大小。默认值:2_000_000字节。runLog.keepLines:触发运行日志剪除时保留的最新行数。默认值:2000。webhookToken:用于 cron webhook POST 投递(delivery.mode = "webhook")的 bearer token;如果省略,则不发送认证标头。webhook:已弃用的旧版回退 webhook URL(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:每次重试尝试的退避延迟数组,单位为 ms(默认值:[30000, 60000, 300000];1-10 项)。retryOn:触发重试的错误类型 -"rate_limit"、"overloaded"、"network"、"timeout"、"server_error"。省略时会重试所有瞬时类型。
仅适用于一次性 cron 作业。重复作业使用单独的失败处理。
cron.failureAlert
{
cron: {
failureAlert: {
enabled: false,
after: 3,
cooldownMs: 3600000,
includeSkipped: false,
mode: "announce",
accountId: "main",
},
},
}
enabled:启用 cron 作业失败提醒(默认值:false)。after:触发提醒前的连续失败次数(正整数,最小值:1)。cooldownMs:同一作业重复提醒之间的最小毫秒数(非负整数)。includeSkipped:将连续跳过的运行计入提醒阈值(默认值:false)。跳过的运行会单独跟踪,不影响执行错误退避。mode:投递模式 -"announce"通过渠道消息发送;"webhook"发布到配置的 webhook。accountId:用于限定提醒投递范围的可选账户或渠道 id。
cron.failureDestination
{
cron: {
failureDestination: {
mode: "announce",
channel: "last",
to: "channel:C1234567890",
accountId: "main",
},
},
}
- 所有作业 cron 失败通知的默认目标位置。
mode:"announce"或"webhook";当存在足够目标数据时默认为"announce"。channel:announce 投递的渠道覆盖项。"last"会复用最后一个已知投递渠道。to:显式 announce 目标或 webhook URL。webhook 模式必填。accountId:投递的可选账户覆盖项。- 每个作业的
delivery.failureDestination会覆盖此全局默认值。 - 当既未设置全局失败目标,也未设置每作业失败目标时,已经通过
announce投递的作业会在失败时回退到该主要 announce 目标。 delivery.failureDestination仅支持sessionTarget="isolated"作业,除非该作业的主要delivery.mode是"webhook"。
参见 Cron 作业。隔离 cron 执行会作为后台任务跟踪。
媒体模型模板变量
在 tools.media.models[].args 中展开的模板占位符:
| 变量 | 描述 |
|---|---|
{{Body}} |
完整入站消息正文 |
{{RawBody}} |
原始正文(无历史/发送者包装) |
{{BodyStripped}} |
已移除群组提及的正文 |
{{From}} |
发送者标识符 |
{{To}} |
目标标识符 |
{{MessageSid}} |
渠道消息 id |
{{SessionId}} |
当前会话 UUID |
{{IsNewSession}} |
创建新会话时为 "true" |
{{MediaUrl}} |
入站媒体伪 URL |
{{MediaPath}} |
本地媒体路径 |
{{MediaType}} |
媒体类型(image/audio/document/…) |
{{Transcript}} |
音频转录 |
{{Prompt}} |
CLI 条目的已解析媒体提示词 |
{{MaxChars}} |
CLI 条目的已解析最大输出字符数 |
{{ChatType}} |
"direct" 或 "group" |
{{GroupSubject}} |
群组主题(尽力获取) |
{{GroupMembers}} |
群组成员预览(尽力获取) |
{{SenderName}} |
发送者显示名称(尽力获取) |
{{SenderE164}} |
发送者电话号码(尽力获取) |
{{Provider}} |
提供商提示(whatsapp、telegram、discord 等) |
配置包含($include)
将配置拆分到多个文件:
// ~/.openclaw/openclaw.json
{
gateway: { port: 18789 },
agents: { $include: "./agents.json5" },
broadcast: {
$include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
},
}
合并行为:
- 单个文件:替换包含它的对象。
- 文件数组:按顺序深度合并(后面的覆盖前面的)。
- 同级键:在 include 之后合并(覆盖已包含的值)。
- 嵌套 include:最多深入 10 层。
- 路径:相对于包含它的文件解析,但必须留在顶层配置目录(
openclaw.json的dirname)内。绝对路径/../形式只有在仍解析到该边界内时才允许。 - 仅更改单个顶层区段且该区段由单文件 include 支撑的 OpenClaw 所有写入,会透传写入该被包含文件。例如,
plugins install会更新plugins.json5中的plugins: { $include: "./plugins.json5" },并保持openclaw.json不变。 - 根 include、include 数组,以及带同级覆盖项的 include 对 OpenClaw 所有写入是只读的;这些写入会失败关闭,而不是扁平化配置。
- 错误:对缺失文件、解析错误和循环 include 提供清晰消息。