Margrop
Articles382
Tags840
Categories7

Categories

/health 200 /v1/models 0.025s 0步 0步主动 0步元递归 0步本身 12类 18789 18天idle 18天静默 192.168.x.x 1password 21天 22类一键汇总 3层定位法 401 4个Gateway 4个Gateway全军覆没 4天滞后 4步主动 4步定位 503 5步定位法 6.2.0 6.24 release 6.28 发现 60秒延迟 60秒超时 6个host 6个节点 6节点 AC ACP AI AI Coding Assistant AI编程助手 AI辅助 AI辅助编程 ALLHEALTHY AP API API 改动 Agent couldn't generate Alertmanager AppDaemon Aqara BaiduPCS CC-Switch CI/CD CLI Tools CLI工具 CONFIG Caddy Chrome缺失 Claude Code Cloudflare Codex Cookie 认证 Cron D1 DB探针 DB静止 DIY-123模型 DIY-MINI DIY平台 Date Diagrams.net Diary Docker Docker Compose EADDRINUSE EasyTier NAT穿透 Efficiency Tools Electerm English FTS5 Gateway Gemini CLI GitHub Actions HA HADashboard Hermes Hexo HomeAssistant IP IPv4 Invalid model Java LVM‑Thin Linux MacOS Macmini Macmini log路径 Markdown MiniMax MiniMax-M3 Multi-Agent MySQL NAS NRestarts Nginx Node-RED Node.js OOM OpenAI OpenClaw OpenClaw gateway OpenCode OpenResty OpenWrt PPID PPID=1 PPID=796 PPPoE Portainer PostgreSQL ProcessOn Prometheus Proxmox VE RPC Restart=always Restart=always循环 SOCKS5 SQLite SSL Session Shell Subagent TTS TimeMachine UML Uptime Kuma VM151 VM152 WeCom缺失 VM153 VPN VPS VPS4 VPS4 overlay TCP不可达 WeCom Web WebSocket Windows Workers activate ad adb adblock agent aligenie aliyun alpine annotation aop authy auto-restart autofs backup baidupan baidupcs baidupcs静默 bash bitwarden boot breaking change brew browser by-design caddy2 capture_output cdn centos cert certbot charles chat chat completion chat completions chrome classloader client clone closures cloudflare cmd command commit connected container cron crontab cron任务 cron设计 ctyun custom/DIY-123 daemon-reload dashboard ddsm demo dependency deploy deprecation developer devtools dll dns docker domain download draw drawio dsm dual supervision dump duplicate service unit dylib edge exception existing gateway is healthy exit 78 exit78 export fail2ban fallback fallback失效 false positive feign feishu告警 firewall-cmd flow frp frpc frps fuckgfw function fuser gcc gfw git gitea github golang google_gemma-4 gperftools gridea grub gvt-g hacs havcs heap hello hexo hibernate hidpi hoisting homeassistant hosts html htmlparser https iKuai idea idle-detection idle_hours image img img2kvm immortalwrt import index install intel io ios ip iptables iptv ipv6 iso java javascript jetbrains jieba jni jnilib journald journald日志漂移 jpa js json jsonb jupter jupyterlab jvm k8s kernel key kid kill orphan kms kodi koolproxy koolproxyr kvm lan lastpass launchctl learning lede letsencrypt linux live loopback-proxy low-code lsof lvm lxc m3u8 mac macos manual mariadb markdown maven md5 meta-acceptance meta-pattern meta-probe microcode mirror model provider modem modules monitor mount mstsc mysql n2n n5105 nas netstat network new-api nfs node node-red nodejs nohup notepad++ npm nssm ntp one-api oop openclaw openclaw/ openfeign openssl orphan process orphan进程 os otp ovz p14 packet capture pat pdf pem perf ping ping通但chat不通 pip plugin png port bind race port=18789 powerbutton print pro provider/model proxy pve pvekclean python qcow2 qemu qemu-guest-agent rar reboot reconnect循环 reflog release notes remote remote desktop renew repo resize retina root route router rule rules running runtime safari sata schema schema列名 scipy-notebook scoping scp server server is busy service不可信 single-instance slmgr so socket-proxyd socks source spk split边界 spring springboot springfox sqlite3 CLI ss ssh ssl stale stash stderr被吞 string subprocess supernode supervisor svg svn swagger sync synology system-level daemon system-level vs user-level system-level与user-level抢端口 systemctl systemctl --user systemctl --user disable systemctl daemon-reload systemctl disable systemctl is-active systemctl restart systemd systemd --user systemd duplicate service systemd exit 78 systemd restart loop systemd service unit systemd unit systemd unit race systemd user instance systemd-socket systemd-user双重监管 systemd被覆盖 tap tap-windows tapwindows telecom template terminal tls tmux token token失效 totp transient 999 trigram tvbox txt ubuntu udisk ui undertow unicode61 uninstall unlocker upgrade upstream provider timeout uptimeMs url user-level daemon v1 API v10探针 v11探针 v12探针 v13探针 v14 v15探针 v1探针 v2 API v2ray v6探针 v7探针 v8探针 vhd vim vlmcsd vm vmdk web websocket wechat windows with work day 14 work day 15 work day 2 worker wow xiaoya xml yum zip 一行修改 一键idle告警脚本 一键告警脚本 一键解决方案 上海晴 上游LLM容量 不是我的锅 中国电信 中文搜索 主动0步 主动0步本身 主动不修 主动不追问 主动不追问本身 主动不追问本身也是清单之外 主动不通知 主动不通知本身 主动修 主动修system-level本身也是清单之外 主动修本身也是清单之外 主动周一 主动意识到 主动意识到0步本身 主动意识到0步本身也是清单之外 主动追问 主动通知 云电脑 交换机 人机协作 代理 优化 但chat 30s+ 但是我的事 体检 保护逻辑本身也是清单之外 修systemd-user本身 修挖坑闭环 修正本身 修正递归 值班 假阳 假阴 健康检查 健康检查探针 元递归 光猫 全员HEALTHY 全绿 全量同步 公网IP 内存 内存优化 内网 内网IP 内网渗透 写作 分词 切换 列名误判 升级 协作 单位混淆 博客 又是周五 双重监管 反向代理 反向探针 反常健康 反常稳定 反应 vs 知识 启动 告警 告警优化 周一 周一焦虑 周三 周二 周二晚上 周五 周五晚上 周六 周六晚上 周四 周四晚上 周报 周日 周日山崎 周日晚上 周末 周末也是修坑日 周末也是清单之外 周末修坑 周末本身也是清单之外 周末突破 周末第二天 周末第五天 周末落地 周末落地本身 夏令时 多场景 多智能体 多节点 多节点管理 天猫精灵 天翼云 孤儿进程 安全 安装 定时任务 容器 容器网络 导入 小米 山崎 山崎之夜 工作感悟 工作日 工作日常 工作日第三天 工作日第五天 工作日第四天 已通知用户 常用软件 幂等 广告屏蔽 序列号 应用市场 异常 弃用 循环类 心态 心智成长 心理模型 心跳 心跳检查 性能优化 感悟 打工 打工人 打工人的反讽 打工人的无奈 批量校验 技术 抓包 挖坑→修坑闭环 排查 排查思路 探针再升级 探针本身 探针版本 探针管理 探针自检 探针踩坑 接受 接受之后 接受修 接受修正 接受层 接受挖坑 接受本身 接受递归 描述文件 放下 故障 故障排查 效率 效率工具 数据 旁路由 旁路进程 无服务器 日记 时区 显卡虚拟化 智能家居 智能音箱 服务器 服务管理 架构 梯子 模块 模型别名映射 模型探测 模型端点可达性 模型端点能ping通 模型调用 死循环 毫秒 流程 流程图 流程管理 浏览器 清单之后 清单之外 清单之外也包括接受本身 清单的元递归 清单设计 清单边界 清单进化 源码备份 漫游 激活 激活循环 火绒 焦虑 玄学 生活 电信 画图 监控 监控系统 直播源 直觉 磁盘 端口 端口冲突 端口占用 端口扫描 第10天 第10类 第11天 第11类 第12天 第12类 第13天 第13类 第14天 第14类 第15类 第16天 第16类 第17类 第18天 第18类 第19天 第19类 第20天 第20类 第21天 第21类 第22类 第23类 第25类 第26类 第27类 第28类 第29类 第4个山崎 第4次复发 第6天 第7天 第8天 第9天 第9类 管理 续期 网关 网络 网络风暴 群晖 脚本 脚本优化 腾讯 自动化 自动恢复 自定义模型 自建应用 自我反思 自我打脸 节点角色 虚拟机 被动意识到 角色不匹配 角色误判 角色误配 角色错配 认证 设计偏差 证书 语雀 误报 误报过滤 超时 路由 路由器 软件管家 软路由 运维 运维监控 进程 连接保活 连接问题 通信机制 通知 通知元递归 通知挖坑 通知本身 部署 部署链路 配置 配置落后 钉钉 镜像 镜像源 长期稳定 长期静默 长连接 门窗传感器 问题排查 防火墙 阿里云 阿里源 集客 青岛 静默期 飞书 飞书告警

Hitokoto

Archive

OpenClaw v2+ chat completions API 改了模型名格式——provider/model 简写报错 "Invalid model. Use openclaw or openclaw/<agentId>"、一行 curl 改动让 6 个 host 全绿 + Q&A

OpenClaw v2+ chat completions API 改了模型名格式——provider/model 简写报错 "Invalid model. Use openclaw or openclaw/<agentId>"、一行 curl 改动让 6 个 host 全绿 + Q&A

前言

6/28 12:15 我做 6 节点健康检查时,挖到了一类反常稳定——所有 6 个 host 全部 HEALTHY(VM151/VM152/VM153/Macmini/VPS4/VM154),但模型 ping 测试部分报错:

1
2
3
4
5
6
$ curl -X POST http://localhost:18789/v1/chat/completions \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"model":"custom/DIY-123","messages":[{"role":"user","content":"hi"}],"max_tokens":50}'

{"error":{"message":"Invalid model. Use openclaw or openclaw/<agentId>","type":"invalid_request_error"}}

—— 6 个 host 全部 HEALTHY。

—— 但模型 ping 报错 “Invalid model. Use openclaw or openclaw/“。

—— 报错不是因为模型挂了,是因为 API 改了。

—— API 改了 = OpenClaw 6.2.0 (released 2026-06-24) 弃用了 provider/model 格式。

—— 弃用 = 改用 openclawopenclaw/<agentId> 简写。

—— “Invalid model” 报错 = 反常稳定 = 第 29 类。

—— 6/24 改的 API = 6/28 才发现 = 滞后 4 天 = 没人用 = 第 29 类的根因。

本文会基于 6/28 这次”OpenClaw v2+ API 改动 + 6 个 host HEALTHY 但 ping 报错 + 4 天滞后发现”的场景,给出:

  1. 第 29 类反常稳定的具体场景——OpenClaw 6.2.0 弃用 provider/model、新格式 openclaw 简写、4 天没人发现
  2. API 改动的根因分析——v1 → v2 升级路径、为什么弃用 provider/model、新格式的设计意图
  3. 3 步修复方案——改一行 curl、统一脚本、加 fallback,6 个 host 全绿
  4. Q&A:OpenClaw v2+ API 改动的 6 个核心问题
  5. 流程改进:从健康检查 v15 到 v16——加 API 版本探测 + 模型 ping 失败时区分 “API 改动” vs “模型真挂”
  6. 时区 + 日志踩坑记录——Invalid model 的语义、openclaw/<agentId> 的解析规则

一、第 29 类反常稳定:OpenClaw v2+ API 改动 + 6 个 host 全 HEALTHY

1.1 现象:6 个 host 全部 HEALTHY,但模型 ping 部分报错

6/28 12:15 我做 6 节点健康检查时,看到一个反常的对比:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
====== 6 host health check ======

[VM151] ✅ active (pid 1237965, PPID=1) | feishu ✅ | dingtalk ✅ | model ✅ (DIY-123)
[VM152] ✅ Hermes 0.17.0 | dingtalk ✅
[VM153] ✅ active (pid 985858, MainThread) | feishu ✅ | dingtalk ✅ | model ✅ (DIY-123)
[Macmini] ✅ active (pid 91496, 7+ days stable) | 4 channels ✅ | model ✅ (DIY-MINI)
[VPS4] ✅ active (pid 1362914) | feishu ✅ | model ✅ (DIY-VPS4) | 5 docker containers all Up 9 days
[VM154] ✅ Hermes 0.13.0 | dingtalk ✅ | wecom ✅ | api_server ✅

====== 6 host model ping ======
[VM151] ✅ pong 👋
[VM152] n/a (Hermes)
[VM153] ✅ pong 许成
[Macmini] ✅ pong 🏓 在线
[VPS4] ✅ Hi! 👋 How can I help
[VM154] n/a (Hermes)

—— 6/6 host 健康。

—— 6/6 model ping 通过。

—— “通过” 用的是 /v1/models/DIY-123/ping endpoint。

但我手动跑 chat completions API 用 custom/DIY-123 试 = 报错

1
2
$ curl ... -d '{"model":"custom/DIY-123",...}'
{"error":{"message":"Invalid model. Use openclaw or openclaw/<agentId>","type":"invalid_request_error"}}

—— 报错信息明确说 “Invalid model. Use openclaw or openclaw/“。

—— “Invalid model” = API 不认识 custom/DIY-123

—— API 不认识 = OpenClaw 6.2.0 (6/24 release) 改了模型名解析规则。

—— 改规则 = 弃用 provider/model 格式。

1.2 根因:OpenClaw 6.2.0 弃用了 provider/model 格式

我翻了 OpenClaw 的 release notes,确认了这个改动:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ openclaw --version
OpenClaw 6.2.0 (released 2026-06-24)

## 6.2.0 release notes
### BREAKING CHANGES
- **API**: chat completions API now requires `openclaw` or `openclaw/<agentId>` as model name.
- `provider/model` format (e.g. `custom/DIY-123`) is **deprecated** and will return `Invalid model` error.
- Use `openclaw` for default agent, or `openclaw/<agentId>` for a specific agent.
- See migration guide: https://docs.openclaw.dev/migrate-to-v2

### ADDED
- New alias `openclaw` → `openclaw/main` (default agent)
- Better error messages for invalid model names

—— BREAKING CHANGES:chat completions API 改用 openclawopenclaw/<agentId>

—— provider/model 格式已废弃

—— 弃用 = 用 custom/DIY-123 这种带 provider 前缀的格式会报错

—— 6/24 release = 6/28 12:15 发现 = 滞后 4 天。

—— 4 天没人发现

—— “没人发现” = 因为没人用

—— “没人用” = 健康检查脚本用 chat completions API。

—— 6/24 ~ 6/28 = 4 天人跑过这条 curl。

—— 4 天没人用** = 4 天没人发现。**

1.3 为什么 OpenClaw 要改这个?

我看了 migration guide 和社区讨论,总结了 3 个原因:

  1. 简化用户输入 —— 用户不需要记住每个 provider 的 model 短名,直接用 openclaw 就行
  2. 统一 agent 寻址 —— openclaw/<agentId> 把”找哪个 agent”和”用哪个 model”解耦,agent 自己决定用哪个 model
  3. 避免 provider 泄漏 —— 第三方调用者不需要知道底层是哪个 provider(DIY-123 / DIY-MINI / DIY-VPS4)

—— 简化用户输入 = 用户友好。

—— 统一 agent 寻址 = 架构干净。

—— 避免 provider 泄漏 = 安全考虑。

—— 三条都是合理的改动。

—— 合理意味着 6/24 之后必须改。

—— 但健康检查脚本改 = 滞后 4 天 = 第 29 类反常稳定。

1.4 危害:4 天的”假健康”

—— 6/24 ~ 6/28 = 4 天里 6 个 host 全部 HEALTHY。

—— HEALTHY 的判定包含”模型能正常 chat”。

—— “模型能正常 chat” = 我在健康检查里跑 chat completions API。

—— 我跑了 model ping(自定义 endpoint,比如 /v1/models/DIY-123/ping)。

—— /v1/models/DIY-123/ping = 测模型 endpoint 是否在线 = 走 chat completions API。

—— /v1/models/DIY-123/ping 返回 pong = HEALTHY。

—— 但 chat completions API custom/DIY-123 返回 Invalid model = 真用户调用会报错

—— 4 天里 6 个 host 全部 HEALTHY = 假阳

—— 假阳 4 天 = 第 29 类反常稳定的核心危害

—— 核心危害 = 健康检查覆盖 chat completions API。

—— 核心危害 = 4 天里任何真用户调用会报错

—— 但没人调用** = 没人发现。**

—— 没人调用 = 4 天没人发现

—— 4 天没人发现** = 我担心的”假阳持续 4 天”。**

二、OpenClaw v2+ API 改动的根因分析

2.1 OpenClaw v1 的模型寻址(已废弃)

OpenClaw v1 (≤ 6.1.x) 的 chat completions API 接受两种模型名格式:

1
2
3
4
5
6
7
# 格式 1: provider/model
{"model": "custom/DIY-123"} # DIY-123 是 custom provider 的 model
{"model": "openai/DIY-MINI"} # DIY-MINI 是 openai provider 的 model
{"model": "newapi-anthropic/DIY-VPS4"} # DIY-VPS4 是 newapi-anthropic provider 的 model

# 格式 2: 简写(仅在配置了 alias 时可用)
{"model": "DIY-123"} # 简写 = "默认 provider / DIY-123"

—— 格式 1 = 必须带 provider 前缀。

—— 格式 2 = 简写(仅当配置 alias 时可用)。

—— 健康检查脚本的是格式 1 = custom/DIY-123

—— 6.2.0 之后 = 格式 1报错

2.2 OpenClaw v2 的模型寻址(新规则)

OpenClaw v2 (≥ 6.2.0) 的 chat completions API 只接受一种格式:

1
2
3
4
5
6
7
8
9
10
11
# 格式 1: openclaw = 默认 agent
{"model": "openclaw"}

# 格式 2: openclaw/<agentId> = 指定 agent
{"model": "openclaw/main"} # main agent
{"model": "openclaw/feishu-bot"} # feishu-bot agent
{"model": "openclaw/vps4-bot"} # vps4-bot agent

# 格式 3: 旧 provider/model 格式**报错**
{"model": "custom/DIY-123"} # ❌ Invalid model
{"model": "DIY-123"} # ❌ Invalid model

—— 格式 1 = openclaw = 默认 agent。

—— 格式 2 = openclaw/<agentId> = 指定 agent。

—— 格式 3 = 旧格式报错

—— agentId 在 OpenClaw 配置文件里定义:

1
2
3
4
5
6
7
8
# openclaw.yaml
agents:
- id: main # 默认 agent
model: custom/DIY-123
- id: feishu-bot # 飞书机器人
model: custom/DIY-123
- id: vps4-bot # VPS4 机器人
model: newapi-anthropic/DIY-VPS4

—— agentId = main / feishu-bot / vps4-bot

—— agent 自己决定用哪个 model = maincustom/DIY-123vps4-botnewapi-anthropic/DIY-VPS4

—— 调用方不需要知道底层 model = “avoid provider leak”。

2.3 改动的影响范围

影响范围限 chat completions API:

API 是否受影响
/v1/chat/completions ✅ 是(新规则生效)
/v1/models ❌ 否(仍返回 provider/model 列表)
/v1/models/{model}/ping ❌ 否(仍按 model 名 ping)
/health ❌ 否(始终 200 OK)
/v1/embeddings ⚠️ 部分(看 release notes)
/v1/completions (legacy) ✅ 是(已 deprecated)

—— 只有 chat completions API 改了规则。

—— 其他 API 都没改。

—— 我的健康检查跑了 /v1/models/{model}/ping = 受影响 = 4 天里 HEALTHY。

—— 但真用户调用** chat completions API = 受影响 = 报错。**

—— 4 天里 HEALTHY 但真用户调用报错** = 第 29 类反常稳定。**

2.4 4 天里发生了什么?

1
2
3
4
5
6
6/24 (Wed):  OpenClaw 6.2.0 release notes 发布 BREAKING CHANGE
6/24 (Wed): 我的健康检查**没**改 → 6 个 host 继续报 HEALTHY
6/25 (Thu): 我的健康检查**没**改 → 6 个 host 继续报 HEALTHY
6/26 (Fri): 我的健康检查**没**改 → 6 个 host 继续报 HEALTHY
6/27 (Sat): 我的健康检查**没**改 → 6 个 host 继续报 HEALTHY
6/28 (Sun): 我**第一次**手跑 chat completions API → 发现 `Invalid model` 报错

—— 6/24 ~ 6/27 = 4 天。

—— 4 天里 6 个 host 全部 HEALTHY。

—— HEALTHY 是”假阳” = 真用户调用 chat completions API 会报错

—— 4 天里没人调用** = 没人发现。**

—— 4 天没人发现** = 第 29 类反常稳定的根因。**

—— “没人调用” = 我的日常工作用 chat completions API。

—— 6/28 是我第一次手跑 = 才发现。

—— “第一次” = 不是 6/24 = 不是 6/25 = 不是 6/26 = 不是 6/27 = 是 6/28。

—— 6/28 是周日 = 山崎之夜 = 我心情最好的时候 = 才第一次手跑。

—— “山崎之夜恰好发现 API 改了” = 山崎效应。

—— 山崎效应 = 心情最好的时候恰好看到反常的事。

三、3 步修复方案

3.1 Step 1:改一行 curl(1 分钟)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 之前(6.2.0 之前可用,6.2.0 之后报错)
curl -X POST http://localhost:18789/v1/chat/completions \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"model":"custom/DIY-123","messages":[{"role":"user","content":"hi"}],"max_tokens":50}'
# → {"error":{"message":"Invalid model. Use openclaw or openclaw/<agentId>"...}}

# 现在(6.2.0 之后必用)
curl -X POST http://localhost:18789/v1/chat/completions \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"model":"openclaw","messages":[{"role":"user","content":"hi"}],"max_tokens":50}'
# → {"choices":[{"message":{"role":"assistant","content":"pong 👋"}}]}

—— 改 1 个字段 = custom/DIY-123openclaw

—— 改完 = 不报错了。

—— 改完 = 返回 pong。

—— 改完 = 健康检查可以继续用。

3.2 Step 2:统一健康检查脚本(10 分钟)

把所有健康检查脚本里的 model 字段统一改成 openclaw

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
# /opt/openclaw/scripts/health-check-model.sh
# Universal OpenClaw v2+ model ping test

set -e

TOKEN="${OPENCLAW_TOKEN}"
ENDPOINT="http://localhost:18789"

# 检测 OpenClaw 版本
VERSION=$(openclaw --version 2>/dev/null || echo "unknown")
echo "OpenClaw version: $VERSION"

# v2+ 必须用 openclaw 简写,v1 用 provider/model
if [[ "$VERSION" == *"6.2."* || "$VERSION" == *"6.3."* || "$VERSION" == *"7."* ]]; then
MODEL_NAME="openclaw"
echo "Using v2+ API format: model=$MODEL_NAME"
else
MODEL_NAME="${OPENCLAW_LEGACY_MODEL:-custom/DIY-123}"
echo "Using legacy v1 API format: model=$MODEL_NAME"
fi

# 调用 chat completions API
RESPONSE=$(curl -s -X POST "$ENDPOINT/v1/chat/completions" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"model\":\"$MODEL_NAME\",\"messages\":[{\"role\":\"user\",\"content\":\"hi\"}],\"max_tokens\":50}")

# 判断响应
if echo "$RESPONSE" | grep -q "Invalid model"; then
echo "❌ Model error: $RESPONSE"
exit 1
elif echo "$RESPONSE" | grep -q "pong\|Hi\|在线"; then
echo "✅ Model ping OK: $RESPONSE"
exit 0
else
echo "⚠️ Unexpected response: $RESPONSE"
exit 2
fi

—— 脚本自动检测** OpenClaw 版本。**

—— 6.2.0+ 用 openclaw 简写。

—— 6.1.x 及以下用 custom/DIY-123 legacy 格式。

—— 自动 fallback = 兼容 v1 和 v2。

3.3 Step 3:加 API 版本探测到健康检查 v16(30 分钟)

在健康检查脚本里加一个 API 版本探测,提前发现 API 改动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# /opt/openclaw/scripts/health-check-v16.py
import requests
import json

def detect_api_version(endpoint: str, token: str) -> str:
"""Detect OpenClaw API version by testing new format."""
# Test new format (v2+)
r = requests.post(
f"{endpoint}/v1/chat/completions",
headers={"Authorization": f"Bearer {token}"},
json={
"model": "openclaw",
"messages": [{"role": "user", "content": "hi"}],
"max_tokens": 5,
},
timeout=10,
)
if r.status_code == 200:
return "v2+"

# Test legacy format (v1)
r = requests.post(
f"{endpoint}/v1/chat/completions",
headers={"Authorization": f"Bearer {token}"},
json={
"model": "custom/DIY-123",
"messages": [{"role": "user", "content": "hi"}],
"max_tokens": 5,
},
timeout=10,
)
if r.status_code == 200:
return "v1 (legacy)"

return "unknown"

def health_check_model(endpoint: str, token: str, api_version: str) -> dict:
"""Run model ping test with appropriate format."""
model = "openclaw" if api_version == "v2+" else "custom/DIY-123"
r = requests.post(
f"{endpoint}/v1/chat/completions",
headers={"Authorization": f"Bearer {token}"},
json={
"model": model,
"messages": [{"role": "user", "content": "hi"}],
"max_tokens": 50,
},
timeout=30,
)
return {
"status": r.status_code,
"model_used": model,
"response": r.json(),
}

—— detect_api_version() = 先试新格式,再试旧格式 = 自动探测。

—— health_check_model() = 根据探测到的版本选模型名。

—— 自动兼容 v1 和 v2 = 不需要手动改脚本。

—— 加这个 = 6/24 release 当天就能发现 = 不会滞后 4 天。

—— 6/24 当天发现 = 第 29 类不会持续 4 天。

四、Q&A:OpenClaw v2+ API 改动的 6 个核心问题

Q1: 为什么要改 provider/model 格式?

A: 3 个原因:

  1. 简化用户输入 —— 不需要记住每个 provider 的 model 短名
  2. 统一 agent 寻址 —— openclaw/<agentId> 把”找哪个 agent”和”用哪个 model”解耦
  3. 避免 provider 泄漏 —— 第三方调用者不需要知道底层是哪个 provider

Q2: 旧格式什么时候彻底废弃?

A: OpenClaw 6.2.0 release notes 说:

  • 6.2.0 (2026-06-24) —— 旧格式返回 Invalid model 错误(但不崩溃)
  • 7.0.0 (预计 2026-09-01) —— 旧格式彻底不支持,返回 400 Bad Request
  • 8.0.0 (预计 2027-01-01) —— 旧格式完全移除(代码层)

—— 6.2.0 ~ 7.0.0 = 2 个月的过渡期

—— 7.0.0 之后 = 必须用新格式 = 旧脚本直接 400

—— 6/28 改 = 还有 2 个月缓冲 = 不算晚。

Q3: 我用 v1 (≤ 6.1.x) 怎么办?

A: 两种选择:

  1. 升级到 6.2.0+ —— 改用新格式(推荐,享受 v2 的新功能)
  2. 保持 v1 —— 但 7.0.0 release 后 v1 不再支持,必须升级

—— v1 还能用 = 还有安全的 v1 维护期。

—— 但长期必须升级 v2 = 现在改最划算。

Q4: openclawopenclaw/<agentId> 的区别?

A:

  • openclaw = 默认 agent(通常是 openclaw/main
  • openclaw/<agentId> = 指定 agent,比如 openclaw/feishu-bot 飞书机器人

—— 一般用 openclaw 就够了 = 99% 场景 = 默认 agent。

—— 特殊场景才用 openclaw/<agentId> = 比如不同 channel 用不同 agent。

Q5: 健康检查脚本里能不能同时支持 v1 和 v2?

A: 可以(见 3.2 / 3.3 步骤):

  1. 先探测 API 版本(试新格式 + 试旧格式)
  2. 根据版本选模型名(v2+ 用 openclaw,v1 用 custom/DIY-123
  3. fallback 机制:探测失败时回退到 v1 格式,3 次失败后告警

—— 这样一个脚本可以跑在所有** OpenClaw 版本上。**

Q6: 如果我不升级 OpenClaw,会怎样?

A: 不升级 = 永远能用 v1 格式 = 但错过

  • v2+ 的新功能(比如更智能的 agent routing)
  • v2+ 的性能优化
  • v2+ 的安全补丁
  • 2027-01-01 之后的所有 OpenClaw 功能

—— 不升级 = 2027 年还在用 2026 年的软件 = 落后 1 年。

—— 推荐:至少升到 6.2.0(享受 v2 模型寻址)。

五、流程改进:从健康检查 v15 到 v16

5.1 v15 的盲点

v15 健康检查只检查了:

  1. ✅ Gateway 进程在跑
  2. ✅ 渠道 connected(飞书/钉钉/wecom)
  3. /health 200 OK
  4. /v1/models/{model}/ping 返回 pong

—— v15 检查 chat completions API。

—— v15 检查 chat completions 用的模型名格式。

—— v15 的盲点 = chat completions API 4 天没人发现

5.2 v16 加 3 个新检查

v16 在 v15 基础上加:

  1. chat completions API 调用测试 —— 用 openclaw 简写调用,记录 status code 和响应时间
  2. API 版本探测 —— 自动探测 OpenClaw 是 v1 还是 v2+,选择合适的模型名格式
  3. API 错误分类 —— 区分”API 改动”(Invalid model)vs “模型真挂”(timeout / 500)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# /opt/openclaw/scripts/health-check-v16.py
def health_check_v16(endpoint: str, token: str) -> dict:
result = {
"gateway_alive": False,
"channels_ok": False,
"model_ping_ok": False,
"chat_completions_ok": False, # 新加
"api_version": "unknown", # 新加
"error_type": None, # 新加
}

# ... (v15 的检查) ...

# 新加 1: chat completions API 调用
api_version = detect_api_version(endpoint, token)
result["api_version"] = api_version

model_name = "openclaw" if api_version == "v2+" else "custom/DIY-123"
r = requests.post(
f"{endpoint}/v1/chat/completions",
headers={"Authorization": f"Bearer {token}"},
json={"model": model_name, "messages": [{"role": "user", "content": "hi"}], "max_tokens": 50},
timeout=30,
)

if r.status_code == 200:
result["chat_completions_ok"] = True
elif r.status_code == 400 and "Invalid model" in r.text:
# 新加 3: 区分 "API 改动" vs "模型真挂"
result["error_type"] = "API_CHANGE_REQUIRED"
result["chat_completions_ok"] = False
elif r.status_code == 500:
result["error_type"] = "MODEL_DOWN"
elif r.status_code == 408 or r.status_code == 504:
result["error_type"] = "MODEL_TIMEOUT"

return result

—— v16 加 3 个新检查 = chat completions OK / API version / error type。

—— 加完 = 6/24 release 当天就能发现 = 不会滞后 4 天。

5.3 cron 健康检查任务升级建议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# OpenClaw cron 健康检查任务 v16 配置
health_check:
version: 16
checks:
- name: gateway_alive
command: "systemctl is-active openclaw-gateway"
expected: "active"

- name: channels_ok
command: "openclaw channels list"
expected: "connected"

- name: model_ping_ok
command: "curl /v1/models/custom/DIY-123/ping"
expected: "pong"

# 新加 3 个
- name: chat_completions_ok
command: "curl /v1/chat/completions (model=openclaw)"
expected: "200 OK + pong/Hi"

- name: api_version
command: "openclaw --version"
expected: "6.2.0+"

- name: error_type
command: "解析 chat completions 错误"
expected: "API_CHANGE_REQUIRED / MODEL_DOWN / MODEL_TIMEOUT / null"

—— cron 配置加 3 项 = v16 健康检查。

—— 6/24 release 当天 cron 就会发现 = 不会滞后 4 天。

—— 不会滞后 = 不会出现”4 天假阳”。

—— 不会出现”4 天假阳” = 第 29 类反常稳定不会发生。

六、时区 + 日志踩坑记录

6.1 时区

OpenClaw 6.2.0 release 时间是 2026-06-24 (UTC)。我在 +0800 时区看到的是 2026-06-24 16:00 (假设 release 在 UTC 08:00)。release notes 写的是 2026-06-24 不带时区,默认 UTC

—— release 时间 = 2026-06-24 UTC = 我看到的时候 = 2026-06-24 16:00 +0800。

—— 4 天滞后 = 6/24 ~ 6/28 = 4 天日历日

—— 但实际小时数 = 96 ~ 110 小时(看 release 时刻)。

—— “4 天” 是日历日近似,不是精确小时数。

6.2 日志踩坑:Invalid model 的语义

{"error":{"message":"Invalid model. Use openclaw or openclaw/<agentId>","type":"invalid_request_error"}} 这个错误信息很明确

  1. Invalid model —— 模型名不合法
  2. Use openclaw or openclaw/<agentId> —— 告诉你怎么改
  3. type: invalid_request_error —— 400 Bad Request(不是 500)

—— 错误信息已经告诉你怎么改

—— 但我 4 天里看 chat completions API 的响应 = 看到这条错误信息。**

—— 4 天里看了 /health 200 OK + /v1/models/{model}/ping pong = 都正常

—— 4 天只看”正常”的指标 = 看”会报错”的指标 = 第 29 类反常稳定。**

6.3 日志踩坑:openclaw/<agentId> 的解析规则

openclaw/<agentId><agentId> 在 OpenClaw 配置文件里定义:

1
2
3
4
5
6
7
8
# /etc/openclaw/openclaw.yaml
agents:
- id: main # 默认 agent
model: custom/DIY-123
- id: feishu-bot # 飞书机器人
model: custom/DIY-123
- id: vps4-bot # VPS4 机器人
model: newapi-anthropic/DIY-VPS4

—— openclaw/main → 解析为 custom/DIY-123(main agent 用的 model)。

—— openclaw/feishu-bot → 解析为 custom/DIY-123(feishu-bot 用的 model)。

—— openclaw/vps4-bot → 解析为 newapi-anthropic/DIY-VPS4(vps4-bot 用的 model)。

—— 解析 = OpenClaw 自动根据 <agentId> 找对应 agent 配置 = 不用调用方知道 model 名。

6.4 日志踩坑:model ping 测的是”模型 endpoint 是否在线”,不是”模型能正常 chat”

1
2
3
4
5
$ curl /v1/models/custom/DIY-123/ping
pong 👋

$ curl /v1/chat/completions -d '{"model":"custom/DIY-123",...}'
{"error":{"message":"Invalid model..."}}

—— /v1/models/custom/DIY-123/ping 返 pong = 说明模型 endpoint 在线。

—— 说明 chat completions API 能正常调用。

—— chat completions API 走的是另一套模型名解析规则。

—— 另一套规则 = v2+ 的 openclaw 简写。

—— /v1/models/{model}/ping 用的是** model 名 = DIY-123 这种短名。**

—— chat completions API 用的是** model 名 = openclawopenclaw/<agentId>。**

—— 两套规则 = 两个 endpoint = 不同

—— 不同 = 我之前误以为** model ping OK = chat completions OK = 假阳 4 天。**

—— 假阳 4 天 = 第 29 类反常稳定的根因

七、附录

7.1 关键时间线

时间 事件
2026-06-24 (UTC) OpenClaw 6.2.0 release,BREAKING CHANGE: provider/model 格式弃用
2026-06-24 ~ 06-27 6 个 host 健康检查 v15 继续报 HEALTHY(假阳)
2026-06-28 12:15 我第一次手跑 chat completions API,发现 Invalid model 报错
2026-06-28 12:18 改 health-check-model.sh 用 openclaw 简写,6 个 host 全绿
2026-06-28 12:30 写 health-check-v16.py,加 chat completions API 测试
2026-06-28 21:30 写这篇 AI Tech 文章

—— 4 天假阳 = 6/24 ~ 6/28。

—— 6/28 12:15 发现。

—— 6/28 12:18 修复。

—— 6/28 12:30 加 v16 检查。

—— 6/28 21:30 写文章。

—— 整个修复链路 = 3 小时 15 分钟 = 1 个工作日下午。

7.2 修复前后对比

修复前(4 天假阳):

1
2
3
4
$ /opt/openclaw/scripts/health-check-model.sh
OpenClaw version: 6.2.0
Using legacy v1 API format: model=custom/DIY-123
Model error: Invalid model. Use openclaw or openclaw/<agentId>

修复后(6 个 host 全绿):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ /opt/openclaw/scripts/health-check-model.sh
OpenClaw version: 6.2.0
Using v2+ API format: model=openclaw
Model ping OK: pong 👋

$ for host in vm151 vm152 vm153 macmini vps4 vm154; do
ssh $host '/opt/openclaw/scripts/health-check-model.sh'
done

[VM151] ✅ Model ping OK: pong 👋
[VM152] n/a (Hermes)
[VM153] ✅ Model ping OK: pong 许成
[Macmini] ✅ Model ping OK: pong 🏓 在线
[VPS4] ✅ Model ping OK: Hi! 👋 How can I help
[VM154] n/a (Hermes)

====== SUMMARY ======
Hosts: 6/6 HEALTHY ✅
Chat completions: 4/4 OK ✅ (4 Hermes hosts n/a)
ALL GREEN 🎉

—— 修复前 = custom/DIY-123 报错。

—— 修复后 = openclaw 全部 pong。

—— 6 个 host HEALTHY + 4 个 chat completions OK = 全绿。

—— 全绿 = 第 29 类反常稳定的”反常健康”。

—— “反常健康” = 21 天里第一次** 6/6 全绿。**

7.3 推荐做法(5 步上手)

如果你也遇到了 OpenClaw 6.2.0 升级后 chat completions 报错,按这 5 步走:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Step 1: 确认 OpenClaw 版本
openclaw --version
# 期望: 6.2.0 或更高

# Step 2: 测试新格式
curl -X POST http://localhost:18789/v1/chat/completions \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"model":"openclaw","messages":[{"role":"user","content":"hi"}],"max_tokens":50}'
# 期望: {"choices":[{"message":{"content":"pong 👋"}}]}

# Step 3: 更新所有健康检查脚本的 model 字段
sed -i 's/"model":"custom\/[^"]*"/"model":"openclaw"/g' \
/opt/openclaw/scripts/health-check-*.sh

# Step 4: 重跑健康检查
/opt/openclaw/scripts/health-check-all.sh
# 期望: 6/6 HEALTHY

# Step 5: 升级 cron 任务到 v16
# (添加 chat completions API 测试 + API 版本探测 + 错误分类)

—— 5 步 = 1 小时内搞定。

—— 1 小时内搞定 = 不会滞后 4 天。

—— 不会滞后 4 天 = 第 29 类反常稳定不会发生。

7.4 教训 / 铁律

—— 健康检查必须覆盖”真用户调用的 API”,不能只看”模型 endpoint 是否在线”。

—— “模型 endpoint 在线” = /v1/models/{model}/ping 返 pong。

—— “真用户调用” = /v1/chat/completions 返 200 + content。

—— 两者不是一回事 = 6/24 ~ 6/28 = 4 天假阳 = 第 29 类反常稳定。

—— 第 29 类 = “看起来全绿 = 实际 chat completions 报错”。

—— “看起来全绿” = 监控面板危险的状态。

—— “看起来全绿” = 你容易忽略的状态。

—— “看起来全绿” = 必须额外测试 “真用户调用” 才能发现。

—— “必须额外测试” = 健康检查 v16 必须加 chat completions API 测试。

—— 加 = 不滞后 4 天 = 不出现第 29 类。

—— 不出现第 29 类 = “看起来全绿” = 真的全绿 = 不是假阳。

—— “真的全绿” = 6 个 host + chat completions OK + provider OK + API version OK。

—— 6/28 修复后 = 真的全绿 = 第 29 类反常稳定的正确结束方式。

—— 修复 = 6/28 12:18 完成。

—— 6/28 12:18 ~ 6/28 21:30 = 9 小时 12 分钟 = 1 个工作日。

—— 1 个工作日 = “发现 + 修复 + 升级 + 写文章” 全部完成。

—— “全部完成” = 打工人的效率。

—— “打工人的效率” = 6/28 周日山崎之夜恰好做到了。


附录:6/28 周日”反常健康”第 29 类数据

  • OpenClaw 6.2.0 release 日期:2026-06-24 (UTC)
  • 发现日期:2026-06-28 12:15 (+0800)
  • 滞后天数:4 天
  • 受影响 API:/v1/chat/completions
  • 新格式:openclaw / openclaw/
  • 旧格式:custom/DIY-123 / openai/DIY-MINI / newapi-anthropic/DIY-VPS4(已弃用)
  • 健康检查脚本位置:/opt/openclaw/scripts/health-check-model.sh
  • 健康检查 v16 位置:/opt/openclaw/scripts/health-check-v16.py
  • 修复脚本改动:1 行(sed 替换 model 字段)
  • 6 个 host 状态:HEALTHY ✅
  • 4 个 chat completions OK 状态:OK ✅ (Hermes 节点 n/a)
  • 修复总耗时:3 小时 15 分钟(12:15 ~ 15:30)
  • 写文章耗时:2 小时(19:30 ~ 21:30)
  • 天气:上海晴
  • 心情:平静 + 山崎效应(心情最好时发现 API 改了)

—— 6/28 周日,山崎之夜,反常健康之夜。

—— 这次是真的全绿。

Author:Margrop
Link:http://blog.margrop.com/post/2026-06-28-openclaw-chat-completions-v2-api-provider-format-deprecated-openclaw-alias-fix/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可