乐于分享
好东西不私藏

OpenClaw 实战:openclaw.json 的 14 个模块,我踩过的坑都在这了

OpenClaw 实战:openclaw.json 的 14 个模块,我踩过的坑都在这了

OpenClaw 实战:openclaw.json 的 14 个模块,我踩过的坑都在这了

折腾 OpenClaw 这段时间,配置文件是我花最多时间的地方。

一开始我以为就一个 JSON 文件,照着示例填填 API Key 就行。结果跑起来各种报错——模型不认、工具调用不了、飞书消息收不到、网关连不上……排查半天,最后发现是 JSON 格式错了、Key 引用方式不对、或者模块之间互相依赖搞混了。

这篇文章把我踩过的坑、踩过的雷、以及现在的稳定配置写法全列出来。纯实战经验,希望能帮你少走弯路。

配置文件长什么样?

在 ~/.openclaw/ 目录下有一个 openclaw.json,这就是 OpenClaw 的核心配置文件。它把所有配置拆成了 14 个模块,每个模块管一块。

先看整体结构,知道有什么:

├── auth          认证配置(API Key 等)├── models        模型配置(提供商、API 地址、模型列表)├── agents        智能体配置(默认模型、工作区、会话)├── tools         工具配置(启用/禁用哪些工具)├── channels      渠道配置(飞书、企业微信等)├── gateway       网关配置(端口、访问控制)├── session       会话配置(生命周期、超时)├── hooks         自动化配置(定时任务等)├── bindings      多路由配置(消息分流到不同 Agent)├── plugins       插件配置├── skills        技能配置├── env           环境变量(敏感信息存储)├── logging       日志配置├── messages      消息行为配置└── commands      斜杠命令配置

我的做法:不用一次把所有模块都配上。先配最关键的三个——authmodelsagents,先把 Agent 跑起来,再按需逐个添加其他模块。


1. auth 模块:API Key 怎么放最安全

这个模块管所有外部服务的 API Key 认证信息。

常见错误:直接在 JSON 里写明文 Key。

{  "auth": {    "profiles": {      "zai:default": {        "provider": "zai",        "mode": "api_key",        "apiKey": "${ZAI_API_KEY}"      }    }  }}

关键点• provider 的值必须和 models 模块里的提供商名称完全一致,大小写都敏感• apiKey 用 ${ENV_VAR} 格式引用环境变量,不要写明文• 配置前先 export ZAI_API_KEY="sk-xxx" 设置好环境变量

我踩过的坑:provider 写成了 "zai:default",结果模型调用一直报 401。后来发现 provider 名字应该是 "zai"":default" 是 profile 名称的一部分,不能写进 provider 字段。


2. models 模块:最核心的配置

这个模块定义了系统能调用哪些模型、通过哪个 API 调用。

我的配置思路:每个提供商配一个 provider,里面列出我能用的模型列表。

智谱 AI 配置

{  "models": {    "mode": "merge",    "providers": {      "zai": {        "baseUrl": "https://open.bigmodel.cn/api/coding/paas/v4",        "api": "openai-completions",        "models": [          {            "id": "glm-5",            "name": "GLM-5",            "contextWindow": 204800,            "maxTokens": 131072,            "reasoning":true          },          {            "id": "glm-4-flash",            "name": "GLM-4-Flash",            "contextWindow": 128000,            "maxTokens": 8192,            "reasoning":false          }        ]      }    }  }}

OpenRouter 配置

{  "models": {    "mode": "merge",    "providers": {      "openrouter": {        "baseUrl": "https://openrouter.ai/api/v1",        "api": "openai-completions",        "models": [          {            "id": "google/gemini-2.0-flash",            "name": "Gemini 2.0 Flash",            "contextWindow": 1000000,            "maxTokens": 8192,            "reasoning":true          }        ]      }    }  }}

关键点• mode: "merge" = 合并内置模型和自定义模型(我用这个)• id 必须是提供商那边的准确模型 ID,自己编的 ID 会报错• contextWindow 影响上下文长度,设小了会截断,设大浪费了也没用• reasoning: true = 启用推理能力,复杂任务建议开

我的坑baseUrl 后面多了一个 /,导致所有模型调用都报 404。OpenAI 兼容接口的 URL 格式很讲究,末尾不能有多余斜杠。


3. agents 模块:Agent 的”大脑”配置

这个模块决定 Agent 用什么模型、工作区在哪、会话怎么管理。

我的配置

{  "agents": {    "defaults": {      "model": {        "primary": "zai/glm-5",        "fallbacks": ["openrouter/google/gemini-2.0-flash"]      },      "workspace": "~/.openclaw/workspace",      "compaction": {        "mode": "safeguard"      },      "heartbeat": 300    }  }}

关键点• primary 格式是 提供商/模型ID,必须和 models 模块里配的完全一致• fallbacks 是备用模型列表,主模型不可用时自动切• workspace 是 Agent 的工作目录,只能读写这个目录下的文件• heartbeat: 300 = 每 5 分钟检测 Agent 是否存活• compaction.mode: "safeguard" = 长对话自动压缩,防止超出上下文

我的坑fallbacks 写成了字符串不是数组,导致 Agent 卡死不启动。JSON 里数组必须用 [] 包裹。


4. tools 模块:让 Agent 能用工具

控制 Agent 能做什么——搜索、执行命令、读写文件等。

全量配置

{  "tools": {    "profile": "full",    "deny": [],    "allow": [],    "web": {      "search": {        "enabled":true      },      "timeout": 10    }  }}

保守配置(只保留基础工具)

{  "tools": {    "profile": "basic",    "deny": ["browser", "canvas"],    "allow": [],    "web": {      "search": {        "enabled":true      }    }  }}

关键点• profile: "full" = 启用全部工具;"basic" = 仅基础工具• deny 是禁用列表,allow 是白名单(allow 优先于 deny)• web.search.enabled: true = 启用网页搜索


5. channels 模块:连接飞书

飞书配置

{  "channels": {    "feishu": {      "enabled":true,      "appId": "cli_axxxxxxxx",      "appSecret": "${FEISHU_APP_SECRET}",      "connectionMode": "websocket",      "streaming":true,      "timeout": 30    }  }}

企业微信配置

{  "channels": {    "wecom": {      "enabled":true,      "corpId": "wwxxxxxxx",      "corpSecret": "${WECOM_CORP_SECRET}",      "agentId": 1000001,      "connectionMode": "websocket"    }  }}

关键点• appId 是 cli_ 开头的字符串,不是纯数字• connectionMode: "websocket" = 长连接(推荐)• streaming: true = 消息流式输出

我的坑appId 填错了,飞书机器人一直收不到消息。后来去飞书开发者平台重新看了下,cli_ 开头的字符串和后面的数字要完整复制,不能漏。


6. gateway 模块:网关安全

本地安全模式

{  "gateway": {    "port": 18789,    "mode": "local",    "bind": "loopback",    "auth": {      "mode": "token",      "token": "${GATEWAY_TOKEN}"    },    "timeout": 60  }}

公网访问模式

{  "gateway": {    "port": 18789,    "mode": "public",    "bind": "0.0.0.0",    "auth": {      "mode": "token",      "token": "${GATEWAY_TOKEN}"    }  }}

关键点• bind: "loopback" = 仅本机可访问(安全)• bind: "0.0.0.0" = 所有地址可访问(公网模式,需配 token)• 修改此模块后需 openclaw gateway restart


7. session 模块:会话管理

{  "session": {    "ttl": 86400,    "timeout": 3600,    "autosave":true,    "autosaveInterval": 300  }}

• ttl: 86400 = 会话保留 24 小时• timeout: 3600 = 1 小时无活动自动结束• autosaveInterval: 300 = 每 5 分钟自动保存


8. hooks 模块:定时任务

{  "hooks": {    "cron": [      {        "id": "daily-report",        "schedule": "0 9 * * *",        "agent": "main",        "prompt": "生成今日AI资讯摘要,并发布到公众号草稿箱"      }    ]  }}

• schedule 是标准 cron 表达式:分 时 日 月 周• 0 9 * * * = 每天早上 9 点执行• agent 指定用哪个 Agent 执行(需要 bindings 配置过)


9. bindings 模块:多 Agent 路由

{  "bindings": {    "rules": [      {        "channel": "feishu",        "keyword": ["写代码", "debug", "编程"],        "agent": "coder"      },      {        "channel": "feishu",        "keyword": ["报告", "总结", "周报"],        "agent": "writer"      }    ]  }}

• 规则按顺序匹配,第一个命中的生效• 多租户场景用这个模块


10. env 模块:敏感信息存储

{  "env": {    "ZAI_API_KEY": "sk-xxxx",    "GATEWAY_TOKEN": "xxxx",    "FEISHU_APP_SECRET": "xxxx"  }}

我的做法env 里存的是明文,所以我严格控制 openclaw.json 的文件权限——chmod 600 openclaw.json,只有我自己能读。


11. logging 模块:日志级别

{  "logging": {    "level": "info",    "path": "~/.openclaw/logs",    "maxSize": 100,    "maxDays": 7  }}

• "debug" = 最详细(排查问题时用)• "info" = 普通日志(日常用这个)• "error" = 仅记录错误


12. messages 模块:消息行为

{  "messages": {    "prefix": "[虾哥AI] ",    "format": "markdown",    "ack": {      "enabled":true,      "reaction": "✅"    }  }}

• prefix = 回复前缀,方便区分是 AI 的回复• ack.reaction = 飞书消息已读回执显示的表情


快速参考表

模块
常用场景
修改后需重启?
auth
换 API Key
models
添加/切换模型
agents
改默认模型
tools
禁用某个工具
channels
配置飞书
gateway
改端口/安全策略
session
改超时策略
hooks
设置定时任务
bindings
多租户路由
env
敏感信息存储
logging
改日志级别
messages
改回复格式

总结

折腾 OpenClaw 这段时间,我最大的感悟是:配置文件不是填完就完事了,它是个活的东西,会随着使用过程不断调整

几个建议:• 先跑通再调优,别一开始就配全套• JSON 格式错了是最常见的问题,用在线 JSON 校验器过一遍• Key 引用方式一定要用 ${ENV_VAR},别写明文• 改了 channels 和 gateway 后要重启网关

有什么踩坑经验,欢迎交流。