OpenClaw 完整配置指南:AI网关的进阶玩法
说实话,第一次接触 OpenClaw 的时候,我被它的配置复杂度吓了一跳。这不是那种开箱即用的聊天机器人,而是一个真正的 AI 网关中间件——它不接模型,只负责把各种模型、渠道、工具整合在一起。折腾了几个月后,我摸索出了一套相对成熟的配置方案。这篇文章分享我的完整配置,以及踩过的一些坑。
OpenClaw 到底是什么
简单来说,OpenClaw 是一个AI 网关。它自己不运行任何大模型,而是作为一个中间层,帮你统一管理多个模型提供商(OpenAI、Anthropic、各种国产模型),同时接入 Telegram、Discord、WhatsApp 等聊天渠道。
它的核心能力包括:
- 多模型管理:一次配置,随时切换不同模型
- 故障自动转移:主模型挂掉时自动切到备用模型
- 多渠道接入:Telegram、Discord、Slack 等统一接入
- 工具链扩展:搜索、浏览器、文件操作等能力
- 记忆系统:支持长对话记忆和上下文管理
如果你只是想要一个简单的 ChatGPT 客户端,那 OpenClaw 可能太重了。但如果你需要同时管理多个模型、对接多个渠道、并且希望有故障转移能力,它就是目前最好的开源方案之一。
我的完整配置文件
下面是我生产环境使用的完整配置,已经对所有敏感信息进行了脱敏处理:
{ "agents": { "defaults": { "blockStreamingDefault": "off", "compaction": { "mode": "safeguard" }, "imageModel": { "primary": "iw/kimi-k2.5" }, "maxConcurrent": 4, "memorySearch": { "cache": { "enabled": true, "maxEntries": 50000 }, "experimental": { "sessionMemory": true }, "model": "nvidia/nv-embed-v1", "provider": "openai", "remote": { "apiKey": "${NVIDIA_API_KEY}", "baseUrl": "https://integrate.api.nvidia.com/v1/" }, "sources": [ "memory", "sessions" ] }, "model": { "primary": "iw/kimi-k2.5" }, "models": { "iw/deepseek-chat": {}, "iw/deepseek-reasoner": {}, "iw/glm-5": {}, "iw/gpt-5.3-codex": {}, "iw/gpt-5.4": {}, "iw/kimi-k2.5": {}, "iw/minimax-m2.5": {}, "iw/qwen3.5-397b-a17b": {}, "iw/qwen3.5-plus": {}, "iw/step-3.5-flash": {} }, "subagents": { "maxConcurrent": 8 }, "thinkingDefault": "adaptive", "verboseDefault": "on", "workspace": "/root/.openclaw/workspace" }, "list": [ { "agentDir": "/root/.openclaw/agents/main/agent", "default": true, "heartbeat": { "ackMaxChars": 30000, "every": "30m", "includeReasoning": false, "session": "agent:main:telegram:direct:xxx", "target": "telegram" }, "id": "main", "name": "main", "workspace": "/root/.openclaw/workspace" } ] }, "auth": { "profiles": {} }, "channels": { "telegram": { "blockStreaming": false, "botToken": "${TELEGRAM_BOT_TOKEN}", "dmPolicy": "pairing", "enabled": true, "groupAllowFrom": [ 1234567890, 9876543210 ], "groupPolicy": "allowlist", "groups": { "*": {} }, "heartbeat": { "showOk": false }, "streaming": "partial" } }, "commands": { "native": "auto", "nativeSkills": "auto", "ownerDisplay": "raw", "restart": true }, "gateway": { "auth": { "mode": "token", "token": "${GATEWAY_AUTH_TOKEN}" }, "bind": "loopback", "controlUi": { "allowInsecureAuth": true, "allowedOrigins": [ "https://xxx.xxx.xxx.xxx:xxxx", "http://xxx.xxx.xxx.xxx:xxxx" ] }, "mode": "local", "port": 18789, "tailscale": { "mode": "off", "resetOnExit": false }, "trustedProxies": [ "127.0.0.1" ] }, "hooks": { "internal": { "enabled": true, "entries": { "boot-md": { "enabled": true }, "bootstrap-extra-files": { "enabled": true }, "command-logger": { "enabled": true }, "session-memory": { "enabled": true } } } }, "memory": { "backend": "qmd", "citations": "auto", "qmd": { "includeDefaultMemory": true, "limits": { "maxResults": 6, "timeoutMs": 30000 }, "searchMode": "query", "update": { "debounceMs": 15000, "interval": "5m" } } }, "messages": { "ackReactionScope": "group-mentions" }, "models": { "mode": "merge", "providers": { "iw": { "api": "openai-responses", "apiKey": "${IW_API_KEY}", "baseUrl": "https://api.example.com/v1", "models": [ { "compat": { "supportsDeveloperRole": false }, "contextWindow": 200000, "cost": { "cacheRead": 0.5, "cacheWrite": 0, "input": 1, "output": 3.2 }, "id": "glm-5", "input": [ "text" ], "maxTokens": 131000, "name": "glm-5", "reasoning": true }, { "compat": { "supportsDeveloperRole": false }, "contextWindow": 400000, "cost": { "cacheRead": 0.175, "cacheWrite": 0, "input": 1.75, "output": 14 }, "id": "gpt-5.3-codex", "input": [ "text", "image" ], "maxTokens": 128000, "name": "gpt-5.3-codex", "reasoning": true }, { "compat": { "supportsDeveloperRole": false }, "contextWindow": 270000, "cost": { "cacheRead": 0.25, "cacheWrite": 0, "input": 2.5, "output": 15 }, "id": "gpt-5.4", "input": [ "text", "image" ], "maxTokens": 128000, "name": "gpt-5.4", "reasoning": true }, { "compat": { "supportsDeveloperRole": false }, "contextWindow": 262000, "cost": { "cacheRead": 0.07, "cacheWrite": 0, "input": 0.45, "output": 2.25 }, "id": "kimi-k2.5", "input": [ "text", "image" ], "maxTokens": 262000, "name": "kimi-k2.5", "reasoning": true }, { "compat": { "supportsDeveloperRole": false }, "contextWindow": 256000, "cost": { "cacheRead": 0, "cacheWrite": 0, "input": 0.4, "output": 2.4 }, "id": "qwen3.5-plus", "input": [ "text", "image" ], "maxTokens": 65500, "name": "qwen3.5-plus", "reasoning": true }, { "compat": { "supportsDeveloperRole": false }, "contextWindow": 262000, "cost": { "cacheRead": 0, "cacheWrite": 0, "input": 0.6, "output": 3.6 }, "id": "qwen3.5-397b-a17b", "input": [ "text", "image" ], "maxTokens": 65500, "name": "qwen3.5-397b-a17b", "reasoning": true }, { "compat": { "supportsDeveloperRole": false }, "contextWindow": 190000, "cost": { "cacheRead": 0.03, "cacheWrite": 0, "input": 0.295, "output": 1.2 }, "id": "minimax-m2.5", "input": [ "text" ], "maxTokens": 190000, "name": "minimax-m2.5", "reasoning": true }, { "compat": { "supportsDeveloperRole": false }, "contextWindow": 250000, "cost": { "cacheRead": 0.02, "cacheWrite": 0, "input": 0.1, "output": 0.3 }, "id": "step-3.5-flash", "input": [ "text" ], "maxTokens": 250000, "name": "step-3.5-flash", "reasoning": true }, { "compat": { "supportsDeveloperRole": false }, "contextWindow": 160000, "cost": { "cacheRead": 0.13, "cacheWrite": 0, "input": 0.26, "output": 0.38 }, "id": "deepseek-reasoner", "input": [ "text" ], "maxTokens": 65500, "name": "deepseek-reasoner", "reasoning": true }, { "compat": { "supportsDeveloperRole": false }, "contextWindow": 160000, "cost": { "cacheRead": 0.13, "cacheWrite": 0, "input": 0.26, "output": 0.38 }, "id": "deepseek-chat", "input": [ "text" ], "maxTokens": 65500, "name": "deepseek-chat", "reasoning": true } ] } } }, "plugins": { "entries": { "telegram": { "enabled": true } } }, "session": { "dmScope": "per-channel-peer", "reset": { "idleMinutes": 43200, "mode": "idle" } }, "skills": { "install": { "nodeManager": "npm" } }, "tools": { "agentToAgent": { "enabled": true }, "loopDetection": { "criticalThreshold": 20, "detectors": { "genericRepeat": true, "knownPollNoProgress": true, "pingPong": true }, "enabled": true, "globalCircuitBreakerThreshold": 30, "historySize": 30, "warningThreshold": 10 }, "profile": "full", "sessions": { "visibility": "agent" }, "web": { "search": { "apiKey": "${BRAVE_API_KEY}", "enabled": true, "provider": "brave" } } }, "wizard": { "lastRunAt": "2026-03-09T08:15:47.724Z", "lastRunCommand": "onboard", "lastRunMode": "local", "lastRunVersion": "2026.3.8" }}这份配置集成了 10 个模型,全部通过一个自定义提供商 iw 接入。接下来我会逐个模块详细解释。
Agents 配置:代理的核心行为
agents 模块定义了 AI 代理的行为模式。我的配置分两部分:defaults 是全局默认设置,list 是具体代理实例。
默认配置详解
"defaults": { "blockStreamingDefault": "off", "compaction": { "mode": "safeguard" }, "imageModel": { "primary": "iw/kimi-k2.5" }, "maxConcurrent": 4, "model": { "primary": "iw/kimi-k2.5" }, "thinkingDefault": "adaptive", "verboseDefault": "on"}关键点解读:
model.primary: 默认主模型,这里用的是 Kimi K2.5。OpenClaw 使用provider/model的格式指定模型。imageModel: 处理图片的专用模型,可以跟主模型不同。我把它也设成 Kimi,因为它支持视觉。thinkingDefault: 推理模式。adaptive表示让模型自己决定是否开启深度思考,Claude 4.6 默认就是这个模式。maxConcurrent: 单个代理的最大并发请求数。设为 4 表示同时处理 4 个对话。compaction: 对话压缩策略。safeguard模式会在上下文过长时进行智能压缩,保留关键信息。
关于 compaction,根据官方文档的说明,它会在上下文接近 token 上限时自动触发,通过摘要方式减少历史记录长度,而不是直接截断。这比简单丢弃早期消息要智能得多。
模型列表配置
"models": { "iw/deepseek-chat": {}, "iw/deepseek-reasoner": {}, "iw/glm-5": {}, "iw/gpt-5.3-codex": {}, "iw/gpt-5.4": {}, "iw/kimi-k2.5": {}, "iw/minimax-m2.5": {}, "iw/qwen3.5-397b-a17b": {}, "iw/qwen3.5-plus": {}, "iw/step-3.5-flash": {}}这里列出的是当前代理可以使用的所有模型。配置为空对象 {} 表示使用模型定义时的默认参数。如果你需要给特定模型设置特殊参数(比如 temperature、maxTokens),可以在这里覆盖。
代理实例配置
"list": [ { "id": "main", "name": "main", "default": true, "heartbeat": { "every": "30m", "target": "telegram", "prompt": "Read HEARTBEAT.md..." } }]这里定义了一个名为 main 的代理,default: true 表示这是默认代理。heartbeat 是 OpenClaw 的一个特色功能——定时心跳任务。
心跳机制让代理可以定期执行预设任务。我的配置是每 30 分钟让代理读取一次工作区的 HEARTBEAT.md 文件和最近的 Telegram 会话历史,然后更新记忆目录。这相当于给代理一个定期”自省”的机会,让它保持对长期任务的记忆。
多模型配置:如何管理 10+ 模型
这是整个配置最复杂的部分。models.providers 定义了所有可用的模型提供商和模型规格。
提供商配置结构
"models": { "mode": "merge", "providers": { "iw": { "api": "openai-responses", "apiKey": "${IW_API_KEY}", "baseUrl": "https://api.example.com/v1", "models": [...] } }}mode: "merge": 表示用户配置的模型与内置模型合并,而不是完全覆盖。api: "openai-responses": 指定使用 OpenAI 兼容的 API 格式。这是目前最通用的格式,大部分国内模型代理都支持。baseUrl: 模型 API 的端点地址。这里应该替换成你实际使用的代理服务地址。
单个模型配置详解
以 Kimi K2.5 为例:
{ "id": "kimi-k2.5", "name": "kimi-k2.5", "contextWindow": 262000, "maxTokens": 262000, "input": ["text", "image"], "reasoning": true, "cost": { "input": 0.45, "output": 2.25, "cacheRead": 0.07, "cacheWrite": 0 }, "compat": { "supportsDeveloperRole": false }}各字段含义:
contextWindow: 上下文窗口大小。Kimi K2.5 支持 262K tokens,这在国产模型中是数一数二的。maxTokens: 单次响应的最大 token 数。设为跟上下文窗口一样大,表示可以用满整个窗口。input: 支持的输入类型。["text", "image"]表示同时支持文本和图片输入。reasoning: 是否支持推理模式。设为 true 表示这个模型可以进行深度思考。cost: 成本计算参数,单位是每百万 token 的价格。这是 OpenClaw 统计费用用的,不影响实际调用。compat.supportsDeveloperRole: 是否支持开发者角色。设为 false 表示在系统提示词中使用user角色而不是developer角色。
实战技巧:模型选择策略
我在配置中集成了 10 个模型,各有各的用途:
| 模型 | 场景 | 理由 |
|---|---|---|
| Kimi K2.5 | 日常主力 | 上下文长、中文好、性价比高 |
| GPT-5.4 | 复杂推理 | 综合能力最强 |
| GPT-5.3-codex | 代码任务 | 专门优化过代码生成 |
| DeepSeek-reasoner | 数学/逻辑 | 推理能力强 |
| MiniMax M2.5 | 长文本 | 支持 19 万上下文 |
| Step-3.5-flash | 快速响应 | 速度最快、成本最低 |
| GLM-5 | 中文对话 | 智谱出品,中文理解好 |
| Qwen3.5 系列 | 多模态 | 阿里系,图文理解强 |
实际使用时,可以通过 /model 命令在对话中切换模型,或者在配置中设置故障转移列表。
Gateway 配置:网关的安全与访问控制
gateway 模块控制 OpenClaw 网关的启动方式、端口绑定和安全策略。
"gateway": { "port": 18789, "bind": "loopback", "mode": "local", "auth": { "mode": "token", "token": "${GATEWAY_AUTH_TOKEN}" }, "controlUi": { "allowInsecureAuth": true, "allowedOrigins": [ "https://xxx.xxx.xxx.xxx:xxxx" ] }, "trustedProxies": ["127.0.0.1"]}重要配置项:
port: 18789: 网关默认端口。18789 是 OpenClaw 的保留端口,如果被占用可以改。bind: "loopback": 只绑定到本地回环地址,不允许外部直接访问。这是安全最佳实践。mode: "local": 本地模式,所有数据本地处理,不走远程服务器。auth.mode: "token": 使用 Token 认证方式。客户端连接时需要提供正确 token。controlUi: 控制面板的访问配置。allowedOrigins列出了允许访问的域名或 IP,防止跨站攻击。trustedProxies: 信任的反向代理 IP。如果你用 Nginx 或 Caddy 做反向代理,需要把代理服务器的 IP 加到这里。
关于 bind 的选择,官方文档提到有三种模式:
loopback: 最安全,只允许本机访问(127.0.0.1)localhost: 解析 localhost 后绑定all: 绑定所有接口,允许外部访问(不推荐)
生产环境建议始终使用 loopback,然后通过反向代理对外提供服务。
Memory 配置:长期记忆的实现
OpenClaw 的记忆系统让它能够记住跨对话的信息。我的配置使用 QMD(Queryable Memory Database)作为后端。
"memory": { "backend": "qmd", "citations": "auto", "qmd": { "includeDefaultMemory": true, "limits": { "maxResults": 6, "timeoutMs": 30000 }, "searchMode": "query", "update": { "debounceMs": 15000, "interval": "5m" } }}工作机制:
backend: "qmd": 使用 QMD 作为记忆存储后端。QMD 是一个向量数据库,支持语义搜索。searchMode: "query": 搜索模式。query表示基于查询的检索,OpenClaw 会自动把对话内容转成搜索查询。maxResults: 6: 每次检索最多返回 6 条相关记忆。update.interval: "5m": 每 5 分钟触发一次记忆更新,把新对话内容写入向量库。citations: "auto": 自动在回复中标注引用的记忆来源。
向量嵌入配置
在 agents.defaults.memorySearch 中配置了向量嵌入服务:
"memorySearch": { "provider": "openai", "model": "nvidia/nv-embed-v1", "remote": { "apiKey": "${NVIDIA_API_KEY}", "baseUrl": "https://integrate.api.nvidia.com/v1/" }}这里用的是 NVIDIA 的 nv-embed-v1 嵌入模型。实测下来,这个模型在中文场景表现比 OpenAI 的 text-embedding-3-small 更稳定。NVIDIA 提供了免费的 API 额度,足够个人使用。
Channels 配置:Telegram 接入实战
目前我只配置了 Telegram 渠道。这部分控制机器人如何接收和发送消息。
"channels": { "telegram": { "enabled": true, "botToken": "${TELEGRAM_BOT_TOKEN}", "dmPolicy": "pairing", "groupPolicy": "allowlist", "groupAllowFrom": [1234567890, 9876543210], "streaming": "partial" }}安全策略:
dmPolicy: "pairing": 私信配对模式。陌生人第一次发消息时,机器人会生成一个配对码,需要主人批准后才能对话。这比allowlist更灵活,也比open更安全。groupPolicy: "allowlist": 群组白名单模式。只有在groupAllowFrom列表中的群组 ID 才能使用机器人。groupAllowFrom: 允许的群组 ID 列表。获取群组 ID 的方法是:先把机器人拉入群组,然后访问https://api.telegram.org/bot<Token>/getUpdates,在返回的 JSON 中找chat.id。
流式响应配置
streaming: "partial" 启用流式响应。这意味着机器人生成回复时会实时发送片段,而不是等全部生成完再发。用户体验更好,但会消耗更多 Telegram API 配额。
其他可选值:
off: 关闭流式,一次性发送完整消息block: 分块发送,适合长消息progress: 显示进度指示器
Tools 配置:工具链与安全防护
tools 模块配置代理可以使用的工具集。
循环检测配置
这是我最喜欢的功能之一,防止 AI “鬼打墙”:
"loopDetection": { "enabled": true, "warningThreshold": 10, "criticalThreshold": 20, "globalCircuitBreakerThreshold": 30, "detectors": { "genericRepeat": true, "knownPollNoProgress": true, "pingPong": true }}检测机制:
warningThreshold: 10: 连续 10 次相似响应时触发警告criticalThreshold: 20: 连续 20 次时触发关键警告globalCircuitBreakerThreshold: 30: 连续 30 次时强制切断,防止无限循环
三个检测器分别识别不同类型的循环:
genericRepeat: 通用的重复内容检测knownPollNoProgress: 检测无进展的轮询行为pingPong: 检测来回反复的”乒乓”对话
Web 搜索配置
"web": { "search": { "enabled": true, "provider": "brave", "apiKey": "${BRAVE_API_KEY}" }}配置了 Brave Search API。相比 Google,Brave 的隐私保护更好,而且提供免费额度。代理可以通过 /search 命令或工具调用进行网络搜索,获取最新信息。
会话管理
"sessions": { "visibility": "agent"}控制会话的可见范围。agent 表示每个代理只能看到自己的会话,代理之间不共享对话历史。
Session 配置:会话生命周期管理
"session": { "dmScope": "per-channel-peer", "reset": { "mode": "idle", "idleMinutes": 43200 }}dmScope: "per-channel-peer": 私信隔离模式。每个对话对象拥有独立的会话上下文,不同用户之间的对话互不影响。这对多用户场景很重要。reset.mode: "idle": 空闲重置模式。当会话空闲超过指定时间后自动重置。idleMinutes: 43200: 43200 分钟 = 30 天。也就是说,30 天没对话的会话会被自动清理。
其他重置模式还有:
daily: 每天固定时间重置manual: 只通过/reset命令手动重置
Commands 与 Hooks:命令系统和内部钩子
命令配置
"commands": { "native": "auto", "nativeSkills": "auto", "ownerDisplay": "raw", "restart": true}native: "auto": 自动注册原生命令(如 Discord 的斜杠命令、Telegram 的菜单命令)restart: true: 允许通过/restart命令重启网关
内部钩子
"hooks": { "internal": { "enabled": true, "entries": { "boot-md": { "enabled": true }, "command-logger": { "enabled": true }, "session-memory": { "enabled": true } } }}这些是 OpenClaw 的内部扩展点:
boot-md: 启动时读取工作区的 Markdown 引导文件command-logger: 记录命令执行日志session-memory: 会话记忆管理
实战技巧:从配置到落地
1. 环境变量管理
生产环境不要把 API Key 直接写在配置里。使用 ${VAR_NAME} 占位符,然后通过环境变量注入:
export IW_API_KEY="sk-xxx"export TELEGRAM_BOT_TOKEN="123456:ABC..."export GATEWAY_AUTH_TOKEN="your-token"export BRAVE_API_KEY="BSA..."export NVIDIA_API_KEY="nvapi-..."
openclaw startDocker 部署时可以写在 .env 文件里,或者使用 secrets 管理工具。
2. 故障转移实战
虽然我配置了 10 个模型,但默认只用一个。要实现自动故障转移,需要在 agents.defaults.model 中设置 fallbacks:
"model": { "primary": "iw/kimi-k2.5", "fallbacks": [ "iw/gpt-5.4", "iw/glm-5", "iw/qwen3.5-plus" ]}当 Kimi 不可用时(返回 5xx 错误、超时、或响应格式异常),OpenClaw 会按顺序尝试备用模型。根据官方文档,故障转移会在以下情况触发:
- API 返回 5xx 错误
- 请求超时(默认 600 秒)
- 模型响应格式异常
- 模型明确返回不可用状态
3. 监控与调试
OpenClaw 提供了几个有用的诊断命令:
# 检查配置完整性openclaw doctor
# 查看实时日志openclaw logs -f
# 测试模型连接openclaw models test iw/kimi-k2.5
# 查看网关状态openclaw gateway status建议在配置文件中开启详细日志:
"logging": { "level": "info", "consoleLevel": "info"}4. 性能优化
如果你发现响应变慢,可以调整这些参数:
maxConcurrent: 降低并发数,减少资源竞争contextTokens: 减小上下文窗口,降低 token 消耗timeoutSeconds: 缩短超时时间,快速失败compaction: 启用更激进的对话压缩策略
安全建议
最后强调几个安全要点:
-
Token 保护: Gateway Auth Token 拥有完全控制权,泄露等于服务器被接管。使用强密码,定期更换。
-
群组白名单: 务必配置
groupAllowFrom,防止机器人被拉入恶意群组。 -
私信配对: 生产环境建议使用
pairing模式,不要开open。 -
沙箱隔离: 如果启用了代码执行工具,务必配置 Docker 沙箱:
"sandbox": { "mode": "non-main", "docker": { "network": "none", "readOnlyRoot": true }}- 定期审计: 定期运行
openclaw doctor --fix检查配置安全问题。
总结
这份配置涵盖了 OpenClaw 的核心能力:多模型管理、记忆系统、渠道接入、工具扩展。几个关键要点:
- 模型配置: 使用
providers定义模型端点,agents.defaults.models声明可用模型 - 故障转移: 通过
fallbacks数组实现自动切换 - 记忆系统: QMD + 向量嵌入,实现长期记忆
- 安全配置: loopback 绑定 + Token 认证 + 白名单
- 监控维护: 心跳任务 + 循环检测 + 空闲重置
OpenClaw 的学习曲线确实比较陡,但一旦配置完成,它就是一个非常强大的 AI 网关。希望这份配置能帮你少走一些弯路。有问题欢迎在评论区留言讨论。
参考链接: