事件背景
先说结论,我的openclaw钉钉机器人出现404错误,是因为我太信任openclaw,我让他自己修改模型所导致的。
我目前给openclaw配置的是阿里云大模型免费API,每个模型有100万token的免费额度,但openclaw特别费token,加之早期“瞎折腾”1个月时间用掉了900万token免费额度。

在之前,如果某个模型额度用完,我使用openclaw的配置向导切换新的模型。由于最近openclaw越来越“听话”,而且免费模型额度也不够用了,我就购买了阿里Coding Plan订阅,不再小心翼翼的看着免费额度余额。
所以在原模型额度即将用尽之前,我直接在钉钉里将阿里Coding Plan订阅的模型配置方法和我的API KEY都给他,让他去配置并切换模型。

他非常老实的对配置文件进行了备份,而且提示模型切换成功!

在我重启服务之前,他还是能正常使用了(可能老模型还在生效),重启服务后,他就报403错误,钉钉上让他“恢复之前模型配置”,显然他已经听不懂人话了。

于是我根据之前的备份文件路径去宿主机上恢复了之前的配置文件
✅ 备份完成!文件已保存到:
`/root/.openclaw/backup/models.json.backup.20260302\_094142\`
这个操作肯定是错误,因为但我恢复备份文件后,钉钉又开始报404错误

后来通过查看官方文档,发现切换模型时涉及三个配置文件
- 主配置:
/root/.openclaw/openclaw.json - 模型配置:
/root/.openclaw/models.json - Agent 配置:`/root/.openclaw/agents/main/agent/models.json
以下是我的整个故障排查过程,希望对你有用,但更希望你用不上😄
一、故障现象
用户反馈钉钉机器人只能返回错误信息:
404 status code (no body)
服务状态显示正常,钉钉连接也已建立,但无法正常回复消息。
二、初步排查
2.1 检查服务状态
systemctl --user status openclaw-gateway
输出显示服务运行正常,钉钉 SDK 已成功连接。
2.2 查看应用日志
tail -100 /tmp/openclaw/openclaw-2026-03-02.log
日志中发现关键错误:
{"subsystem":"agent/embedded","message":"embedded run agent end:
runId=xxx isError=true error=404 status code (no body)"}
错误来自 agent/embedded 子系统,说明是 Agent 调用外部 API 时返回了 404。
三、深入分析
3.1 验证 API 密钥有效性
首先怀疑是 API 密钥失效,使用 curl 直接测试 DashScope API:
curl -s -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer sk-xxx" \
-H "Content-Type: application/json" \
-d '{"model": "qwen3.5-flash", "messages": [{"role": "user", "content": "test"}]}'
结果:API 调用成功,说明密钥本身是有效的。
3.2 检查配置文件一致性
OpenClaw 有三个层级的配置文件:
- 主配置:
/root/.openclaw/openclaw.json - 模型配置:
/root/.openclaw/models.json - Agent 配置:
/root/.openclaw/agents/main/agent/models.json
检查发现:
openclaw.json中的 API 密钥:sk-0486...(有效)models.json中的 API 密钥:sk-sp-2d3...(无效,来自备份文件)- Agent 配置中缺少
qwen3.5-flash模型定义
3.3 问题根源
用户在上午通过钉钉发送了更换模型的指令,导致:
- Agent 级别的配置被修改
- 模型 ID 不匹配(
qwen3.5-flashvsqwen3.5-flash-2026-02-23) - 后续使用备份文件恢复时,API 密钥被覆盖为无效密钥
四、解决方案
4.1 统一 API 密钥
将所有配置文件中的 API 密钥统一为有效密钥:
# models.json
{
"providers": {
"dashscope": {
"apiKey": "sk-04861****************"
}
}
}
# agents/main/agent/models.json(同上)
4.2 确保模型定义完整
在所有配置文件中添加所需的模型定义:
{
"id": "qwen3.5-flash-2026-02-23",
"name": "qwen3.5-flash-2026-02-23",
"api": "openai-completions",
"contextWindow": 256000,
"maxTokens": 65536
}
4.3 恢复主配置
恢复 openclaw.json 到正确状态,确保默认模型配置正确:
{
"agents": {
"defaults": {
"model": {
"primary": "dashscope/qwen3.5-flash-2026-02-23"
}
}
}
}
4.4 重启服务
systemctl --user restart openclaw-gateway
五、验证结果
重启后查看日志:
[2026-03-02T14:45:27.906Z] DingTalk Stream SDK connected successfully
钉钉消息测试:正常回复 ✅
六、经验总结
6.1 OpenClaw 配置文件层级
| 配置文件 | 路径 | 用途 |
|---|---|---|
| openclaw.json | /root/.openclaw/ | 主配置,包含网关、插件、渠道等 |
| models.json | /root/.openclaw/ | 全局模型配置 |
| models.json | /root/.openclaw/agents/main/agent/ | Agent 级别模型配置 |
6.2 关键注意事项
- API 密钥一致性:所有配置文件中的 API 密钥必须一致
- 模型 ID 匹配:默认模型必须在 models.json 中有对应定义
- 备份文件风险:从备份恢复时,注意备份文件中的密钥可能已失效
- 钉钉指令影响:通过钉钉发送的配置修改指令会持久化到配置文件中
6.3 推荐的最佳实践
- 修改配置前创建备份
- 修改后验证所有配置文件的一致性
- 定期检查 API 密钥有效性
- 记录配置变更历史
七、相关命令速查
# 查看服务状态
systemctl --user status openclaw-gateway
# 重启服务
systemctl --user restart openclaw-gateway
# 查看实时日志
tail -f /tmp/openclaw/openclaw-2026-03-02.log
# 测试 API 密钥
curl -s -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "qwen3.5-flash", "messages": [{"role": "user", "content": "test"}]}'
*本文记录了完整的故障排查过程,希望能帮助遇到类似问题的朋友。