OpenClaw 钉钉机器人 403、404 错误故障排查实战

0 阅读4分钟

事件背景

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

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

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

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

于是我根据之前的备份文件路径去宿主机上恢复了之前的配置文件

✅ 备份完成!文件已保存到:
`/root/.openclaw/backup/models.json.backup.20260302\_094142\`

这个操作肯定是错误,因为但我恢复备份文件后,钉钉又开始报404错误 image.png

后来通过查看官方文档,发现切换模型时涉及三个配置文件

  1. 主配置/root/.openclaw/openclaw.json
  2. 模型配置/root/.openclaw/models.json
  3. 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 有三个层级的配置文件:

  1. 主配置/root/.openclaw/openclaw.json
  2. 模型配置/root/.openclaw/models.json
  3. 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 问题根源

用户在上午通过钉钉发送了更换模型的指令,导致:

  1. Agent 级别的配置被修改
  2. 模型 ID 不匹配(qwen3.5-flash vs qwen3.5-flash-2026-02-23
  3. 后续使用备份文件恢复时,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 关键注意事项

  1. API 密钥一致性:所有配置文件中的 API 密钥必须一致
  2. 模型 ID 匹配:默认模型必须在 models.json 中有对应定义
  3. 备份文件风险:从备份恢复时,注意备份文件中的密钥可能已失效
  4. 钉钉指令影响:通过钉钉发送的配置修改指令会持久化到配置文件中

6.3 推荐的最佳实践

  1. 修改配置前创建备份
  2. 修改后验证所有配置文件的一致性
  3. 定期检查 API 密钥有效性
  4. 记录配置变更历史

七、相关命令速查

# 查看服务状态
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"}]}'

*本文记录了完整的故障排查过程,希望能帮助遇到类似问题的朋友。